Как автоматически прокрутить ScrollPane, чтобы узел был выровнен в верхней части панели - PullRequest
0 голосов
/ 23 марта 2019

В моей программе у меня есть ScrollPane, содержимое которого представляет собой VBox с большим количеством дочерних узлов. Некоторые из узлов являются ссылками, по которым вы можете щелкнуть, и они должны перейти к месту назначения ссылки (представьте, что, щелкая ссылки в содержании в статье Википедии, вы перейдете к соответствующему разделу). Я знаю, что для вертикальной прокрутки ScrollPane по коду я бы использовал .setVvalue().

Я думаю, что я получу y-координату узла назначения ссылки, разделю ее на общую высоту содержимого и использую это значение в качестве Vvalue. Проблема в том, как бы я точно получил координату y узла, если он вложен в несколько контейнеров (например, в 2 VBox) с использованием .getBoundsInParent()? Кроме того, я даже подходить к этому правильному пути?

Пример того, что я имею в виду:

Перед нажатием на ссылку

После нажатия на ссылку

1 Ответ

3 голосов
/ 23 марта 2019

Вы можете использовать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...