JavaFx - 是否可以将图像拖放到形状(圆形)中?

JavaFx - is it possible to drag and drop an image to a shape (circle)?

我不确定是否可以将图像拖放到某个形状(圆形)中。我已经尝试使用 "setupGestureTarget();" 、“.setOnDragOver”和“.setOnDragDropped”。

到目前为止,拖放仅适用于场景 (HBox),不适用于形状 (Circle)。

我不确定拖放是否以及如何对形状起作用?

如有任何帮助,我们将不胜感激

使用下面的代码,您可以将计算机上任意位置的图像拖放到应用程序中的形状中。

此外,形状可以四处移动(参见 "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);
   }   
}