2016-06-14 28 views
5

我試圖理解Event Handling in JavaFX,在那裏我發現了這一行。在JavaFX中消耗事件的含義是什麼

路由可以修改爲事件過濾器和事件處理程序,沿路由過程處理事件 。另外,如果事件過濾器或事件處理程序 在任何時間點都使用該事件,則初始路由上的某些節點可能不會收到該事件。

你能解釋一下事件消耗是什麼意思嗎?

回答

8

事件沿特定路線傳遞。在大多數情況下(例如鼠標/按鍵事件),路線將從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,該事件在rootNode處理開始。這裏過濾器被執行。如果該事件未在過濾器中消耗,則會將其傳遞到事件過濾器接收事件的地址。如果該事件未被過濾器消耗,則rect的事件處理程序將接收該事件。如果該事件未被該事件處理程序確認,則該事件處理程序將接收該事件。

只需取消部分evt.consume()來電,看看會發生什麼...

+0

感謝您的回覆。你能解釋一下事件句柄和便捷方法'setOnAction'等等和'addEventHandler()'有什麼區別嗎? – UnKnown

+1

@未知最好提出新問題作爲新問題。 – jewelsea