2010-03-09 52 views
4

我在我的JTable中以我想要的格式顯示Date s時遇到問題。我的JTable已經使用ResultSet和列表創建。在Jtable/ResultSet中格式化日期

我試着在getValueAt(.)以下,但沒有運氣:

 if(value instanceof Date) 
     { 
      //System.out.println("isDate"); 
      DateFormat formatter = DateFormat.getDateInstance(); 
      SimpleDateFormat f = new SimpleDateFormat("MM/dd/yy"); 
      value = f.format(value); 
      Date parsed = (Date) value; 
      try { 
       parsed = (Date) f.parse(value.toString()); 
      } catch (ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      value = parsed.toString(); 
     } 

println(.)從不打印所以它甚至不說這個。正在顯示格式爲Apr 10, 1992但我想04/10/92

雖然我們對DateJTables的話題......我有isCellEditable(.)爲真,但我不能編輯日期細胞。你怎麼做到這一點?

+1

檢查,如果你的 '的instanceof' 條件指的java.util.Date還是java.sql.Date。 – Aito 2010-03-09 19:44:25

+0

任何異常和堆棧跟蹤?發佈它們。 – BalusC 2010-03-09 20:48:57

+0

結果集得到sql.Date我相信。沒有例外或錯誤 – twodayslate 2010-03-10 05:05:07

回答

14

不覆蓋getValue,使用TableCellRenderer代替:

TableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() { 

    SimpleDateFormat f = new SimpleDateFormat("MM/dd/yy"); 

    public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     if(value instanceof Date) { 
      value = f.format(value); 
     } 
     return super.getTableCellRendererComponent(table, value, isSelected, 
       hasFocus, row, column); 
    } 
}; 

table.getColumnModel().getColumn(0).setCellRenderer(tableCellRenderer); 
+0

有一個在這裏閱讀 http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#renderer – objects 2010-03-09 22:13:09

5

正在顯示的格式是 1992年4月10日

聽起來像的一個toString()表示日期存儲在TableModel中,而不是日期對象。所以你需要檢查你的數據是如何從ResultSet複製到TableModel的。確保你正在使用resultSet.getObject()方法。或者,也許問題在於,您正在將數據庫中存儲的字符串按照您看到的格式進行格式化。

無論如何,一旦您能夠在TableModel中實際存儲Date對象,請查看Table Format Renderers,它允許您在單行代碼中創建具有自定義日期格式的自定義渲染器。

+1

+1,我不認爲你錯過了一些東西。這種方法比我的更好。 – 2010-03-10 21:48:36

4

您應該創建DefaultTableCellRenderer的子類並覆蓋setValue(Object),然後設置整個列的單元格渲染器。

public class DateCellRenderer extends DefaultTableCellRenderer { 
    public DateCellRenderer() { super(); } 

    @Override 
    public void setValue(Object value) { 
     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy"); 

     setText((value == null) ? "" : sdf.format(value)); 
    } 
} 
在你的用戶代碼

然後像做JTable.getColumnModel().getColumn(index).setCellRenderer(new DateCellRenderer());

-5

有一個第三方提供補充.. moment.js

只需通過nuget添加它,將腳本移動到您的內容腳本文件。加入這一行(例子)

的Javascript:

<script src="@Url.Content("~/Content/Scripts/moment.min.js")" type="text/javascript"></script> 

然後我們改變我們的JTable字段聲明。

的Javascript:

DateAdded: { 
         title: 'Date added', 
         width: '20%', 
         sorting: false, 
         display: function (data) { 
          return moment(data.record.DateAdded).format('DD/MM/YYYY HH:mm:ss'); 
         } 
        }