首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TableRowSorter与非法比较器铸造的故障

TableRowSorter与非法比较器铸造的故障
EN

Stack Overflow用户
提问于 2014-12-09 16:26:27
回答 2查看 832关注 0票数 1

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

如您所见,“name”列工作正常。如果我单击ID列,就会得到

代码语言:javascript
复制
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)

以下是定义和使用行排序器的位置:

代码语言:javascript
复制
        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);

这就在表模型中,这一切似乎都是正常的:

代码语言:javascript
复制
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (columnIndex < 0 || columnIndex >= 3) {
            throw new IndexOutOfBoundsException("Illegal col index: " + columnIndex);
        }
        if (rowIndex < 0 || rowIndex >= rows.size()) {
            throw new IndexOutOfBoundsException("Illegal row index: " + rowIndex);
        }
        ItemRow ir = rows.get(rowIndex);
        switch (columnIndex) {
            case 0: return ir.getItem().getImage(); 
            case 1: return ir.getItem().getId();
            case 2: return ir.getItem().getName();
        }
        throw new IllegalStateException("Column index invalid?");
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0: return Image.class;
            case 1: return Integer.class;
            case 2: return String.class;
        }
        throw new IllegalStateException("Column index invalid?");
    }

出什么问题了?提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-09 18:43:12

在使用ClassCastException时,JTable的一个重要来源是getValueAtgetColumnClass和默认呈现器的尽力而为(而不是防止失败)行为的结合。

在这里,您声明第二列(第1列)的类型是Integer,并将用于该列的Comparator设置为Integer比较器。到目前为止似乎还算合理。但是,您实际上可以自由地返回getValueAt方法中的任何内容,除非您指定了自定义呈现器,否则您的非整数值将呈现得很好。编译器无法检查您声明的类型是否实际匹配!因此,您只能通过仔细检查、设置自定义呈现器/编辑器或尝试排序(因为默认比较器不那么宽松)才能发现类不匹配。

在这种情况下,getId()实际上返回了一个String而不是一个Integer

票数 3
EN

Stack Overflow用户

发布于 2014-12-09 16:28:56

您使用的是一个比较器,它需要一个整数,但正在接收一个字符串。

代码语言:javascript
复制
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);
     }
 });

您可能需要编写一个尝试-捕捉块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27383893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档