2015-06-11 63 views
2

我想知道JavaFX 8中是否有ScrollPane屬性可用於偵聽當前在給定時間顯示的組件。 例如, ScrollPane有一個VBox,它有8個按鈕。在滾動窗格中只能看到4個按鈕。我想要一個監聽器,在滾動位置改變時顯示8個按鈕中的4個按鈕。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