public abstract class AbstractDocument extends Object implements Document, Serializable
このクラスはドキュメントのロック・メカニズムを実装します。これによって、複数の読取りまたは1つの書込みを扱えるようになり、複数の書込みがあっても、ドキュメントのオブザーバ全員に以前の変更が通知されるまで、ドキュメントに別の変更を加えることができません。読取りロックの取得および解放には、render
メソッドを使用します。書込みロックは、ドキュメントを変更するメソッドによって取得され、そのメソッド呼出しの間は保持されます。通知は、ドキュメントを変更するスレッド上で行われます。このスレッドは、通知の間はドキュメントへの完全な読取りアクセス権を持っています。一方で、その他の読取り側は、通知が完了するまではアクセスを許されません。通知はBeansイベント通知であり、すべてのリスナーが通知を受け取るまでは他の変更を許可しません。
このクラスからサブクラス化された任意のモデルで、BasicTextUIから派生したLook & Feelの実装を持つテキスト・コンポーネントと関連して使用されるものは、非同期に更新しても問題ありません。これは、ドキュメントのタイプがAbstractDocument
の場合には、View階層へのすべてのアクセスがBasicTextUIによって直列化されるからです。ロックでは、独立したスレッドのView階層へのアクセスは必ずDocumentListenerメソッドを介して行われ、また、1回につきアクティブなイベント・スレッドは1つしか存在しないと見なします。
同期のサポートが必要な場合は、さらに次の前提条件があります。任意のDocumentListenerおよびUndoListenerの実装に対するコード・パスがスレッドに対して安全であること、また、デッドロックを避ける場合には、コンポーネントのロックにアクセスしないこと、という条件です。JComponentのrepaint
メソッドおよびrevalidate
メソッドは安全です。
AbstractDocumentはドキュメントの最後に暗黙のブレークをモデル化します。さまざまなことが可能ですが、その1つとして最後の文字のあとにキャレットを配置できます。その結果、Contentより短いgetLength
を返します。独自のContentを生成する場合は、文字を追加して初期化するようにしてください。この例についてはStringContentとGapContentを参照してください。別の前提条件は、暗黙の最終文字をモデル化するElementsはendOffset ==(getLength()+1)となることです。たとえば、DefaultStyledDocumentの場合はgetParagraphElement(getLength()).getEndOffset()== getLength()+1
です。
警告: このクラスの直列化されたオブジェクトは、今後のSwingリリースとの互換性がなくなる予定です。現在の直列化のサポートは、短期間の格納や、同じバージョンのSwingを実行するアプリケーション間のRMIに適しています。1.4以降、すべてのJavaBeans(tm)用の長期間の格納サポートがjava.beans
パッケージに追加されています。XMLEncoder
を参照してください。
修飾子と型 | クラスと説明 |
---|---|
class |
AbstractDocument.AbstractElement
要素の抽象部分を実装します。
|
static interface |
AbstractDocument.AttributeContext
このインタフェースは、プラグイン可能な属性圧縮手法をMutableAttributeSetの実装で使用可能にするために使用できます。
|
class |
AbstractDocument.BranchElement
ほかの要素を含む複合要素を実装します。
|
static interface |
AbstractDocument.Content
編集可能な文字のシーケンスを示すインタフェースです。
|
class |
AbstractDocument.DefaultDocumentEvent
ドキュメントが変更された場合に、ドキュメントの変更を格納します。
|
static class |
AbstractDocument.ElementEdit
ドキュメントのイベントに追加できるElementChangeの実装です。
|
class |
AbstractDocument.LeafElement
ある種のコンテンツを直接表す要素を実装します。
|
修飾子と型 | フィールドと説明 |
---|---|
protected static String |
BAD_LOCATION
不正な位置を示すエラー・メッセージです。
|
static String |
BidiElementName
単方向の実行を示す要素の名前です。
|
static String |
ContentElementName
内容を示す要素の名前です。
|
static String |
ElementNameAttribute
要素の名前の指定に使う属性の名前です。
|
protected EventListenerList |
listenerList
ドキュメントのイベント・リスナーです。
|
static String |
ParagraphElementName
段落を示す要素の名前です。
|
static String |
SectionElementName
行、段落などのセクションを示す要素の名前です。
|
StreamDescriptionProperty, TitleProperty
修飾子 | コンストラクタと説明 |
---|---|
protected |
AbstractDocument(AbstractDocument.Content data)
指定されたコンテンツ・ストレージ・メカニズムをラップした、新しい
AbstractDocument を構築します。 |
protected |
AbstractDocument(AbstractDocument.Content data, AbstractDocument.AttributeContext context)
指定されたコンテンツ・ストレージ・メカニズムをラップした、新しい
AbstractDocument を構築します。 |
修飾子と型 | メソッドと説明 |
---|---|
void |
addDocumentListener(DocumentListener listener)
ドキュメント・リスナーを追加し、変更があったときに通知されるようにします。
|
void |
addUndoableEditListener(UndoableEditListener listener)
任意の変更を通知するアンドゥ・リスナーを追加します。
|
protected Element |
createBranchElement(Element parent, AttributeSet a)
ドキュメントの枝の要素を作成します。この要素には、ほかの要素(複数可)を含めることができます。
|
protected Element |
createLeafElement(Element parent, AttributeSet a, int p0, int p1)
ドキュメントの葉の要素を作成します。
|
Position |
createPosition(int offs)
ドキュメントが変更されたときに、変更を追跡する位置を返します。
|
void |
dump(PrintStream out)
診断用のダンプを出力します。
|
protected void |
fireChangedUpdate(DocumentEvent e)
このイベント・タイプの通知対象として登録されているすべてのリスナーに通知します。
|
protected void |
fireInsertUpdate(DocumentEvent e)
このイベント・タイプの通知対象として登録されているすべてのリスナーに通知します。
|
protected void |
fireRemoveUpdate(DocumentEvent e)
このイベント・タイプの通知対象として登録されているすべてのリスナーに通知します。
|
protected void |
fireUndoableEditUpdate(UndoableEditEvent e)
このイベント・タイプの通知対象として登録されているすべてのリスナーに通知します。
|
int |
getAsynchronousLoadPriority()
非同期ロードの優先順位を取得します。
|
protected AbstractDocument.AttributeContext |
getAttributeContext()
属性を管理するためのコンテキストを返します。
|
Element |
getBidiRootElement()
ドキュメントの双方向構造のルート要素を返します。
|
protected AbstractDocument.Content |
getContent()
ドキュメントの内容を取得します。
|
protected Thread |
getCurrentWriter()
現在の書込みスレッドがあれば、それを取得します。
|
abstract Element |
getDefaultRootElement()
ルート要素を返します。要素の構造にビューを割り当てる別のメカニズムが提供されないかぎり、このルート要素がビューのベースになります。
|
DocumentFilter |
getDocumentFilter()
挿入または削除のフィルタを行う
DocumentFilter を返します。 |
DocumentListener[] |
getDocumentListeners()
このドキュメントに登録された、すべてのドキュメント・リスナーから成る配列を返します。
|
Dictionary<Object,Object> |
getDocumentProperties()
プロパティのセットの管理をサポートします。
|
Position |
getEndPosition()
ドキュメントの末尾を表す位置を返します。
|
int |
getLength()
データの長さを返します。
|
<T extends EventListener> |
getListeners(Class<T> listenerType)
このドキュメントに
FooListener として現在登録されているすべてのオブジェクトの配列を返します。 |
abstract Element |
getParagraphElement(int pos)
指定された位置を保持する段落要素を取得します。
|
Object |
getProperty(Object key)
プロパティの値を調べるのに便利なメソッドです。
|
Element[] |
getRootElements()
定義されているルート要素をすべて取得します。
|
Position |
getStartPosition()
ドキュメントの先頭を表す位置を返します。
|
String |
getText(int offset, int length)
ドキュメントからテキストのシーケンスを取得します。
|
void |
getText(int offset, int length, Segment txt)
ドキュメントの指定部分内にあるテキストを取得します。
|
UndoableEditListener[] |
getUndoableEditListeners()
このドキュメントに登録された、すべての取消し可能編集リスナーから成る配列を返します。
|
void |
insertString(int offs, String str, AttributeSet a)
ドキュメントに内容を挿入します。
|
protected void |
insertUpdate(AbstractDocument.DefaultDocumentEvent chng, AttributeSet attr)
ドキュメント構造をテキスト挿入の結果で更新します。
|
protected void |
postRemoveUpdate(AbstractDocument.DefaultDocumentEvent chng)
ドキュメント構造をテキスト削除の結果で更新します。
|
void |
putProperty(Object key, Object value)
プロパティの値を格納するのに便利なメソッドです。
|
void |
readLock()
ロックを取得して、ドキュメントからなんらかの状態の読込みを開始できるようにします。
|
void |
readUnlock()
読込みのロックを解除します。
|
void |
remove(int offs, int len)
ドキュメントから内容を削除します。
|
void |
removeDocumentListener(DocumentListener listener)
ドキュメント・リスナーを削除します。
|
void |
removeUndoableEditListener(UndoableEditListener listener)
アンドゥ・リスナーを削除します。
|
protected void |
removeUpdate(AbstractDocument.DefaultDocumentEvent chng)
ドキュメント構造をテキスト削除の結果で更新します。
|
void |
render(Runnable r)
モデルが非同期的な更新をサポートしている場合、並行性に直面してモデルを安全に描画できるようにします。
|
void |
replace(int offset, int length, String text, AttributeSet attrs)
offset からoffset+length までのテキスト領域を削除し、text に置き換えます。 |
void |
setAsynchronousLoadPriority(int p)
非同期ロードの優先順位を設定します。
|
void |
setDocumentFilter(DocumentFilter filter)
DocumentFilter を設定します。 |
void |
setDocumentProperties(Dictionary<Object,Object> x)
このドキュメントのドキュメント・プロパティの辞書を置き換えます。
|
protected void |
writeLock()
ロックを取得して、ロックが保護しているドキュメントの変更を開始できるようにします。
|
protected void |
writeUnlock()
以前
writeLock 経由で取得された書込みロックを解除します。 |
protected EventListenerList listenerList
public static final String SectionElementName
protected AbstractDocument(AbstractDocument.Content data)
AbstractDocument
を構築します。data
- コンテンツprotected AbstractDocument(AbstractDocument.Content data, AbstractDocument.AttributeContext context)
AbstractDocument
を構築します。data
- コンテンツcontext
- 属性のコンテキストpublic Dictionary<Object,Object> getDocumentProperties()
documentProperties
の辞書を使用して、ドキュメント全体に関するプロパティの注釈を付加できます。null
以外のDictionary
setDocumentProperties(java.util.Dictionary<java.lang.Object, java.lang.Object>)
public void setDocumentProperties(Dictionary<Object,Object> x)
x
- 新規辞書getDocumentProperties()
protected void fireInsertUpdate(DocumentEvent e)
e
- イベントEventListenerList
protected void fireChangedUpdate(DocumentEvent e)
e
- イベントEventListenerList
protected void fireRemoveUpdate(DocumentEvent e)
e
- イベントEventListenerList
protected void fireUndoableEditUpdate(UndoableEditEvent e)
e
- イベントEventListenerList
public <T extends EventListener> T[] getListeners(Class<T> listenerType)
FooListener
として現在登録されているすべてのオブジェクトの配列を返します。FooListener
は、addFooListener
メソッドを使用して登録されます。
FooListener.class
などのクラス・リテラルを使用してlistenerType
引数を指定できます。たとえば、次のコードを使用すると、ドキュメントd
をそのドキュメント・リスナーに照会できます。
DocumentListener[] mls = (DocumentListener[])(d.getListeners(DocumentListener.class));このようなリスナーがない場合は空の配列を返します。
listenerType
- 要求されるリスナーの型。次の下位インタフェースを指定: java.util.EventListener
FooListener
として登録されたすべてのオブジェクトの配列、またはこのようなリスナーが追加されていない場合は空の配列ClassCastException
- listenerType
で、java.util.EventListener
を実装するクラスまたはインタフェースが指定されなかった場合getDocumentListeners()
, getUndoableEditListeners()
public int getAsynchronousLoadPriority()
-1
public void setAsynchronousLoadPriority(int p)
p
- 新しい非同期ロードの優先順位。0より小さい値の場合、ドキュメントは非同期でロードされないpublic void setDocumentFilter(DocumentFilter filter)
DocumentFilter
を設定します。DocumentFilter
がinsert
とremove
に渡され、条件付きでテキストの挿入や削除が可能になります。null
値は、フィルタが実行されないことを表します。filter
- テキストの制約に使用されるDocumentFilter
getDocumentFilter()
public DocumentFilter getDocumentFilter()
DocumentFilter
を返します。戻り値null
は、フィルタが実行されないことを表します。setDocumentFilter(javax.swing.text.DocumentFilter)
public void render(Runnable r)
この実装は、Runnableオブジェクトを実行している間、読取りロックを取得するためのものです。複数を同時に実行している場合、アクティブに描画中のオブジェクトがある間は、すべての書込みがブロックされます。オブジェクトが例外をスローした場合、そのロックは安全に解放されます。決して終了しないオブジェクトに対する保護はなく、事実上、ドキュメントは自身が存在する間ずっとロックされます。
指定されたRunnableオブジェクトがこの実装でどのような変更を試みても、デッドロックが発生します。この状況を検知できるようにするために個々の描画スレッドを追跡することはできません。また、サブクラスは、描画スレッドの追跡、およびエラーのスローのオーバーヘッドを発生させる可能性があります。
このメソッドはスレッド・セーフですが、ほとんどのSwingメソッドは違います。詳細は、Swingでの並行性に関連しているサイトを参照してください。
public int getLength()
getLength
、インタフェース: Document
Document.getLength()
public void addDocumentListener(DocumentListener listener)
addDocumentListener
、インタフェース: Document
listener
- 追加するDocumentListener
Document.addDocumentListener(javax.swing.event.DocumentListener)
public void removeDocumentListener(DocumentListener listener)
removeDocumentListener
、インタフェース: Document
listener
- 削除するDocumentListener
Document.removeDocumentListener(javax.swing.event.DocumentListener)
public DocumentListener[] getDocumentListeners()
DocumentListener
。ドキュメント・リスナーが現在登録されていない場合は空の配列addDocumentListener(javax.swing.event.DocumentListener)
, removeDocumentListener(javax.swing.event.DocumentListener)
public void addUndoableEditListener(UndoableEditListener listener)
UndoableEdit
で実行される「元に戻す/再実行」操作は、適切なDocumetnEventを発生させて、ビュー(複数の場合もあり)をモデルと同期させます。addUndoableEditListener
、インタフェース: Document
listener
- 追加するUndoableEditListener
Document.addUndoableEditListener(javax.swing.event.UndoableEditListener)
public void removeUndoableEditListener(UndoableEditListener listener)
removeUndoableEditListener
、インタフェース: Document
listener
- 削除するUndoableEditListener
Document.removeDocumentListener(javax.swing.event.DocumentListener)
public UndoableEditListener[] getUndoableEditListeners()
UndoableEditListener
。取消し可能編集リスナーが現在登録されていない場合は空の配列addUndoableEditListener(javax.swing.event.UndoableEditListener)
, removeUndoableEditListener(javax.swing.event.UndoableEditListener)
public final Object getProperty(Object key)
getDocumentProperties().get(key);
getProperty
、インタフェース: Document
key
- null
以外のプロパティ・キーnull
getDocumentProperties()
public final void putProperty(Object key, Object value)
getDocumentProperties().put(key, value);
value
がnull
の場合、このメソッドはプロパティを削除します。putProperty
、インタフェース: Document
key
- null
以外のキーvalue
- プロパティ値getDocumentProperties()
public void remove(int offs, int len) throws BadLocationException
このメソッドはスレッド・セーフですが、ほとんどのSwingメソッドは違います。詳細は、Swingでの並行性に関連しているサイトを参照してください。
remove
、インタフェース: Document
offs
- 開始オフセット>= 0len
- 削除対象の文字数>= 0BadLocationException
- 指定された削除位置がドキュメント内の有効な位置でない場合Document.remove(int, int)
public void replace(int offset, int length, String text, AttributeSet attrs) throws BadLocationException
offset
からoffset+length
までのテキスト領域を削除し、text
に置き換えます。この動作がどのように実装されるかはその実装に左右され、削除してから挿入を行うというように別々の2つの操作として実装することもあれば、置換えを行うというように1つの基本操作として実装することもあります。offset
- 子要素のインデックスlength
- 削除するテキストの長さ。0の場合は何も削除されないtext
- 挿入するテキスト。null
の場合、テキストは挿入されないattrs
- 挿入されたテキストの属性を示すAttributeSet。null
も可。空の属性セットとして扱われるが、サブクラスで正確な解釈をするBadLocationException
- 指定された位置がドキュメント内の有効な位置でない場合public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
このメソッドはスレッド・セーフですが、ほとんどのSwingメソッドは違います。詳細は、Swingでの並行性に関連しているサイトを参照してください。
insertString
、インタフェース: Document
offs
- 開始オフセット>= 0str
- 挿入する文字列。nullや空の文字列の場合は何もしないa
- 挿入されたコンテンツの属性BadLocationException
- 指定された挿入位置がドキュメント内の有効な位置でない場合Document.insertString(int, java.lang.String, javax.swing.text.AttributeSet)
public String getText(int offset, int length) throws BadLocationException
getText
、インタフェース: Document
offset
- 開始オフセット>= 0length
- 取得対象の文字数>= 0BadLocationException
- 指定された範囲に、ドキュメント内の無効な位置が含まれる場合Document.getText(int, int)
public void getText(int offset, int length, Segment txt) throws BadLocationException
txtパラメータのpartialReturnプロパティがfalseの場合、Segmentで返されたデータは、要求された長さ全体になり、データの格納方法によってコピーになる場合とならない場合があります。partialReturnプロパティがtrueの場合は、コピーを作成しなくても返すことが可能なテキストの量だけが返されます。部分的に返すことで、ドキュメントの大部分をスキャンする場合のパフォーマンスが向上します。部分的に返す方法でドキュメント全体にアクセスする例を次に示します。
int nleft = doc.getDocumentLength(); Segment text = new Segment(); int offs = 0; text.setPartialReturn(true); while (nleft > 0) { doc.getText(offs, nleft, text); // do something with text nleft -= text.count; offs += text.count; }
getText
、インタフェース: Document
offset
- 開始オフセット>= 0length
- 取得対象の文字数>= 0txt
- テキストを取得するSegmentオブジェクトBadLocationException
- 指定された範囲に、ドキュメント内の無効な位置が含まれる場合public Position createPosition(int offs) throws BadLocationException
このメソッドはスレッド・セーフですが、ほとんどのSwingメソッドは違います。詳細は、Swingでの並行性に関連しているサイトを参照してください。
createPosition
、インタフェース: Document
offs
- モデル内の位置>= 0BadLocationException
- 指定された位置が、関連するドキュメント内の有効な位置を示さない場合Document.createPosition(int)
public final Position getStartPosition()
getStartPosition
、インタフェース: Document
public final Position getEndPosition()
getEndPosition
、インタフェース: Document
public Element[] getRootElements()
getRootElements
、インタフェース: Document
public abstract Element getDefaultRootElement()
getDefaultRootElement
、インタフェース: Document
Document.getDefaultRootElement()
public Element getBidiRootElement()
public abstract Element getParagraphElement(int pos)
pos
- 開始オフセット>= 0protected final AbstractDocument.AttributeContext getAttributeContext()
protected void insertUpdate(AbstractDocument.DefaultDocumentEvent chng, AttributeSet attr)
chng
- 変更の説明attr
- 変更の属性protected void removeUpdate(AbstractDocument.DefaultDocumentEvent chng)
chng
- 変更の説明protected void postRemoveUpdate(AbstractDocument.DefaultDocumentEvent chng)
chng
- 変更の説明public void dump(PrintStream out)
out
- 出力ストリームprotected final AbstractDocument.Content getContent()
protected Element createLeafElement(Element parent, AttributeSet a, int p0, int p1)
parent
- 親要素a
- 要素の属性p0
- 範囲の始点>= 0p1
- 範囲の終点>= p0protected Element createBranchElement(Element parent, AttributeSet a)
parent
- 親要素a
- 属性protected final Thread getCurrentWriter()
null
protected final void writeLock()
writeLock
を取得しようとしないかぎり、複数のwriteLock
を取得できます。DocumentListener通知内からwriteLock
を取得しようとすると、IllegalStateException
となります。スレッドごとに複数のwriteLock
を取得する機能により、サブクラスはwriteLockを取得し、多数の操作を実行してから、ロックを解放できます。
writeLock
の呼出しは、writeUnlock
の呼び出しと回数が同じである必要があります。そうでないと、Document
がロック状態のままになり、読込みや書込みを実行できません。
IllegalStateException
- 不正なロックを試みた場合にスローされる。ドキュメントが適切に実装されていれば、ドキュメント・リスナーがドキュメントの変更を試みた場合にのみこの例外が発生することがある。こうした状況は、Beanイベント・モデルに違反している。このイベント・モデルでは配信の順序に保証はなく、変更が許可される前に、すべてのリスナーに通知される必要がある。protected final void writeUnlock()
writeLock
経由で取得された書込みロックを解除します。ロック数を1つ減らした後、未処理のロックがない場合は、新しい書込み側または読取り側が許可されます。writeLock()
public final void readLock()
readUnlock
を呼び出してください。readUnlock()
public final void readUnlock()
readLock();
try {
// do something
} finally {
readUnlock();
}
readLock()
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.