gpt4 book ai didi

java - 对 JTable 的 setDefaultRenderer 方法的混淆

转载 作者:行者123 更新时间:2023-11-30 02:24:48 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com