2012-05-10 50 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在一个窗格中移动对象,并且我知道如何使用DragDetected和剪贴板在窗格之间拖放文本,但是我无法确定如何组合这两个窗体,以便在流程中拖放n个可以看到的形状。 – Giannis