假设我有一个带有一些数据的JTable。对table.getValueForCell(row,col)的调用返回单元格的内容。这是预期的。
现在说我要排序我的桌子。我单击表头(列),然后对表进行排序。如果我使用相同的row和col值调用table.getValueForCell(row,col)。这里现在有一个不同的行,因为表已经排序。但是,table.getValueForCell(row,col)返回旧数据。看起来好像保存表数据的基础数据结构在排序时不会更新。
关于如何解决这个问题,或者我可能做错了什么?
答案 0 :(得分:4)
数据始终以TableModel中的原始顺序存储。您可以使用以下方式访问原始订单:
table.getModel().getValueAt(...);
每当对表进行排序时,只会更改视图。从表中获取数据时,您只需使用:
table.getValueAt(...);
如果您出于某种原因需要在两者之间来回转换,您可以使用任何一种适当的表格方法:
convertRowIndexToModel(...);
convertRowIndexToView(...);
答案 1 :(得分:2)
来自JTable的documentation。
JTable专门使用整数 引用行和 它显示的模型的列。 JTable只需一个表格 细胞和用途范围 getValueAt(int,int)来检索 绘画过程中模型的值。 重要的是要记住 返回的列和行索引 各种JTable方法都是如此 JTable(视图)并没有 必须使用相同的索引 该模型。
默认情况下,可能会重新排列列 在JTable中使视图成为可能 列以不同的顺序出现 模型中的列。这样做 不影响执行 模型:当列是 重新排序后,JTable维持着 内部列的新顺序 并在之前转换其列索引 查询模型。
因此,在编写TableModel时,它是 没必要听专栏 按模型重新排序事件 在自己的坐标系中查询 无论发生了什么 视图。在示例区域中有一个 演示排序算法 正是利用这种技术 插入另一个坐标 行的顺序是的系统 变了,而不是顺序 列。
同样使用排序和 过滤功能 RowSorter底层的TableModel 不需要知道该怎么做 排序,而不是RowSorter将处理 它。协调转换将是 使用基于行的必要 具有底层的JTable方法 TableModel的。所有JTable都基于行 方法是根据RowSorter, 这不一定是相同的 底层TableModel的那个。对于 例如,选择始终在 JTable的条款,以便在使用时 RowSorter你需要转换 使用convertRowIndexToView或 convertRowIndexToModel。下列 显示如何转换坐标 JTable到底层的 模型:
另外,getValueAt的javadoc:
public Object getValueAt(int row, int column)
返回行和的单元格值 柱。
注意:列在。中指定 表格视图的显示顺序,而不是 TableModel的列顺序。这是 一个重要的区别,因为 用户重新排列中的列 table,给定索引中的列 观点会改变。同时 用户的行为永远不会影响 模型的列排序。
但是,您可以使用this其他StackOverflow主题中所述的表包装器。实际上你调用的方法并不存在于JTable中,而且似乎已经来自该主题了!希望这会有所帮助。