浏览 2557 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-09
最后修改:2010-01-09
继承了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方法就好了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |