2016-11-20 40 views
0

我試圖讓一個節點識別何時從一個節點執行拖動手勢到另一個節點。 我試圖設置一個MouseDragEvent通過node#setOnMouseDragOver,但它不會被調用。JavaFX:節點無法識別鼠標被拖動到它上面

這是我實現:

nfaNode.setOnMouseDragOver(event1 -> { 
       System.out.println("over " + nfaNode.getText().getText()); 
      }); 

enter image description here

我希望它知道Q_1上拖動,使我能夠告訴Q_0被拖到Q_1。

回答

0

在拖動手勢過程中,事件僅傳遞到默認情況下手勢開始的節點。要更改此設置,您需要在onDragDetected處理程序中調用startFullDrag。此外,如果您移動節點,則可能需要將mousetransparent設置爲true,以便鼠標事件不會僅傳遞到拖動的節點。

@Override 
public void start(Stage primaryStage) { 
    Rectangle rect1 = new Rectangle(100, 100, Color.BLUE); 
    Rectangle rect2 = new Rectangle(200, 200, 100, 100); 
    rect2.setFill(Color.RED); 

    rect1.setOnDragDetected(evt -> { 
     rect1.startFullDrag(); 
    }); 

    rect2.setOnMouseDragOver(evt -> { 
     System.out.println("over"); 
    }); 

    Pane root = new Pane(rect1, rect2); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

註釋掉rect1.startFullDrag();,你會不會在控制檯中看到任何輸出。

更新

你可從一個MouseDragEventgestureSource得到節點,在你開始拖動操作和使用getSource檢索,其中添加了事件處理程序的節點。例如:

@Override 
public void start(Stage primaryStage) { 
    TextField text1 = new TextField(); 
    TextField text2 = new TextField(); 

    EventHandler<MouseEvent> dragDetected = evt -> ((Node) evt.getSource()).startFullDrag(); 
    EventHandler<MouseDragEvent> dragOver = evt -> { 
     System.out.println("over " + ((TextField) evt.getGestureSource()).getText()); 
    }; 

    EventHandler<MouseDragEvent> dragReleased = evt -> { 
     TextField target = (TextField) evt.getSource(); 
     TextField source = (TextField) evt.getGestureSource(); 
     if (source != target) { 
      target.setText(source.getText()); 
      source.clear(); 
     } 
    }; 

    for (TextField tf : Arrays.asList(text1, text2)) { 
     tf.setOnDragDetected(dragDetected); 
     tf.setOnMouseDragOver(dragOver); 
     tf.setOnMouseDragReleased(dragReleased); 
    } 

    VBox root = new VBox(text1, text2); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

我已嘗試此,使用'nfaNode.setOnDragDetected(事件1 - > nfaNode.startFullDrag()); (「over」+ nfaNode.getText()。getText()); });'但是唯一打印的是Q_0。我無法明確地將它寫爲node1和node2,因爲我將這些操作添加到窗格時將這些操作添加到所有節點。 –

+0

@OrangeReceptacle使用手勢源和通過事件對象提供的源。 (新增示例回答) – fabian