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

这个想法是:在N列的TableView上,即使使用水平滚动条,也始终可以看到前M列。

接近我的要求的唯一方法是将两个表视图绑定在一起,以便它们同步滚动。 由于我的观点,并排放置两张桌子的想法并不是最好的

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

我知道,可能我可以使用EventHandlers和Listener来解决这些问题,但我希望只能使用一个表。

所以,问题是:在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;

}

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

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

我们成功地使用这种技术将两个表格与单个滚动条连接起来,同时等待这个Jira被修复。

选项2 -自己写的TableViewSkin下载JavaFX的源代码,看看他们做什么与皮肤,然后你可以写一个完整的自定义皮肤,或者编写包装两个常规皮肤皮肤并以类似的方式上面的选项#1实施


我可以在javafx表格视图中冻结列。 我们需要创建我们的自定义表列类,其中我们将有两个方法setFixedisFixed ,它们将用于使某列固定。

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

  • TableViewskin

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

  • NestedTableColumnHeader - 在这个类中重写layoutChildren()方法并添加新方法来布置fixedColumns
  • VirtualFlow
  • TableView - 覆盖createDefaultSkin() ,为fixedTableColumn添加新的booleanProperty showColumnHeader和一个ObservableArrayList
  • TableRow - 覆盖createDefaultSkin()
  • TableRowSkinBase - 重写layoutChildren()方法来处理固定列。
  • 链接地址: http://www.djcxy.com/p/80139.html

    上一篇: JavaFX, how to freeze the position of some columns in TableView

    下一篇: ObservableList<Message> to TableView