【问题标题】:How to handle wrong drop location in JavaFx?如何处理 JavaFx 中错误的放置位置?
【发布时间】:2018-06-21 14:02:45
【问题描述】:

在我的 GUI 中,我创建了一些骰子 (ImageView),我可以将它们拖放到一个特定的 GridPane 中。当我将骰子放入特定的 GridPane 时,骰子会从初始位置消失并移动到正确的位置。这只有在我选择正确的放置位置时才能正常工作。

问题是如何管理错误的放置位置?

实际上,如果我将骰子放在错误的位置(例如在 Gridpane 之外),骰子就会消失,就像它被移到了正确的位置一样。 如果骰子没有放在 GridPane 中,我想将骰子恢复到原始位置。

有没有一种方法可以帮助我检查我是否落入了正确的位置?或者有什么东西可以防止掉入错误的位置?

【问题讨论】:

  • 你使用的是剪贴板+DragEvent还是MouseDragEvents?
  • DragEvent,现在我正在使用 setOnDragDetected、setOnDragOver 和 setOnDragDropped
  • 我在这个例子中使用了setonDraggedExitedstackoverflow.com/questions/48432094/…。如果成功删除,它只会从原始位置删除Image
  • 当我运行时,我的代码认为 drop 会成功,即使它是错误的

标签: javafx drag-and-drop imageview gridpane


【解决方案1】:

您可以检查传递给onDragDone 事件的DragEventtransferMode 属性:

dragSource.setOnDragDone(evt -> {
    if (evt.getTransferMode() == null) {
        System.out.println("drag aborted");
    } else {
        System.out.println("drag successfully completed");
    }
});

注意:这需要您在onDragDropped 事件处理程序中使用setDropCompleted 将拖动手势标记为已完成。示例:

@Override
public void start(Stage primaryStage) {
    Button source = new Button("Not dragged yet");
    Button target = new Button("target");

    HBox root = new HBox(20, source, target);

    source.setOnDragDetected(evt -> {
        Dragboard db = source.startDragAndDrop(TransferMode.COPY);
        ClipboardContent content = new ClipboardContent();
        content.putString(source.getText());
        db.setContent(content);
    });

    source.setOnDragDone(evt -> {
        source.setText(evt.getTransferMode() == null ? "failure" : "success");
    });

    target.setOnDragOver(evt -> {
        if (evt.getDragboard().hasString()) {
            evt.acceptTransferModes(TransferMode.COPY);
            evt.consume();
        }
    });
    target.setOnDragDropped(evt -> {
        String value = evt.getDragboard().getString();
        target.setText(value);
        evt.setDropCompleted(true);
        evt.consume();
    });

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

【讨论】:

  • 问题是我的代码打印在这两种情况下总是“拖拽中止”
  • @lordp 你可能没有打电话给setDropCompleted。我添加了一个工作示例。
  • 非常感谢你,我解决了,你是对的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
相关资源
最近更新 更多