我有一个JTable,我需要删除一行,即选中的行。
首先,我得到了表格模型:
DefaultTableModel model = (DefaultTableModel) table.getModel();
然后选择的行(如果选择第二行,则返回1,这是可以理解的,因为行从零开始):
int selectedRow = table.getSelectedRow();
然后我尝试删除该行:
model.removeRow(selectedRow);
然后我再次设置表模型:
table.setModel(model);
这实现了删除完全随机的行。我根本无法理解为什么。我在某个时候使用table.setRowSorter(sorter)对表进行了排序,但我不知道为什么这应该是一个问题。如果绝对需要SSCCE,请告诉我,因为我需要修改很多代码才能生成。
注意:这两行返回的值不同:
System.out.println(table.getValueAt(selectedRow, 1));
System.out.println(model.getValueAt(selectedRow, 1));
答案 0 :(得分:11)
如果JTable
已过滤或排序,则可以转换
int modelRow = convertRowIndexToModel(row);
答案 1 :(得分:4)
JTable.getSelectedRow
返回的索引是view
索引:它是表中最终用户看到的行的索引。它与模型索引不同,因为如果对表进行排序,模型中的索引不会更改,但视图中的索引会发生变化。因此,您必须始终使用JTable.convertRowIndexToModel
从视图索引中获取模型索引。
请注意,必须对列进行相同的操作,因为用户可能会根据自己的喜好选择重新排序列。
此外,每次删除行时都不必再次设置模型。相反,您的模型应该触发TableModelEvent以通知视图有关删除。请参阅AbstractTableModel.fireTableRowsDeleted
。