2016-09-15 29 views
2

目前雙方的孩子和家長處理程序處理我的鼠標單擊事件結構像我想避免在我的JavaFX程序的JavaFX 8

AnchorPane [家長] - >集團[兒童] ...雙方都setOnMouseClicked事件代碼..

我的問題是,當點擊子節點,子節點的setOnMouseClicked執行,然後再父節點的setOnMouseClicked被執行...

現在我情況下,我想有一個像

    功能
  • 如果執行子節點的setOnMouseClicked然後
  • 父節點的setOnMouseClicked不應得到執行..

如何實現這一目標?欲瞭解更多信息,請查看下圖。

enter image description here

  1. 現在,如果我點擊父節點 - >選定子節點應該被取消。所以我寫父Node.setOnMouseClicked - >取消選擇子節點..
  2. 但是,即使我點擊子節點選擇它 - >它也執行父節點的setOnMouseClicked - >並立即取消選擇子節點。

我發現這個問題作爲一個架構問題,因此沒有發佈代碼示例。

請讓我知道您的寶貴建議。您的幫助將不勝感激。

+0

看看事件過濾器和消耗事件 - [this](https://docs.oracle.com/javase/8/javafx/events-tutorial/processing.htm)應該是一個很好的開始。 – Itai

回答

2

這是一個耗時的事件的一個小例子 - 通過下一個聽衆,已經消耗不會泡沫事件:

@Override 
public void start(Stage stage) throws Exception { 
    Canvas c = new Canvas(400, 400); 
    Pane p = new Pane(c); 
    p.setOnMouseClicked(me -> { 
     System.out.println("Pane mouse click: " + me.getX() + ", " + me.getY()); 
    }); 
    c.setOnMouseClicked(me -> { 
     System.out.println("Canvas mouse click: " + me.getX() + ", " + me.getY()); 
     if (me.getX()>200) { 
      System.out.println("Consuming event"); 
      me.consume(); 
     } 
    }); 
    stage.setScene(new Scene(p)); 
    stage.show(); 
} 

當點擊左側部分,然後的Canvas,你會得到正確的部分是這樣的:

Canvas mouse click: 96.0, 174.0 
Pane mouse click: 96.0, 174.0 
Canvas mouse click: 373.0, 180.0 
Consuming event 

通知,第二次是如何不執行Pane事件偵聽器。當然,您可以使用任何邏輯來決定是否使用該事件。