2013-06-24 63 views
3

我想按一列中的日期對Jtable進行排序,但僅以dd-MM-yyyy格式顯示日期。因此,所有條目都是相同的,只有不可見的秒數不同。Swing JTable按日期排序

我有一個TableModel的與下面的方法獲取數據:

@Override 
public Object getValueAt(int row, int col) { 

    Object[][] tableData = new Object[rowDataMap.keySet().size()][1]; 
    int index = 0; 
    for (Long key : pane.nqm_messages.keySet()) 
    { 
     Date date = rowDataMap.get(key); 

     SimpleDateFormat form = new SimpleDateFormat("dd-MM-yyyy"); 
     String outputDate = form.format(date); 

     tableData[index][0] = outputDate; 

     index++; 
    } 
    return tableData[row][col]; 
} 

這裏是我的TableRowSorter還,我要對行進行排序:如果我那樣做

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
List<SortKey> keys = new ArrayList<SortKey>(); 

SortKey sortKey; 
sorter.setComparator(0, new Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     //Sort dd-MM-yyyy 
    } 
}); 

我不能排序,因爲字符串是obv。全部都一樣。 當我直接使用這樣的

資料表[索引]的時間對象[0] =日期

我不知道如何以正確的格式顯示,但排序可以做到的。

我該如何做到這兩點?

+0

沒有返回值的字符串表示,返回該值本身並相應地實現columnClass的 – kleopatra

+0

除了什麼克列奧帕特拉指出,這是完全不能勝任要嘗試在單元 – MadProgrammer

+0

的每個請求上構建顯示數據,除此之外,您的模型實現看起來很腥意:a)爲什麼僅在需要返回單個值時創建完整的2d數組? b)爲什麼每次調用getValueAt時創建單一值?如果它是動態的,它可能會在不同的調用之間改變,那麼模型很可能是行爲不當,因爲沒有通知它的聽衆c)格式化日期是一個渲染器(不是模型)的責任,對於建議來說是 – kleopatra

回答

4

不要將Date對象轉換爲String。相反,在模型中直接使用它們。建議格式化不是模型責任,而是使用TableCellRenderer

允許getValueAt返回Date對象。

修改表模型並覆蓋getColumnClass方法並返回hiven列的合適類(如Date.class)。

該表默認將爲您設置Date對象的格式。

如果默認的不符合您的喜好,您可以提供您自己的TableCellRenderer

詳情請參閱How to use tables,要特別注意Using Custom Renderers

3

每當displayinner邏輯不同,你應該考慮TableModel的的CellRenderer。爲什麼不在日期列上添加CellRenderer?單元格渲染器使用SimpleDateFormat呈現日期對象,但內部值保留爲Date對象。這樣的排序應該正常工作,因爲分揀機工作在內部值。

+0

如果'TableModel#getColumnClassAt'返回'Data.class',表格將使用它自己的默認表格單元格渲染器。然而,+1建議使用'CellRenderer',而不是更少 – MadProgrammer

+0

我認爲CellRenderer會覆蓋使用getColumnClassAt方法的默認渲染器。但我可能是錯的 –

+0

是的,這是我的觀點,但如果需要的話,你可以提供你自己的。 – MadProgrammer