我有自己的TableModel
实现,旨在显示来自SQL
数据库的数据。我已经覆盖了所有必要的方法,使用字符串数组作为列名,arraylist<Object[]>
表示数据,Class<?>[]
数组表示可以从数据库中检索的所有不同类型。我还有一个布尔数组,指示哪些列是可编辑的,哪些不是。在我将表中的所有内容存储为Object并且尚未实现类型部分并且它运行良好之前。既然我已经将类型添加到模型中,我就无法编辑int类型的任何列,即使该列在我的布尔数组中是可编辑的。我已经覆盖了isEditable()
方法,只是从该布尔数组中返回值,并且在有问题的into列中返回true - 但它仍然是不可编辑的。这是定义行为还是有问题?我担心我现在无法发布代码,因为我在手机上,我的笔记本电脑目前没有互联网连接,直到本周结束。我已经搜索过但Google只显示了很多关于使单元格可编辑或不可编辑的问题,而不是为什么你不能编辑int列。
编辑:这是一个显示我的问题的pastebin:http://pastebin.com/cYJnyyqy
使用jdk7
并且只有字符串列是可编辑的,即使isEditable()
对所有列都返回true。
答案 0 :(得分:3)
嗯。我从来没有将原始类型(例如int.class
)用于getColumnClass()。我一直使用“包裹”类型,例如Integer.class
。
尝试更改Class<?>[] types
以使用包装类而不是基元。 e.g。
Class<?>[] types = {
String.class,
Character.class,
Integer.class,
...
Swing可能需要这样才能找到正确的Renderer / TableCellEditor。但我不确定......
答案 1 :(得分:3)
回答后续问题
- 为什么char仍然不可编辑
Reason是默认的通用编辑器:它只能处理具有将String作为参数的构造函数的类,而Character不会。出路是Character类的特定自定义编辑器。
这是JTable.GenericEditor抛出的地方:
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column) {
this.value = null;
((JComponent)getComponent()).setBorder(new LineBorder(Color.black));
try {
Class<?> type = table.getColumnClass(column);
// Since our obligation is to produce a value which is
// assignable for the required type it is OK to use the
// String constructor for columns which are declared
// to contain Objects. A String is an Object.
if (type == Object.class) {
type = String.class;
}
// JW: following line fails
constructor = type.getConstructor(argTypes);
}
catch (Exception e) {
// JW: so the editor returns a null
return null;
}
return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}
这是JTable处理null的地方:
// JTable.editCellAt(...)
TableCellEditor editor = getCellEditor(row, column);
if (editor != null && editor.isCellEditable(e)) {
editorComp = prepareEditor(editor, row, column);
if (editorComp == null) {
// JW: back out if the comp is null
removeEditor();
return false;
}