我目前已經有了一個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)