如何在拖放操作期间执行代码?

时间:2016-11-17 16:01:02

标签: java javafx drag-and-drop event-handling javafx-2

我有一个节点我想实现拖放(此对象是源而不是目标)。我还希望对象与鼠标光标一起移动。我设法做了这两件事但不是同时做的。

setOnDragDetectedsetOnMouseDragged似乎不能很好地协同工作。考虑具有以下处理程序的节点:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Example extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        Rectangle rect = new Rectangle(20, 20);
        rect.setOnMousePressed(e -> System.out.println("Pressed"));
        rect.setOnMouseDragged(e -> System.out.println("Dragged"));
        rect.setOnDragDetected(e -> {
            System.out.println("Detected");
            ClipboardContent content = new ClipboardContent();
            content.putString("something");
            Dragboard db = rect.startDragAndDrop(TransferMode.ANY);
            db.setContent(content);
        });
        Group subGroup = new Group(rect);

        Scene scene = new Scene(subGroup, 100, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {

        Example.launch(args);
    }
}

现在在节点上按鼠标并移动鼠标。这是输出:

Pressed
Dragged
Dragged
Dragged
Dragged
Dragged
Dragged
Detected

检测到拖动后,MouseDragged处理程序停止。

我如何实现我所描述的目标?我注意到的一件事可能是我可以使用onDragOver作为父级,但我希望行为在节点中,因为它确实应该在那里。

1 个答案:

答案 0 :(得分:0)

你在这里混合两件事。简而言之,当您调用startDragAndDrop方法时,系统会切换到拖放模式,Java会停止向MouseEvent传递rect

MouseEvent documentation有一个“拖动手势”部分,它解释了三种类型的拖动手势。这里只是一个简短的总结:

  • 简单的按下 - 拖动 - 释放 - 当检测到拖动时,Java继续将MouseEvents传递到检测到拖动的节点。
  • 完全按下 - 拖放 - 您可以在使用startFullDrag设置的处理程序中调用setOnDragDetected。然后,Java也开始向其他节点(潜在的手势目标)发送MouseDragEvents
  • 平台支持的拖放 - 如果您在startDragAndDrop处理程序中调用OnDragDetected,Java将停止传递MouseEvents并开始传递DragEvents。这用于与其他应用程序的拖放交互。

我不清楚您想要实现的目标,但只要您不想在应用程序之外拖动某些内容,请尝试使用startFullDrag

此外,进一步查看DragEventMouseDragEvent文档可能会有所帮助。