JavaFX:节点无法识别何时拖动鼠标

时间:2016-11-20 09:40:09

标签: java javafx

我正在尝试让节点识别从一个节点到另一个节点执行拖动手势的时间。 我试图通过node#setOnMouseDragOver设置一个MouseDragEvent,但它永远不会被调用。

这是我的实施:

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

enter image description here

我希望它知道Q_1被拖了过来,以便我能够告诉Q_0被拖到Q_1。

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();
}