如何自动滚动ScrollPane,以使节点在窗格顶部对齐

时间:2019-03-23 01:47:51

标签: java javafx

在我的程序中,我有一个ScrollPane,它的内容是带有很多子节点的VBox。某些节点是可以单击的链接,它应该跳到链接的目的地(想象一下,在Wikipedia文章的目录中单击链接,它将跳到相应的部分)。我知道,为了通过代码垂直滚动ScrollPane,我将使用.setVvalue()

我的想法是,我将获得链接目标节点的y坐标,并将其除以内容的总高度,然后将该值用作Vvalue。问题是,如果使用.getBoundsInParent()将节点嵌套在多个容器中(例如,在2个VBox中),我将如何准确获得该节点的y坐标?而且,我什至以这种正确的方式来对待吗?

我的意思的例子:

Before clicking the link

After clicking the link

1 个答案:

答案 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