テキスト入力関連のコンポーネント
続いて、テキスト入力関連です。すでにTextFieldは使いましたが、この他にもパスワードを入力するPasswordField、複数行のテキストを入力するTextAreaなどがあります。
void makeContent(Component component){
TextField field1 = new TextField();
component.add(field1);
PasswordField field2 = new PasswordField();
component.add(field2);
final TextArea area = new TextArea();
component.add(area);
field1.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void documentUpdate(DocumentEvent ev) {
Document doc = (Document)ev.getSource();
area.setText(doc.getText());
}
});
field1.set(TextComponentPeer.PROPERTY_SYNC_MODE,
new Integer(TextComponentPeer.SYNC_ON_CHANGE));
field1.set(TextComponentPeer.PROPERTY_SYNC_DELAY, new Integer(250));
}

例として、3つのテキスト入力用コンポーネントを並べて表示するサンプルを挙げておきます。先ほどのHeloAppにある「makeContent」メソッドだけを修正してください。また、単に表示するだけでは面白くないので、今回はTextFieldにテキストを書くと、それがTextAreaにも自動的に書き出されるようにしてみました。
各コンポーネントの作成は、単にnewするだけで非常に単純です。今回のポイントは、テキストを変更した時のイベント処理です。これらのテキスト入力用コンポーネントには、コンポーネントの内容を管理する「Document」というクラスのインスタンスが設定されています。これは、テキスト入力関連コンポーネントのモデルクラスであり、このDocumentの内容が変更されると、DocumentEventというイベントが発生して、DocumentListenerというイベントリスナーで処理することができます。ここではfield1を作成した後、
field1.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void documentUpdate(DocumentEvent ev) {……略……}
});
このようにしてDocumentの変更の処理を追加しています。TextFieldの「getDocument」でDocumentインスタンスを取得し、その「addDocumentListener」を使ってDocumentListenerインスタンスを設定しています。これで、Documentの内容(すなわち、このDocumentが設定されているTextFieldに書かれているテキスト)が変更されると、documentUpdateが呼び出されます。
ただし、デフォルトの状態では、テキストを変更してもdocumentUpdateは呼び出されません。どうやらデフォルトでは、クライアント側に表示される内容が変更されても、すぐにはサーバー側のDocumentに反映されないようなのです。そこで、クライアント=サーバー間の同期に関する設定を変更しておく必要があります。
field1.set(TextComponentPeer.PROPERTY_SYNC_MODE,
new Integer(TextComponentPeer.SYNC_ON_CHANGE));
field1.set(TextComponentPeer.PROPERTY_SYNC_DELAY, new Integer(250));
setは、第1引数に指定したプロパティの値を第2引数の値に設定するものです。ここでは、TextComponentPeerクラスに用意されている「PROPERTY_SYNC_MODE」「PROPERTY_SYNC_DELAY」というクラスフィールドのプロパティを変更しています。これらは同期モードと同期までのディレイ(待ち時間)に関するもので、ここでは「クライアント側の値が修正されたらすぐに同期を行う」「250ミリ秒遅れで同期を開始する」というようにしてます。
