JTable removeRow(),删除错误的行

我有一个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)); 

如果是JTable过滤或排序,那么您可以转换

 int modelRow = convertRowIndexToModel(row); 

JTable.getSelectedRow返回的索引是一个view索引:它是表中最终用户看到的行的索引。 它与模型索引不同,因为如果对表进行排序,模型中的索引不会更改,但视图中的索引会发生变化。 因此,您必须始终使用JTable.convertRowIndexToModel从视图索引中获取模型索引。

请注意,必须对列进行相同操作,因为用户可能会选择对列进行重新排序。

此外,每次删除行时都不必再次设置模型。 相反,您的模型应该触发TableModelEvent以通知视图有关删除。 请参见AbstractTableModel.fireTableRowsDeleted