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 here,Object
"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);
}
并注意到 Object
是 MyString
的一个实例,单元格中的结果来自 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 的知识。
我在尝试为自定义 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 here,Object
"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);
}
并注意到 Object
是 MyString
的一个实例,单元格中的结果来自 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 的知识。