我正在创建一个程序,它使用两列过滤JTable的内容。我已经使用了RowSorter,一切都很好-至少根据我所看到的(视图)。
表中的每一行都可以双击打开一个对话框。此对话框允许您编辑表上的信息。然而,对话框上的信息仍然是原始视图的信息(在使用过滤之前)。
例子:
在过滤之前,表上的第一行是行a。过滤后,表上的第一行是行b。
但是,当我双击打开第一行的对话框时(在过滤之后,现在应该是行b,打开了行a的对话框)。[希望我解释得够清楚]
我认为我的问题是模型没有被更新后,过滤器已经发生。我试过:
for(int i = 0; i < table.getRowCount(); i++){
table.convertRowIndexToView(i);
}
和
for(int i = 0; i < table.getRowCount(); i++){
table.convertRowIndexToModel(i);
}
当我使用列标题排序表时,我也遇到了类似的问题。
如何解决这个问题?
我认为我的问题是模型在过滤器发生后没有更新
模型永远不会更新。
只有视图被更新,以便以排序/过滤的顺序显示模型中的数据。
表格中的每一行都可以双击打开一个对话框。
所以我假设您将一行数据复制到对话框中,以便可以编辑它,然后将其添加回原始模型。
因此,您需要使用convertRowIndexToModel(...)
来获取模型行号,以便您可以访问要在编辑对话框中显示的模型数据。您只对要编辑的行执行此操作,而不是对整个表执行此操作。
请参阅JTable教程,有关于Comparator
的优秀示例和关于如何使用TableModel的良好解释
更改数据后,可以按如下方式刷新表;
for(int i = 0; i < table.getRowCount(); i++)
{ table.convertRowIndexToModel(i); }
table = new jTable(myModel);
或
myModel.fireTableDataChanged()
希望有帮助
Burak