当前位置: 首页 > 知识库问答 >
问题:

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

方长卿
2023-03-14

我有一个网格窗格的圆圈,我希望能够将一个圆圈拖到另一个圆圈之上,并将第一个圆圈的颜色应用于第二个圆圈。

我遇到的问题是,我无法让目标圆检测到dragEntered或dragOver。我已经能够使用标签成功地实现这一点,但由于某些原因,圆圈不会产生相同的效果。

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

这里有一个使用标签做类似事情的代码链接:Hello拖放

以下是我的代码片段:

              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个答案

孙言
2023-03-14

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

这已添加到我的<代码>圈中。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();
                }
            });
 类似资料:
  • 我已经画了一个正方形,但是我怎样才能在它旁边放置另一个正方形而没有任何空隙呢?我认为< code>mRedRect1F中的第一个参数(0)需要更改,但我不知道该更改什么。 使现代化

  • 我是JavaFX动画的新手。我正在尝试遵循代码作为另一个大项目的试用;基本上我想用鼠标拖动来移动圆圈,当圆圈在矩形上时,突出显示矩形。如果圆圈落在矩形上,请将其颜色更改为圆圈的颜色。 到目前为止,我已经设法用鼠标移动圆圈,但我不确定为什么矩形的OnDragEntered方法什么都不做。 以下是FXML: 这是控制器: 包装com.sc.colordx.controller; 这是正确的方法吗?还是

  • 我正在为一个家庭作业制作一个ms绘画风格的程序。在这个家庭作业中,你应该能够右键点击一个形状并在屏幕上移动它。填充的形状可以在形状内的任何地方右键单击,而未填充的形状则应在形状的边框上右键单击并选择。 我遇到的问题是,当我最初启动程序,绘制和未填充的形状,并尝试拖动它,它会拖动,但一旦我再次放下它,它的行为正确,变得不可拖动,所有未来未填充的形状都相应地行动。 TLDR:我希望所有填充的形状都是可

  • 我想创建一个多边形从形状点。

  • 问题内容: 在同一对话框窗口中有两个QListWIdget。都启用了DragDrop功能。如果我将文件拖放到两个ListWidges中的任何一个,程序将识别出该文件并打印出被删除文件的列表。但是除了拖放文件之外,我还希望能够将List小部件Items从一个拖放到另一个。如果我拖动ListItems,则会触发拖放事件。但是它无法识别出哪些项已放置到窗口小部件上。示例代码如下。目的是将列表项从一个Li

  • 问题内容: 嗨,我正在尝试创建仿射变换,使我可以将一个三角形变换为另一个三角形。我所拥有的是2个三角形的坐标。你能帮助我吗? 按照亚当·罗森菲尔德的回答,我想出了这段代码,以防万一有人无聊地自己解决方程: 问题答案: 我假设您在这里谈论2D。仿射变换矩阵中有9个值: 有3个顶点输入,和,当其转化应该成为,,。然而,由于我们在齐次坐标的工作,应用到不一定给-它给人的倍数。所以,我们也有未知的乘法器,