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

JTable setting a default editor for a custom class

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

提供的默认类型

我的 table 设置中有以下代码:

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);

布尔类型按预期工作,我可以单击复选框并打开和关闭它。字符串类型显示但不允许我编辑。在我的模型中,我拥有它,以便所有列 return 对 editable 为真。

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

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

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

我的问题:为什么设置默认编辑器对字符串 class 不起作用但对布尔值 class 起作用?为什么我必须在模型中的 getColumnClass 方法中有一个特例?

假设你扩展DefaultTableModel,注意getColumnClass(),继承自AbstractTableModel, "returns Object.class regardless of columnIndex." As noted hereObject "is rendered by a label that displays the object's string value."没有默认编辑器Object。特别是,"To specify more precise column types, the table model must define the getColumnClass() method appropriately."

我弄清楚了为什么它会按照我最初描述的方式运行。当我查看 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 通过方法的原因是因为 JTable 中的 GenericEditor(涵盖 String class)具有方法 getTableCellEditorComponent 创建一个 java.lang.reflect.Constructor 对象,用于实例化此列中允许的对象的新实例。 MyString 列 class 有一个采用 String 的构造函数,因此它 returned 一个新的 MyString 列实例到 setValueAt 方法。当我将 getColumnClass 中的代码(如上所示)更改为 return String.class 时,编辑停止时会创建一个新的 String 实例并将其传递给 setValueAt 方法,因此在单元格中正确移动。

通过这个问题确实学到了很多关于 JTables 的知识。