Java TableRowSorter故障和非法比较器投射

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

只是想知道为什么在特定列上使用比较器进行表行排序不起作用。对话框如下图所示,“项目类型”表正在排序

如您所见,“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$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);
     }
 });