2011-03-31 77 views
1

我想排序我的JTable中的一列。該列包含Long's(j ava.util.Long),它實現了Comparable。因此,讀取this document時,它說:排序多行的JTable列

1:如果通過setComparator方法爲列指定了比較器,請使用它。 2:如果getColumnClass返回的列類是String,則使用由Collat​​or.getInstance()返回的Comparator。

3:如果列類實現Comparable,則使用調用compareTo方法的Comparator。如果已經指定了TableStringConverter,則使用它將值轉換爲字符串,然後使用由Collat​​or.getInstance()返回的Comparator。 5:否則使用Collat​​or.getInstance()返回的比較器對對象調用toString的結果。

我的代碼不會創建自定義Comparator對象,所以#1出來了。該列是Long的一列,因此#2已經出來。 #3聲明它應該按照長「compareTo」方法進行排序。但事實並非如此。如果我的JTable有3個Long,90,900和111,它將把它們排序爲「900,90,111」或「111,90,900」。如#5所述,它似乎像字符串一樣對它們進行排序。

這裏是從我們創建表:

table = new JTable(new CustomTableModel(new Vector<Vector<Object>>() ,Record.getNames())); 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.setAutoCreateRowSorter(true); 

,然後添加信息:

public void setRecords(Iterable<Record> records){ 
    CustomTableModel model = (CustomTableModel) table.getModel(); 
    model.setRowCount(0); 
    model.clearRecords(); 

    for(Record r : records){ 
     Vector<Object> v = new Vector<Object>(); 
     v.add(r.getFromNumber()); 
     v.add(r.getToNumber()); 
     v.add(r.getStartDate()); 
     v.add(new Long(r.getDuration())); 
     model.addRow(v); 
     model.addRecord(r); 
    } 
    model.fireTableDataChanged(); 
    table.getRowSorter().toggleSortOrder(2); 

我怎樣才能解決這個問題,所以最後一列(列3),是由長排序/長/整數,而不是字符串?我看着自定義的比較器,但我不知道如何實現。 JTable不應該使用#3嗎?謝謝!

回答

1

確認您的模型的getColumnClass()方法返回Long.class

+0

啊,它返回「Object」,而不是Long。我在哪裏設置/更改? – 2011-03-31 01:41:31

+0

下面是使用'AbstractTableModel'使用'DefaultTableModel'和[另一個](http://sites.google.com/site/drjohnbmatthews/table)的[示例](http://stackoverflow.com/questions/3305198)。 – trashgod 2011-03-31 01:44:00

+0

太棒了,謝謝! – 2011-03-31 01:48:31