论坛首页 Java企业应用论坛

继承TableRowSorter的一个小陷阱

浏览 2557 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-09   最后修改:2010-01-09
在一个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方法就好了。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics