JavaFX中Event consume的含义是什么?

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

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

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

事件沿特定路线传递。 在大多数情况下(例如鼠标/键事件)路径将从Scene的根节点开始,并包含从根节点到场景图中的目标Node的路径上的每个Node 。 在到目标Node的路由上,将执行事件filter ,如果这些filter中的任何filter都应该使用该事件,则会停止对事件的任何进一步处理。 一旦事件到达目标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开始。 这里执行filter。 如果事件未在filter中使用,则会将其传递到rect Node ,其中事件filter接收事件。 如果filter未使用该事件,则rect的事件处理程序将接收该事件。 如果事件未被该事件处理程序消除,则root的事件处理程序将接收该事件。

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