我在尝试为自定义类设置默认的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方法中有特殊情况?
答案 0 :(得分:1)
假设您要延长DefaultTableModel
,请注意getColumnClass()
,继承自AbstractTableModel
,&#34;无论Object.class
如何,都会返回columnIndex
。&# 34;如上所述here,Object
&#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);
}
并注意到Object
是MyString
的一个实例,单元格中的结果来自Object.toString()
。
MyString
来到该方法的原因是因为GenericEditor
(涵盖JTable
类)中的String
具有创建的方法getTableCellEditorComponent
一个java.lang.reflect.Constructor
对象,用于实例化此列中允许的对象的新实例。 MyString
列类的构造函数带有String
,因此它向MyString
方法返回了一个新的setValueAt
列实例。当我更改getColumnClass
中的代码(如上所示)以返回String.class
时,在编辑停止并将其传递给String
时创建了setValueAt
的新实例方法,因此在细胞中正确移位。
对于这个问题肯定学到了很多关于JTables的知识。