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 オブジェクトを含む列のヘッダーをクリックしてソートすると、混乱します。 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

Time クラスを文字列としてキャストしようとしているため、 ClassCastException が発生しています。java.sql.Time と java.sql.Date はどちらも java.util.Date のサブクラスであるため、Date オブジェクトとして表示されます。これらのサブクラスは、シン ラッパーにすぎません (SQL 列にマップするのに十分な追加情報を備えた同じものです)。そのため、Swing JTable では java.util.Date として使用されています。これは、java.sql 型がほとんどの場合、swing コンポーネントと無関係であるためです。

于 2012-05-13T05:20:46.213 に答える