web-dev-qa-db-ja.com

JavaFXでどこでもマウスイベントを処理する

JavaFXアプリケーションがあり、シーン内の任意の場所でマウスクリックのイベントハンドラーを追加したいと思います。次のアプローチは問題なく動作しますが、私が望んでいる通りではありません。問題を説明するためのサンプルを次に示します。

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

空のスペースのどこかをクリックすると、EventHandlerhandle()メソッドを呼び出しますが、buttonをクリックすると、handle()メソッドは呼び出されません。 。アプリケーションには多くのボタンやその他のインタラクティブな要素があるため、要素ごとに新しいハンドラーを手動で追加することなく、それらの要素のクリックをキャッチするアプローチが必要です。

25
Sam De Meyer

addEventFilter() を使用して、イベントフィルターをシーンに追加できます。これは、イベントが子コントロールによって消費される前に呼び出されます。イベントフィルターのコードは次のようになります。

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