Jtable 排序,清空的问题

http://blog.csdn.net/aptweasel/article/details/7028058



这个问题纠结了很久很久,目前网上好像还没有人遇到过像我这样比较繁杂的问题,今天终于搞定了,分享给大家看一看

情况是这样的,我做一个关于SWING的工程,当然会用到大量的表格最早清空表格是这样写的

//                DefaultTableModel model = (DefaultTableModel) table.getModel();
//                for (int i = model.getRowCount() - 1; i >= 0; i--) {
//                    model.removeRow(i);
//                }  

用这个方法是有问题的,因为是JTable    >> TableModel  >> TableData(Vector或String[])这样的映射关系,如果用上面的方法,如果数据增加或减少都不会通知TableModel ,就导致每次清数据就报数据越界异常ArrayIndexOutOfBoundsException。

 

如果直接清理数据是会通知上层的监听,改变模型

((DefaultTableModel) table.getModel()).getDataVector().clear();   //清除表格数据
((DefaultTableModel) table.getModel()).fireTableDataChanged();//通知模型更新
table.updateUI();//刷新表格

 

这样做了,程序好像是不出问题了,但是如果对表格做了排序操作,再看看,程序是不出错了,但是每加载一行,就看到表格会做一次排序,这个过程的开销很大,如果数据量大的话,甚至导致内存溢出。经过一天半的研究,跟踪,终于找到了问题所在,创建表的时候,引用了排序器,排序器的监听是一个独立于JTable >> TableModel >> TableData之外,又在后台影响着这三者之间的关系的一个人,在程序调试时,很难找到他在那里影响的,最终在JDK API里发现了一点端倪

javax.swing
类 RowSorter<M>

java.lang.Object
  javax.swing.RowSorter<M>

类型参数:
M - 底层模型的类型

 

setSortKeys

public abstract void setSortKeys(List<? extends RowSorter.SortKey> keys)
设置当前排序键。
参数:
keys - 新的 SortKeysnull 是指定一个空列表的简写,表示视图应该是未排序的。

toggleSortOrder

public abstract void toggleSortOrder(int column)
颠倒指定列的排序顺序。调用此方法时,由子类提供具体行为。通常,如果指定列已经是主要排序列,则此方法将升序变为降序(或将降序变为升序);否则,使指定列成为主要排序列,并使用升序排序顺序。如果指定列不可排序,则此方法没有任何效果。

如果此方法导致更改排序顺序和排序操作,则它将发送适当的 RowSorterListener 通知。

参数:
column - 要切换排序顺序的列,就底层模型而言
抛出:
IndexOutOfBoundsException - 如果列超出底层模型的范围

上面这两个方法很像,但又有区别,我先用toggleSortOrder(int column) 这个column必须有一个有效的列号,就是说,不能用-1,这个方法是不能取消对表的排序选中的。那么另一个方法setSortKeys(List<? extendsRowSorter.SortKey> keys),这个就比较难了,我也不知道应该传什么参数,再看参数说明:null 是指定一个空列表的简写,表示视图应该是未排序的。“应该”两字说的实在是诡异,我就把它当成死马医,看看到底行不行,嘿嘿,通过方法:rowSort.setSortKeys(null);把表格还原到不排序的状态,就达到我想要的结果了,大功终于告成!

 

下面是方法实现的具体代码,请大家欣赏

 

1. Jtable 排序

简单的排序,按字符串的ASCII码排序

 table.setAutoCreateRowSorter(true);

2,Jtable 自定义排序

/**
 *定义按数字排序算法
 * @author black
 * @since 2011-10-20
 */
public class OrderNumberComparator implements Comparator{

    public int compare(Object o1, Object o2) {
        int i = (Integer) o1 - (Integer) o2;
            return i;
    }

}

定义表的时候,选择按自定义算法排序的字段,如果不设置,默认按字符串的ASCII码排序

JTable dataGrid=new JTable ();

DefaultTableModel model = (DefaultTableModel) this.dataGrid.getModel();
TableRowSorter<TableModel> sorter=new TableRowSorter<TableModel>(model);
//sorter.setSortable(0, false);
sorter.setComparator(0, new cimframe.util.OrderNumberComparator());
sorter.setComparator(3, new cimframe.util.OrderNumberComparator());
sorter.setComparator(4, new cimframe.util.OrderNumberComparator());
sorter.setComparator(5, new cimframe.util.OrderNumberComparator());
dataGrid.setRowSorter(sorter);


3,Jtable 清空

    /***
     * 清除JTable数据
     *****/
    public static synchronized void clearTable(JTable table) {
        try {
            RowSorter rowSort = table.getRowSorter();
            if (rowSort != null) {
                rowSort.setSortKeys(null);// 如果使用了排序器,先清除对表的排序              
            }
            ((DefaultTableModel) table.getModel()).getDataVector().clear();
            ((DefaultTableModel) table.getModel()).fireTableDataChanged();
            table.updateUI();
        } catch (Exception ex) {
            log.error(ex);
        }       
    }

你可能感兴趣的:(exception,datagrid,swing,object,null,Integer)