当您单击我的JTable上的列标题时,它按字母顺序对行进行排序。这适用于除我之外的所有列。在这一列中,值都是字符串,但包含数字。我需要他们根据他们的十进制值而不是字符串值进行排序。在JTable中按列排序行
任何想法如何做到这一点?
当您单击我的JTable上的列标题时,它按字母顺序对行进行排序。这适用于除我之外的所有列。在这一列中,值都是字符串,但包含数字。我需要他们根据他们的十进制值而不是字符串值进行排序。在JTable中按列排序行
任何想法如何做到这一点?
默认的行排序器将根据列类进行排序。如果列类是Object(默认值),那么它使用toString()
方法。如果您可以将列中的内容更改为实现Comparable接口的内容(例如Integer/Double),那么它将使用该比较器。您还必须更改表模型上的列类。
为了做到这一点,您将不得不扩展DefaultTableModel(或实现AbstractTableModel或TableModel)并重写getColumnClass()方法。
如果您无法更改进入该列的数据(出于某种原因您想要在那里存储字符串),那么您将不得不修改该表的RowSorter。
DefaultRowSorter rowSorter = new DefaultRowSorter();
rowSorter.setComparator(numberColumnIndex,numberSortingComparator);
table.setRowSorter(rowSorter);
请阅读教程的JTable这是含有TableRowSorter还例如,
你的答案是这些代码行,设置列级正确
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
// or could be in most cases hardcoded, and I'm using that too
@Override
public Class<?> getColumnClass(int colNum) {
switch (colNum) {
case 0:
return Integer.class;
case 1:
return Double.class;
case 2:
return Long.class;
case 3:
return Boolean.class;
case 4:
return String.class;
case 5:
return Icon.class;
/*case 6:
return Double.class;
case 7:
return Double.class;
case 8:
return Double.class;*/
default:
return String.class;
}
}
+1,正确的解决方案是将数字存储为Double对象而不是String对象。它们不仅会被正确地排序,而且会以正确的理由被正确地排序。 – camickr 2011-06-04 01:32:50
通过“包含数字”你的意思是像一个字符串“ 50个苹果“,或者只是一个像”50“这样的字符串类型的数字? – Tim 2011-06-03 21:07:27
这两个答案都正确引用'getColumnClass()'。另见[Class Literals as Runtime-Type Tokens](http://download.oracle.com/javase/tutorial/extra/generics/literals.html)。 – trashgod 2011-06-04 00:20:19