JavaFXでのイベント処理 を理解しようとしていたところ、この行が見つかりました。
ルートは、ルートに沿ったイベントフィルターとイベントハンドラーがイベントを処理するときに変更できます。また、イベントフィルターまたはイベントハンドラーがいずれかの時点でイベントを消費する場合、初期ルート上の一部のノードがイベントを受信しない可能性があります。
イベントが消費する意味を説明できますか?
イベントは特定のルートに沿って渡されます。ほとんどの場合(マウス/キーイベントなど)、ルートはNode
のルートScene
から始まり、シーングラフのルートNode
からターゲットNode
までのパス上のすべてのNode
を含みます。ターゲットNode
へのルートで、イベントfiltersが実行され、これらのフィルターのいずれかがイベントを消費する必要がある場合、これによりイベントのそれ以上の処理が停止します。イベントがターゲットNode
に到達したら、ルートに「移動」してイベントを呼び出しますhandler途中で。イベントを消費することで、そこでもイベント処理を停止できます。
例:
_@Override
public void start(Stage primaryStage) {
Rectangle rect = new Rectangle(50, 50);
StackPane root = new StackPane(rect);
rect.addEventFilter(MouseEvent.MOUSE_CLICKED, evt -> {
System.out.println("rect click(filter)");
// evt.consume();
});
root.addEventFilter(MouseEvent.MOUSE_CLICKED, evt -> {
System.out.println("root click(filter)");
// evt.consume();
});
root.setOnMouseClicked(evt -> {
System.out.println("root click(handler)");
// evt.consume();
});
rect.setOnMouseClicked(evt -> {
System.out.println("rect click(handler)");
// evt.consume();
});
Scene scene = new Scene(root, 200, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
_
rect
をクリックすると、イベント処理はroot
Node
から始まります。ここでフィルターが実行されます。イベントがフィルターで消費されない場合は、rect
Node
に渡され、そこでイベントフィルターがイベントを受信します。そのイベントがフィルターによって消費されない場合、rect
のイベントハンドラーがイベントを受信します。イベントがそのイベントハンドラーによって消費されない場合、root
Node
のイベントハンドラーがイベントを受信します。
evt.consume()
呼び出しのコメントを解除して、何が起こるかを確認してください...