JavaFX中Event consume的含义是什么?

Asi*_*taq 9 java events javafx

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

路径可以修改为路径上的事件过滤器和事件处理程序处理事件.此外,如果事件过滤器或事件处理程序在任何时候消耗该事件,则初始路由上的某些节点可能不会接收该事件.

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

fab*_*ian 15

事件沿特定路线传递.在大多数情况下(如鼠标/键盘事件)的航线将开始在根部NodeScene,并含有每一个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();
}
Run Code Online (Sandbox Code Playgroud)

如果单击rect,则事件处理从root Node.这里执行过滤器.如果事件未在过滤器中使用,则会将其传递给rect Node事件过滤器接收事件的事件.如果过滤器未使用该事件,则事件处理程序将rect接收该事件.如果事件未被该事件处理程序消除,则事件的事件处理程序将root Node接收该事件.

只需取消注释一些evt.consume()调用,看看会发生什么......