2011-10-02 48 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