2014-10-27 86 views
7

我有一種情況,在JavaFX中有一個容器節點(HBox)和兩個子節點。當我從左邊的子節點拖到右邊時,我得到了大量的拖動事件到左邊的節點,最後當我將鼠標放在右邊的節點上時,我在父級獲得了一個點擊事件。以下是一些複製這種情況的代碼。如何阻止JavaFX父節點在兒童之間拖動後獲得點擊

我想知道的是:如何阻止父接收此點擊事件?我已經嘗試了消耗事件的左右節點上的各種事件過濾器和事件處理程序,但我似乎無法找到正確的防止發送到父級的單擊事件。有任何想法嗎?

package test; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.Background; 
import javafx.scene.layout.BackgroundFill; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class TestDrag extends Application 
{ 

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     String leftHead = "Start dragging from me\n"; 
     String dragStarted = "Drag begun; staying simple\n"; 
     Label left = new Label(leftHead); 

     left.setOnDragDetected(e -> { 
      left.setText(leftHead + dragStarted); 
      e.consume(); 
     }); 

     left.setOnMouseDragged(e -> { 
      left.setText(leftHead + dragStarted + "Mouse dragged to: " + e.getSceneX() + ", " + e.getSceneY()); 
      e.consume(); 
     }); 

     left.setOnMouseReleased(e -> { 
      left.setText(leftHead + "Mouse released\n"); 
      e.consume(); 
     }); 

     String rightHead = "Drag on to me\n"; 
     Label right = new Label(rightHead); 
     right.setOnMouseClicked(e -> { 
      right.setText(rightHead + "Clicked me!\n"); 
     }); 

     left.setPrefSize(400, 300); 
     left.setBackground(new Background(new BackgroundFill(Color.LIGHTBLUE, null, null))); 
     right.setPrefSize(400, 300); 
     right.setBackground(new Background(new BackgroundFill(Color.LIGHTPINK, null, null))); 

     HBox hbox = new HBox(left, right); 
     hbox.setOnMouseClicked(e -> { 
      right.setText(rightHead + "Clicked the underlying HBox at " + System.currentTimeMillis() + "\n"); 
     }); 


     primaryStage.setScene(new Scene(hbox)); 
     primaryStage.show(); 
    } 

} 
+0

好奇:你想達到什麼目的? – kleopatra 2014-10-28 10:15:31

+0

我想停止生成點擊。這是由JavaFX(而不是由OS)生成的合成點擊。在我的真實代碼中,HBox確實有一個可見部分並點擊它有一個效果。我希望能夠在孩子之間拖動而不觸發父級中的這個點擊處理程序。 – 2014-10-28 13:46:47

+0

嗯......看起來很奇怪:如果鼠標在被按下之後被移動/拖拽,點擊不應該被觸發,應該如何? – kleopatra 2014-10-31 09:44:11

回答

9

無法防止事件每本身發生,但isStillSincePressed()(在MouseEvent中)可用於父級(本例中的HBox)以區分點擊和一拖。

+0

我已經將它添加到了我的HBox單擊處理程序中,而且它似乎完成了這項工作 - 忽略isStillSincePressed爲false的點擊,並且我似乎得到了我想要的行爲。 – 2014-11-03 11:59:15

0

我的第二反應(評論)是:多麼奇怪。我對點擊的期望是基於Swing(可能基於Win也是,似乎還記得過去的VB時代):當按下/釋放的按鈕位於相同位置的相同組件上時,會收到點擊。

/** 
* This event occurs when mouse button has been clicked (pressed and 
* released on the same node). This event provides a button-like behavior 
* to any node. Note that even long drags can generate click event (it 
* is delivered to the top-most node on which the mouse was both 
* pressed and released). 
*/ 

因此短期回答你的問題是:因爲它實際上讀MouseEvent.MOUSE_CLICKED的文檔後,原來

FX語義是不同的,你不能阻止點擊父。根據究竟你需要實現,還有如何應付選項點擊:

  • 不使用它在所有的,使用壓/釋放
  • 實現自己在-同一地點語義:聽在捕獲階段壓制,存儲位置,在點擊的位置比較,僅引起這樣的反應,如果相同/近