テキスト入力関連のコンポーネント
続いて、テキスト入力関連です。すでに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ミリ秒遅れで同期を開始する」というようにしてます。