自定义 JavaFX 事件

Nic*_*_93 4 java events javafx listener

我有一个自定义事件侦听器:

public interface IMyCustomListener {

  public void onEvent1(int param0);

  public void onEvent2(String param0);
}
Run Code Online (Sandbox Code Playgroud)

现在我将使用 javafx 事件模式(Event、EventTarget、EventHandler...)触发事件,我该怎么做?

fab*_*ian 6

你不能。JavaFX 使用javafx.event.Events 或子类型,因此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);

}
Run Code Online (Sandbox Code Playgroud)
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);
    }

}
Run Code Online (Sandbox Code Playgroud)
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);
    }

}
Run Code Online (Sandbox Code Playgroud)
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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用示例

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);
    }
});
Run Code Online (Sandbox Code Playgroud)