web-dev-qa-db-fra.com

Gérez l'événement de la souris n'importe où avec JavaFX

J'ai une application JavaFX et je voudrais ajouter un gestionnaire d'événements pour un clic de souris n'importe où dans la scène. L'approche suivante fonctionne bien, mais pas exactement comme je le souhaite. Voici un exemple pour illustrer le problème:

public void start(Stage primaryStage) {
    root = new AnchorPane();
    scene = new Scene(root,500,200);
    scene.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println("mouse click detected! "+event.getSource());
        }
    });

    Button button = new Button("click here");
    root.getChildren().add(button);

    primaryStage.setScene(scene);
    primaryStage.show();
}

Si je clique n'importe où dans un espace vide, la EventHandler invoque la méthode handle(), mais si je clique sur button, la méthode handle() n'est pas invoquée . Il existe de nombreux boutons et autres éléments interactifs dans mon application, j'ai donc besoin d'une approche pour capturer les clics sur ces éléments également sans avoir à ajouter manuellement un nouveau gestionnaire pour chaque élément.

25
Sam De Meyer

Vous pouvez ajouter un filtre d'événements à la scène avec addEventFilter () . Cela sera appelé avant que l'événement ne soit consommé par les contrôles enfants. Voici à quoi ressemble le code du filtre d'événements.

scene.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent mouseEvent) {
        System.out.println("mouse click detected! " + mouseEvent.getSource());
    }
});
47
Brian Blonski