java – 如何扩展TableRowSorter只更改单个列的比较器,超级处理其余的
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何扩展TableRowSorter只更改单个列的比较器,超级处理其余的,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3691字,纯文字阅读大概需要6分钟。
内容图文
![java – 如何扩展TableRowSorter只更改单个列的比较器,超级处理其余的](/upload/InfoBanner/zyjiaocheng/817/4f25d2f17d1f41dbb6ac3cf64fa710a6.jpg)
嗨,我试图在JTable中只为一个列使用自定义比较器.我用以下代码完成了这个.问题是这样做会破坏Integer的适当排序.
我有一个JTable,列类是:
字符串|整数|整数|布尔|布尔
我正在使用的比较器就是这些.第一个使用How to split a string between letters and digits (or between digits and letters)?的分割.
//compare strings being aware of numbers embedded in the string
private static Comparator<String> numberAwareCompare = new Comparator<String>() {
public int compare(String s1, String s2) {
String[] s1Parts = s1.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
String[] s2Parts = s2.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
int i = 0;
while(i < s1Parts.length && i < s2Parts.length){
//if parts are the same
if(s1Parts[i].compareTo(s2Parts[i]) == 0){
++i;
}else{
try{
int intS1 = Integer.parseInt(s1Parts[i]);
int intS2 = Integer.parseInt(s2Parts[i]);
//if the parse works
int diff = intS1 - intS2;
if(diff == 0){
++i;
}else{
return diff;
}
}catch(Exception ex){
return s1.compareTo(s2);
}
}//end else
}//end while
//Handle if one string is a prefix of the other.
if(s1.length() < s2.length()){
return -1;
}else if(s1.length() > s2.length()){
return 1;
}else{
return 0;
}
return 0;
}
};
我将TableRowSorter扩展如下:
public class FeatureRowSorter extends TableRowSorter<TableModel>{
public FeatureRowSorter(TableModel tableModel) {
super(tableModel);
//setComparator(0, numberAwareCompare);
//setComparator(1,intCompare);
//setComparator(2,intCompare);
}
@Override
public Comparator<?> getComparator(int column){
if(column == 0){
return numberAwareCompare;
}else{
return super.getComparator(column);
}
}
}
这会导致以下不希望的排序行为:
这可以通过创建整数排序来克服.这是问题所在.我不应该为Integer创建一个排序.如果默认的TableRowSorter知道类是Integer,为什么不能创建它呢?
所以我创建了一个简单的整数排序器,如下所示:
//Integer compare, need this to use the custom TableRowSorter
public static Comparator<Integer> intCompare = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
现在我删除上面的getComparator方法,并明确地将比较器添加到正确的列. (上面注释掉的代码).这具有正确的排序行为.
我使用以下代码将行分类器添加到表中.我的模型创建了一个新的自定义行分类器,并将其发送到控制器对象中的视图JTable.
//In the model, FeatureTableModel extends DefaultTableModel,getClass method implemented correctly
public FeatureRowSorter getFeatureRowSorter(){
return new FeatureRowSorter(getFeatureTableModel());
}
然后将分拣机添加到表中,如下所示:
view.getFeatureTable().setRowSorter(model.getFeatureRowSorter());
所以问题是,如何在不必实现整数分拣机的情况下这样做呢?这看起来像是一个黑客,而且我正在实现一个整数比较器的事实看起来很可疑.由于FeatureTableModel的getClass方法正确实现,TableRowSorter知道这些列是Integer. (没关系,其中一个布尔列不是复选框.我正在覆盖该渲染器).
任何建议将不胜感激.
更新:
在阅读了Duncan的回答之后,我发现我没有正确地使用了getClass.
我有:
@Override
public Class<?> getColumnClass(int column){
if(column == 4){
return Boolean.class;
}else if(column == 2){
return Integer.class;
}else{
return Object.class;
}
}
我改为:
@Override
public Class<?> getColumnClass(int column){
if(column == 4){
return Boolean.class;
}else if(column == 1 || column == 2){
return Integer.class;
}else{
return Object.class;
}
}
解决方法:
基于快速测试,我通过调用TableRowSorter实例上的setComparator方法实现了预期的结果.
也就是说,我没有创建自己的扩展TableRowSorter的类.
JTable table = new JTable(model);
TableRowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(rowSorter);
rowSorter.setComparator(0, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// etc.
}
});
在我的测试中,这种方法对在同一个表中对整数列进行排序的能力没有负面影响.
我很欣赏这不是你遇到问题的原因的解释,但是作为一种可能更简单的解决办法,它值得一试.
内容总结
以上是互联网集市为您收集整理的java – 如何扩展TableRowSorter只更改单个列的比较器,超级处理其余的全部内容,希望文章能够帮你解决java – 如何扩展TableRowSorter只更改单个列的比较器,超级处理其余的所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。