Как перетащить и оставить изображение без перетаскивания? - PullRequest
0 голосов
/ 03 октября 2018

Я настраиваю игру на линкорах, в которой я хочу установить корабли на игровом поле, перетаскивая 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();
            }
        });




    }

На данный момент перетаскивание работает по большей части, за исключением секции setOnDragDone, которая нене меняю цвет на зеленый (но я поработаю над этим позже).

Мой вопрос заключается в том, что когда я начинаю перетаскивание, в любом случае можно установить размер перетаскиваемого изображения (а неполный размер исходного изображения, отображаемого).Если нет, могу ли я по-прежнему перетаскивать изображение, но не отображать перетаскиваемое изображение, а просто изменять цвет цели.

1 Ответ

0 голосов
/ 04 октября 2018

Во-первых, очень быстрое предложение, почему у вас есть пять отдельных циклов «for» для установки разных обработчиков перетаскивания для одного и того же набора узлов.Вы можете делать все только в одном цикле for.

for(Node target: playerGrid.getChildren()) {
   if(target.getId() != null) {
      target.setOnDragOver(..);
      target.setOnDragEntered(..);
      target.setOnDragExited(..);
      target.setOnDragDropped(..);
      target.setOnDragDone(..);
   }
}

Переходя к актуальному вопросу, чтобы изменить размер изображения и установить его на панели, вы можете использовать функцию «снимок».Проверьте приведенный ниже код, чтобы установить измененное изображение в dragboard.

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 и сделать снимок.

ImageView dragImage = new ImageView(pictureOne.getImage());
dragImage.setFitHeight(dragSize);
dragImage.setFitWidth(dragSize);
content.putImage(dragImage.snapshot(null,null));

Что касается другого вопроса не показа изображения, я думаю, что вы можете установить любой контент STRING и проверить его вместо использования event.getDragboard (). HasImage ().Нечто подобное ..

// 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")
...