如何处理 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
事件的 DragEvent
的 transferMode
属性:
dragSource.setOnDragDone(evt -> {
if (evt.getTransferMode() == null) {
System.out.println("drag aborted");
} else {
System.out.println("drag successfully completed");
}
});
注意: 这需要您使用 setDropCompleted
在 onDragDropped
事件处理程序中将拖动手势标记为已完成。示例:
@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();
}
在我的 GUI 中,我创建了一些骰子 (ImageView),我可以将它们拖放到一个特定的 GridPane 中。当我将一个骰子放入特定的 GridPane 时,骰子从初始位置消失并移动到正确的位置。仅当我选择正确的放置位置时才能正常工作。
The problem is how can I manage the wrong drop location?
实际上,如果我将骰子放在错误的位置(比如在网格窗格外),骰子就会消失,就像它被移到了正确的位置一样。 如果骰子没有放置到 GridPane,我想将骰子恢复到原来的位置。
有什么方法可以帮助我检查我是否落入了正确的位置?或者有什么可以防止掉入错误位置的东西?
您可以检查传递给 onDragDone
事件的 DragEvent
的 transferMode
属性:
dragSource.setOnDragDone(evt -> {
if (evt.getTransferMode() == null) {
System.out.println("drag aborted");
} else {
System.out.println("drag successfully completed");
}
});
注意: 这需要您使用 setDropCompleted
在 onDragDropped
事件处理程序中将拖动手势标记为已完成。示例:
@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();
}