Javafx 2 JavaFX,如何冻结TableView中某些列的位置

Javafx 2 JavaFX,如何冻结TableView中某些列的位置,javafx-2,javafx,tableview,Javafx 2,Javafx,Tableview,其思想是:在N列的TableView上,即使使用水平滚动条,前M列也始终可见 唯一接近我要求的就是这个。 在我看来,把两张桌子并排放在一起不是最好的主意,因为 1) 列的排序在两个表之间部分独立:如果使用相同的observableList,则行在两个表中都进行排序,但不可能在至少一列不在同一个表中的多个列上进行排序 2) 没有与鼠标滚轮或箭头键同步的滚动 我知道,我可能可以使用EventHandler和侦听器处理类似的问题,但我希望可以只使用一个表 所以,问题是:在TableView或Table

其思想是:在N列的TableView上,即使使用水平滚动条,前M列也始终可见

唯一接近我要求的就是这个。 在我看来,把两张桌子并排放在一起不是最好的主意,因为

1) 列的排序在两个表之间部分独立:如果使用相同的observableList,则行在两个表中都进行排序,但不可能在至少一列不在同一个表中的多个列上进行排序
2) 没有与鼠标滚轮或箭头键同步的滚动

我知道,我可能可以使用EventHandler和侦听器处理类似的问题,但我希望可以只使用一个表

所以,问题是:在TableView或TableColumns上是否有任何可配置的属性来具有我所寻找的行为

所以,问题是:在TableView或TableColumns上是否有任何可配置的属性来具有我所寻找的行为

显然不是,但是JavaFX Jira上有一个针对这种行为的功能请求(您需要注册才能查看它):


我建议你投赞成票。(^)

目前没有此类功能。事实上,即使是操纵滚动条和响应滚动条事件也是有问题的。我可以想到两个选择:

选项#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;
private静态最终滚动条getScrollBar(最终TableView TableView){
for(最终的VirtualFlow VirtualFlow:Nodes.filter(Nodes.degents(tableView,2),VirtualFlow.class)){
for(最终节点子节点:virtualFlow.getChildrenUnmodifiable()){
if(滚动条的子节点实例&((滚动条)子节点).getOrientation()==Orientation.VERTICAL){
返回(滚动条)子节点;
}
}
}
返回null;
}

使用此选项可以定位两个垂直滚动条,并将其属性(如最小值、最大值、值等)绑定到您自己的垂直滚动条,然后隐藏原始滚动条。您还需要将managed=false设置为不占用布局中的空间

找到并隐藏水平滚动条,并将“移动”表格水平滚动条的属性绑定到您自己的水平滚动条

我们成功地使用这种技术,在等待修复的同时,用一个滚动条链接两个表

选项#2-编写自己的TableViewSkin
下载JavaFx源代码,查看它们对皮肤的作用,然后您可以编写一个完整的自定义皮肤,或者编写一个包装两个常规皮肤的皮肤,并以与上面选项1类似的方式实现。查看电子表格视图。

我可以在javafx表格视图中冻结列。我们需要创建我们的自定义表列类,在这个类中,我们将有两个方法
setFixed
isFixed
,用于将某些列设置为固定列

除此之外,您还需要创建自己的

  • TableViewskin

  • TableHeaderRow
    -基本上在这个类中,您需要重写
    getRootHeader()
    方法

  • NestedTableColumnHeader
    -在此类中重写
    layoutChildren()
    方法,并添加新方法来布局
    fixedColumns
  • VirtualFlow
  • TableView
    -覆盖
    createDefaultSkin()
    ,为
    fixedTableColumn
    添加新的
    booleanProperty showColumnHeader
    和一个
    ObservableArrayList
  • TableRow
    -覆盖
    createDefaultSkin()
  • TableRowSkinBase
    -重写
    layoutChildren()
    方法以处理固定列

  • ControlsFX现在在上有了一个不错的实现。他们已经将“电子表格视图”功能迁移到合法的TableView子类中。