0

MySQL データベースには、「2012-01-18 09:45:30」という形式の datetime 列を含むテーブルがあります。次の構文を使用して、このテーブルの内容をクエリします。

Statement s = conn.createStatement();
s.executeQuery( "select * from db_name.tbl_name;");
ResultSet rs = s.getResultSet();
ResultSetMetaData = rs.getMetaData();
int numberOfColumns = metaData.getColumnCount();

//Put Column Header info in Vector
Vector columnNames = new Vector();
for (int column = 0; column < numberOfColumns; column++) {
    columnNames.addElement(metaData.getColumnLabel(column+1));
}

//Put sql table data in Vector of Vectors
Vector data = new Vector();
while (rs.next()) {
    Vector newRow = new Vector();
    newRow.addElement(rs.getObject(i));
}
s.close();
rs.close();
DefaultTableModel model = new DefaultTableModel(data,columnNames);
JTable table = new JTable(model);
JScrollPane pane = new JScrollPane(table);

DefaultTableModel で getColumnClass をオーバーライドしないと、MySQL の datetime 列が JTable に次の形式の文字列として表示されます。

2012-01-18 09:45:30

次の構文を使用して日時列のクラス名を取得すると、返されるクラスは java.sql.Timestamp です。

System.out.println(metaData.getColumnClassName(i));

さて、これは私を混乱させる部分です。次の構文を使用して、DefaultTableModel の getColumnClass メソッドをオーバーライドして正しいクラスを返すと、datetime 列は次のようにフォーマットされて表示されます。

Jan 18,2012

時間部分が完全に省略されていることに注意してください。

@override
public Class getColumnClass(int column) {
    for (int row = 0; row < getRowCount(); row++) {
        Object o = getValueAt(row, column);
        if (o != null) {
            try {
                switch (metaData.getColumnClassName(column+1)) {
                    case "java.sql.Timestamp":
                        return java.sql.Timestamp.class;
                    case "java.sql.Date":
                        return java.sql.Date.class;
                } 
            }
            catch (SQLException ex) {
                Logger.getLogger(ResultSetToCheckBoxTable.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    return Object.class;
}

また、java.sql.Date 列を表示しようとすると、次の形式の文字列として表示されます。

2012-01-18

GetColumnClass をオーバーライドして正しいクラスを返すかどうかに関係なく。

次のように表示する方法java.sql.Date:日付と時刻を表示するにはJan 18, 2012?java.sql.TimeStamp

4

2 に答える 2

2

/インスタンスを好きなようにTableCellRendererフォーマットする for both クラスを作成するだけです。Swing テーブル チュートリアルを参照してください。特に、「概念: エディターとレンダラー」セクションと「カスタム レンダラーの使用」セクションを参照してください。TimestampDate

于 2012-05-14T22:10:35.170 に答える
1

代わりにオーバーライドDefaultTableModel.getValueAt()して、次のようにすることができます。

private static DateFormat dateFormatter =
    DateFormat.getDateInstance();
private static DateFormat timestampFormatter =
    DateFormat.getDateTimeInstance();            

...

public Object getValueAt(int row, int column) {
    Object value = super.getValueAt(row, column);
    if (value instanceof Date) {
        synchronized (dateFormatter) {
            dateFormatter.format((Date)value);
        }
    }
    else if (value instanceof Timestamp) {
        synchronized (timestampFormatter) {
            timestampFormatter.format((Date)value);            
        }
    } else {
        return value;
    }
}
于 2012-05-14T19:09:33.457 に答える