2012-02-18 6 views
2

これはフレーズが非常に難しいですが、特定のメソッドをオブジェクトにリンクできる必要があります。具体的には、グラフィック指向のGUIを作成しています。ボタンなどの要素のデフォルトの「アクション」関数として任意のメソッドを割り当てることができるようにしたいと考えています。Javaでメソッド参照を渡す方法はありますか?

つまり、私は基本的に自分自身を描く能力を持っているこれらのインターフェイス「グラフィックス」オブジェクトを作成しました。各要素は、それ自身を呼び出します

b1.action(); 
b2.action(); 

:私はのような何かを行う場合は、次に

GraphicObject b1 = new Button(); 
GraphicObject b2 = new Button(); 
b1.assignDefaultAction(---some method reference here--); 
b2.assignDefaultAction(---a different method reference here--); 

:私は、彼らが自分のアクションを処理したいと思いますので、私は、例えば、このような何かを行うことができます独立して参照されるメソッドです。私はこれがC++でできると信じていますが、私はJavaでそれを見ていません。それは可能なのでしょうか、あるいは何らかの回避策がありますか?私が避けようとしていることは、私がやる必要のある小さなことごとに抽象化を作成しなければならないか、100枚の仕様で私の入っているJPanelを捨てるだけです。

ありがとうございました。

答えて

6

ボタンはActionListenerの実装を使用する必要があります。その特定のケースでスイングに固執する。

独自のクラスには追随し、Commandパターンインターフェースで起動することもできます。

public interface Command { 
    public void execute(Map<String, Object> parameters); 
} 

それとも、良いアイデアJDKが提供するAPIに固執し、Callableを試してみることです。

1

Javaにはメソッド参照がありません。代わりに、擬似クロージャ(匿名の内部クラス)を使用することができます。これに伴う唯一の問題はもちろん、必要に応じて関数を再利用することはできません。

+2

真わけではありません。 JavaにはMethodオブジェクトがあります。http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.htmlを参照してください。しかし、duffymoが言及しているように、代わりにActionListenersを使用することをお勧めします。 – GreyBeardedGeek

+0

Hmmm、反映されたMethodをメソッド参照と同じにするかどうかわかりません。それを呼び出すには、そのクラスを含むクラスのインスタンスが必要です。また、メソッドReflectionを使用した場合、メソッドのシグネチャを強制するのは難しいでしょうか? – Perception

+0

合意 - これが、ActionListenerが推奨されるソリューションになる理由です。 – GreyBeardedGeek

0

通常、これを行うにはActionListenerの匿名の内部クラスを使用し、actionPerformedメソッドで必要なメソッド呼び出しを追加します。以下のような

何か:

b.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent a) { 
     b.someMethod(); 
    }    
}); 
0

のJava 8以降では、使いやすいメソッド参照とラムダ式があるでしょう。

ボタンにアクションを割り当てることは、実際には最も重要な例です。

bttnExit.setOnAction((actionEvent) -> { Platform.exit(); }); 

や、メソッドの参照を使用して:

bttnExit.setOnAction(MyClass::handleExitButton); 
関連する問題