2012-05-14 98 views
0

在MySQL数据库中,我有ta表,其中包含datetime列,其格式为'2012-01-18 09:45:30'。我使用下面的语法查询此表的内容:在JTable中显示MySQL日期时间

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

如果我不覆盖的getColumnClass中的DefaultTableModel,那么MySQL的日期时间列显示在JTable作为以下格式的字符串:

2012-01-18 09:45:30 

如果我使用以下语法datetime列获取类名称,返回的类的java.sql.Timestamp

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

现在,这为t他混淆了我的一部分。如果我覆盖的DefaultTableModel所述的getColumnClass方法返回正确的类,使用下面的语法,则日期时间列进行格式化和像这样显示:

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, 2012java.sql.TimeStamp以便显示日期和时间?

回答

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

感谢您的意见。但是,我重写getColumnClass的部分原因是强制一列返回布尔值。我这样做是为了帮助我在我的JTable上添加一列复选框和一个select/delselect all按钮。 – Riggster