JTable为自定义类设置默认编辑器

时间:2015-04-29 09:44:55

标签: java swing jtable tablecelleditor

我在尝试为自定义类设置默认的JTable单元格编辑器时遇到问题。我有几个自定义列(数字,字符串和布尔值)。对于数字类型,我使用自己的单元格编辑器,对于布尔和字符串类型,我只想使用JTable类提供的默认类型。

我在表格的设置中有以下代码:

JTable table;
....
table.setDefaultEditor(MyBoolean.class, table.getDefaultEditor(Boolean.class));
table.setDefaultRenderer(MyBoolean.class, table.getDefaultRenderer(Boolean.class));
table.setDefaultEditor(MyString.class, table.getDefaultEditor(String.class);
table.setDefaultRenderer(MyString.class, table.getDefaultRenderer(String.class);

布尔类型按预期工作,我可以点击复选框并让它打开和关闭。字符串类型显示但不允许我编辑。在我的模型中,我拥有它以便所有列都返回true以进行编辑。

如果我将以下内容添加到我的模型中:

@Override
public Class<?> getColumnClass(int columnIndex){
    Class<?> clz = columns.get(columnIndex).getClass();
    if(clz.isAssignableFrom(MyString.class)){
        return String.class;
    }
    return clz;
}

我现在可以按预期编辑字符串了。

我的问题:为什么设置默认编辑器不适用于字符串类,但适用于布尔类?为什么我必须在模型中的getColumnClass方法中有特殊情况?

2 个答案:

答案 0 :(得分:1)

假设您要延长DefaultTableModel,请注意getColumnClass(),继承自AbstractTableModel,&#34;无论Object.class如何,都会返回columnIndex。&# 34;如上所述hereObject&#34;由标签显示,该标签显示对象的字符串值。&#34; Object没有默认编辑器。特别是,&#34;要指定更精确的列类型,表模型必须适当地定义getColumnClass()方法。&#34;

答案 1 :(得分:1)

我弄清楚为什么它的表现方式与我原先描述的方式相同。当我查看setValueAt方法时,它终于点击了:

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
   rows.get(rowIndex).getValues().set(columnIndex, aValue);
   fireTableCellUpdated(rowIndex, columnIndex);
}

并注意到ObjectMyString的一个实例,单元格中的结果来自Object.toString()

MyString来到该方法的原因是因为GenericEditor(涵盖JTable类)中的String具有创建的方法getTableCellEditorComponent一个java.lang.reflect.Constructor对象,用于实例化此列中允许的对象的新实例。 MyString列类的构造函数带有String,因此它向MyString方法返回了一个新的setValueAt列实例。当我更改getColumnClass中的代码(如上所示)以返回String.class时,在编辑停止并将其传递给String时创建了setValueAt的新实例方法,因此在细胞中正确移位。

对于这个问题肯定学到了很多关于JTables的知识。