JavaFx TableView 如何判断 ScrollBar 是否可见

JavaFx TableView how to tell if ScrollBar is visible

基于 this example(选项 #1),我在 SplitPane 中使用 2 TableView 创建了一个固定列。 显示其他列(不是固定列)的 TableView 可能会变得太宽以至于显示 ScrollBar,为此我必须用 -fx-padding: 0 0 13px 0; 进行补偿以保持 [=两个 TableView 的 16=] 对齐。

所以我现在必须弄清楚是否正在显示 ScrollBar 或找到一种完全不同的方法来确保 TableRow 对齐。不幸的是,显而易见的方法似乎不起作用。 (ScrollBar不是null,我只是没有post代码来保证)

ScrollBar horizontalScrollBar = (ScrollBar) lookup(".scroll-bar:horizontal");
horizontalScrollBar.visibleProperty().addListener((observable, oldValue, newValue) -> {
    System.out.println(newValueobservableScrollBar);
});

由于某些原因,当 ScrollBar 出现或消失时,不会触发监听器。

因此,为了确定某个特定滚动条是否可见,我首先必须找到它,所以我查找了该特定 table 上的所有滚动条。

Set<Node> scrollBars = itemsTableView.lookupAll(".scroll-bar");

然后过滤集合以检索我正在寻找的特定滚动条(在我的例子中是水平的)

Optional<Node> horizontalScrollBar = scrollBars.stream()
          .filter(node ->
            ((ScrollBar) node).getOrientation().equals(Orientation.HORIZONTAL))
          .findAny();

然后将监听器附加到滚动条的可见性-属性

horizontalScrollBar.ifPresent(node ->
          node.visibleProperty().addListener((observable, oldValue, newValue) -> {
                    if(newValue)
                    {
                        columnTableView.setStyle("-fx-padding: 0 0 13px 0;");
                    } else
                    {
                        columnTableView.setStyle("-fx-padding: 0 0 0 0;");
                    }
              })
        );

几乎看起来有点简单吧?好吧,一旦你想通了

lookup(".scroll-bar:horizontal");

不是return水平滚动条而是第一个(垂直)滚动条。除非您意识到这一点,否则您的应用程序会表现得有点神秘。