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

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

【问题讨论】:

    标签: javafx listener javafx-8 visible scrollpane


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多