使用自定义AbstractTableModel排序

时间:2010-11-05 21:46:24

标签: java jtable

我已经创建了自己的类,它扩展了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中的列表不会更新。我需要列表与视觉布局同步。

关于我如何做到这一点的任何想法?

非常感谢

4 个答案:

答案 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)

为什么不使用JXTable?你可以找到它here

答案 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(...);