首先,jtable本身只是一个框架,它是根据tablemodel来显示数据的,我们能看到几行,table就有几行,但tablemodel
并非如此,因为可能只显示了其中的几行。
排序:
从jdk1.6开始,jtable可以通过点击header来排序了!使用方法如下:
TableRowSorter<DefaultTableModel> sorter= new TableRowSorter<DefaultTableModel>(tablemodel);
jtable.setRowSorter(sorter);
可见,TableRowSorter需要一个底层的tablemodel来装载数据。一般选择重写tablemodel的方法来自定义排序规则,加快排序速度:
DefaultTableModel tablemodel = new DefaultTableModel(obj,goodsInfo)
{
private static final long serialVersionUID = 1L;
//--设置不可编辑-------
public boolean isCellEditable(int row,int column)
{
return false;
}
//--定义按类的比较规则排序---------
public Class<?> getColumnClass(int column) {
Class<?> returnValue = Object.class;
if ((column >= 0) && (column < getColumnCount())&& (getRowCount()>0))
{ //排除某些cell是空的情况
for(int i=0;i<getRowCount();i++)
if(getValueAt(i, column)!=null)
returnValue = getValueAt(i, column).getClass();
}
return returnValue;
}
};
过滤:
TableRowSorter有个方法是setRowFilter,可以实现过滤,它继承自DefaultRowSorter,使用方法:
sorter.setRowFilter(RowFilter.regexFilter(".*foo.*"));
可以用正则表达式来过滤。
这时候,我们看到的行数变了,即table.getRowCount()变了,但底层的tablemodel行数是不会变的!
接下来,讲另一个