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();
}
_
空のスペースのどこかをクリックすると、EventHandler
はhandle()
メソッドを呼び出しますが、button
をクリックすると、handle()
メソッドは呼び出されません。 。アプリケーションには多くのボタンやその他のインタラクティブな要素があるため、要素ごとに新しいハンドラーを手動で追加することなく、それらの要素のクリックをキャッチするアプローチが必要です。
addEventFilter() を使用して、イベントフィルターをシーンに追加できます。これは、イベントが子コントロールによって消費される前に呼び出されます。イベントフィルターのコードは次のようになります。
scene.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
System.out.println("mouse click detected! " + mouseEvent.getSource());
}
});