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

在GridPane中移动节点后JavaFX MouseEvent不触发

云瑞
2023-03-14

我试图用JavaFX创建一个“可拖动”的直方图UI。我有一个滚动窗格,其中包含一个网格窗格,有一列和许多行。每行是一个包含标签的HBox。每10行,还有一个包含一行的HBox。

我试图通过设置onMousePressed、onMouseAdrag和onMouseCreleased事件处理程序(如下所示),使包含行的HBoxe可拖动。如果我将一条hbox线拖动并释放到它的起点之上,它就会工作-它最终会出现在我放入的任何网格行中,我可以再次单击并拖动它。然而,如果我在起点下方拖动并释放一条线,我将无法为该hBox获得更多的鼠标事件。我试着到处添加日志语句,但什么都没有。我试着在Mouseover上设置,但也没有被解雇。

为什么像这样在网格周围移动hbox可以向上拖动而不能向下拖动?

lineContainer.setOnMousePressed(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent mouseEvent) {
        EventTarget target = mouseEvent.getTarget();

        lastY = mouseEvent.getSceneY();
    }
});
lineContainer.setOnMouseDragged(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent mouseEvent) {
        Node target = (Node) mouseEvent.getTarget();
        HBox hBox = null;
        if (target instanceof HBox) {
            hBox = (HBox) target;
        }
        else if (target instanceof Line) {
            hBox = (HBox) target.getParent();
        }
        else { //should never happen
            log.info("target not hbox or line: " + target.getClass());
        }
        if (mouseEvent.getSceneY() <= (lastY - 15)) {
            int row = GridPane.getRowIndex(hBox);
            GridPane.setRowIndex(hBox, --row);
            lastY = mouseEvent.getSceneY();
            lastRow = row - 1;
        } else if (mouseEvent.getSceneY() >= (lastY + 15)) {
            int row = GridPane.getRowIndex(hBox);
            GridPane.setRowIndex(hBox, ++row);
            lastRow = row - 1;
            lastY = mouseEvent.getSceneY();
        }
    }
});
lineContainer.setOnMouseReleased(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent mouseEvent) {
        Node tar = (Node) mouseEvent.getTarget();
        HBox hBox = null;
        if (tar instanceof HBox) {
            hBox = (HBox) tar;
        }
        else if (tar instanceof Line && tar.getParent() instanceof HBox) {
            hBox = (HBox) tar.getParent();
        }
        else { //should never happen
            log.info(mouseEvent.getTarget().getClass().toString());
        }
    }
});

更新:我设法通过创建一个新的HBox,重置onMouse来让它工作...处理程序,并在每次释放鼠标时复制其子级。但我仍然不知道是什么导致了最初的问题......

共有1个答案

钦德佑
2023-03-14

以下不是你的直接解决方案,但我想说我有一个类似的问题,并分享我的观察结果。

我的应用程序允许在两个轴(X,Y)上拖动。我所能找到的只是一些看不见的元素正在“遮蔽”MouseeEvent的hitbox。使用“MS扫雷器”方法对其进行测试,显示该干扰区域从根的坐标(0,0)延伸到场景中另一个节点的坐标(maxX,maxY),该节点位于上方的一层。

我的问题通过改变父对象(让我们称之为层)的z顺序得到了解决,这些父对象包含没有接收到它们的MouseEvents的节点。

JavaFX MouseEvent 文档解释说,只有顶级节点才能接收事件:https://docs.oracle.com/javafx/2/api/javafx/scene/input/MouseEvent.html

另请查看picOnBound属性:JavaFX:如何使节点部分鼠标透明?

 类似资料:
  • 我正在使用JavaFX8创建一个应用程序。我使用拖放动态更改网格窗格的内容。我希望迭代每行或每行/列的GridPane内容。JavaFX允许通过指定行和列在GridPane中添加节点。 我希望通过指定行和列,以相同的方式读取GridPane的节点 我想有一些类似于下面的源代码(下面的代码不正确),

  • 问题内容: 我需要一个MySQL查询,该查询可在一个嵌套集中移动一个节点及其所有子节点。我找到了这个站点,但是该函数似乎非常不合逻辑- 没有或没有嵌套的集合模型,并且代码本身仅比所需的更长。我在表格中仅有的额外一列是。 我不能只删除并再次添加该节点,因为它将丢失其ID。 问题答案: 我知道,这个主题已经很老了,但是无论如何仍然没有答案。我是从Google来到这里的,没有找到这个问题的直接答案。 因

  • 下图应该有助于尽可能清楚地说明这一点。 我有三个窗格A、B和C。B和C是A的子窗格,B有自己的子窗格(白色框)。通过拖放,我可以将B的孩子移动到B中的任何位置,并能够再次拾取他们,但如果拖到C,甚至是A的一小部分,他们可以被丢弃,但不能再次拾取。 我使用基本控制。要拖动,我使用imgView.setOnMouseDragged。 那么,我如何才能从一个窗格A拖动到窗格B或C,并且仍然允许拾取和拖动

  • 我正在制作一个基于虫子“感知”和吃食物的网格风格游戏/模拟。我正在使用标签的gridPane(称为)来显示虫子和食物的网格。当虫子将细胞移向食物等时,这显然会不断更新。 我目前有一个函数,我想用在cell Content中具有新文本的标签替换[row, ol]处的标签。 我有一个有效的方法 然而,我担心这仅仅是在当前标签上添加了一个标签,显然超过100次的模拟迭代并不理想。 在添加标签之前,我已经

  • 我想知道如何实现这个功能: 我有一个可编辑的JTree,可以编辑节点的名称。如果我有一个节点是分支节点(其中有一些叶节点),并且该分支节点在编辑时展开,编辑后,该节点将折叠。 编辑完成后,如果分支节点打开,我想让它保持打开状态,如果分支节点折叠,我想让它折叠。 我试图查看TreeWireExpandListener,但它似乎无法解决我的问题,因为在调用这些方法之前,我需要识别实际节点是否处于编辑模

  • 我想用XSLT转换XML文档。按名称和属性匹配的节点及其子节点应嵌套/移动到新节点中。 从转变 到 但是我的XSLT工作不好。您有什么提示吗,XSLT文件有什么问题? 非常感谢你 安德烈亚斯 我的XSLT 输出: 我的源XML文件 我希望在转换后的输出中将v:data节点及其子节点嵌套到一个新节点中。但只有属性名为“Custon”的v:data节点。转换后的XML文档应该如下所示 如果我从XSLT