【问题标题】:Displaying MySQL datetime in JTable在 JTable 中显示 MySQL 日期时间
【发布时间】:2012-05-14 18:33:19
【问题描述】:

在 MySQL 数据库中,我有一个包含日期时间列的表,其格式为“2012-01-18 09:45:30”。我使用以下语法查询该表的内容:

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 日期时间列在 JTable 中显示为以下格式的字符串:

2012-01-18 09:45:30

如果我使用以下语法获取日期时间列的类名,则返回的类是 java.sql.Timestamp

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

现在,这是让我感到困惑的部分。如果我使用以下语法覆盖 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 以便显示日期和时间?

【问题讨论】:

    标签: java mysql swing datetime date


    【解决方案1】:

    只需为这两个类创建一个 TableCellRenderer 即可完全按照您的喜好格式化 Timestamp/Date 实例。查看Swing table tutorial,尤其是'Concepts: Editors and renderers''Using custom renderers' 部分

    【讨论】:

      【解决方案2】:

      您可以改写 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;
          }
      }
      

      【讨论】:

      • 感谢您的建议。但是,我重写 getColumnClass 的部分原因是强制一列返回布尔值。我这样做是为了帮助我在 JTable 上添加一列复选框和一个全选/全选按钮。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多