【问题标题】:JavaFx TableView how to tell if ScrollBar is visibleJavaFx TableView如何判断ScrollBar是否可见
【发布时间】:2018-06-28 05:49:20
【问题描述】:

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

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

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

由于某种原因,当ScrollBar 出现或消失时,Listener 没有被触发。

【问题讨论】:

  • 我猜ScrollBar 已完全从场景中移除,而不是只是变得不可见。 (无论如何,这对于布局性能来说是更有效的方法......您可以通过向scene 属性添加一个侦听器并检查null 来收听,但ScrollBar 的确切显示/隐藏方式是一个实现细节和代码可能会在 Java 运行时更新时中断......)。
  • 所以你的意思基本上只是用sceneProperty()替换visibleProperty()

标签: tableview javafx-8 scrollbar


【解决方案1】:

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

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");

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

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 2011-02-16
    • 2014-05-03
    • 2015-12-29
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多