我正在查询一个 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
}
}
};