2012-05-10 48 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