SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
~サーバーサイドとクライアントサイドのどちらでも対応できるEcho(2)

第24回

  • X ポスト
  • このエントリーをはてなブックマークに追加

テキスト入力関連のコンポーネント

 続いて、テキスト入力関連です。すでに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));
}
図2 TextField、PasswordField、TextAreaを表示したところ。TextFieldにテキストを書くと、リアルタイムにTextAreaにも表示される。
図2 TextField、PasswordField、TextAreaを表示したところ。TextFieldにテキストを書くと、リアルタイムにTextAreaにも表示される。

 例として、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ミリ秒遅れで同期を開始する」というようにしてます。

次のページ
リストの表示

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5447 2010/09/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング