Java TableRowSorter故障和非法比较器投射
只是想知道为什么在特定列上使用比较器进行表行排序不起作用。对话框如下图所示,“项目类型”表正在排序 如您所见,“name”列工作正常。如果我点击ID列,我会得到Java TableRowSorter故障和非法比较器投射,java,swing,sorting,jtable,Java,Swing,Sorting,Jtable,只是想知道为什么在特定列上使用比较器进行表行排序不起作用。对话框如下图所示,“项目类型”表正在排序 如您所见,“name”列工作正常。如果我点击ID列,我会得到 Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at org.overlord.rfm.rfcsv.ItemGroupsDialog
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at org.overlord.rfm.rfcsv.ItemGroupsDialog$ItemTable$2.compare(ItemGroupsDialog.java:1)
以下是定义和使用行分拣机的位置:
rowSorter = new TableRowSorter<>(model);
rowSorter.setComparator(1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return (o1<o2 ? -1 : (o1.equals(o2) ? 0 : 1));
}
});
rowSorter.setSortable(1, true);
rowSorter.setComparator(2, new HumaneStringComparator());
rowSorter.setSortable(2, true);
rowSorter.setRowFilter(searchFilter);
setRowSorter(rowSorter);
rowSorter=新表格rowSorter(型号);
rowSorter.setComparator(1,新的Comparator(){
@凌驾
公共整数比较(整数o1,整数o2){
返回(o1=3){
抛出新IndexOutOfBoundsException(“非法列索引:+columnIndex”);
}
if(rowIndex<0 | | rowIndex>=rows.size()){
抛出新IndexOutOfBoundsException(“非法行索引:+rowIndex”);
}
ItemRow ir=rows.get(rowIndex);
开关(列索引){
案例0:返回ir.getItem().getImage();
案例1:返回ir.getItem().getId();
案例2:返回ir.getItem().getName();
}
抛出新的IllegalStateException(“列索引无效?”);
}
@凌驾
公共类getColumnClass(int columnIndex){
开关(列索引){
案例0:返回Image.class;
案例1:返回Integer.class;
案例2:返回String.class;
}
抛出新的IllegalStateException(“列索引无效?”);
}
出了什么问题?请提前感谢您的帮助。您使用的比较器需要一个整数,但收到的却是一个字符串
rowSorter.setComparator(1, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
Integer i1 = Integer.parseInt(s1);
Integer i2 = Integer.parseInt(s2);
return i1.compareTo(i2);
}
});
rowSorter.setComparator(1,新的Comparator(){
@凌驾
公共整数比较(字符串s1、字符串s2){
整数i1=整数.parseInt(s1);
整数i2=Integer.parseInt(s2);
返回i1。比较(i2);
}
});
您可能需要编写一个try-catch块。当使用
JTable
时,getValueAt
、getColumnClass
和默认呈现器的尽力而为(而不是快速失败)行为的组合是ClassCastException
的一个重要来源
在这里,您声明第二列(第1列)的类型是Integer
,您可以将用于它的比较器设置为Integer
比较器。到目前为止似乎很合理。但是,实际上,您可以在getValueAt
方法中自由返回任何内容,并且除非您指定自定义呈现器,否则您的非整数值将呈现得很好。编译器无法检查您声明的类型是否确实匹配!因此,只有通过仔细检查、设置自定义渲染器/编辑器或尝试排序(因为默认比较器没有那么宽松)才能发现类不匹配
在本例中,getId()
实际上返回的是一个字符串,而不是一个整数
如何接收字符串?这正是我的问题。我认为,当您单击ID的列标题时,tablerowsorter会将值发送到整数比较器。当然,这些值是字符串(“299”,“60”,等等。)@PacoAbato你在问题的评论中要求澄清,而不是在你自己的答案的评论中猜测一些东西,怎么样?我现在不能测试。我写这篇文章时手头没有编译器。我编辑泛型。但我想这个想法才是重要的。快速检查:ItemRow.getItem().getId()
返回一个整数
,而不是字符串
,对吗?呃,糟糕。)它返回一个字符串。这就是问题所在,是的;)(如果您将此作为答案发布,我将接受您的答案)。我忘记了ID实际上是一个字符串,因为我在它的末尾添加了一个字母以指示损坏的项目。
rowSorter.setComparator(1, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
Integer i1 = Integer.parseInt(s1);
Integer i2 = Integer.parseInt(s2);
return i1.compareTo(i2);
}
});