2017-10-09 15 views
0

私はカスタムイベントリスナを持っている:カスタムJavaFXのイベント

public interface IMyCustomListener { 

    public void onEvent1(int param0); 

    public void onEvent2(String param0); 
} 

今私は私がこれをどのように行うことができ、JavaFXのイベントパターン(イベント、のEventTarget、EventHandlerの...)でイベントを発生さでしょうか?

+1

アダプタを実装するだけです。しかし、JavaFXを使うだけで自分のインターフェースを定義するのはどうしてですか? – Michael

+1

同様の質問がすでに議論されています:[カスタムイベントの発行と処理の方法](https://stackoverflow.com/questions/27416758/how-to-emit-and-handle-custom-events) –

答えて

1

できません。 JavaFXはjavafx.event.Eventまたはサブタイプを使用するため、String、またはプリミティブintにさえ渡すことはできません。

ただし、カスタムサブタイプEventを作成し、このクラスにパラメータを追加することはできます。

同様に、javafx.event.EventHandlerを実装するクラスのみをイベントハンドラとして登録できます。

あなたはしかし、あなたのメソッドに委譲イベントハンドラクラスを作成することができます。

public abstract class CustomEvent extends Event { 

    public static final EventType<CustomEvent> CUSTOM_EVENT_TYPE = new EventType(ANY); 

    public CustomEvent(EventType<? extends Event> eventType) { 
     super(eventType); 
    } 

    public abstract void invokeHandler(MyCustomEventHandler handler); 

} 
public class CustomEvent1 extends CustomEvent { 

    public static final EventType<CustomEvent> CUSTOM_EVENT_TYPE_1 = new EventType(CUSTOM_EVENT_TYPE, "CustomEvent1"); 

    private final int param; 

    public CustomEvent1(int param) { 
     super(CUSTOM_EVENT_TYPE_1); 
     this.param = param; 
    } 

    @Override 
    public void invokeHandler(MyCustomEventHandler handler) { 
     handler.onEvent1(param); 
    } 

} 
public class CustomEvent2 extends CustomEvent { 

    public static final EventType<CustomEvent> CUSTOM_EVENT_TYPE_2 = new EventType(CUSTOM_EVENT_TYPE, "CustomEvent2"); 

    private final String param; 

    public CustomEvent2(String param) { 
     super(CUSTOM_EVENT_TYPE_2); 
     this.param = param; 
    } 

    @Override 
    public void invokeHandler(MyCustomEventHandler handler) { 
     handler.onEvent2(param); 
    } 

} 
public abstract class MyCustomEventHandler implements EventHandler<CustomEvent> { 

    public abstract void onEvent1(int param0); 

    public abstract void onEvent2(String param0); 

    @Override 
    public void handle(CustomEvent event) { 
     event.invokeHandler(this); 
    } 
} 

は使用例

Button btn = new Button("Say 'Hello World'"); 
btn.setOnAction((ActionEvent event) -> { 
    btn.fireEvent(new CustomEvent1(42)); 
    btn.fireEvent(new CustomEvent2("Hello World")); 
}); 

btn.addEventHandler(CustomEvent.CUSTOM_EVENT_TYPE, new MyCustomEventHandler() { 

    @Override 
    public void onEvent1(int param0) { 
     System.out.println("integer parameter: " + param0); 
    } 

    @Override 
    public void onEvent2(String param0) { 
     System.out.println("string parameter: "+param0); 
    } 
}); 
関連する問題