JavaFX ScrollPane - Проверьте, какие компоненты отображаются

Интересно, есть ли в JavaFX 8 свойство ScrollPane, которое можно использовать для прослушивания компонентов, которые в данный момент отображаются в данный момент времени. Например, ScrollPane имеет VBox, который имеет 8 кнопок. Только 4 кнопки можно увидеть в области прокрутки. Я хотел бы, чтобы слушатель давал те 4 из 8 кнопок, которые отображаются при изменении положения прокрутки.

1 ответ

Решение

Вы можете проверить, видны ли узлы вот так:

private List<Node> getVisibleNodes(ScrollPane pane) {
    List<Node> visibleNodes = new ArrayList<>();
    Bounds paneBounds = pane.localToScene(pane.getBoundsInParent());
    if (pane.getContent() instanceof Parent) {
        for (Node n : ((Parent) pane.getContent()).getChildrenUnmodifiable()) {
            Bounds nodeBounds = n.localToScene(n.getBoundsInLocal());
            if (paneBounds.intersects(nodeBounds)) {
                visibleNodes.add(n);
            }
        }
    }
    return visibleNodes;
}

Этот метод возвращает список всех видимых узлов. Все, что он делает, это сравнивает координаты сцены ScrollPane и его дочерних элементов.

введите описание изображения здесь

Если вы хотите их в свойстве, просто создайте свой собственный ObservableList:

private ObservableList<Node> visibleNodes;

...

visibleNodes = FXCollections.observableArrayList();

ScrollPane pane = new ScrollPane();
pane.vvalueProperty().addListener((obs) -> {
    checkVisible(pane);
});
pane.hvalueProperty().addListener((obs) -> {
    checkVisible(pane);
});

private void checkVisible(ScrollPane pane) {
    visibleNodes.setAll(getVisibleNodes(pane));
}

Полный код см. В BitBucket

Другие вопросы по тегам