混淆了JTable的setDefaultRenderer方法

时间:2017-08-28 18:39:44

标签: java swing jtable

我目前有一个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)

任何帮助将不胜感激!

1 个答案:

答案 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;
}