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

时间:2013-12-08 00:24:51

标签: javafx

我正在尝试使用JavaFX创建一个“可拖动的”直方图UI。我有一个ScrollPane,其中包含一个包含1列和大量行的GridPane。每行中都有一个含有标签的HBox。每10行,还有一个包含Line的HBox。

我尝试通过设置onMousePressed,onMouseDragged和onMouseReleased事件处理程序(如下所示)使包含行的HBox可拖动。它可以工作,如果我拖动并释放一个高于其起点的hbox线 - 它最终会放入我放入的任何网格行中,然后我可以再次单击并拖动它。但是,如果我拖动并在其起点下方释放一条线,我就不能再获得该hBox的mouseEvents。我尝试在任何地方添加日志语句,没有。我尝试设置onMouseOver,它也没有被解雇。

为什么要在网格周围移动一个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 个答案:

答案 0 :(得分:0)

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

我的应用程序允许在两个轴(X,Y)中拖动。我已经能够发现一些看不见的元素正在“模糊”MouseEvent hitbox。使用“MS扫雷”方法对其进行测试,显示此干扰区域从根的坐标(0,0)延伸到场景中的另一个节点(maxX,maxY),该场景是上面的一层。

我的问题是通过更改包含未接收其MouseEvents的节点的父对象的z顺序(让我们称之为图层)来解决的。

JavaFX MouseEvent doc解释说它只是接收事件的顶级节点: https://docs.oracle.com/javafx/2/api/javafx/scene/input/MouseEvent.html

另请查看pickOnBounds属性:JavaFX: How to make a Node partially mouse transparent?