2010-11-05 77 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