2012-05-10 13 views
1

私はJavaFX2上のドラッグアンドドロップで作業しています。ドラッグされたオブジェクト(ドラッグされたオブジェクトのクローン)は、JavaFXシーンビルダのように、マウスカーソルに続いている可能性があります。javafxドラッグアンドドロップ移動アイコン

これは私のサンプルソースコードです:

Pane pane; 
private void dragAndDropExample() { 
    pane = new Pane(); 
    pane.setPrefSize(800, 600); 
    TitledPane titlePane = new TitledPane("Partial Order", pane); 
    add(titlePane, 0, 2); 

    pane.getChildren().add(createCircle(350, 300, Color.RED)); 
    pane.getChildren().add(createCircle(250, 300, Color.BROWN)); 

    pane.setOnMouseMoved(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      if (circleToMove != null) { 
       circleToMove.setCenterX(event.getX()); 
       circleToMove.setCenterY(event.getY()); 
      } 

     } 
    }); 
} 

Circle circleToMove; 

private Circle createCircle(double x, double y, Color color) { 
    final Circle c = new Circle(x, y, 25); 
    c.setFill(color); 

    c.setOnDragDetected(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent arg0) { 
      System.out.println("SetOnDragDetected"); 
      c.setFill(Paint.valueOf("blue")); 
      Dragboard db = c.startDragAndDrop(TransferMode.COPY_OR_MOVE); 
      ClipboardContent content = new ClipboardContent(); 
      content.putString("foo " + c.hashCode()); 
      db.setContent(content); 
      arg0.consume(); 
      circleToMove = c; 
     } 
    }); 

    c.setOnMouseClicked(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      System.out.println("Mouse clicked"); 
     } 
    }); 

    c.setOnMouseReleased(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      System.out.println("Mouse Released"); 
      circleToMove = null; 
     } 
    }); 

    c.setOnDragExited(new EventHandler<DragEvent>() { 

     @Override 
     public void handle(DragEvent event) { 
      System.out.println("SetOnDragExited"); 
      System.out.println(event.getGestureSource()); 

     } 
    }); 

    c.setOnDragOver(new EventHandler<DragEvent>() { 

     @Override 
     public void handle(DragEvent event) { 
      System.out.println("setOnDragOver " + c.hashCode()); 
      c.setFill(Paint.valueOf("white")); 
      event.acceptTransferModes(TransferMode.COPY_OR_MOVE); 
      event.consume(); 
     } 
    }); 

    c.setOnDragDropped(new EventHandler<DragEvent>() { 

     @Override 
     public void handle(DragEvent arg0) { 
      System.out.println("setOnDragDropped"); 
      c.setFill(Paint.valueOf("black")); 

      if (arg0.getGestureSource() instanceof Circle) { 

       if (arg0.getDragboard().hasString()) { 
        System.out.println(c.hashCode() + " hat jetzt " + arg0.getDragboard().getString()); 
       } 
      } 
     } 
    }); 

    c.setOnDragEntered(new EventHandler<DragEvent>() { 

     @Override 
     public void handle(DragEvent arg0) { 
      System.out.println("setOnDragEntered"); 

     } 
    }); 

    return c; 
} 

私はペイン上のMouseEventでみましたが、このイベントは、ドラッグ&ドロップ中に解雇されません。

答えて

4

間違ったハンドラーを使用しています。ドラッグイベントは、アイテムをペインの間にドラッグするために使用されます。あなただけの取り扱いオブジェクトの使用に次のコードを移動したい場合:

private Circle createCircle(double x, double y, Color color) { 
    final Circle c = new Circle(x, y, 25); 
    c.setFill(color); 

    c.setOnMouseDragged(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      c.relocate(event.getSceneX() - c.getRadius(), event.getSceneY() - c.getRadius()); 
     } 
    }); 

    return c; 
} 

をまた、あなたがEnsemble demo:

+0

に次のサブサンプルを見て試すことができます私は他の一つに円をドラッグ&ドロップしたいと思います。私はonMouseDraggedを使用している場合、どのように私はドロップ機能を実装する必要がありますか?私は少し混乱している! – moohkooh

+0

ああ、私の悪い。私は後で私の答えを更新します。 –

+0

@SergeyGrinevペイン間でシェイプを移動するにはどうすればよいですか? MouseDraggedを使用してオブジェクトを1つのペインの中に移動する方法を見つけましたが、クリップボードでDragDetectedを使用してペインの間にテキストをドラッグ&ドロップする方法を知っていますが、 。 – Giannis

関連する問題