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);
}
}