我已经阅读了几个关于JTable排序的问题:
Problems with JTable sorting of integer values
JTable + Sorting specific field
但由于某种原因,我仍然无法做到正确。
我写了这个:
String allItemsColumns [] = { "#", "Name", "Stock",
"Price", "Type", "Supplier", "Location", "" };
allItemsTableModel = new DefaultTableModel(null, allItemsColumns);
allItemsTable = new JTable(allItemsTableModel)
{
Class<?>[] types = { Integer.class, String.class, Integer.class,
Double.class, String.class, String.class, String.class, ImageIcon.class };
@Override
public Class<?> getColumnClass(int columnIndex) {
return this.types[columnIndex];
}
};
但我还是得到了
0
10000
20
当我对股票进行分类时可能这是显而易见的,但我现在真的很想念它。
我不认为我是如何添加信息的,因为我(想的是)告诉它将列读作整数,双打或字符串
我的排序方法:
allItemsTable.setAutoCreateRowSorter(true);
TableRowSorter<DefaultTableModel> rowSorter =
(TableRowSorter<DefaultTableModel>)allItemsTable.getRowSorter();
rowSorter.setComparator(3, new Comparator<String>() {
@Override
public int compare(String o1, String o2)
{
return Integer.parseInt(o1) - Integer.parseInt(o2);
}
});
我从我看到的一个问题中得到了它。第3列是“Stock”,它只是整数,但结果,就像我说的那样:
0
10000
20
答案 0 :(得分:4)
总结我的各种评论:
因此,不需要在包含可相互比较的值的列中使用自定义比较器,只需实现columnClass即可返回该类型并完成。
这是一个演示行为的片段(把它扔进你最喜欢的测试设置,只是任何帧都可以)。第一列定义为Integer,它是一个可比较的,第二列是一个数字,它是一个可比较的,其他的只是对象。所有实际值都是整数。第一列按数字排序,所有其他列按字符串表示
final Class[] classes = new Class[]{Integer.class, Number.class};
DefaultTableModel model = new DefaultTableModel(0, 3) {
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex < classes.length)
return classes[columnIndex];
return super.getColumnClass(columnIndex);
}
@Override
public String getColumnName(int column) {
return getColumnClass(column).getSimpleName();
}
};
for (int row = 0; row < 15; row++) {
model.addRow(new Object[]{row, row, row});
}
JTable table = new JTable(model);
table.setAutoCreateRowSorter(true);
如果实现columnClass(顺便说一句:应该在模型中完成,而不是视图!)似乎不能在具体的上下文中工作,那么其他地方应该有一些问题需要跟踪(它迟早会再次出现) )
答案 1 :(得分:0)
据我所知,getColumnClass()
对排序没有影响。它用于确定编辑。
如果您要添加数字的字符串表示并希望它们按数字排序,那么这就是您的问题。将它们添加为数字类型,它应该工作。排序基于实现TableModel
接口的Comparable
中的值。