5

我想在一列中按日期对 Jtable 进行排序,但仅以 dd-MM-yyyy 格式显示日期。所以所有条目都是相同的,只是在不可见的秒数上有所不同。

我有一个 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] = 日期

我不知道如何以正确的格式显示它,但可以进行排序。

我怎样才能实现两者?

4

2 回答 2

6

不要将Date对象转换为String. 相反,直接在模型中使用它们。建议格式化不是模型的责任,而是使用TableCellRenderer.

允许getValueAt返回Date对象。

修改表模型并覆盖该getColumnClass方法并返回蜂巢列的适当类(如Date.class)。

默认情况下,该表将为您格式化Date对象。

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

有关详细信息,请参阅如何使用表格,特别注意使用自定义渲染器

于 2013-06-24T09:37:53.353 回答
3

每当displayandinner逻辑不同时,您应该考虑使用TableModelCellRenderer。为什么不在日期列上添加 CellRenderer?单元格渲染器使用 SimpleDateFormat 渲染日期对象,但内部值仍保留为 Date 对象。这样排序应该可以正常工作,因为排序器在内部值上工作。

于 2013-06-24T09:35:32.437 回答