2014-09-30 71 views
0

對不起再次提出基本問題。作爲新來的Java,所以我認爲更好地採取指導,而不是做一些愚蠢的事情。Java Jtable coulmn短路,日期不能正常工作

在我的JTable,我有以下數據

Id | Name | Date(month-year) 
1 | XYZ | August-2014 
2 | ABc | April-2014 

我Modelclass是現在如下

​​

的建議,我已經在我的模型表重寫的getColumnClass中

@Override 
public Class getColumnClass(int c) 
{ 
    if(c == 2) 
    { 
       //return Date.class; 
       return getValueAt(0,c).getClass(); 
    } 
     else 
     return getValueAt(0,c).getClass(); 
    } 

和我已啓用默認列分揀機。

現在默認情況下,所有字符串列在短路時都可以正常工作,但對於Date列,它也會將其視爲字符串並將其縮短爲字符串。

如果我強制列的時間短,它給我錯誤。

我在做什麼錯,什麼是正確的做法。

感謝

+0

什麼值,返回此列,有Date.class的回報,否則這個問題並不讓我SENCE – mKorbel 2014-09-30 12:33:11

+1

更多信息閱讀甲骨文教程如何使用表 - 部分約渲染器(描述有關數據類型) – mKorbel 2014-09-30 12:34:06

+0

嗨@mKorbel我已經添加了一些關於模型類的細節,以便它更具可讀性。 – javadotnetcoder 2014-09-30 12:43:23

回答

2

現在,作爲建議,我在我的模型表重寫的getColumnClass

請注意,您的實現是錯誤的,主要是因爲你從來沒有問模型的價值得到該列的類(更不用說冗餘/無用if-else塊)。既然你知道你的模型,那麼你完全有能力與無需返回正確的列類查詢模式:

@Override 
public Class<?> getColumnClass(int columnIndex) { 
    switch (columnIndex) { 
     case 0: return Integer.class; // Id column 
     case 1: return String.class; // Name column 
     case 2: return Date.class; // Date column 
      default: return super.getColumnClass(columnIndex); 
    } 
} 

這應該是足夠的正確排序日期列,即使你的渲染器顯示月份,年份模式:

table.setDefaultRenderer(Date.class, new DefaultTableCellRenderer() { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

     if (value instanceof Date) { 
      SimpleDateFormat formatter = new SimpleDateFormat("MMMM-yyyy"); 
      value = formatter.format((Date)value); 
     } 

     return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    } 
}); 

例如,如果你有9/27/20149/30/2014那麼這應該是自然的升序排列,當你排序此列,無論兩個單元顯示September-2014

+0

謝謝,它解決了問題 – javadotnetcoder 2014-09-30 15:07:41

+0

嗨@ dic19,它解決了這個問題,但我沒有得到table.setDefaultRenderer(Date.class,new DefaultTableCellRenderer),在這個爲什麼我們提到Date.class,爲什麼我們在這裏使用 – javadotnetcoder 2014-09-30 15:26:06

+1

@ javadotnetcoder:是的,'JTable'使用[*類Literals作爲運行時類型標記*](http://docs.oracle.com/javase/tutorial/extra/generics/literals.html)將數據類型與自定義關聯渲染器。 – trashgod 2014-09-30 17:42:33

2

幾件事情必須協同工作:

  • 讓列二,標Date,從getColumnClass()返回Date.class

  • 確保只有Date.class類型的值被添加到TableModel

  • 使用自定義renderer和合適的DateFormat(例如,)來強制日期格式。 "MMMM/yyyy",如圖所示here

  • 採用關於精確到一個月的日期的約定,例如,每月的第一天,並在模型的公共界面中強制執行。