JavaFX中Event consume的含义是什么?

时间:2016-06-14 13:22:48

标签: java events javafx

我试图了解Event Handling in JavaFX并在那里找到了这条线。

  

可以将路径修改为事件过滤器和事件处理程序   路线处理事件。此外,如果是事件过滤器或事件处理程序   在任何时候消耗事件,初始路线上的一些节点可能   没有收到活动。

你能解释一下事件消耗的意义吗?

1 个答案:

答案 0 :(得分:15)

事件沿特定路线传递。在大多数情况下(例如鼠标/键事件)路由将从onclick的根Node开始,并包含从根Scene到路径Node的路径上的每个Node在场景图中定位Node。在到目标Node的路线上,会执行事件过滤器,如果这些过滤器中的任何过滤器都应该使用该事件,则会停止对该事件的任何进一步处理。一旦事件达到目标Node,如果"旅行"回到根调用任何事件处理程序。通过使用事件也可以在那里停止事件处理。

示例:

@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()次调用,看看会发生什么......