1

Java 自体と Java Swing について理解し始めたばかりで、「アクション リスナー」の概念を理解するのに問題があります。C# と Java はよく似ていると言われますが、実際に両方を試して比較すると、話は別です。

ボタン用に次の自動生成されたアクション リスナーがあります。

btnNewButton.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
        lblNylabel.setText("New label text");
    }
});

私はそれを次のように理解しています:

  1. オブジェクト「btnNewButton」を介して非静的メソッドを呼び出しますbtnNewButton.addActionListener()
  2. このメソッドは、1 つの ActionListener インスタンスを引数として取ります
  3. 自動化されたコードは、「new ActionListener()」コンストラクター呼び出しを介して ActionListener インスタンスをインスタンス化します - 私が理解できないのは、ActionListener クラスを自分でインスタンス化できないことですが、メソッド呼び出しの引数として可能ですか??
  4. 「actionPerformed」メソッドが新しいインスタンス本体内で生成され、ここで使用されます (何?)
  5. 「actionPerformed」メソッド内で、ボタンがクリックされたときに何をするかを定義します - 完全に理にかなっています

ActionListenerの概念を理解するのに役立つ、より理解しやすい/簡単な方法でこれを行うことは可能ですか?

4

1 に答える 1

12

私が理解していないのは、ActionListenerクラスを自分でインスタンス化できないということですが、メソッド呼び出しの引数としては可能ですか?

あなたがするとき

new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        lblNylabel.setText("New label text");
   }
}

実際には、の匿名サブクラスのインスタンスを作成していますActionListener

それは意味的に行うことと同等です

class AnonymousActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        lblNylabel.setText("New label text");
   }
}

btnNewButton.addActionListener(new AnonymousActionListener());

(そして、tada、ボーナスとして、Javaでメソッドローカルクラスを持つことができることを学びました;-)


一般的な選択肢は次のとおりです。

  1. 別の通常のクラスを使用します。

    class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            lblNylabel.setText("New label text");
        }
    }
    
    class YourClass {
    
        public void yourMethod() {
            ...
            btnNewButton.addActionListener(new MyActionListener());
        }
    }
    

    (他のクラスが必要な変数にアクセスできる場合にのみ可能です。)

  2. 上記と同じですが、内部(非静的)クラスがあります:

    class YourClass {
    
        public void yourMethod() {
            ...
            btnNewButton.addActionListener(new MyActionListener());
        }
    
        // Inner class
        class MyActionListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                lblNylabel.setText("New label text");
            }
        }
    }
    

    (ここでlblNylabelは、おそらく内部クラスのスコープになります。)

  3. 囲んでいるクラス自体がを実装し、ActionListenerthis引数として使用するようにしaddActionListenerます。

    class YourClass implements ActionListener {
    
        public void yourMethod() {
            ...
            btnNewButton.addActionListener(this);
        }
    
        public void actionPerformed(ActionEvent e) {
            lblNylabel.setText("New label text");
        }
    }
    
于 2012-04-25T07:19:28.463 に答える