JavaFX,如何冻结TableView中某些列的位置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX,如何冻结TableView中某些列的位置相关的知识,希望对你有一定的参考价值。
这个想法是:在N列的TableView上,即使使用水平滚动条,前M列始终可见。
我的要求附近唯一的是这个Binding two tableviews together such that they scroll in sync。根据我的观点,并排放置两张桌子的想法并不是最好的
1)列的类型在两个表之间是部分独立的:如果使用相同的observableList,则行在两个表中排序,但不可能在多列上排序,其中至少有一列不在同一个表中 2)鼠标滚轮或箭头键没有同步滚动
我知道,可能,我可以使用EventHandlers和Listeners处理这些问题,但我希望可以只使用一个表。
所以,问题是:TableView或TableColumns上是否有任何可配置属性可以实现我正在寻找的行为?
所以,问题是:TableView或TableColumns上是否有任何可配置属性可以实现我正在寻找的行为?
显然不是,但是在JavaFX Jira上有一个针对此行为的功能请求(您需要注册才能查看它):
https://javafx-jira.kenai.com/browse/RT-19454
我建议你投票。 :^)
目前没有这样的功能。实际上,即使操纵滚动条并响应滚动条事件也是有问题的。我能想到的两个选择:
选项#1 - 多表
创建一个新的布局,其中包含两个表和两个滚动条,如下面的FXML代码段所示:
<BorderPane prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<bottom>
<ScrollBar fx:id="hScroll" />
</bottom>
<center>
<HBox fx:id="varTable" prefHeight="100.0" prefWidth="200.0">
<children>
<TableView fx:id="fixedTable" prefHeight="200.0" prefWidth="200.0">
<columns>
<TableColumn prefWidth="75.0" text="Column X" />
<TableColumn prefWidth="75.0" text="Column X" />
</columns>
</TableView>
<TableView prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS">
<columns>
<TableColumn prefWidth="75.0" text="Column X" />
<TableColumn prefWidth="75.0" text="Column X" />
</columns>
</TableView>
</children>
</HBox>
</center>
<right>
<ScrollBar fx:id="vScroll" orientation="VERTICAL" />
</right>
</BorderPane>
注意第二个tabe设置了HBox.hgrow =“ALWAYS”。
编写一个函数来定位TableView中的滚动条:
private static final ScrollBar getScrollBar(final TableView<?> tableView) {
for (final VirtualFlow virtualFlow: Nodes.filter(Nodes.descendents(tableView, 2), VirtualFlow.class)) {
for (final Node subNode: virtualFlow.getChildrenUnmodifiable()) {
if (subNode instanceof ScrollBar && ((ScrollBar)subNode).getOrientation() == Orientation.VERTICAL) {
return (ScrollBar)subNode;
}
}
}
return null;
}
使用此选项可找到两个垂直滚动条并将其属性(如min,max,value等)绑定到您自己的垂直滚动条,然后隐藏原始滚动条。您还需要设置managed = false,以便它们不占用布局中的空间。
找到并隐藏水平滚动条,并将“移动”表水平滚动条的属性绑定到您自己的水平滚动条。
我们成功地使用这种技术将两个表与一个滚动条链接,同时等待this Jira被修复。
选项#2 - 编写自己的TableViewSkin下载JavaFx源代码以查看它们对皮肤的作用,然后您可以编写完整的自定义皮肤或编写包裹两个常规皮肤的皮肤,并以与上述选项#1类似的方式实现
我能够在javafx表视图中冻结列。我们需要创建自定义表列类,其中我们将有两个方法setFixed
和isFixed
,它们将用于使某些列固定。
除此之外,你需要创建自己的
TableViewskin
TableHeaderRow
- 基本上在这个类中你需要覆盖getRootHeader()
方法NestedTableColumnHeader
- 在这个类中重写layoutChildren()
方法并添加新方法来布局fixedColumns
VirtualFlow
TableView
- 覆盖createDefaultSkin()
,为booleanProperty showColumnHeader
添加新的ObservableArrayList
and一个fixedTableColumn
TableRow
- 覆盖createDefaultSkin()
TableRowSkinBase
- 覆盖layoutChildren()
方法来处理固定列。
JavaFX没有此功能。查看ControlsFX的SpreadsheetView。
以上是关于JavaFX,如何冻结TableView中某些列的位置的主要内容,如果未能解决你的问题,请参考以下文章
JavaFX:保存和恢复 TableView 的视觉状态(顺序、宽度和可见性)
JavaFX TableView:线程“ JavaFX Application Thread”中的异常java.lang.IndexOutOfBoundsException
JavaFX TableView Integer 不显示,而 String 项目是