2010-11-05 100 views
1

我已經創建了自己的類來擴展AbstractTableModel。這個想法是能夠存儲隱藏的「id」列。以下代碼適用於此目的:使用自定義AbstractTableModel排序

public class GuiTableModel extends AbstractTableModel { 


List<Object[]> rowlist = new ArrayList<Object[]>(); 
List<String> colNames = new ArrayList<String>(); 

public void addRow(Object[] data) { 
    rowlist.add(data); 
} 
public void addColumn(String name) { 
    colNames.add(name); 
} 

public int getColumnCount() { 
    return colNames.size(); 
} 

public int getRowCount() { 
    return rowlist.size(); 
} 

public Object getValueAt(int row, int col) { 
    return rowlist.get(row)[col]; 
} 

@Override 
public String getColumnName(int column) { 
    return colNames.get(column); 
} 

@Override 
public boolean isCellEditable(int rowIndex, int mColIndex) { 
    return false; 
} 

正如您在上面看到的,它的一個非常簡單的實現。但問題是,當某人通過單擊JTable中的列標題按列排序時,AbstractTableModel中的列表不會被更新。我需要列表與視覺佈局同步。

關於如何做到這一點的任何想法?

非常感謝

在我看來

回答

0

的問題是,雖然,當有人排序由通過單擊JTable中的列標題,AbstractTableModel中的列表不會更新

而這正是我噸應該工作。在對列進行排序或重新排序時,模型中的數據絕不會改變。它唯一的觀點發生了變化。

如果你想從表中的數據,那麼你應該使用:

table.getValueAt(row, column) 

,它會讓你的應有的價值。如果你需要從模型中獲取的數據直接,那麼你需要使用:

table.getModel().getValueAt(table.convertRowIndexToModel(row), column); 

的想法是能夠存儲一個隱藏的「ID」 collumn。

沒有理由爲此創建自定義模型。只需將所有數據存儲在DefaultTableModel中。然後,您可以從表格視圖中移除「ID」列。

table.getColumnModel().removeColumn(table.getColumn("ID")); 

在這種情況下數據不在視圖中,因此您不能使用table.getValueAt(...)。相反,你必須使用table.getModel()。getValueAt(...);

+0

謝謝。我結束了使用字符串rt =(String)model.getValueAt(table.convertRowIndexToModel(table.getSelectedRow())但也感謝提示,不需要使用我自己的模型! – jtnire 2010-11-06 18:30:33