我试图通过实施国际象棋游戏来学习JavaFX。 我的问题是我不知道如何通过拖放来移动一块。 在我的代码中,我有一个2D标签数组,其中label包含一个ImageView。 我想知道如何确定拖动片下的另一个片段(节点)。 提前谢谢。
答案 0 :(得分:0)
基本上,您必须对要拖动的项目使用setOnDragDetected()
方法,然后使用目标项目上的setOnDragOver()
来确定哪个TransferMode正在接受setOnDragDropped()
在完成放置时使用目标方法。最后setOnDragComplete()
在原始项目上确定拖动是否成功。
1)链接以获取来自oracle here
的更多信息2)一个很好的例子here
3)第二个容易理解的例子:
/**
* Demonstrates a drag-and-drop feature.
*/
public class HelloDragAndDrop extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("Hello Drag And Drop");
Group root = new Group();
Scene scene = new Scene(root, 400, 200);
scene.setFill(Color.LIGHTGREEN);
final Text source = new Text(50, 100, "DRAG ME");
source.setScaleX(2.0);
source.setScaleY(2.0);
final Text target = new Text(250, 100, "DROP HERE");
target.setScaleX(2.0);
target.setScaleY(2.0);
source.setOnDragDetected(event -> {
/* drag was detected, start drag-and-drop gesture */
System.out.println("onDragDetected");
/* allow any transfer mode */
Dragboard db = source.startDragAndDrop(TransferMode.ANY);
/* put a string on dragboard */
ClipboardContent content = new ClipboardContent();
content.putString(source.getText());
db.setContent(content);
event.consume();
});
target.setOnDragOver(event -> {
/* data is dragged over the target */
System.out.println("onDragOver");
/*
* accept it only if it is not dragged from the same node and if it
* has a string data
*/
if (event.getGestureSource() != target && event.getDragboard().hasString()) {
/* allow for both copying and moving, whatever user chooses */
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
}
event.consume();
});
target.setOnDragEntered(event -> {
/* the drag-and-drop gesture entered the target */
System.out.println("onDragEntered");
/* show to the user that it is an actual gesture target */
if (event.getGestureSource() != target && event.getDragboard().hasString()) {
target.setFill(Color.GREEN);
}
event.consume();
});
target.setOnDragExited(event -> {
/* mouse moved away, remove the graphical cues */
target.setFill(Color.BLACK);
event.consume();
});
target.setOnDragDropped(event -> {
/* data dropped */
System.out.println("onDragDropped");
/* if there is a string data on dragboard, read it and use it */
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasString()) {
target.setText(db.getString());
success = true;
}
/*
* let the source know whether the string was successfully
* transferred and used
*/
event.setDropCompleted(success);
event.consume();
});
source.setOnDragDone(event -> {
/* the drag-and-drop gesture ended */
System.out.println("onDragDone");
/* if the data was successfully moved, clear it */
if (event.getTransferMode() == TransferMode.MOVE) {
source.setText("");
}
event.consume();
});
root.getChildren().add(source);
root.getChildren().add(target);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}