web-dev-qa-db-ja.com

JavaFXでイベントが消費する意味は何ですか

JavaFXでのイベント処理 を理解しようとしていたところ、この行が見つかりました。

ルートは、ルートに沿ったイベントフィルターとイベントハンドラーがイベントを処理するときに変更できます。また、イベントフィルターまたはイベントハンドラーがいずれかの時点でイベントを消費する場合、初期ルート上の一部のノードがイベントを受信しない可能性があります。

イベントが消費する意味を説明できますか?

11
Asif Mushtaq

イベントは特定のルートに沿って渡されます。ほとんどの場合(マウス/キーイベントなど)、ルートは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をクリックすると、イベント処理はrootNodeから始まります。ここでフィルターが実行されます。イベントがフィルターで消費されない場合は、rectNodeに渡され、そこでイベントフィルターがイベントを受信します。そのイベントがフィルターによって消費されない場合、rectのイベントハンドラーがイベントを受信します。イベントがそのイベントハンドラーによって消費されない場合、rootNodeのイベントハンドラーがイベントを受信します。

evt.consume()呼び出しのコメントを解除して、何が起こるかを確認してください...

16
fabian