我想在一列中按日期对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。全都一样。 当我直接使用像那样的日期对象
tableData [index] [0] =日期
我不知道如何以正确的格式显示它,但可以完成排序。
我如何实现这两个目标?
答案 0 :(得分:5)
请勿将Date
个对象转换为String
。而是直接在模型中使用它们。建议格式化不是模型的责任,而是使用TableCellRenderer
。
允许getValueAt
返回Date
对象。
修改表模型并覆盖getColumnClass
方法并返回hiven列的批准类(如Date.class
)。
默认情况下,该表会为您格式化Date
个对象。
如果您不喜欢默认的TableCellRenderer
,则可以提供自己的{{1}}。
有关详情,请参阅How to use tables,特别注意Using Custom Renderers
答案 1 :(得分:3)
每当display
和inner
逻辑不同时,您应该考虑 TableModel 和 CellRenderer 。为什么不在日期列上添加CellRenderer?单元格渲染器使用SimpleDateFormat渲染日期对象,但内部值仍为Date对象。这样排序应该正常工作,因为分拣机处理内部值。