如何处理 JavaFx 中错误的放置位置?

How to handle wrong drop location in JavaFx?

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

The problem is how can I manage the wrong drop location?

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

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

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

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

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

@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();
}