我正在尝试让节点识别从一个节点到另一个节点执行拖动手势的时间。
我试图通过node#setOnMouseDragOver
设置一个MouseDragEvent,但它永远不会被调用。
这是我的实施:
nfaNode.setOnMouseDragOver(event1 -> {
System.out.println("over " + nfaNode.getText().getText());
});
我希望它知道Q_1被拖了过来,以便我能够告诉Q_0被拖到Q_1。
答案 0 :(得分:0)
在拖动手势期间,事件仅传递到默认情况下手势启动的节点。要更改此设置,您需要在startFullDrag
处理程序中调用onDragDetected
。此外,如果您移动节点,则可能需要将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();
,您将无法在控制台中看到任何输出。
<强>更新强>
您可以从gestureSource
检索MouseDragEvent
以获取启动拖动手势的节点,并使用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();
}