[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方法就好了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值