【问题标题】:Confusion over a JTable's setDefaultRenderer method对 JTable 的 setDefaultRenderer 方法的困惑
【发布时间】: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 的类)

任何帮助将不胜感激!

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    我发现我没有覆盖 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 2011-09-24
      • 2013-07-27
      • 2021-03-30
      • 1970-01-01
      • 2021-03-24
      • 2017-11-10
      • 2017-03-20
      • 2013-07-19
      相关资源
      最近更新 更多