Вы можете использовать localToParent
несколько раз для преобразования координат из системы координат узла ScollPane
s 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
в содержимом scrllPane
.
Я думаю, что я получу Y-координату узла назначения ссылки, разделю ее на общую высоту содержимого и использую это значение в качестве Vvalue
Это не на 100% правильно. Необходимо учитывать тот факт, что для vvalue = 1
нижняя часть содержимого отображается внизу области просмотра, а не вверху. Следовательно, уравнение для координаты y части содержимого, отображаемой в верхней части области просмотра, равно
y = vvalue * (contentHeight - viewportHeight)
так
vvalue = y / (contentHeight - viewportHeight)
Вам нужно лечить случаи, когда contentHeight <= viewportHeight
или y > contentHeight - viewportHeight
отдельно, конечно.
Высота области просмотра может быть получена через границы области просмотра
double viewportHeight = scrollPane.getViewportBounds().getHeight();