我有一个节点我想实现拖放(此对象是源而不是目标)。我还希望对象与鼠标光标一起移动。我设法做了这两件事但不是同时做的。
setOnDragDetected
和setOnMouseDragged
似乎不能很好地协同工作。考虑具有以下处理程序的节点:
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
作为父级,但我希望行为在节点中,因为它确实应该在那里。
答案 0 :(得分:0)
你在这里混合两件事。简而言之,当您调用startDragAndDrop
方法时,系统会切换到拖放模式,Java会停止向MouseEvent
传递rect
。
MouseEvent documentation有一个“拖动手势”部分,它解释了三种类型的拖动手势。这里只是一个简短的总结:
MouseEvents
传递到检测到拖动的节点。startFullDrag
设置的处理程序中调用setOnDragDetected
。然后,Java也开始向其他节点(潜在的手势目标)发送MouseDragEvents
。startDragAndDrop
处理程序中调用OnDragDetected
,Java将停止传递MouseEvents
并开始传递DragEvents
。这用于与其他应用程序的拖放交互。我不清楚您想要实现的目标,但只要您不想在应用程序之外拖动某些内容,请尝试使用startFullDrag
。
此外,进一步查看DragEvent和MouseDragEvent文档可能会有所帮助。