Java 如何在不显示正在拖动的图片的情况下拖放?

Java 如何在不显示正在拖动的图片的情况下拖放?,java,javafx,drag-and-drop,fxml,Java,Javafx,Drag And Drop,Fxml,我正在设置一个战列舰游戏,通过将战列舰的ImageView拖到网格中的按钮上,我希望能够在游戏板上设置战列舰。我有以下代码来设置到目前为止的所有拖放操作: private void configureDragAndDrop(ImageView image) { image.setOnDragDetected(new EventHandler<MouseEvent>(){ @Override publi

我正在设置一个战列舰游戏,通过将战列舰的
ImageView
拖到网格中的按钮上,我希望能够在游戏板上设置战列舰。我有以下代码来设置到目前为止的所有拖放操作:

        private void configureDragAndDrop(ImageView image) {

        image.setOnDragDetected(new EventHandler<MouseEvent>(){

            @Override
            public void handle(MouseEvent event) {
                Dragboard db = pictureOne.startDragAndDrop(TransferMode.ANY);

                ClipboardContent content = new ClipboardContent();
                content.putImage(pictureOne.getImage());
                db.setContent(content);

                event.consume();
            }

        });



        for(Node target: playerGrid.getChildren()) {
            if(target.getId() != null) {
                target.setOnDragOver(new EventHandler<DragEvent>() {
                    @Override
                    public void handle(DragEvent event) {
                        /* data is dragged over the target */
                        /* accept it only if it is not dragged from the same node 
                         * and if it has a string data */
                        if (event.getGestureSource() != target &&
                                event.getDragboard().hasImage()) {
                            /* allow for moving */
                            event.acceptTransferModes(TransferMode.MOVE);
                        }

                        event.consume();
                    }
                });
            }

        }

        for(Node target: playerGrid.getChildren()) {
            if(target.getId() != null) {
                target.setOnDragEntered(new EventHandler<DragEvent>() {
                    @Override
                    public void handle(DragEvent event) {
                    /* the drag-and-drop gesture entered the target */
                    /* show to the user that it is an actual gesture target */
                         if (event.getGestureSource() != target &&
                                 event.getDragboard().hasImage()) {
                             target.setStyle("-fx-background-color: pink");
                         }

                         event.consume();
                    }
                });
            }

        }

        for(Node target: playerGrid.getChildren()) {
            if(target.getId() != null) {
                target.setOnDragExited(new EventHandler<DragEvent>() {
                    public void handle(DragEvent event) {
                        /* mouse moved away, remove the graphical cues */
                        target.setStyle("-fx-background-color:blue");

                        event.consume();
                    }
                });
            }

        }

        for(Node target: playerGrid.getChildren()) {
            if(target.getId() != null) {
                target.setOnDragDropped(new EventHandler<DragEvent>() {
                    public void handle(DragEvent event) {
                        /* data dropped */
                        /* if there is a string data on dragboard, read it and use it */
                        Dragboard db = event.getDragboard();
                        boolean success = false;
                        if (db.hasImage()) {
                           target.setStyle("-fx-background-color:green");
                           success = true;
                        }
                        /* let the source know whether the string was successfully 
                         * transferred and used */
                        event.setDropCompleted(success);

                        event.consume();
                     }
                });
            }

        }

        for(Node target: playerGrid.getChildren()) {
            if(target.getId() != null) {
                target.setOnDragDone(new EventHandler<DragEvent>() {
                    public void handle(DragEvent event) {
                        /* data dropped */
                        /* if there is a string data on dragboard, read it and use it */
                        Dragboard db = event.getDragboard();
                        boolean success = false;
                        if (db.hasImage()) {
                           target.setStyle("-fx-background-color:yellow");
                           success = true;
                        }
                        /* let the source know whether the string was successfully 
                         * transferred and used */
                        event.setDropCompleted(success);

                        event.consume();
                     }
                });
            }
        }

        image.setOnDragDone(new EventHandler<DragEvent>() {
            public void handle(DragEvent event) {
                /* the drag and drop gesture ended */
                /* if the data was successfully moved, clear it */
                if (event.getTransferMode() == TransferMode.MOVE) {
                    pictureOne.setOpacity(0.0);
                }
                event.consume();
            }
        });




    }
private void配置DragandDrop(图像视图图像){
检测到image.setOnDragDetected(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
Dragboard db=pictureOne.startDragAndDrop(TransferMode.ANY);
ClipboardContent=新的ClipboardContent();
content.putImage(pictureOne.getImage());
db.setContent(content);
event.consume();
}
});
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
/*将数据拖到目标上*/
/*仅当未从同一节点拖动它时才接受它
*如果它有一个字符串数据*/
如果(event.getGestureSource()!=目标&&
event.getDragboard().hasImage()){
/*允许移动*/
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragEntered(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
/*拖放手势进入目标*/
/*向用户显示它是实际的手势目标*/
如果(event.getGestureSource()!=目标&&
event.getDragboard().hasImage()){
target.setStyle(“-fx背景色:粉色”);
}
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragExited(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*鼠标移开,移除图形提示*/
target.setStyle(“-fx背景色:蓝色”);
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragDrop(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*数据丢失*/
/*如果拖板上有字符串数据,请读取并使用它*/
Dragboard db=event.getDragboard();
布尔成功=假;
if(db.hasImage()){
target.setStyle(“-fx背景色:绿色”);
成功=真实;
}
/*让源知道字符串是否已成功删除
*转让和使用*/
事件。setDropCompleted(成功);
event.consume();
}
});
}
}
for(节点目标:playerGrid.getChildren()){
if(target.getId()!=null){
target.setOnDragDone(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*数据丢失*/
/*如果拖板上有字符串数据,请读取并使用它*/
Dragboard db=event.getDragboard();
布尔成功=假;
if(db.hasImage()){
target.setStyle(“-fx背景色:黄色”);
成功=真实;
}
/*让源知道字符串是否已成功删除
*转让和使用*/
事件。setDropCompleted(成功);
event.consume();
}
});
}
}
setOnDragDone(新的EventHandler(){
公共无效句柄(DrageEvent事件){
/*拖放手势结束了*/
/*如果数据已成功移动,请将其清除*/
if(event.getTransferMode()==TransferMode.MOVE){
pictureOne.setOpacity(0.0);
}
event.consume();
}
});
}
到目前为止,除了
setOnDragDone
部分没有将颜色更改为绿色(但我将在稍后处理该部分)之外,拖动在大部分情况下都有效


我的问题是,当我开始拖动时,是否仍然可以设置正在拖动的图像的大小(而不是显示的原始图像的完整大小)。如果没有,我是否仍然可以拖动图像,但不显示正在拖动的图像,只需更改目标的颜色

首先是一个非常简单的建议,为什么有五个单独的“for”循环来为同一组节点设置不同的拖动处理程序。您只能在一个for循环中完成所有操作

for(Node target: playerGrid.getChildren()) {
   if(target.getId() != null) {
      target.setOnDragOver(..);
      target.setOnDragEntered(..);
      target.setOnDragExited(..);
      target.setOnDragDropped(..);
      target.setOnDragDone(..);
   }
}
说到实际问题,要调整图像大小并在dragboard中设置,可以使用“快照”功能。检查以下代码以设置已调整大小的ima
double displaySize = 150;
double dragSize = 50;
ImageView pictureOne = new ImageView(new Image(ImageDragDemo.class.getResourceAsStream(imgName)));
pictureOne.setFitHeight(displaySize);
pictureOne.setFitWidth(displaySize);
pictureOne.setOnDragDetected(event -> {
    Dragboard db = pictureOne.startDragAndDrop(TransferMode.ANY);
    ClipboardContent content = new ClipboardContent();
    // Resizing the image to required size before taking the snapshot.
    pictureOne.setFitHeight(dragSize);
    pictureOne.setFitWidth(dragSize);

    content.putImage(pictureOne.snapshot(null,null));

    // Resetting the image to initial size after taking the snapshot.
    pictureOne.setFitHeight(displaySize);
    pictureOne.setFitWidth(displaySize);
    db.setContent(content);
    event.consume();
});
ImageView dragImage = new ImageView(pictureOne.getImage());
dragImage.setFitHeight(dragSize);
dragImage.setFitWidth(dragSize);
content.putImage(dragImage.snapshot(null,null));
// Instead of content.putImage(..) use
content.putString("DRAG_IMAGE");
..
// And instead of checking using event.getDragboard().hasImage() use
event.getDragboard().hasString() && event.getDragboard().getString().equals("DRAG_IMAGE")