JavaFX: How to disable ScrollBars in TableView
我有一个JavaFX TableView,当父节点的大小调整得太小而无法显示数据而不是使其变得可滚动时,我希望表行为截断TableView的图像。为了澄清,我只希望滚动条被禁用或不可见,因此它们不会显示。
下面是我在SceneBuilder中的节点层次结构,以帮助您。
我在下面尝试过的事情
我读了这篇文章,但是答案只是使单元格调整大小以适合宽度,而不是禁用ScrollBar。我在这里阅读了ScrollBar上的文档,但是找不到visible或enabled属性。我也很幸运地阅读了TableView文档。
我在这里搜索了JavaFX CSS指南,发现下面有两个可以引用滚动窗格的策略。
1 2
| -fx-hbar-policy:
-fx-vbar-policy: |
但是将TableView包裹在ScrollPane中并没有按预期工作。它不允许我"适合父母"。我想引用这些属性,但是如果可能的话,直接在TableView中引用。任何建议,我们将不胜感激。
- 我不确定,但是可以在TableView上使用lookup()直接访问ScrollBar吗? ScrollBar scrollBar = (ScrollBar) tableView.lookup(".scroll-bar:vertical");,然后将其禁用?
-
"但我找不到setVisible()或setEnabled()属性"。 ScrollBar继承自Node,后者提供了visible和disable属性。不幸的是,ScrollBarPolicy枚举特定于ScrollPane,而像TableView这样的控件将其ScrollBar创建为VirtualFlow的一部分。据我所知,没有公共API允许将TableView的ScrollBar配置为从不显示。
-
@Zephyr我尝试了这个,我可以应用.setDisable(true);到滚动条。但是,这只会使滚动条变灰,并且看起来像一个禁用的按钮,但是仍然可以看到它并且可以正常工作。我将尝试setVisible和其他一些东西。我只是为了确认查找是否在一定程度上可以正常工作并与您交流而写。同时仍在尝试自己进行这项工作。谢谢您到目前为止使我朝着我的目标前进。
-
@Slaw非常感谢您的明确解释。我对VirtualFlow并不十分熟悉,因为我还是javafx的新手,所以我刚刚阅读了有关它的内容,并且我理解为什么我不能直接配置它。像往常一样,您的输入非常有用。
-
有一个功能请求JDK-8090721,它要求公开/支持的方式来隐藏TableView的滚动条,但是JavaFX 11.0.2尚未实现它。
完全隐藏滚动条,无论是否"应该"显示,都可以使用以下CSS实现:
1 2 3 4 5 6 7 8 9
| .table-view .scroll-bar * {
-fx-min-width: 0;
-fx-pref-width: 0;
-fx-max-width: 0;
-fx-min-height: 0;
-fx-pref-height: 0;
-fx-max-height: 0;
} |
如果要禁用所有滚动,则可以将事件过滤器添加到TableView:
1 2 3 4 5 6 7 8
| table. addEventFilter(ScrollEvent. ANY, Event::consume );
// or if you only want to disable horizontal scrolling
table. addEventFilter(ScrollEvent. ANY, event -> {
if (event. getDeltaX() != 0) {
event. consume();
}
}); |
如果您不希望在父级变得太小时缩小TableView,请设置最小大小以使用首选大小:
1
| table.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); |
如果您不希望TableView增长到其首选大小,请对最大大小进行相同的操作。如果需要,还可以给出一个明确的首选大小。
- 这个答案的综合性是极好的,但是我对css有一个小问题。我有多个表,我想滚动其他表。如果我只想引用一个TableView,而它的css-id是firstTable,我该怎么做?我尝试在块的前面加上" .firstTable",但是除了引用某些ID以外,关于javafx css显然还有一些我不了解的地方。感谢您的帮助!
-
如果"firstTable"是id,则应使用#firstTable。一起看起来就像#firstTable .scroll-bar * { ... }。 JavaFX-CSS基于CSS 2.1和一些CSS 3,以及一些自定义功能。链接的文档提供了指向CSS参考页面的链接。
-
您还可以使用.table-view .scroll-bar * {-fx-min-width: 0; -fx-pref-width: 0; -fx-max-width: 0;}仅获取垂直滚动条,反之亦然仅获取水平滚动条。我知道这是违反直觉的,但是如果您以其他方式使用它,则将无法正常工作。 (P.S.我在评论中这里的代码格式不正确;我建议对此答案进行编辑,但被拒绝了。)