2010-12-02 12 views
1

addActionListenerメソッドにこのような引数を渡すこのアプローチが何であるか説明してください。私はJButtonタイプのボタン変数が作成され、イベントリスナーが定義されていることを理解しています。私にとってaddActionListener引数、つまりactionPerformedのメソッド定義が本当に明確ではありません。このようなアプローチはどこでできますか?ありがとう。ここで何が起こっている引数をメソッドに渡します。 Java

JButton button = new JButton("New button"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     System.out.println("Hello"); 
    } 
}); 
+1

:それは第一級市民としての機能(IMOかなり基本的なと)くそ便利な機能を欠いているJavaの周りにハックです。 – delnan

+2

ある日Javaは閉鎖します.... JDK 8(2012):P –

+0

Java 10で、20代前半になると思います。 – whiskeysierra

答えて

7

addActionListenerがパラメータとしてimplements ActionListenerそのオブジェクトを取ることです。

あなたはActionListenerインターフェースによって必要とされる方法actionPerformedを規定ActionListenerインタフェースを実装anonymous classとその中を作成しています。

この匿名クラスはオブジェクトとしてインスタンス化され、そのオブジェクトはaddActionListenerメソッドに渡されます。

+1

ありがとう。それは良いアプローチと考えられているか、ActionListenerインターフェースを実装する内部クラスを明確に定義する方が良いでしょうか? – Eugene

+2

'ActionListener'のために匿名のクラスを使うのはとても普通です(そして私の考えではっきりしています)。なぜなら、ボタンがある場所で何をしているのかを特定の場所で一度しか使わないからです。ネームスペースを乱雑にしているボタンごとに、別の名前のインナークラスを必要としません。 –

+1

私の意見では、ファーストクラスの関数とクロージャ/ lambdaを持つ他の言語と比べると面倒な解決策ですが、単純にコードのブロックを定義してクラス全体を構築するのではなく関数に渡すことができますそれ。しかし、Javaは(まだ)ここにもそこにもないこれを行うことはできません。他の言語のやり方を調べ始めるなら、覚えておいてください。 –

2

button.addActionListener()では、実装されるクラスはanonymous inner classと呼ばれます。このクラスは、addActionListener()メソッド内にのみ存在し、他の誰にも知られていません。基本的には、addActionListener()に渡されるActionListener(インターフェイスであっても)を作成しています。

ActionListenerはインターフェイスなので、actionPerformed()メソッドを実装する必要があります。 JButtonにイベントが発生すると、JButtonのリスナーには、ActionEventというイベントが(actionPerformed()メソッドを通じて)通知されます。ウィキペディアから ただ、さらに(追加)注:イベント処理コードだけ つのコンポーネントで使用されている場合

匿名内部クラスも を使用しているため、 は、名前の参照を必要としません。

のif-else分岐 これは、イベントのソースを識別するために、複数の大型モノリシック actionPerformed(ActionEvent)方法を回避します。 このタイプのコードはしばしば と思われ、内部クラスのバリエーション はすべてが良いと考えられます。

これは基本的にObserver Pattern(特別なボーナス回答)です。

0

あなたの質問に文字通り答えるには、メソッドを引数として渡すことができます。 (のJava fanboiの観点から、おそらく攻撃)短いそれを置くために

Method method = clazz.getMethod("method-name", method-parameter.class); 
yourObject.call(method);