1
我试图通过实现一个象棋游戏来学习JavaFX。 我的问题是我不知道如何通过拖放来移动一块。 在我的代码中,我有一个标签包含ImageView的二维数组。 我想知道如何确定拖动件下的另一块(节点)。 在此先感谢。将一个节点拖放到另一个节点中
我试图通过实现一个象棋游戏来学习JavaFX。 我的问题是我不知道如何通过拖放来移动一块。 在我的代码中,我有一个标签包含ImageView的二维数组。 我想知道如何确定拖动件下的另一块(节点)。 在此先感谢。将一个节点拖放到另一个节点中
基本上,你必须使用setOnDragDetected()
方法要拖动的项目,然后用setOnDragOver()
的目标项目,以确定哪些TransferMode被接受和setOnDragDropped()
目标方法时的下降对原有项目done.Finally 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);
}
}
它worked.Thank你这么很多 –
@ M.Sianaki当一个答案适合你标记为解决方案。:) – GOXR3PLUS