2013-05-26 28 views
2

我看了一下JTable中幾個問題的Double值排序: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是「股票」,這是唯一的整數,但結果,就像我說的是:

0 
10000 
20 
+0

您的行排序代碼在哪裏?這些行不能奇蹟般地自行排序。 –

+0

是的,對不起,我現在加了 – Nikola

+0

爲了更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

4

要總結一下我的各種評論:

  • TableRowSorter還可以和做排序可比類型如預期
  • getColumnClass中的關鍵是提供正確排序的方式分揀機,因爲它決定了默認比較器使用哪個
    • 如果返回類型是可比,這是一個比較實施委託給它
    • 如果返回類型不是可比性,校書郎實例用於與該值的字符串表示喂,不管它是實際類型是類似的或不

所以沒有必要對包含彼此可比較值的列中的自定義比較器,只需實現columnClass即可返回該類型並完成。

下面是一個演示行爲的片段(把它扔到你最喜歡的測試設置中,任何幀都可以)。第一列被定義爲Integer,它是一個Comparable,其次是一個可以比較的數字,其他的只是Object。所有實際值都是整數。第一列數字順序排序,所有其他人通過他們的字符串表示

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的(順便說一句:應該在模式,而不是視圖來完成)似乎不是一個具體的上下文中工作,在其他地方有一些問題需要追蹤(遲早會再次出現)

+0

+1對它們進行排序,以再次顯示它是如何完成的。 :) –

0

據我所知,getColumnClass()對排序沒有影響。它用於確定編輯。

如果您要添加字符串表示的數字,並期望他們進行數字排序,那就是您的問題。將它們添加爲數字類型,它應該工作。該排序基於實現Comparable接口的TableModel中的值。

+0

我已經添加了我的(或者更確切的說是我使用的)比較器的實現,它不適合我 – Nikola

+1

第3列實際上是價格列。請記住,Java是基於0的,基於 – MadProgrammer

+0

錯誤,getColumnClass()是RowSorter/Filter最重要的標識符,錯誤的是,JTable具有最高效的比較器, – mKorbel