JTable removeRow(),删除错误的行

时间:2011-10-02 08:57:38

标签: java swing jtable

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

2 个答案:

答案 0 :(得分:11)

如果JTable已过滤或排序,则可以转换

int modelRow = convertRowIndexToModel(row);

答案 1 :(得分:4)

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

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

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