2

Oracle の Web サイトで、次のようなコードを見つけました。スペース上の理由から、レイアウトに関して無関係なものを削除しました。

private JTextField textField;

public class TextDemo extends JPanel implements ActionListener
{
    public TextDemo()
    {
        textField = new JTextField(5);
        //This causes a leaking this in constructor warning...
        textField.addActionListener(this);

        //code here for layout and to add the textfield to the panel
    }


    private static int ctr = 0;

    @Override
    public void actionPerformed(ActionEvent evt)
    {
        System.out.println(ctr++);           
    }

}

そこで、この actionListener がいつアクションを検出しているかを確認するためにカウンターを出力してインクリメントする print ステートメントを作成しました。

私は考えていた:

  1. このメソッドをトリガーする唯一のアクションは、入力ボタンですか?
  2. thisオブジェクトのアクション リスナーにアタッチしたコンストラクターではtextField、正確には何が起こるのでしょうか?
4

4 に答える 4

1

最初: 通常、JTextField に DocumentListener を使用します。何が起こっているかについて、より多くの興味深い情報を伝えます。実際には、GUI フィールドの背後にあるドキュメント (一種のモデル) に関連付けられています。

今:

Q1 - Swing 画面コンポーネントでさまざまなイベントを引き起こすマウスとキーボードのアクションを特定するのは困難です。私が覚えているように、それはActionPerformed. JTextFieldただし、任意のアクション イベントを発生させるカスタム コードを a のサブクラスに追加することができます。これを行う場合は注意が必要です。

Q2: Listener オブジェクトは、テキスト フィールドでいつアクション イベントが発生したかを知りたいすべてのオブジェクトのリストに格納されます。これが発生すると、テキスト フィールドはactionPerformed()リスナー リスト内のすべてのオブジェクトに対してメソッドを呼び出します。

Observer Patternについて調査することをお勧めします。これは、この種のことを行うコードのビットによく使用される名前です。多くの状況で使用できます。重要なのは、リスナーとリスナー (オブザーバーとオブザード) を疎結合することです。リッスンしているオブジェクトは、リッスンしているオブジェクトに対して、特定の場合に通知が必要であることを伝えるだけで済みます。リッスンされているオブジェクトは、リッスンしているすべてのさまざまなオブジェクトのリストと、それらが通知を受けたいイベントを保持します。接続はこれだけで、簡単なインターフェースを使用して簡単にプログラムできます。

于 2013-04-30T20:49:12.263 に答える