在拖動手勢過程中,事件僅傳遞到默認情況下手勢開始的節點。要更改此設置,您需要在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();
,你會不會在控制檯中看到任何輸出。
更新
你可從一個MouseDragEvent
的gestureSource
得到節點,在你開始拖動操作和使用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();
}
我已嘗試此,使用'nfaNode.setOnDragDetected(事件1 - > nfaNode.startFullDrag()); (「over」+ nfaNode.getText()。getText()); });'但是唯一打印的是Q_0。我無法明確地將它寫爲node1和node2,因爲我將這些操作添加到窗格時將這些操作添加到所有節點。 –
@OrangeReceptacle使用手勢源和通過事件對象提供的源。 (新增示例回答) – fabian