java - 对 JTable 的 setDefaultRenderer 方法的混淆

标签 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/方法的文档中所述:

Sets a default cell renderer to be used if no renderer has been set in a 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 的类)

如有任何帮助,我们将不胜感激!

最佳答案

我发现我没有重写 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;
}

关于java - 对 JTable 的 setDefaultRenderer 方法的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45925416/

相关文章:

java - 在 JTable 中禁用水平自动滚动

java - 如何使用 hibernate 和 postrgresql 跨程序的多个实例锁定记录?

java - BoxLayout 中的 NullPointerException

java - 默认单元格编辑器类查询?

multithreading - JavaFX 的 Swing 计时器替代方案和线程管理差异

eclipse - 使用 Swing 截断图像

java - JTable 不会刷新

java - 有状态的 pl/sql 包是如何定义的?

java - 遍历外星人列表

java - 如何在 JFileChooser 中的 "Enter"按钮上点击 "Cancel"后采取行动?