目前没有这样的功能。事实上,即使是操纵滚动条和响应滚动条事件也是有问题的。我能想到的两个选择:
选项 #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>
请注意,第二个表设置了 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;
}
使用它来定位两个垂直滚动条并将它们的属性(如最小值、最大值、值等)绑定到您自己的垂直滚动条,然后隐藏原始滚动条。您还需要设置 managed=false 以便它们不会占用布局中的空间。
找到并隐藏水平滚动条并将“移动”表水平滚动条的属性绑定到您自己的水平滚动条。
在等待修复此 Jira时,我们成功地使用此技术将两个表与单个滚动条链接起来。
选项 #2 - 编写您自己的 TableViewSkin
下载 JavaFx 源代码以查看他们对皮肤的作用,然后您可以编写一个完整的自定义皮肤或编写一个包装两个常规皮肤的皮肤,并以与上面的选项 #1 类似的方式实现