JavaFX ScrollPane - 检查显示哪些组件

Posted

技术标签:

【中文标题】JavaFX ScrollPane - 检查显示哪些组件【英文标题】:JavaFX ScrollPane - Check which components are displayed 【发布时间】:2015-08-27 02:27:13 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以检查节点是否像这样可见:

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 及其子项的场景坐标。

如果您希望它们在 Property 中,只需创建您自己的 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

【讨论】:

以上是关于JavaFX ScrollPane - 检查显示哪些组件的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX ScrollPane 样式

如何正确制作嵌套的 JavaFX GridPanes 布局?

JavaFX 中的图形可视化(如 yFiles)

JavaFX - 如何从TextArea隐藏滚动条?

如何在不让 Flash 8 隐藏工具提示的情况下在 ScrollPane 中显示工具提示?

Java AWT 图形界面编程Container 容器 ③ ( ScrollPane 可滚动容器示例 )