事件在 JavaFX 中的含义是什么

2022-09-04 01:44:15

我试图理解JavaFX中的事件处理,在那里我发现了这一行。

可以修改路由,因为沿路由处理事件的事件筛选器和事件处理程序。此外,如果事件筛选器或事件处理程序在任何时候使用该事件,则初始路由上的某些节点可能不会收到该事件。

你能解释一下事件消费的含义是什么吗?


答案 1

事件沿特定路由传递。在大多数情况下(例如鼠标/键事件),路由将从的根目录开始,并在场景图中包含从根到目标的路径上的所有路径。在到目标的路由上,将执行事件过滤器,如果这些过滤器中的任何一个应该使用该事件,这将停止对该事件的任何进一步处理。一旦事件到达目标(如果“传回”根目录),则在此过程中调用任何事件处理程序。也可以通过消耗事件来停止事件处理。NodeSceneNodeNodeNodeNodeNode

例:

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

如果单击 ,事件处理将从 .此处执行筛选器。如果事件未在筛选器中使用,则将其传递到 事件筛选器接收事件的 。如果筛选器未使用该事件,则 的事件处理程序将接收该事件。如果该事件处理程序未假定该事件,则 的事件处理程序将接收该事件。rectrootNoderectNoderectrootNode

只需取消评论一些电话,看看会发生什么...evt.consume()


答案 2