由于我使用的是Java 1.4.2,这意味着我不能使用Java的表排序器实现。取而代之的是,我一直在使用上一篇文章的早期回复中的TableSorter.java类:Heads up on implementing rowsorter and rowfilter java 1.4
然而,它完美地解决了一个问题,那就是它不能正确地对数值进行排序。例如,我的表中有以下数字序列: 5,18,9,7,2,33
递增排序将在我的JTable中像这样显示它们:
18,2,33,5,7,9
降序排序将在我的JTable中像这样显示它们: 9,7,5,33,2,18
我不知道你是否意识到了,但是很明显,数值的排序只基于第一个数字。
你有什么快速解决这个问题的办法吗?请记住,按照getValue()方法的建议,这些数值在我的JTable中用作字符串。
发布于 2011-05-19 16:47:07
为了向你们更新这一点,我所做的是用以下内容替换了我最初帖子中的TableSorter.java中的LEXICAL_COMPARATOR:
`public static final Comparator LEXICAL_COMPARATOR = new Comparator() { public int compare(Object o1, Object o2) { if(o1 instanceof Integer) {` `Integer firstNumeric, secondNumeric;` firstNumeric =(Integer)o1;
secondNumeric= (Integer)o2;
return firstNumeric.compareTo(secondNumeric);
}
else
return o1.toString().compareTo(o2.toString());
}
};
现在,在Integer中,确保通过执行以下操作将"int“值转换为getValueAt:new Integer(intValue);
我希望这将为人们节省一些时间。
发布于 2011-05-19 06:58:43
验证getColumnClass()是否返回数值类型,如Number。
附录:TableSorterDemo中的MyTableModel就是一个例子。第三列的数据属于Integer类型,这是Number的子类;因此,getColumnClass()返回Integer.class。因为Integer实现了Comparable,所以列是按数字排序的。
发布于 2011-05-19 06:50:14
您需要实现一个执行数字比较的Comparator,而不是默认的字典序比较。所以类似于(取自http://crossedlogic.blogspot.com/2008/11/java-custom-comparators-sorting-text.html):
Comparator c1 = new java.util.Comparator() {
/**
* Custom compare to sort numbers as numbers.
* Strings as strings, with numbers ordered before strings.
*
* @param o1
* @param o2
* @return
*/
@Override
public int compare(Object oo1, Object oo2) {
boolean isFirstNumeric, isSecondNumeric;
String o1 = oo1.toString(), o2 = oo2.toString();
isFirstNumeric = o1.matches("\\d+");
isSecondNumeric = o2.matches("\\d+");
if (isFirstNumeric) {
if (isSecondNumeric) {
return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
} else {
return -1; // numbers always smaller than letters
}
} else {
if (isSecondNumeric) {
return 1; // numbers always smaller than letters
} else {
isFirstNumeric = o1.split("[^0-9]")[0].matches("\\d+");
isSecondNumeric = o2.split("[^0-9]")[0].matches("\\d+");
if (isFirstNumeric) {
if (isSecondNumeric) {
int intCompare = Integer.valueOf(o1.split("[^0-9]")[0]).compareTo(Integer.valueOf(o2.split("[^0-9]")[0]));
if (intCompare == 0) {
return o1.compareToIgnoreCase(o2);
}
return intCompare;
} else {
return -1; // numbers always smaller than letters
}
} else {
if (isSecondNumeric) {
return 1; // numbers always smaller than letters
} else {
return o1.compareToIgnoreCase(o2);
}
}
}
}
}
};然后将其作为列的比较器传入:
tblSorter.setColumnComparator(String.class, c1);让我知道它是如何工作的。
https://stackoverflow.com/questions/6051838
复制相似问题