事件在 JavaFX 中的含义是什么
我试图理解JavaFX中的事件处理,在那里我发现了这一行。
可以修改路由,因为沿路由处理事件的事件筛选器和事件处理程序。此外,如果事件筛选器或事件处理程序在任何时候使用该事件,则初始路由上的某些节点可能不会收到该事件。
你能解释一下事件消费的含义是什么吗?
我试图理解JavaFX中的事件处理,在那里我发现了这一行。
可以修改路由,因为沿路由处理事件的事件筛选器和事件处理程序。此外,如果事件筛选器或事件处理程序在任何时候使用该事件,则初始路由上的某些节点可能不会收到该事件。
你能解释一下事件消费的含义是什么吗?
事件沿特定路由传递。在大多数情况下(例如鼠标/键事件),路由将从的根目录开始,并在场景图中包含从根到目标的路径上的所有路径。在到目标的路由上,将执行事件过滤器,如果这些过滤器中的任何一个应该使用该事件,这将停止对该事件的任何进一步处理。一旦事件到达目标(如果“传回”根目录),则在此过程中调用任何事件处理程序。也可以通过消耗事件来停止事件处理。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()