2011-06-03 38 views
2

当您单击我的JTable上的列标题时,它按字母顺序对行进行排序。这适用于除我之外的所有列。在这一列中,值都是字符串,但包含数字。我需要他们根据他们的十进制值而不是字符串值进行排序。在JTable中按列排序行

任何想法如何做到这一点?

+0

通过“包含数字”你的意思是像一个字符串“ 50个苹果“,或者只是一个像”50“这样的字符串类型的数字? – Tim 2011-06-03 21:07:27

+0

这两个答案都正确引用'getColumnClass()'。另见[Class Literals as Runtime-Type Tokens](http://download.oracle.com/javase/tutorial/extra/generics/literals.html)。 – trashgod 2011-06-04 00:20:19

回答

4

默认的行排序器将根据列类进行排序。如果列类是Object(默认值),那么它使用toString()方法。如果您可以将列中的内容更改为实现Comparable接口的内容(例如Integer/Double),那么它将使用该比较器。您还必须更改表模型上的列类。

为了做到这一点,您将不得不扩展DefaultTableModel(或实现AbstractTableModel或TableModel)并重写getColumnClass()方法。

如果您无法更改进入该列的数据(出于某种原因您想要在那里存储字符串),那么您将不得不修改该表的RowSorter。

DefaultRowSorter rowSorter = new DefaultRowSorter(); 
rowSorter.setComparator(numberColumnIndex,numberSortingComparator); 
table.setRowSorter(rowSorter); 
8

请阅读教程的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; 
       } 
      } 
+0

+1,正确的解决方案是将数字存储为Double对象而不是String对象。它们不仅会被正确地排序,而且会以正确的理由被正确地排序。 – camickr 2011-06-04 01:32:50