JavaFX ScrollPane - 检查显示了哪些组件

JavaFX ScrollPane - Check which components are displayed

我想知道JavaFX 8 中是否有一个ScrollPane 属性 可以用来在给定时间监听当前显示的组件。 例如, ScrollPane 有一个 VBox,它有 8 个按钮。在滚动窗格中只能看到 4 个按钮。我想要一个监听器,它提供滚动位置变化时显示的 8 个按钮中的 4 个。

您可以检查节点是否可见:

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;
}

此方法returns 所有可见节点的列表。 它所做的只是比较 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