我目前有一个SSCCE(或至少是一个中等版本),它有一个表,一个扩展AbstractTableModel的模型,以及一个扩展DefaultTableCellRenderer的单元格渲染器。
我试图将包含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;
}
data只是Person类型的一个arraylist(一个具有明显变量的类(String)fName,(String)sName和(LocalDate)DOB)
任何帮助将不胜感激!
答案 0 :(得分: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;
}