[code] 继承TableRowSorter的一个小陷阱

阅读更多
在一个JTable里面想做sorting。
继承了TableRowSorter覆盖了getComparator方法。返回了基于底层model的各个列特化的Comparator。
原本期望就可以sorting了,但是失败了,抛ClassCast异常。因为底层model有一个列里面的类型是没有实现Comparable的。
有问题,问源码。
DefaultRowSorter的compare方法调用过程中需要调用useToString来决定是否在排序之前把底层modle的值转换为string.
而TableRowSorter里面覆盖了useToString方法。
    protected boolean useToString(int column) {
        Comparator comparator = super.getComparator(column);
        if (comparator != null) {
            return false;
        }
        Class columnClass = getModel().getColumnClass(column);
        if (columnClass == String.class) {
            return false;
        }
        if (Comparable.class.isAssignableFrom(columnClass)) {
            return false;
        }
        return true;
    }

由于有super的存在,覆盖的getComparator方法在这一步是没有被调到的。而TableRowSorter的父类DefaultRowSorter的getComparator这时对model里面没有实现Comparable的列是返回null的。于是在对这个列做排序的时候就是先转换为string再排序了。但是排序的时候用到了这个列特化的Comparator,所以类型转换失败。
知道了原因,解决方法很简单,覆盖掉useToString方法就好了。

你可能感兴趣的:([code] 继承TableRowSorter的一个小陷阱)