只是想知道为什么在特定列上使用比较器的表行排序不起作用。对话框如下图所示,“项目类型”表正在排序。
正如您所见,“名称”列工作正常。如果我点击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);
这是表格模型,一切看起来都很正常:
@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?");
}
出了什么问题?提前感谢您的帮助。
答案 0 :(得分:3)
使用ClassCastException
时JTable
的重要来源是getValueAt
,getColumnClass
和尽力而为(而不是快速失败)行为的组合默认渲染器。
在此,您声明第二列(第1列)的类型为Integer
,并将用于它的Comparator
设置为Integer
比较器。到目前为止似乎很合理。但是,您实际上可以在getValueAt
方法中自由返回任何,除非您指定自定义渲染器,否则非Integer值将呈现正常。编译器无法检查您声明的类型是否实际匹配!因此,您只能通过仔细检查,设置自定义渲染器/编辑器或尝试排序(因为默认比较器不那么宽松)来找到类不匹配。
在这种情况下,事实证明getId()
实际上返回String
而不是Integer
。
答案 1 :(得分:0)
您正在使用需要Integer但正在接收String的比较器。
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);
}
});
您可能想要编写try-catch块。