2016-07-03 138 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

相关问题