ドキュメント
文字データの制御
テキストコンポーネントはドキュメントと呼ばれる機能にモデルを実装しています
ドキュメントを操作することによって、開発者はテキストコンポーネントに対する
テキストの属性や、イベント、その他の制御を詳細に行うことができるようになります
ドキュメントは javax.swing.text.Document インターフェイスを実装します
public interface Document
このインターフェイスは、テキストの情報や制御のための様々なメソッドを宣言しています
コンポーネントは、この Document に対してテキスト情報のやり取りを行います
そのため、ドキュメントを実装することによって
最終的に、テキストコンポーネントの振る舞いを制御することができます
テキスト情報は Document.getLength() が文字数を
Document.getText() メソッドが指定位置の文字列を返します
public int getLength()
public String getText(
int offset , int length
) throws BadLocationException
public void getText(
int offset , int length , Segment txt
) throws BadLocationException
offset には取得する文字列の最初のオフセットを
length にはオフセットからの取得する文字数を指定します
txt は、戻り値の代わりにテキストを受け取るためのセグメントを指定します
セグメントは、文字列を char 配列で扱うためのクラスで
文字配列に高速にアクセスする必要がある場合に有効です
セグメントについて、この場では省略します
テキストの入力は Document.insertString() メソッドを
削除は Document.remove() メソッドを使って行います
public void insertString(
int offset , String str , AttributeSet a
) throws BadLocationException
public void remove(
int offs , int len
) throws BadLocationException
offset には、文字を挿入する位置を、str には挿入する文字列を指定します
a 挿入されたコンテンツに関連している属性を指定します
特に属性を指定する必要がなければ null を指定します
offs には削除する文字の開始位置、len は offs から削除する文字数を指定します
AttributeSet には、文字列の書式情報を指定するためのものです
これについて、詳しくは後ほど解説します
Document にはこのほかにもモデルとして必要なメソッドを宣言していますが
特別なモデルを建築する場合を除いて、これらを全て自分で実装する必要はありません
Swing は javax.swing.text.PlainDocument クラスを提供しています
java.lang.Object
|
+--javax.swing.text.AbstractDocument
|
+--javax.swing.text.PlainDocument
public class PlainDocument extends AbstractDocument
PlainDocument は純粋なテキスト情報のためのモデルです
既定となる AbstractDocument は Document インターフェイスを実装する抽象クラスで
Swing がサポートする標準ドキュメントは、AbstractDocument がルートとなります
このクラスのコンストラクタは、次のようなものがあります
public PlainDocument()
public PlainDocument(AbstractDocument.Content c)
c には編集可能な文字配列を制御するコンテンツのコンテナを指定します
これは javax.swing.text.AbstractDocument.Content インターフェイスで
文字シーケンスを操作するためのメソッドを宣言しています
public static interface AbstractDocument.Content
この場では、特にこのインターフェイスを実装する必要はありません
PlainDocument クラスを拡張することによって、目的のテキスト制御を実装できます
例えば、特定の文字の入力だけを許可するなど
コンポーネントがモデルに行う操作に規制をかけることができるようになるでしょう
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class Test extends JApplet {
public void init() {
JTextField text = new JTextField(20);
text.setDocument(new IntegerDocument());
getContentPane().setLayout(new FlowLayout());
getContentPane().add(text , BorderLayout.NORTH);
}
}
class IntegerDocument extends PlainDocument {
public void insertString(int offs , String str ,
AttributeSet a) throws BadLocationException {
try { Integer.parseInt(str); }
catch(Exception err) { return; }
super.insertString(offs , str , a);
}
}
このプログラムは、数値しか入力することのできない
IntegerDocument ドキュメントを作成し、テキストコンポーネントに設定しています