覆盖 getColumnClass 不适用于日期列

Override getColumnClass not working for Date Columns

我在 Matlab 中使用 JIDE 网格排序和自动过滤功能。我已经覆盖了 getColumnClass 并且过滤和排序对整数、双精度和字符串列(按数字排序为数字,按词法分别为字符串排序)运行良好。

但是,我在日期列方面遇到了一个重大问题。我已覆盖 getColumn class 并定义为 Date.class。但我认为我必须定义将日期(如原始数据)传递给过滤和排序的格式,以便它理解格式并正常工作。

我看到 JIDE 自动过滤中的默认日期格式是“2016 年 4 月 7 日”。我曾尝试将我的数据转换为相同的格式,但没有成功。如果我尝试过滤日期,它会抛出 (Unknown Source) 异常。我认为它不理解我的日期格式。覆盖日期列的 class 时如何定义日期格式?

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException:
                               java.util.Date cannot be cast to java.lang.String
       at java.lang.String.compareTo(Unknown Source)
       at com.jidesoft.filter.LessThanFilter.isValueFiltered(Unknown Source)
       at com.jidesoft.grid.FilterableTableModel.shouldBeFiltered(Unknown Source)

这是我的 TableModel class,它覆盖了 DefaultTableModel。

import javax.swing.table.*;
import java.util.Date;

class MyTableModel extends DefaultTableModel {

    public MyTableModel(Object rowData[][], Object columnNames[]) {
        super(rowData, columnNames);
    }
    @Override
    public Class getColumnClass(int col) {
        switch (col){
            case 0:
                return Integer.class;
            case 1: case 2: case 9:
            case 10: case 33:
                return String.class;
            case 3:
                return Date.class;
            default:
                return Double.class;
        }
    }
    @Override
    public boolean isCellEditable(int row, int col) {
        switch (col){
            case 28: case 29: case 30: case 31: case 32:
                return true;
            default:
                return false;
        }
    }
}

我对 JIDE 一无所知,所以我的所有评论都是针对 JDK.

中的常规 classes

I see default date format in JIDE Autofiltering is '07-Apr-2016'.

对我来说,这看起来像一个字符串。如果您希望该列包含一个 Date,那么您需要在 TableModel 中存储一个 Date 对象,而不是日期的字符串表示形式。

然后您通常会向 table 添加自定义呈现器以以适当的格式显示日期。

例如:

public class YMDRenderer extends DefaultTableCellRenderer
{
    private Format formatter = new SimpleDateFormat("yy/MM/dd");

    public void setValue(Object value)
    {
        //  Format the Object before setting its value in the renderer

        try
        {
            if (value != null)
                value = formatter.format(value);
        }
        catch(IllegalArgumentException e) {}

        super.setValue(value);
    }
}

您还可以查看 Table Format Renderers,其中包含可重复使用的渲染器,您只需向渲染器提供 Format 对象即可使用。这将节省您为所需的每种数据格式创建唯一渲染器的时间。

编辑:

I guess I have to use FormatConverter of some sort to do that

您可以使用 SimpleDateFormat class 和 parse(String) 方法将字符串解析为日期对象。

异常表示:java.util.Date 无法转换为 java.lang.String。这意味着,就像 Camickr 指出的那样,日期实际上是作为字符串存储在我的 TableModel 而不是 Date 对象中。我使用 SimpleDateFormat class 将字符串转换为日期对象。为了其他新手 java 学习者的利益,下面是执行此操作的代码片段。

import javax.swing.table.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyTableModel extends DefaultTableModel{
    public MyTableModel(Object rowData[][], Object columnNames[]){
        super(rowData, columnNames);
        String ExpectedDateFormat = (String) ("dd/mm/yyyy");
        SimpleDateFormat format = new SimpleDateFormat(ExpectedDateFormat);
        Date strToDate = null;
        for (int i=0; i<rowData.length;i++){
            String DateStr = (String) super.getValueAt(i,3);
                    try {
                strToDate = format.parse(DateStr);
            //    System.out.println(strToDate);
            } catch (ParseException e) {
            //   e.printStackTrace();
            }
            super.setValueAt(strToDate,i,3);
        }
    }

    @Override
    public Class getColumnClass(int col) {
        switch (col){
            case 0:
                return Integer.class;
            case 1: case 2: case 9:
            case 10: case 33:
                return String.class;
            case 3:
                return Date.class;
            default:
                return Double.class;
        }
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        switch (col){
            case 28: case 29: case 30: case 31: case 32:
                return true;
            default:
                return false;
        }
    }
}

日期数据在uitable中的显示可以使用与上述Camickr相同的class(SimpleDateFormat)来控制。

我后来发现的另一个帖子解释并解决了同样的问题:HERE