【发布时间】:2018-02-06 02:27:09
【问题描述】:
我目前有一个 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() 的 value 参数绝对是 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 类型的数组列表(一个具有明显变量 (String)fName、(String)sName 和 (LocalDate)DOB 的类)
任何帮助将不胜感激!
【问题讨论】: