2017-08-28 120 views
1

我目前已經有了一個SSCCE(或者至少是中等),它有一個表,一個擴展了AbstractTableModel的模型和一個擴展了DefaultTableCellRenderer的單元格渲染器。對JTable的setDefaultRenderer方法感到困惑

我試圖將包含LocalDate(生日)的列轉換爲一個時間。所以,我試圖做一個「測試」自定義渲染,看看我是否能得到一個渲染工作:

class CustomDateCellRenderer extends DefaultTableCellRenderer{ 
    @Override 
     public Component getTableCellRendererComponent(JTable tab, Object value, boolean isSelected, 
                 boolean hasFocus, int r, int c){ 
     if(value instanceof LocalDate){ 
      System.out.println("Local Date"); 
      // this is where I display the age from the value variable 
     } 
     return super.getTableCellRendererComponent(tab,value,isSelected,hasFocus,r,c); 
    } 
} 

它的工作,如果我叫:

table.getColumnModel().getColumn(2).setCellRenderer(new CustomDateCellRenderer());

但如果我用:

table.setDefaultRenderer(LocalDate.class, new CustomDateCellRenderer());

我試圖理解爲什麼,特別是當值參數getTableCellRendererComponent()絕對是LocalDate。我猜這可能是該列已經有一個默認的單元格渲染器,當我試圖設置一個。由於JTable /方法的文檔中描述:

設置要使用如果沒有渲染器在TableColumn

這聽起來像不像這個問題已經設置默認的單元格渲染器?我只是困惑,因爲我自己並沒有設定一個。

我很高興,如果需要提供整個SSCCE,但就目前而言,並讓事情變得更短,這是我的TableModel的getValueAt()和setValueAt()方法:

@Override 
public void setValueAt(Object value, int r, int c){ 
    Person p = data.get(r); 
    switch(c){ 
     case 0 : p.setFName((String)value); break; 
     case 1 : p.setSName((String)value); break; 
     case 2 : DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
        p.setDOB(LocalDate.parse((String)value, formatter)); break; 
    } 
} 

@Override 
public Object getValueAt(int r, int c){ 
    Person p = data.get(r); 
    switch(c){ 
     case 0 : return p.getFName(); 
     case 1 : return p.getSName(); 
     case 2 : return p.getDOB(); 
    } 
    return null; 
} 

數據只是一個Person類型的數組列表(String)fName,(String)sName和(LocalDate)DOB)

回答

2

我發現我不會重寫TableModel中的getColumnClass()方法。一個業餘愛好者的錯誤!

這意味着table.setDefaultRenderer(LocalDate.class, new CustomDateCellRenderer());不起作用,但獲取列和設置渲染器會。

我不知道,如果是最好的辦法,但現在這是我的getColumnClass方法:

@Override 
public Class getColumnClass(int c){ 
    switch(c){ 
     case 0 : return String.class; 
     case 1 : return String.class; 
     case 2 : return LocalDate.class; 
    } 
    return null; 
}