JavaTM 2 Platform
Std. Ed. v1.3

javax.swing.text
インタフェース Document

既知のサブインタフェースの一覧:
StyledDocument
既知の実装クラスの一覧:
AbstractDocument

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 イベントモデルの規定では、いったんイベント通知を送信したら、イベントソースをさらに変更する前にすべてのリスナーに通知する必要があります。また、配信の順序は保証されません。

通知は、DocumentEvent および UndoableEditEvent という 2 つのイベントとしてなされます。Document を api を介して変更した場合は、登録されたすべての DocumentListeners に DocumentEvent が送られます。Document 実装が元に戻す機能と再実行機能をサポートしている場合は、登録されたすべての UndoableEditListeners に UndoableEditEvent が送られます。取り消し可能な編集がされなかった場合は、Document から DocumentEvent をトリガーして再度変更されたことを示します。しかし、この場合は、その編集は api を介してされた Document の変更というよりむしろソースの変更であるため、UndoableEditEvent は生成されません。

上記の図に関して、左に示されているコンポーネントが青い矩形で表されているドキュメントオブジェクトを変更したと仮定します。ドキュメントは両コンポーネントのビューに DocumentEvent を送信して応答し、履歴バッファを保持しているリスニングロジックに UndoableEditEvent を送ります。

上記の図に関して、右に示されているコンポーネントが青い矩形で表されているドキュメントオブジェクトを変更したと仮定します。ドキュメントは両コンポーネントのビューに DocumentEvent を送信して応答し、履歴バッファを保持しているリスニングロジックに UndoableEditEvent を送ります。

履歴バッファがロールバックされると、つまり、最後の UndoableEdit が実行されないと、両ビューに DocumentEvent が送られ、実行されなかった変更が両ビューに反映されます。つまり、右のコンポーネントの変更が削除されます。履歴バッファが再度別の変更をロールバックすると、さらに別の DocumentEvent が両ビューに送られ実行されなかったドキュメントの変更を反映させます。つまり、左のコンポーネントの変更を削除します。

ドキュメントの変化に関係するメソッドは次のとおりです。

プロパティ

通常、Document の実装には実行時に関連したプロパティセットがあります。よく知られた 2 つのプロパティは、Document がどこから出されたものかを記述するときに使用する StreamDescriptionProperty と Document に名前を付けるときに使用する TitleProperty です。プロパティに関係するメソッドは次のとおりです。

関連項目:
DocumentEvent, DocumentListener, UndoableEditEvent, UndoableEditListener, Element, Position, AttributeSet

フィールドの概要
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)
          モデルが非同期的な更新をサポートしている場合、並行性に直面してモデルを安全に描画できるようにします。
 

フィールドの詳細

StreamDescriptionProperty

public static final String StreamDescriptionProperty
ドキュメントを初期化するのに使うストリーム記述のプロパティ名です。ドキュメントがストリームから初期化され、ストリームについてなんらかの定義がある場合には、これを使います。

TitleProperty

public static final String TitleProperty
ドキュメントのタイトルがあれば、そのプロパティ名です。
メソッドの詳細

getLength

public int getLength()
ドキュメント内の現在のコンテンツの文字数を返します。
戻り値:
文字数 >= 0

addDocumentListener

public void addDocumentListener(DocumentListener listener)
ドキュメントに変更が加えられたときに通知の受信を開始するように、指定されたオブザーバを登録します。
パラメータ:
listener - 登録するオブザーバ
関連項目:
removeDocumentListener(javax.swing.event.DocumentListener)

removeDocumentListener

public void removeDocumentListener(DocumentListener listener)
指定されたオブザーバを通知リストから登録解除して、それ以上変更の更新を受信しないようにします。
パラメータ:
listener - 登録するオブザーバ
関連項目:
addDocumentListener(javax.swing.event.DocumentListener)

addUndoableEditListener

public void addUndoableEditListener(UndoableEditListener listener)
ドキュメントに取り消し可能な編集が加えられたときに通知の受信を開始するように、指定されたオブザーバを登録します。
パラメータ:
listener - 登録するオブザーバ
関連項目:
UndoableEditEvent

removeUndoableEditListener

public void removeUndoableEditListener(UndoableEditListener listener)
指定されたオブザーバを通知リストから登録解除して、それ以上更新を受信しないようにします。
パラメータ:
listener - 登録するオブザーバ
関連項目:
UndoableEditEvent

getProperty

public Object getProperty(Object key)
ドキュメントに関連したプロパティを返します。ドキュメントタイトル、作成者などの情報を格納できるようにします。
パラメータ:
key - null 以外のプロパティ
戻り値:
プロパティ

putProperty

public void putProperty(Object key,
                        Object value)
新しいプロパティをリストに置きます。
パラメータ:
key - null 以外のプロパティキー
value - プロパティの値

remove

public void remove(int offs,
                   int len)
            throws BadLocationException
ドキュメントのコンテンツの一部を削除します。これは、例外がスローされないかぎり、DocumentEvent.EventType.REMOVE タイプの DocumentEvent を登録されているすべての DocumentListeners に送ります。リスナーへの通知は DocumentListeners の removeUpdate を呼び出して行います。

無理のない動作を同時に満たすために、変更を実行してからイベントを送信します。これは、削除通知が送信されるときまでには、ドキュメントは既に更新され createPosition が作成したマークも変更されているからです。削除の場合は、削除範囲の終点は始点に収納されており、削除範囲内の任意のマークは範囲の始点に収納されています。

削除の結果 Document 構造が変更された場合は、変更に応じてどの Elements が挿入、削除されたのかという詳細も、生成された DocumentEvent に格納されます。削除によって構造がどのように変化するかは Document の実装によります。

Document が元に戻す機能と再実行する機能をサポートする場合は、UndoableEditEvent も生成されます。

パラメータ:
offs - 先頭からのオフセット >= 0
len - 削除対象の文字数 >= 0
例外:
BadLocationException - 削除範囲の 1 部がドキュメントの有効部分でなかった場合。例外内の位置は、最初に検出された不正な位置
関連項目:
DocumentEvent, DocumentListener, UndoableEditEvent, UndoableEditListener

insertString

public void insertString(int offset,
                         String str,
                         AttributeSet a)
                  throws BadLocationException
ドキュメントのコンテンツの文字列を挿入します。これは、例外がスローされないかぎり、DocumentEvent.EventType.INSERT タイプの DocumentEvent を登録された DocumentListeners に送ります。DocumentEvent の配信は DocumentListeners の insertUpdate を呼び出して行います。生成された DocumentEvent のオフセットと長さは、実際 Document にどのような変更がされたのかを示します。

挿入の結果 Document 構造が変更された場合は、変更に応じてどの Elements が挿入、削除されたのかという詳細も、生成された DocumentEvent に格納されます。挿入によって構造がどのように変化するかは Document の実装によります。

Document が元に戻す機能と再実行する機能をサポートする場合は、UndoableEditEvent も生成されます。

パラメータ:
offset - コンテンツを挿入するドキュメントに対するオフセット >= 0。指定位置やその後の変更を追跡するすべての位置が移動
str - 挿入する文字列
a - 挿入されたコンテンツに関連している属性。属性がない場合は null
例外:
BadLocationException - 指定された挿入の位置が、ドキュメント内の有効な位置ではない場合
関連項目:
DocumentEvent, DocumentListener, UndoableEditEvent, UndoableEditListener

getText

public String getText(int offset,
                      int length)
               throws BadLocationException
ドキュメントの指定部分内にあるテキストを取り出します。
パラメータ:
offset - テキストの望ましい先頭を表す、ドキュメントに対するオフセット >= 0
length - 望ましい文字列の長さ >= 0
戻り値:
長さ >= 0 の String 内のテキスト
例外:
BadLocationException - 指定範囲の 1 部がドキュメントの有効部分でなかった場合。例外内の位置は、最初に検出された不正な位置

getText

public void getText(int offset,
                    int length,
                    Segment txt)
             throws BadLocationException
ドキュメントの指定部分内にあるテキストを取り出します。
パラメータ:
offset - テキストの望ましい先頭を表す、ドキュメントに対するオフセット >= 0
length - 望ましい文字列の長さ >= 0
txt - テキストを返す先の Segment オブジェクト
例外:
BadLocationException - 指定範囲の 1 部がドキュメントの有効部分でなかった場合。例外内の位置は、最初に検出された不正な位置

getStartPosition

public Position getStartPosition()
ドキュメントの先頭を表す位置を返します。返された位置は、変更を追跡してドキュメントの先頭に常に位置するために利用できます。
戻り値:
位置

getEndPosition

public Position getEndPosition()
ドキュメントの末尾を表す位置を返します。返された位置は、変更を追跡してドキュメントの末尾に常に位置するために利用できます。
戻り値:
位置

createPosition

public Position createPosition(int offs)
                        throws BadLocationException
このメソッドを使用すると文字コンテンツのシーケンスの位置にマークを付けられます。このマークを使用してコンテンツの中で行われた挿入や削除のような変更を追跡できます。挿入に関してのポリシーは、挿入位置がゼロでない限り、常に挿入は最も一般的なケースである現在の位置よりも前にするということです。挿入位置がゼロの場合は、元の位置に続けて挿入されます。
パラメータ:
offs - ドキュメントの先頭からのオフセット >= 0
戻り値:
位置
例外:
BadLocationException - 指定された位置が、関連するドキュメント内の有効な位置を表さない場合

getRootElements

public Element[] getRootElements()
定義されているすべてのルート要素を返します。

一般的にドキュメント構造は 1 つだけですが、インタフェースはテキストデータに関して構造プロジェクションを任意の数だけ構築できるようにサポートしています。ドキュメントは、複数のドキュメント構造をサポートする複数のルート要素を持つことができます。以下に、例をいくつか示します。

戻り値:
ルート要素

getDefaultRootElement

public Element getDefaultRootElement()
ビューを要素構造に割り当てるほかの特定の機構が提供されていないかぎり、ビューのベースとなるルート要素を返します。
戻り値:
ルート要素

render

public void render(Runnable r)
モデルが非同期的な更新をサポートしている場合、並行性に直面してモデルを安全に描画できるようにします。指定された実行可能ファイルは、その実行中に何の変更もなくモデルを安全に読み取る方法で実行されます。実行可能ファイルは、それ自身で変更を加えることはできません。
パラメータ:
r - モデルを描画するために使用する Runnable

JavaTM 2 Platform
Std. Ed. v1.3

バグや機能要求の報告
さらに詳しい API リファレンスおよび開発者ドキュメントについては、 Java 2 SDK SE Developer Documentation を参照してください。このドキュメントには、概念、用語の定義、回避策、 実用的なコード例など、開発者を対象にした詳細な解説が掲載されています。

Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.