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

时间:2016-09-04 15:44:01

标签: java javafx drag-and-drop shapes

我有一个Circles的GridPane,我希望能够将一个圆圈拖到另一个圆圈上,并将第一个圆圈的颜色应用到第二个圆圈。

我遇到的问题是我无法让目标圈子检测到dragEntered或dragOver。我已经能够使用标签成功实现此功能,但出于某种原因,Circle不会产生相同的效果。

我已经看到一些准解决方案涉及设置circle.setMouseTransparent(true),以便拖动节点下下的节点可以看到拖动,但这里也没有运气。

以下是使用标签执行类似操作的代码的链接:Hello Drag and Drop

这是我的代码的适用代码段:

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

1 个答案:

答案 0 :(得分:1)

James_D在上面的评论中对这个问题有正确答案。似乎即使只是让圆圈注册发生拖放,您也必须将一些数据传递给Dragboard(即使您不想将数据传递给节点)。

这已添加到我的circle.setOnDragDetected方法中:

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

所以这个方法现在看起来像这样:

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