首頁>Program>source

我有一个JTable並添加了排序.現在,JTable的日期欄位中的5列和第二列轉換為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<SortKey> sortKeys = new ArrayList<SortKey>();
sortKeys.add(new SortKey(2, SortOrder.ASCENDING));
table.getRowSorter().setSortKeys(sortKeys);

我仅應為该特定列更改什麼?

最新回復
  • 5月前
    1 #

    您需要實現將日期字元串视為 Date的比较器 相当簡單的 String 在這裏看看

  • 5月前
    2 #

    因為 java.util.Date 實現 Comparable<Date> ,让您的 TableModel就足够了 返迴 Date.class 来自 getColumnClass() 對於第二列.使用自定義渲染器設置所需日期的格式。

    附錄:這是使用 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();
                }
            });
        }
    }
    

  • objective c:動態更新UILabel
  • 使用Bash您最類似的命令列技巧是什麼?