Java Jtable列排序,日期无法正常工作

时间:2014-09-30 12:30:51

标签: java swing date jtable abstracttablemodel

很抱歉再次提出基本问题。作为java的新手,所以我认为最好采取指导而不是做一些愚蠢的事情。

在我的jtable中,我有以下数据

Id | Name | Date(month-year)
1  | XYZ  | August-2014
2  | ABc  | April-2014

我的Modelclass如下

class MyTableModel extends AbstractTableModel {

 private String[] columnNames = {"Id", "Country","Date"};

 public final Object[] longValues = {Integer.class,"",Date.class};

现在按照建议,我已经覆盖了模型表中的getColumnClass

@Override
 public Class getColumnClass(int c)
 {
     if(c == 2)
     {
              //return Date.class;
              return getValueAt(0,c).getClass();
     }
      else
         return getValueAt(0,c).getClass();
  }

我已启用默认列分拣机。

现在默认情况下,所有字符串列在短路时工作正常,但对于Date列,它也被视为字符串并将其缩短为字符串。

如果我强制列缩短为日期,则会给我错误。

我做错了什么,做错了什么。

由于

2 个答案:

答案 0 :(得分:2)

  

按照建议,我已覆盖模型表中的getColumnClass

请注意,您的实现是错误的,主要是因为您永远不必要求模型的值来获取列的类(更不用说冗余/无用的if-else块)。既然您了解了模型,那么您完全有能力返回正确的列类而无需查询模型:

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case 0: return Integer.class; // Id column
        case 1: return String.class; // Name column
        case 2: return Date.class; // Date column
            default: return super.getColumnClass(columnIndex);
    }
}

这应该足以正确排序日期列,即使您的渲染器显示月 - 月模式:

table.setDefaultRenderer(Date.class, new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        if (value instanceof Date) {
            SimpleDateFormat formatter = new SimpleDateFormat("MMMM-yyyy");
            value = formatter.format((Date)value);
        }

        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
});

例如,如果您有9/27/20149/30/2014,那么当您对此列进行排序时,这应该是自然升序,无论两个单元格都显示September-2014

答案 1 :(得分:2)

有几件事必须齐心协力:

  • 让标有Date的第二列从Date.class返回getColumnClass()

  • 确保只将Date.class类型的值添加到TableModel

  • 使用自定义renderer和合适的DateFormat强制执行日期格式,例如"MMMM/yyyy",如here所示。

  • 通过一项关于日期准确到一个月的公约,例如该月的第一天,并在模型的公共界面中强制执行。