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