简体   繁体   English

JavaFX将形状拖放到另一个形状上

[英]JavaFX Drag and Drop a Shape on to Another Shape

I have a GridPane of Circles, and I want to be able to drag one circle on top of another and have the color from the first be applied to the second. 我有一个GridPane of Circles,并且我希望能够将一个圆拖到另一个圆上,并将第一个颜色应用到第二个颜色。

The problem I'm having is that I cannot get the target circle to detect a dragEntered or dragOver. 我遇到的问题是我无法获取目标圆来检测dragEntered或dragOver。 I have been able to implement this successfully using Labels, but for some reason, a Circle does not give the same effect. 我已经能够使用Labels成功地实现了这一点,但是由于某些原因,Circle并没有带来相同的效果。

I have seen some quasi-solutions that involved setting circle.setMouseTransparent(true) so that the node under the dragged node can see the drag, but no luck here either. 我已经看到了一些涉及设置circle.setMouseTransparent(true)的准解决方案,以便被拖动节点的节点可以看到拖动,但这里也没有运气。

Here's a link to the code that does a similar thing using Labels: Hello Drag and Drop 以下是使用标签执行类似操作的代码的链接: Hello Drag and Drop

Here's an applicable snippet of my code: 这是我的代码的适用代码段:

              circle.setOnDragDetected(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {

                    Dragboard db = circle.startDragAndDrop(TransferMode.ANY);

                    System.out.print("Dragging...");
                    System.out.println("From row: " + draggedFromRow + " From col: " + draggedFromCol);

                    circle.setLayoutX(event.getSceneX());
                    circle.setLayoutY(event.getSceneY());


                    event.consume();
                }
            });

            circle.setOnDragOver(new EventHandler <DragEvent>() {

                public void handle(DragEvent event) {
                    System.out.println("onDragOver");

                    event.acceptTransferModes(TransferMode.ANY);

                    event.consume();
                }
            });


            circle.setOnDragDropped(new EventHandler<DragEvent>() {
                @Override
                public void handle(DragEvent event) {

                    int toCol = Integer.valueOf(circle.getId().substring(0, 1));
                    int toRow = Integer.valueOf(circle.getId().substring(1));

                    performSwap(draggedFromRow, draggedFromCol, toRow, toCol);

                    System.out.print("Dragg dropped on ");
                    System.out.println(toRow + " " + toCol);

                    event.consume();
                }
            });

            circle.setOnDragEntered(new EventHandler<DragEvent>() {
                public void handle(DragEvent event) {
                    System.out.println("drag entered!");

                    event.consume();
                }
            });


            circle.setOnDragExited(new EventHandler<DragEvent>() {
                public void handle(DragEvent event) {
                    System.out.println("drag left!");

                    event.consume();
                }
            });

James_D had the correct answer to this problem in his comment above. James_D在上面的评论中对这个问题有正确的答案。 Seems that even just to have the circle register that a drag and drop is occurring, you have to pass some data to a Dragboard (even if you don't want to pass data to the node). 似乎即使只是让圆寄存器记录正在发生拖放,您也必须将一些数据传递给Dragboard(即使您不想将数据传递给节点)。

This was added to my circle.setOnDragDetected method: 这已添加到我的circle.setOnDragDetected方法中:

Dragboard db = circle.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putString(circle.getId());
db.setContent(content);

So the method now looks like this: 因此,该方法现在如下所示:

            circle.setOnDragDetected(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {

                    Dragboard db = circle.startDragAndDrop(TransferMode.ANY);
                    ClipboardContent content = new ClipboardContent();
                    content.putString(circle.getId());
                    db.setContent(content);

                    System.out.print("onDragDetected");

                    event.consume();
                }
            });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM