JTable +排序特定字段

我有一个JTable并添加了排序。 现在,JTable有5列,日期字段中的第2列转换为DD / MM / YYYY,并显示在单元格的JTextField中。

当我将它排序为字符串并且我将日期混淆时,如何更改该特定列的排序行为?

例如。 按照ASC顺序排序后,我得到了这个:

01/02/2012 01/03/2011 01/04/2011 01/05/2011 01/06/2011 01/07/2011 01/08/2011 01/09/2011 01/10/2011 01/12/2011 

这是错的,我应该得到结果

 01/03/2011 01/04/2011 01/05/2011 01/06/2011 01/07/2011 01/08/2011 01/09/2011 01/10/2011 01/12/2011 01/02/2012 

我的代码现在看起来像这样排序

 List sortKeys = new ArrayList(); sortKeys.add(new SortKey(2, SortOrder.ASCENDING)); table.getRowSorter().setSortKeys(sortKeys); 

我应该仅针对该特定列更改哪些内容?

你需要实现比较器,将日期字符串视为Date而不是简单的String看看这里

因为java.util.Date实现Comparable ,所以让TableModelgetColumnClass()返回第2列的Date.class就足够了。 使用自定义渲染器根据需要格式化日期。

附录:这是使用setDefaultRenderer()的示例。

 import java.awt.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; /** @see http://stackoverflow.com/questions/4553448 */ public class TableDate extends JPanel { private static final int INT_COL = 0; private static final int DATE_COL = 1; private final Calendar calendar = Calendar.getInstance(); private final CustomModel model = new CustomModel(); private final JTable table = new JTable(model); public TableDate() { super(new GridLayout(1, 0)); table.setAutoCreateRowSorter(true); table.setDefaultRenderer(Date.class, new DateRenderer()); table.setPreferredScrollableViewportSize(new Dimension(320, 240)); JScrollPane sp = new JScrollPane(table); this.add(sp); for (int i = 1; i <= 20; i++) { model.addRow(newRow(i)); } } private Object[] newRow(int i) { calendar.add(Calendar.DAY_OF_YEAR, 1); return new Object[]{Integer.valueOf(i), calendar.getTime()}; } private static class CustomModel extends DefaultTableModel { private final String[] columnNames = {"Index", "Date"}; @Override public Class getColumnClass(int col) { if (col == INT_COL) { return Integer.class; } else if (col == DATE_COL) { return Date.class; } return super.getColumnClass(col); } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int col) { return columnNames[col]; } } private static class DateRenderer extends DefaultTableCellRenderer { DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); public DateRenderer() { super(); } @Override public void setValue(Object value) { setText((value == null) ? "" : formatter.format(value)); } } private void display() { JFrame f = new JFrame("TableDate"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new TableDate().display(); } }); } }