我正在尝试使用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 ...处理程序,并在每次释放鼠标时复制其子项来实现它。但我仍然不知道造成原始问题的原因......
答案 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?