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