我已经创建了自己的类,它扩展了AbstractTableModel。这个想法是能够存储隐藏的“id”列。以下代码适用于此目的:
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 :(得分:1)
我认为您正在寻找JTable's and DefaultTableModel's row indexes lose their synchronization after I sort JTable
中概述的JTable.convertRowIndexToModel
此外,对于更复杂的排序和过滤,请尝试http://publicobject.com/glazedlists/
答案 1 :(得分:0)
在我看来,你的问题的一个很好的解决方案是观察者模式 http://en.wikipedia.org/wiki/Observer_pattern
您的类必须实现观察者界面,以通过单击列标题
来跟踪用户生成的事件答案 2 :(得分:0)
答案 3 :(得分:0)
问题是,当有人通过单击JTable中的列标题按列排序时,AbstractTableModel中的列表不会更新
这正是应该运作的方式。在对列进行排序或重新排序时,模型中的数据永远不会更改。它唯一的观点就是变化。
如果您想从表中获取数据,那么您应该使用:
table.getValueAt(row, column)
它会给你正确的价值。如果您需要直接从模型中获取数据,则需要使用:
table.getModel().getValueAt(table.convertRowIndexToModel(row), column);
这个想法是能够存储一个隐藏的“id”列。
没有理由为此创建自定义模型。只需将所有数据存储在DefaultTableModel中。然后,您可以从表格视图中删除“ID”列。
table.getColumnModel().removeColumn( table.getColumn("ID") );
在这种情况下,数据不在视图中,因此您无法使用table.getValueAt(...)。相反,您必须使用table.getModel()。getValueAt(...);