public interface Document
Document
は swing テキストコンポーネントのモデルとなるテキストのコンテナです。このインタフェースのめざすところはプレーンテキストのテキストフィールドのように非常にシンプルなものから HTML または XML のように複雑なものにまで対応できるようにスケーリングすることです。
コンテンツ
もっともシンプルなレベルでは、テキストは線状に伸びる一連の文字として形成されます。国際化に備えて Swing テキストモデルは unicode 文字を使用します。通常、テキストコンポーネントに表示される文字シーケンスはコンポーネントのコンテンツと呼ばれます。
シーケンス内の場所を参照するために 2 文字間の位置座標を使用します。下の図に示すように、テキストドキュメント内の場所は位置として、またはオフセットとして示すことができます。この位置はゼロから始まります。
たとえば、前の図のようにドキュメントのコンテンツが「The quick brown fox」というシーケンスの場合、「The」の前の場所は 0 で、「The」の後とそれに続く空白の間の場所は 3 となります。「The」というシーケンスの全文字シーケンスを範囲と呼びます。
次のメソッドでコンテンツを構成する文字データへアクセスできます。
構造
テキストが単調なコンテンツとして表されることはほとんどありません。むしろ、通常、テキストはコンテンツと関連した構造になっています。正確にどの構造がモデルになっているかは特定の Document 実装により異なります。単純なテキストフィールドのように構造がないようなシンプルなものもあれば、下の図のようなものもあります。
構造単位、すなわちツリーのノードは Element インタフェースで表せます。各 Element は属性のセットによりタグを付けることができます。こういう名前と値のペアの属性は AttributeSet インタフェースで定義されます。
次のメソッドでドキュメント構造へアクセスできます。
変更
すべてのドキュメントは簡単なテキストの追加および削除ができる必要があります。通常、テキストはキーボードまたはマウスのジェスチャーで挿入、削除ができます。挿入、削除をした結果ドキュメント構造にどういう影響があるかはすべてドキュメントの実装によります。
次のメソッドはドキュメントコンテンツの変化に関係付けられています。
通知
Document
に変更が生じた場合は関係者に通知する必要があります。変更通知は JavaBeans に指定されているイベントモデルのガイドラインに準じます。JavaBeans イベントモデルの規定では、いったんイベント通知を送信したら、イベントソースをさらに変更する前にすべてのリスナーに通知する必要があります。また、配信の順序は保証されません。
通知は、2 つの別個のイベント、DocumentEvent と UndoableEditEvent として提供されます。API を介して Document
が変更された場合、登録されているすべての DocumentListeners
に DocumentEvent
が送信されます。Document
の実装が元に戻す機能や再実行機能をサポートしている場合、登録されているすべての UndoableEditListener
に UndoableEditEvent
が送信されます。取り消し可能な編集が取り消された場合、Document から DocumentEvent
をトリガーして再度変更されたことが示されます。しかしこの場合、その編集は API を介して行われた Document
の変更というよりむしろソースの変更であるため、UndoableEditEvent
は生成されません。
上記の図に関して、左に示されているコンポーネントが青い矩形で表されているドキュメントオブジェクトを変更したと仮定します。ドキュメントは両コンポーネントのビューに DocumentEvent を送信して応答し、履歴バッファーを保持しているリスニングロジックに UndoableEditEvent を送ります。
上記の図に関して、右に示されているコンポーネントが青い矩形で表されているドキュメントオブジェクトを変更したと仮定します。ドキュメントは両コンポーネントのビューに DocumentEvent を送信して応答し、履歴バッファーを保持しているリスニングロジックに UndoableEditEvent を送ります。
履歴バッファーがロールバックされると、つまり、最後の UndoableEdit が実行されないと、両ビューに DocumentEvent が送られ、実行されなかった変更が両ビューに反映されます。つまり、右のコンポーネントの変更が削除されます。履歴バッファーが再度別の変更をロールバックすると、さらに別の DocumentEvent が両ビューに送られ実行されなかったドキュメントの変更を反映させます。つまり、左のコンポーネントの変更を削除します。
ドキュメントの変化に関係するメソッドは次のとおりです。
プロパティー
通常、Document の実装には実行時に関連したプロパティーセットがあります。よく知られた 2 つのプロパティーは、Document
がどこから出されたものかを記述するときに使用する StreamDescriptionProperty と Document
に名前を付けるときに使用する TitleProperty です。プロパティーに関係するメソッドは次のとおりです。
Document
クラスの詳細は、「The Swing Connection」、およびもっとも詳細な「The Element Interface」を参照してください。
修飾子と型 | フィールドと説明 |
---|---|
static String |
StreamDescriptionProperty
ドキュメントの初期化に使用するストリームの記述のプロパティー名です。
|
static String |
TitleProperty
ドキュメントのタイトルがある場合、そのプロパティー名です。
|
修飾子と型 | メソッドと説明 |
---|---|
void |
addDocumentListener(DocumentListener listener)
ドキュメントに変更が加えられたときに通知の受信を開始するように、指定されたオブザーバを登録します。
|
void |
addUndoableEditListener(UndoableEditListener listener)
ドキュメントに取り消し可能な編集が加えられたときに通知の受信を開始するように、指定されたオブザーバを登録します。
|
Position |
createPosition(int offs)
このメソッドを使用すると文字コンテンツのシーケンスの位置にマークが付けられます。
|
Element |
getDefaultRootElement()
ルート要素を返します。要素の構造にビューを割り当てる別のメカニズムが提供されないかぎり、このルート要素がビューのベースになります。
|
Position |
getEndPosition()
ドキュメントの末尾を表す位置を返します。
|
int |
getLength()
ドキュメント内の現在のコンテンツの文字数を返します。
|
Object |
getProperty(Object key)
ドキュメントに関連するプロパティーを取得します。
|
Element[] |
getRootElements()
定義されているすべてのルート要素を返します。
|
Position |
getStartPosition()
ドキュメントの先頭を表す位置を返します。
|
String |
getText(int offset, int length)
ドキュメントの指定部分内にあるテキストを取得します。
|
void |
getText(int offset, int length, Segment txt)
ドキュメントの指定部分内にあるテキストを取得します。
|
void |
insertString(int offset, String str, AttributeSet a)
コンテンツの文字列を挿入します。
|
void |
putProperty(Object key, Object value)
プロパティーとドキュメントを関連付けます。
|
void |
remove(int offs, int len)
ドキュメントのコンテンツの一部を削除します。
|
void |
removeDocumentListener(DocumentListener listener)
指定されたオブザーバを通知リストから登録解除して、それ以上変更の更新を受信しないようにします。
|
void |
removeUndoableEditListener(UndoableEditListener listener)
指定されたオブザーバを通知リストから登録解除して、それ以上更新を受信しないようにします。
|
void |
render(Runnable r)
モデルが非同期的な更新をサポートしている場合、並行性が存在する状態でモデルを安全に描画できるようにします。
|
static final String StreamDescriptionProperty
int getLength()
void addDocumentListener(DocumentListener listener)
listener
- 登録するオブザーバremoveDocumentListener(javax.swing.event.DocumentListener)
void removeDocumentListener(DocumentListener listener)
listener
- 登録するオブザーバaddDocumentListener(javax.swing.event.DocumentListener)
void addUndoableEditListener(UndoableEditListener listener)
listener
- 登録するオブザーバUndoableEditEvent
void removeUndoableEditListener(UndoableEditListener listener)
listener
- 登録するオブザーバUndoableEditEvent
Object getProperty(Object key)
key
- null
以外のプロパティーキーputProperty(Object, Object)
void putProperty(Object key, Object value)
StreamDescriptionProperty
および TitleProperty
です。作成者などほかのプロパティーも定義されます。key
- null
以外のプロパティーキーvalue
- プロパティー値getProperty(Object)
void remove(int offs, int len) throws BadLocationException
無理のない動作を同時に満たすために、変更を実行してからイベントを送信します。これは、削除通知が送信されるときまでには、ドキュメントはすでに更新され createPosition
が作成したマークも変更されているからです。削除の場合は、削除範囲の終点は始点に収納されており、削除範囲内の任意のマークは範囲の始点に収納されています。
削除の結果 Document 構造が変更された場合は、変更に応じてどの Elements が挿入、削除されたのかという詳細も、生成された DocumentEvent に格納されます。削除によって構造がどのように変化するかは Document の実装によります。
Document が元に戻す機能と再実行する機能をサポートする場合は、UndoableEditEvent も生成されます。
offs
- 先頭からのオフセット >= 0len
- 削除対象の文字数 >= 0BadLocationException
- 削除範囲の一部がドキュメントの有効な部分でなかった場合。例外内の位置は、最初に検出された不正な位置。DocumentEvent
, DocumentListener
, UndoableEditEvent
, UndoableEditListener
void insertString(int offset, String str, AttributeSet a) throws BadLocationException
挿入の結果 Document 構造が変更された場合は、変更に応じてどの Elements が挿入、削除されたのかという詳細も、生成された DocumentEvent に格納されます。挿入によって構造がどのように変化するかは Document の実装によります。
Document が元に戻す機能と再実行する機能をサポートする場合は、UndoableEditEvent も生成されます。
offset
- コンテンツを挿入するドキュメント内のオフセット。0 以上。指定位置やその後ろの変更を追跡するすべての位置が移動します。str
- 挿入する文字列a
- 挿入されたコンテンツに関連付ける属性。属性がない場合は null も可。BadLocationException
- 指定された挿入位置がドキュメント内の有効な位置でない場合DocumentEvent
, DocumentListener
, UndoableEditEvent
, UndoableEditListener
String getText(int offset, int length) throws BadLocationException
offset
- テキストの望ましい開始位置を表す、ドキュメントのオフセット >= 0length
- 望ましい文字列の長さ >= 0BadLocationException
- 範囲の一部がドキュメントの有効な部分でなかった場合。例外内の位置は、最初に検出された不正な位置。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 someting with text
nleft -= text.count;
offs += text.count;
}
offset
- テキストの望ましい開始位置を表す、ドキュメントのオフセット >= 0length
- 望ましい文字列の長さ >= 0txt
- テキストを返す先の Segment オブジェクトBadLocationException
- 範囲の一部がドキュメントの有効な部分でなかった場合。例外内の位置は、最初に検出された不正な位置。Position getStartPosition()
Position getEndPosition()
Position createPosition(int offs) throws BadLocationException
offs
- ドキュメントの先頭からのオフセット >= 0BadLocationException
- 指定された位置が、関連するドキュメント内の有効な位置を示さない場合Element[] getRootElements()
一般的にドキュメント構造は 1 つだけですが、インタフェースはテキストデータに関して構造プロジェクションを任意の数だけ構築できるようにサポートしています。ドキュメントは、複数のドキュメント構造をサポートする複数のルート要素を持つことができます。次に、例をいくつか示します。
Element getDefaultRootElement()
void render(Runnable r)
r
- モデルを描画するために使用する Runnable
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.