为什么每次都没有触发拖动检测到的事件?

时间:2017-09-14 08:16:25

标签: java javafx drag-and-drop

我想使用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();
});

0 个答案:

没有答案