我正在查询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不能被转换为String。为什么这会正确地将数据标识为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
}
}
};
答案 0 :(得分:3)
ClassCastException即将发生,因为您正在尝试将Time类强制转换为String。它显示为Date对象,因为java.sql.Time和java.sql.Date都是java.util.Date的子类。这些子类只是瘦包装器(同样的东西只有足够的额外信息可以映射到SQL列)。所以在Swing JTable中它被用作java.util.Date,因为java.sql类型与swing组件大部分无关。