NickF_93
NickF_93

Reputation: 509

Custom JavaFX events

I have a custom event listener:

public interface IMyCustomListener {

  public void onEvent1(int param0);

  public void onEvent2(String param0);
}

now I would fire events with javafx events pattern (Event, EventTarget, EventHandler...), how can I do this?

Upvotes: 5

Views: 7821

Answers (1)

fabian
fabian

Reputation: 82491

You cannot. JavaFX uses javafx.event.Events or subtypes, so String or even primitive int can't be passed.

You could however create a custom subtype of Event and add the parameters to this class.

Similarly only classes implementing javafx.event.EventHandler can be registered as event handlers.

You could create a event handler class that delegates to your methods though:

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);
    }
}

Usage Example

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);
    }
});

Upvotes: 8

Related Questions