2011-06-24 44 views
3

假设我有一个带有一些数据的JTable。对table.getValueForCell(row,col)的调用返回单元格的内容。这是预期的。排序JTable行问题

现在说我想排序我的表。我单击表头(列),然后对表格进行排序。如果我使用row和col的相同值调用table.getValueForCell(row,col)。这里现在有一个不同的行,因为表已经排序。但是,table.getValueForCell(row,col)返回旧数据。看起来好像在保存表数据的基础数据结构在排序时没有更新。

任何想法如何解决这个问题,或者我可能做错了什么?

回答

2

来自针对JTable的documentation

JTable使用专有的整数 指行和它所显示的模型的 列两者。 JTable只是使用表格 范围的单元格,并使用 getValueAt(int,int)在绘画过程中从模型中检索 值。 重要的是要记住, 所列的行和列索引返回的各种JTable方法都是根据 的JTable(视图)而不是 必然与 模型使用的索引相同。

默认情况下,列可以在JTable使视图的列 出现在不同的顺序 在模型中的列重新排列 。这不 不会影响 模型的实现都:当列 重新排序,JTable中保持列的 新秩序内部 其列索引 之前转换查询模型。

因此编写TableModel时,是 不必侦听列 重新排序事件,该模型将 查询在自己的坐标系 不管什么在 鉴于发生的事情。在实施例部分中有一个 示范排序算法0​​利用正是这种技术 的夹着另一个坐标 系统,其中所述行的顺序是 改变,而不是 列的顺序。使用 RowSorter的底层TableModel 提供的排序和 过滤功能并不需要知道该怎么办 排序,而RowSorter的将处理 它同样,当

。当使用基于行的 方法的JTable和底层的 TableModel时,坐标转换将是 。所有基于行的 行都基于RowSorter, ,它不一定与底层TableModel的 相同。例如,对于 示例,选择总是在 条款的JTable中,因此在使用 RowSorter时,您需要使用convertRowIndexToView或 convertRowIndexToModel转换 。下面 展示如何将坐标从 JTable中转换为底层 模式:

而且还的Javadoc getValueAt:

public Object getValueAt(int row, int column) 

返回row和 单元格的值柱。

注意:该列在 表视图的显示顺序中指定,而不是在 TableModel的列顺序中指定。这是 的一个重要区别,因为 用户重新排列了 表中的列,在 的给定索引处的列将会改变。同时 用户的操作不会影响 模型的列排序。

但是,您可以使用表格包装,如this其他StackOverflow主题中所述。事实上,你调用的方法并不存在于JTable中,而且似乎已经来自该主题!希望这可以帮助。

+0

谢谢,这正是我需要的信息。我在看模型和视图。当数据按相反顺序排序时仍然有一些使用convertRowIndexToView()的问题。我不得不看看这个。但我会告诉你一些有趣的事情。你链接的其他帖子是我的包装到JTable。我只是将该代码更新到我的最新版本。但是很高兴人们看着它,哈哈。 – user489041

+0

这很搞笑!很高兴的信息是有帮助的,是的,它很高兴看到你的帖子,如果已被使用:) – Perception

4

数据总是以其原始顺序存储在TableModel中。您可以使用以下方式访问原始订单:

table.getModel().getValueAt(...); 

每当对表进行排序时,只有视图发生更改。当您从表中获取数据,你只需使用:

table.getValueAt(...); 

如果由于某种原因,你需要来回在两者之间转换,你可以使用的选择恰当的表的方法:

convertRowIndexToModel(...); 
convertRowIndexToView(...); 
+0

谢谢,这是丰富的。让我看看我是否理解正确。如果您希望数据最初放入表中,请使用table.getMode()。getValueAt()。如果您希望当前在表中显示数据,请使用table.getValueAt()? – user489041

+0

当从'table.getSelectedRows()'(它们在'视图空间'中)获得行号并且想要与模型一起使用它们(其索引在'模型空间'中)时,您需要'convertRowIndexToModel(...)' ,另请参阅[TableRowSorter apidoc](http://docs.oracle.com/javase/6/docs/api/javax/swing/table/TableRowSorter.html) –