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

Javafx可检索拖放错误

司空思聪
2023-03-14

我正在创建一个带有拖放特性的javafx应用程序。我需要能够从一个窗格拖拽到下一个窗格。丢弃后,所有被丢弃的节点都需要是可访问的。拖放操作很顺利。然而,我有一个问题,其中不是所有的节点都可以访问后删除。我会拖动一个节点并点击它,有时它会做出响应,但有时当我点击它时,一个随机节点将不再显示功能。对于哪些节点停止工作,哪些节点始终工作,没有明显的模式(我可以看到)。如果任何人有任何关于为什么这可能是一个问题或如何修复它的想法,它将非常感谢。我到处找过,几年前只发现一个类似的问题,但有他们的解决方案的页面已经被删除了。

ImageView iV= new ImageView(image);
    iV.setId("image");
    iV.setOnDragDetected(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            dragAndDrop(iV, iV.getId(), event);
        }
    });

我拖动了三个ImageViews,这些ImageViews是VBox子级。

MainEntract:在这个类中,我有一个方法可以将我的拖动事件注册到我的窗格中:PView是我的窗格的类扩展

public void registerOnDragDropped(PView pView){


    pView.setOnDragOver(new EventHandler<DragEvent>() {
        @Override
        public void handle(DragEvent event) {
            event.acceptTransferModes(TransferMode.ANY);

            System.out.println("drag over registered");

        }
    });


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

            Dragboard db = event.getDragboard();
            final String id = db.getString();

            double mousePosY = event.getY();
            double mousePosX = event.getX();
            deviceCounter += 1;

            pView.createBoardView(id, deviceCounter, mousePosX, mousePosY);

            event.setDropCompleted(true);

        }
    });

    pView.setOnDragExited(new EventHandler<DragEvent>() {
        @Override
        public void handle(DragEvent event) {
            event.acceptTransferModes(TransferMode.ANY);
            //computerView.setEffect(null);

            event.consume();
        }
    });


}

注意:这个方法在我的MainEntract类(BorderPane)中。初始化MainEntrage的所有其他子节点时。

Node:(draggable nodes扩展StackPane)我的节点的处理程序在我称为makeDraggable()的方法中

public void makeDraggable(Node node) {
    this.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {

            node.getScene().setCursor(Cursor.MOVE);
            System.out.println("makeDraggable mouse pressed");
        }
    });

    node.setOnMouseReleased(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            node.getScene().setCursor(Cursor.DEFAULT);

        }
    });

    node.setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {

            node.setTranslateX(node.getTranslateX() + event.getX() - 35);
            node.setTranslateY(node.getTranslateY() + event.getY() - 35);

            event.consume();

            node.toFront();

        }
    });
}

如果需要其他信息,请告诉我。提前谢谢!

共有1个答案

顾单弓
2023-03-14

我已经想出了解决这个问题的办法。

问题出在我放置在节点上的附件的呈现顺序上。因此,当我将节点拖动到屏幕上时,我有另一个节点(放置在窗格上的一行),它将屏幕的中心绑定到该节点。我最初并不认为这是问题所在,所以我甚至没有包括那个类或代码段。然而,在玩了一圈之后,我意识到这确实是问题所在。我不得不将行添加到渲染顺序的顶部。这可以在允许创建新节点的任何方法中以以下方式完成:

Pane line = new Pane();
//add whatever code binds your line to desired places
getChildren.add(0, line); 
//add the other node as child
 类似资料:
  • 我已经在我的游戏中实现了拖放功能,但到目前为止,我只能“拖放”到硬编码的位置。如图所示: 我想要的是: 当船舶被丢弃时,它的x、y值(相对于GridPane)被保存,或者 飞船掉落到的细胞被保存。 我的setOnDragDropped事件在此处处理: 我觉得这应该是一个简单的鼠标悬停事件或类似的事情,但我不知道该怎么做。 编辑:下面类的完整代码: }

  • 我喜欢用Javafx和FXML布局编写一个九人莫里斯游戏,我将使用场景生成器进行图形部分。 谁能给我写一个关于拖放的小例子吗?因为这是一场九人莫里斯的比赛,我只喜欢拖拽,并有一些我可以扔下碎片的点。

  • 我正在做的是为一副牌中的每张牌创建一个图像视图。对于每个图像视图,我添加了两个事件setOnDragOver和setondragdroped。然而,当我点击并试图拖动一张卡片时,我的活动打印声明甚至没有显示。 我试图做的是允许在窗格上拖动一张卡。因此,根据我拖动它的位置更改位置,但它仍然在窗口上。下面是图像视图的事件。 这个是为了脱线

  • 我正在尝试将自定义对象从JPanel拖放到JavaFX场景<为了实现这一点,我创建了一个带有自定义对象和自定义TransferHandler的简单应用程序。在本例中,我的问题是,当我在

  • 我有一个ImageView,可以用鼠标拖放,点击按钮旋转90度。这两件事在独立完成时都可以工作(因此可以旋转或移动ImageView,而不是两者都可以)。当我旋转ImageView并尝试移动它时,它似乎是随机移动的。 我使用以下方法旋转图像视图: 这导致了我所说的看似随机的运动。 我还尝试使用以下方法旋转ImageView: 位置是图像在屏幕上的位置。宽度和高度是ImageView的宽度和高度。

  • 我正在尝试一个简单的Java FX程序,它可以创建一个窗口,我所需要的只是增加读取已删除文件的能力。我得到了以下代码片段,它不会抛出任何错误,但也不允许我删除任何内容。当我试图删除文件时,它会显示一个红色光标(不允许使用windows光标) 我使用的是Windows 8机器和JDK 8.0_60版。不确定问题出在哪里。代码有问题吗?我错过什么了吗? 我试过的- 已尝试更改传输模式 尝试检查文件权限