2011-10-02 51 views
1

我有一个JTable,我需要删除一行,即选中的行。JTable removeRow(),删除错误的行

因此,首先,我得到的表格模型:

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)); 

回答

11

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

int modelRow = convertRowIndexToModel(row); 
+1

像往常一样,简短,简洁和精确。谢谢! :) – David

4

通过JTable.getSelectedRow返回的索引是一个view指数:它是表格中最终用户所看到的行的索引。它与模型索引不一样,因为如果对表格排序,模型中的索引不会更改,但视图中的索引确实会更改。因此,您必须始终使用JTable.convertRowIndexToModel从视图索引获取模型索引。

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

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

+0

他使用'DefaultTableModel',没有关心那个,+1 – mKorbel