2

我正在查询一个 MySQL 表并选择 varchar、Date、Time、Double 和 Boolean 数据类型。我从 ResultSet 中获取数据并将其放入 DefaultTableModel 中,然后将其放入 JTable 中,然后放入 JScrollPane 中进行显示。

除了其中包含 java.sql.Time 对象的列之外,所有数据都正确显示。这些显示为日期对象,它们的值都是 1970 年 1 月 1 日。

似乎 java.sql.Time 对象被读取为 java.sql.Date 对象(我猜测 1970 年 1 月 1 日被返回,因为时间值超出了对日期对象有效的范围)。

我很困惑,因为如果我覆盖 DefaultTableModel 中的 getColumnClass 方法以始终返回 String.class 并使用表方法 setAutoCreateRowSorter(true),当我单击包含 java.sql.Time 对象的列的标题对其进行排序时,a抛出 java.lang.ClassCastException,它说 java.sql.time 不能转换为字符串。为什么这会正确地将数据识别为 java.sql.Time,但是如果我重写 DefaultTableModel getColumnClass 以返回正确的类,它会将其视为日期而不是时间?任何解决问题的帮助将不胜感激。下面是我如何在 DefaultTableModel 中覆盖他的 getColumnClass 方法:

        model = new DefaultTableModel() {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                if (columnIndex == numberOfColumns) {
                    return Boolean.class;
                } else {
                    return getValueAt(1, columnIndex).getClass(); //return actual class
                    return String.class; //return string regardless of what class is
                }
            }
        };
4

1 回答 1

3

ClassCastException 即将到来,因为您试图将 Time 类转换为字符串。它显示为 Date 对象,因为 java.sql.Time 和 java.sql.Date 都是 java.util.Date 的子类。这些子类只是简单的包装器(同样的,只有足够的额外信息可以映射到 SQL 列)。因此,在 Swing JTable 中,它被用作 java.util.Date,因为 java.sql 类型在大多数情况下与摆动组件无关。

于 2012-05-13T05:20:46.213 回答