【发布时间】:2012-05-21 02:51:40
【问题描述】:
我正在查询一个 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 对象的列的标题进行排序时它,抛出 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
}
}
};
【问题讨论】:
-
this 有帮助吗?您正在将
java.sql.Time时间戳解析为String。这是不好的形式。 -
该链接让我对正在发生的事情有了更好的了解。 JTable 将 java.sql.time 和 java.sql.date 对象都视为 java.util.date 的子类,因此两者都显示为日期,而不是日期显示为日期,时间显示为时间。关于如何正确显示 java.sql.time 对象的任何想法?
-
再次强调,手动执行此操作是不正确的。您的 MySQL JDBC 驱动程序应该隐藏有关时间戳的所有细节,并且应该只返回时间戳。如链接中所述,使用
ResultSet#getTimestamp()