2016-07-03 139 views
1

我試圖通過實現一個象棋遊戲來學習JavaFX。 我的問題是我不知道如何通過拖放來移動一塊。 在我的代碼中,我有一個標籤包含ImageView的二維數組。 我想知道如何確定拖動件下的另一塊(節點)。 在此先感謝。將一個節點拖放到另一個節點中

回答

0

基本上,你必須使用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); 
    } 
} 
+0

它worked.Thank你這麼很多 –

+0

@ M.Sianaki當一個答案適合你標記爲解決方案。:) – GOXR3PLUS

相關問題