Minimal code example:
public class HelloApplication extends Application implements EventHandler<HelloApplication.MyEvent> {
public class MyEvent extends Event {
public static final EventType TYPE = new EventType<>(Event.ANY, "MyType");
public MyEvent() {
super(TYPE);
}
}
@Override
public void handle(MyEvent myEvent) {
System.out.println("Event handled!");
}
@Override
public void start(Stage stage) throws IOException {
BorderPane root = new BorderPane();
stage.setScene(new Scene(root, 640, 480));
Button button1 = new Button("Click");
button1.setOnAction(event -> {
button1.fireEvent(new MyEvent());
System.out.println("Event fired!");
});
root.setTop(button1);
Button button2 = new Button("Clack");
button2.addEventHandler(MyEvent.TYPE, this);
root.setBottom(button2);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
I get "Event fired!" in my console but not "Event handled!".
It works when I add the event listener to button1. Am I missing something obvious? Is it not possible to fire an event on A and listen to it on B?
The code
button2.addEventHandler(MyEvent.TYPE, this);
registers the current HelloApplication
instance (this
) as an event handler with button2
. This means that whenever button2
fires an event with event type MyEvent.TYPE
, then this.handle(...)
will be invoked.
However, in the code you posted, button2
never fires such an event. The only time that event is fired is via the code
button1.fireEvent(new MyEvent());
which of course causes button1
to fire the event, not button2
.