排序JTable行问题



假设我有一个JTable,里面有一些数据。对table.getValueForCell(row,col)的调用返回单元格的内容。这是意料之中的事。

现在说我想整理一下我的桌子。我单击表格标题(列),它会对表格进行排序。如果我用行和列的相同值调用table.getValueForCell(row,col)。现在这里有一个不同的行,因为表已经排序了。但是,表.getValueForCell(row,col)返回旧数据。排序时,保存表数据的底层数据结构似乎没有更新。

有没有办法解决这个问题,或者我可能做错了什么?

数据始终以其原始顺序存储在TableModel中。您可以使用访问原始订单

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

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

table.getValueAt(...);

如果你出于某种原因需要在两者之间来回转换,你可以使用适当的表格方法之一:

convertRowIndexToModel(...); 
convertRowIndexToView(...); 

来自JTable的文档。

JTable只使用整数同时引用行和它显示的模型的列。JTable只需要一个表格细胞范围和用途getValueAt(int,int)来检索绘制过程中来自模型的值。重要的是要记住返回的列和行索引各种JTable方法在JTable(视图)和必须与模型。

默认情况下,可以重新排列列在JTable中,以便视图列的显示顺序与模型中的列。确实如此不影响模型:当列重新排序后,JTable维护内部列的新顺序并在之前转换其列索引查询模型。

因此,在编写TableModel时无需收听专栏按照模型重新排序事件在自己的坐标系中查询不管发生了什么看法在示例区域中有排序算法的演示正是利用了这项技术插入另一个坐标行的顺序为更改,而不是列。

类似地,当使用排序和由提供的过滤功能RowSorter底层TableModel不需要知道怎么做排序,而RowSorter将处理它。坐标转换将使用基于行的具有底层的JTable方法表格模型。所有基于行的JTables方法是根据RowSorter,这不一定与底层TableModel的。对于例如,选择总是在JTable的术语,以便在使用时您需要转换的RowSorter使用convertRowIndexToView或convertRowIndexToModel。以下内容显示如何转换坐标JTable to the underlying型号:

此外,getValueAt:的javadoc

public Object getValueAt(int row, int column)

返回第行和第行的单元格值柱

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

但是,您可以使用另一个StackOverflow主题中描述的表包装器。事实上,您调用的方法在JTable上并不存在,而且似乎已经来自该主题了!希望这能有所帮助。