Интересно, есть ли свойство ScrollPane в JavaFX 8, которое можно использовать для прослушивания компонентов, отображаемых в данный момент в данный момент времени. Например, ScrollPane имеет VBox, который имеет 8 кнопок. В scrollpane можно увидеть только 4 кнопки. Я бы хотел, чтобы слушатель дал эти 4 из 8 кнопок, которые отображаются при изменении положения прокрутки.JavaFX ScrollPane - проверьте, какие компоненты отображаются
2
A
ответ
6
Вы можете проверить, если узлы видны как то:
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