我試圖理解Event Handling in JavaFX,在那裏我發現了這一行。在JavaFX中消耗事件的含義是什麼
路由可以修改爲事件過濾器和事件處理程序,沿路由過程處理事件 。另外,如果事件過濾器或事件處理程序 在任何時間點都使用該事件,則初始路由上的某些節點可能不會收到該事件。
你能解釋一下事件消耗是什麼意思嗎?
我試圖理解Event Handling in JavaFX,在那裏我發現了這一行。在JavaFX中消耗事件的含義是什麼
路由可以修改爲事件過濾器和事件處理程序,沿路由過程處理事件 。另外,如果事件過濾器或事件處理程序 在任何時間點都使用該事件,則初始路由上的某些節點可能不會收到該事件。
你能解釋一下事件消耗是什麼意思嗎?
事件沿特定路線傳遞。在大多數情況下(例如鼠標/按鍵事件),路線將從Scene
的根Node
開始,並且在場景圖中從根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
的事件處理程序將接收該事件。如果該事件未被該事件處理程序確認,則該事件處理程序將接收該事件。
只需取消部分evt.consume()
來電,看看會發生什麼...
感謝您的回覆。你能解釋一下事件句柄和便捷方法'setOnAction'等等和'addEventHandler()'有什麼區別嗎? – UnKnown
@未知最好提出新問題作爲新問題。 – jewelsea