【发布时间】:2010-11-11 06:17:59
【问题描述】:
我有一个第一行空白的 JTable。现在,当我通过单击该列基于该列对表格进行排序时,空白行位于底部。如果我在空白行中插入一些东西并进行排序,则相应地放置该行。即使已排序,我如何跟踪其行索引。我需要访问该行,但如果用户进行排序,那么我会丢失行索引,因为它不再是第一行。
【问题讨论】:
我有一个第一行空白的 JTable。现在,当我通过单击该列基于该列对表格进行排序时,空白行位于底部。如果我在空白行中插入一些东西并进行排序,则相应地放置该行。即使已排序,我如何跟踪其行索引。我需要访问该行,但如果用户进行排序,那么我会丢失行索引,因为它不再是第一行。
【问题讨论】:
假设您使用的是 Java 6 中添加的 TableRowSorter 东西,我认为您需要查看的是 RowSorter 类中的方法 convertRowIndexToModel 和 convertRowIndexToView。你会做类似的事情
table.getRowSorter().convertRowIndexToView(0)
找出哪个可见行索引实际上是模型中的行索引 0。
编辑:正如 Tulskiy 在 cmets 中指出的那样,如果没有为表分配行排序器,这可能会导致 NullPointerException。最好直接在 JTable 上使用这些方法,例如table.convertRowIndexToView(0)
【讨论】:
JTable.convertRowIndexToView() 将根据模型中的索引返回视图中行的索引。 JTable.convertRowIndexToModel() 会做相反的事情。
【讨论】:
解决方案 1
使用jTable1.convertRowIndexToModel(jTable1.getSelectedRow()) 时会出现一些问题,如果您根据日期或时间对值进行排序,则会从convertRowIndexToView(0) 返回不正确的值,因此请使用convertRowIndexToModel(0)。
解决方案 2
这将在排序后从新模型中检索。
jTable1.getValueAt(jTable1.getSelectedRow(), 0);
这将根据原始索引检索值,即使已排序。
((DefaultTableModel)jTable1.getModel()).getValuAt(jTable1.getSelectedRow(), 0);
【讨论】: