我想使用javafx拖放处理程序来移动javafx节点(特别是一个组)。这在我第一次移动组时工作正常(单击组...在屏幕上拖动它......放开......组改变位置)。
但是在第一次成功移动之后,我无法再次移动Node,因为DRAG_DETECTED事件未被触发。为了再次触发DRAG_DETECTED事件,我必须先用鼠标做一些事情(稍微移动它或点击某处),然后再拖放该组。
(我的解决方法是通过java.awt.Robot将鼠标移动1px,然后我每次都可以立即拖动节点。但是这个黑客似乎不是正确的解决方案)
你能告诉我,当我在移动节点后立即尝试开始拖动手势时,为什么没有触发DRAG_DETECTED事件? 有没有正确的方法来解决这个问题?
感谢您的帮助。
以下是我的相关代码:
source.setOnDragDetected((event) -> {
Dragboard db = view.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putImage(source.getImage());
db.setContent(content);
event.consume();
});
target.setOnDragOver((DragEvent event) -> {
if (event.getGestureSource() instanceof SourceClass) {
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
target.setOnDragDropped((DragEvent event) -> {
if (event.getGestureSource() instanceof SourceClass) {
((SourceClass)event.getGestureSource()).getObject().setLocation(
event.getX(), event.getY()); // this changes an observable object
// which then calls its observer
// "target" which will call
// source.relocate(x, y);
event.setDropCompleted(true);
/* Now following the hack to move the mouse slightely, but only workaround. */
Platform.runLater(() -> {
try {
Robot robot = new Robot();
robot.mouseMove((int)event.getScreenX()+1, (int)event.getScreenY()+1);
robot.mouseMove((int)event.getScreenX(), (int)event.getScreenY());
} catch (AWTException e) { }
});
}
event.consume();
});