JavaFX 8:自动为TableView行编号

时间:2016-12-22 03:22:04

标签: model-view-controller javafx-8

我试图在我的桌面视图中自动包含数字。

我有2个具有相似结构的表,其目的是在按钮点击时将所选项目从tableA复制到tableB。

总列数:3
RowCol =应该自动显示数字
TestCol =测试名称(来自Model类)
ModCol = Module(来自Model类)

我遇到了这个问题来解决tableA的自动编号问题 auto numbered table rows (javafx)

代码:

tableARowCol.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<Number>(
            tableA.getItems().indexOf(cellData.getValue()) + 1));
tableATestCol.setCellValueFactory(cellData -> cellData.getValue().testCaseNameProperty());
tableAModCol.setCellValueFactory(cellData -> cellData.getValue().moduleNameProperty());

这适用于tableA,我对tableB使用相同的代码,但是我遇到以下问题(在btn点击上添加数据时,自动编号没有正确更新):

在图像中,tableB的行号显示为1,2,3,3,3,2,7 当我执行以下操作时,这是输出:

  • 从tableA
  • 添加了第1行
  • 从tableA
  • 添加第2行
  • 从tableA 3x
  • 添加了第3行
  • 再次从tableA添加第2行
  • 从tableA
  • 添加了第10行

我想知道什么似乎是问题,我该如何解决它。说实话,我不完全理解自动编号行的行。

到目前为止发生的事情的流程:

  • 从tableA中选择项目
  • 点击按钮添加[&gt;&gt;]
  • 添加到B.
  • 添加的项目将添加到可观察列表(模型)并保存到XML文件

值得一提:

  • 我有另一个侦听器从XML加载项目并将它们填充到表B.当项目被加载时#39;从XML,编号是正确的。这次是从XML加载的相同数据。注意tableB编号是正确的。 This is the same data loaded from the XML this time. Notice tableB numberings are correct.

tableB行编号的代码:

tableBRowCol.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<Number>(
            tableB.getItems().indexOf(cellData.getValue()) + 1));
tableBTestCol.setCellValueFactory(cellData -> cellData.getValue().testCaseNameProperty());
tableBModCol.setCellValueFactory(cellData -> cellData.getValue().moduleNameProperty());

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题在于您使用FolderMonitor.NotifyFilter = NotifyFilters.Attributes; 中的项目列表来确定tableA中的索引。

可是:

不要使用这种方法!

我知道很多用户赞同您使用的答案,但它有一些严重的问题。如果tableB列表中有多个项目相同或甚至(如您的情况)相同,则索引将始终是items中找到的第一个项目。

而是使用List提供的index属性,这也将消除对列表中项目的低效​​搜索,该列表的最差运行时间为TableCell其中{ {1}}是O(n)列表的大小...

以下是@ jewelsea的答案的一个小变化:

n

可以这样使用:

items