2015-12-23 12 views
0

Я не уверен, могу ли я перетащить изображение в форму (круг). Я попробовал это с помощью setupGestureTarget(); , ".setOnDragOver" и ".setOnDragDropped".JavaFx - можно ли перетащить изображение в форму (круг)?

Пока что перетаскивание работает только на сцене (HBox), но не на форме (круг).

Я не уверен, если и как перетаскивание работает на фигурах?

Любая помощь будет принята с благодарностью

+0

Да, это возможно. Отправьте простой пример в виде [MCVE], показывающего, что вы пробовали. Вероятно, это поможет прояснить то, что вы хотите, когда изображение также падает на круг. –

+0

Спасибо за ваш быстрый ответ и намек на то, что это возможно. Я попробовал снова и сумел разрешить его с помощью .setFill (новый ImagePattern (изображение, 0, 0, 1, 1, true)); , Для всего кода см. Ответ! –

ответ

0

с кодом ниже вы можете перетащить изображение из любого места на вашем компьютере в форме в приложении.

И далее, форма может быть перемещен (см "enableDragging"):

@Override 
public void start(Stage primaryStage) { 

    StackPane root = new StackPane(); 
    Pane pane = new Pane(); 

    Circle circle = new Circle(100,100,100); 
    enableDragging(circle); 

    pane.getChildren().addAll(circle); 
    root.getChildren().addAll(pane); 

    circle.setOnDragOver(new EventHandler <DragEvent>() { 
     @Override 
     public void handle(DragEvent event) { 
      /* data is dragged over the target */ 
      System.out.println("onDragOver"); 

      Dragboard db = event.getDragboard(); 
      if(db.hasFiles()){ 
       event.acceptTransferModes(TransferMode.ANY); 
      } 

      event.consume(); 
     } 
    }); 

    circle.setOnDragDropped(new EventHandler <DragEvent>() { 
     @Override 
     public void handle(DragEvent event) { 
      /* data dropped */ 
      System.out.println("onDragDropped"); 

      Dragboard db = event.getDragboard(); 

      if(db.hasFiles()){ 

       for(File file:db.getFiles()){ 
        //String absolutePath = file.getAbsolutePath(); 
        String absolutePath = file.toURI().toString(); 

        Image dbimage = new Image(absolutePath); 
        ImageView dbImageView = new ImageView(); 
        dbImageView.setImage(dbimage); 

        circle.setFill(new ImagePattern(dbimage, 0, 0, 1, 1, true));   
       } 

       event.setDropCompleted(true); 
      }else{ 
       event.setDropCompleted(false); 
      } 
      event.consume(); 
     } 
    }); 

    Scene scene = new Scene(root, 300, 300); 

    primaryStage.setTitle("Drag and Drop Image from Pc into Circle"); 
    primaryStage.setScene(scene); 
    primaryStage.show();  
} 

private void enableDragging(Node node) { 
    final ObjectProperty<Point2D> mouseAnchor = new SimpleObjectProperty<>(); 
    node.setOnMousePressed(event -> mouseAnchor.set(new Point2D(event.getSceneX(), event.getSceneY()))); 
    node.setOnMouseDragged(event -> { 
     double deltaX = event.getSceneX() - mouseAnchor.get().getX(); 
     double deltaY = event.getSceneY() - mouseAnchor.get().getY(); 
     node.relocate(node.getLayoutX()+deltaX, node.getLayoutY()+deltaY); 
     mouseAnchor.set(new Point2D(event.getSceneX(), event.getSceneY()));; 
    }); 
} 
public static void main(String[] args) { 
    launch(args); 
    } 
}