2015-06-11 8 views
2

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

ответ

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 и ее детей.

enter image description here

Если вы хотите, чтобы они в собственности просто создать свой собственный 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