在我的程序中,我有一个ScrollPane,它的内容是带有很多子节点的VBox。某些节点是可以单击的链接,它应该跳到链接的目的地(想象一下,在Wikipedia文章的目录中单击链接,它将跳到相应的部分)。我知道,为了通过代码垂直滚动ScrollPane,我将使用.setVvalue()
。
我的想法是,我将获得链接目标节点的y坐标,并将其除以内容的总高度,然后将该值用作Vvalue
。问题是,如果使用.getBoundsInParent()
将节点嵌套在多个容器中(例如,在2个VBox中),我将如何准确获得该节点的y坐标?而且,我什至以这种正确的方式来对待吗?
我的意思的例子:
答案 0 :(得分:3)
您可以多次使用localToParent
来转换ScollPane
的{{1}}节点的坐标系中的坐标:
content
您可以例如使用
public static Point2D transform(Node coordinatesNode, Node ancestor, double x, double y) {
Point2D coordinates = new Point2D(x, y);
while (coordinatesNode != ancestor) {
coordinates = coordinatesNode.localToParent(coordinates);
coordinatesNode = coordinatesNode.getParent();
}
return coordinates;
}
要获取Point2D pt = transform(someNode, scrollPane.getContent(), 0, 0);
内容中someNode
左上角的坐标。
我的想法是,我将获得链接目标节点的y坐标,然后将其除以内容的总高度,然后将该值用作Vvalue
这不是100%正确的。您需要包括以下事实:对于scrllPane
,内容的底部显示在视口的底部而不是顶部。因此,视口顶部显示的内容部分的y坐标方程为
vvalue = 1
如此
y = vvalue * (contentHeight - viewportHeight)
您当然需要分别处理vvalue = y / (contentHeight - viewportHeight)
或contentHeight <= viewportHeight
的情况。
可以通过视口范围检索视口的高度
y > contentHeight - viewportHeight