Eventhandler?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich kenne nur die beiden Varianten.

Variante 1

Button button 1 = new Button();

EventHandler<ActionEvent> event = new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Hallo Welt!");
                }
};

button1.setOnAction(event);

Variante 2 

Button button1 = new Button();

button1.setOnAction(new EventHandler<ActionEvent>() {
                
                @Override
                public void handle(ActionEvent e) {
                    System.out.println("Hallo Welt!");
                }
});

a) Einige Klassen (wie Node oder Scene) besitzen Convenience Methods. Diese Methoden stellen einen einfachen Weg, Event Handler für bestimmte Events (Mausklicks, Scrolling, etc.) zu registrieren.

Beispiel:

someButton.setOnMouseClicked(event -> {
  /* do something ... */
});

b) Du kannst Event Handler über die addEventHandler-Methode registrieren.

Beispiel:

someNode.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
  /* do something ... */
});

c) Du kannst einfache Event Handler in FXML registrieren.

Beispiel:

<Button text="Click me" onAction="#someAction" />

Im Controller wird die Methode dann definiert:

@FXML
protected void someAction(ActionEvent event) {
  /* do something ... */
}

Oder man definiert den Handler in einem fx:script-Element (mit JavaScript) und referenziert direkt im Attribut darauf:

<Button text="Click me" onAction="someAction()" />
<fx:script>
  function someAction() {
    /* do something ... */
  }
</fx:script>

d) In JavaFX durchlaufen Events verschiedene Phasen. Innerhalb der Bubbling-Phase werden die registrierten Event Handler abgearbeitet. Man kann aber auch schon Events in der Capturing-Phase behandeln, die viel früher durchlaufen wird.

Hierfür würde man sogenannte Event Filter registrieren. Sie werden als Filter bezeichnet, da sie auch dafür sorgen können, dass bestimmte Events auf bestimmten Knoten nicht behandelt werden.

Beispiel:

someNode.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
  /* do something ... */
});