<java> <JTable> 关于设置JTable导入数据后自动排序-小记

来源:互联网 发布:桌子高度 知乎 编辑:程序博客网 时间:2024/06/15 23:00

       在最近的一个程序中,遇到这么一个问题,实现JTable的导入数据,并带有添加,删除,修改等功能。基本功能实现后,由于程序方面的需要,保证程序的实用性,需要添加新功能:导入JTable的数据之后,或者添加,删除之后使JTable能自动进行排序。查阅相关资料后,以下相关实现方法:

       首先需要对Table添加TableRowSorter。这一步很简单,部分code如下:

sorter = new TableRowSorter<HistroyDataTableMode>(histroyDataTableMode);        // 设置只有第一列可以排序,其他均不可以        sorter.setSortable(0, true);                for(int i=1; i<8; i++) {            sorter.setSortable(i, false);        }        histroyDataTable.setRowSorter(sorter);

       添加上面的代码之后,此时的JTable应该就具备点击表头实现排序的功能了,当然本程序需要的JTable自动排序。百度,谷歌也没有人有过这样的写法,查阅API及相关资料后看到TableRowSorter有这么一个API:

setSortKeys

public void setSortKeys(List<? extends RowSorter.SortKey> sortKeys)
设置排序键。此方法创建所提供 List 的一个副本;对所提供 List 的后续更改不影响此 DefaultRowSorter。如果排序键已更改,则此方法触发一个排序。

指定者:
RowSorter<M> 中的setSortKeys
参数:
sortKeys - 新的 SortKeynull 是指定一个空列表的简单表示方法,表示视图应该是未排序的。
抛出:
IllegalArgumentException - 如果sortKey 中的任一值为 null,或者有超出模型范围的列索引
       这个方法是DefaultRowSorter类的一个方法,旨在定义RowSorter的默认排序类型,在自动排序中,这个方法是很重要的,没有定义该排序类型,那排序就没有用。之前我没有查到这个方法之前,仅仅尝试在TableModel发生属性改变时调用Sorter.sort()方法,但是没有效果。从方法定义可以看出,需要改方法的参数是一个List,跟踪查看RowSorter类的SortKey构造方法:

public SortKey(int column, SortOrder sortOrder) {            if (sortOrder == null) {                throw new IllegalArgumentException(                        "sort order must be non-null");            }            this.column = column;            this.sortOrder = sortOrder;        }

       SortOrder参数跟踪进去:

public enum SortOrder {    /**     * Enumeration value indicating the items are sorted in increasing order.     * For example, the set <code>1, 4, 0</code> sorted in     * <code>ASCENDING</code> order is <code>0, 1, 4</code>.     */    ASCENDING,    /**     * Enumeration value indicating the items are sorted in decreasing order.     * For example, the set <code>1, 4, 0</code> sorted in     * <code>DESCENDING</code> order is <code>4, 1, 0</code>.     */    DESCENDING,    /**     * Enumeration value indicating the items are unordered.     * For example, the set <code>1, 4, 0</code> in     * <code>UNSORTED</code> order is <code>1, 4, 0</code>.     */    UNSORTED}

       这下真相大白了,setSortKeys的参数是一个List,List类型是RowSorter.SortKey,SortKey的构造方法是一个列加上一个排序类型,那代码应如:

// 设置排序建        List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();        sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));        sorter.setSortKeys(sortKeys);

       当然,sortKeys是一个列,他可以add多个排序方式,按照我的理解,应该是优先使用第0个排序的方式,若有相同的,则继续按照第1个排序方式,以此类推。我这里仅仅是对0做了升序的排序,其他的应该都是一样。

       哦,对了,需要注意的是setSortKeys这个方法的参数是可以为null,为null的意思则是不做排序。


0 0
原创粉丝点击