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
}
}
};