2

我有自己的TableModel实现,旨在显示数据库中的SQL数据。我已经覆盖了所有必要的方法,对列名使用字符串数组,对可以从数据库中检索的所有不同类型arraylist<Object[]>使用数据和数组。Class<?>[]我还有一个布尔数组,它指示哪些列是可编辑的,哪些是不可编辑的。在我将表中的所有内容都存储为一个对象并且还没有实现类型部分并且它运行良好之前。现在我已将类型添加到模型中,我无法编辑任何 int 类型的列,即使该列在我的布尔数组中是可编辑的。我已经覆盖了isEditable()方法简单地从该布尔数组返回值,并在相关的 into 列上返回 true - 但它仍然不可编辑。这是定义行为还是有问题?恐怕我目前无法发布代码,因为我正在使用手机,我的笔记本电脑目前没有互联网连接,并且要到本周末才能发布。我已经搜索过,但谷歌只显示了很多关于使单元格可编辑或不可编辑的问题,而不是为什么你不能编辑 int 列。编辑:这是一个显示我的问题的 pastebin:http: //pastebin.com/cYJnyyqy

使用jdk7并且只有字符串列是可编辑的,即使isEditable()所有列都返回 true。

4

2 回答 2

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;
    }
于 2012-07-08T16:28:49.037 回答
3

唔。我从未将原始类型(例如int.class)用于 getColumnClass()。我一直使用“包装”类型,例如Integer.class.

尝试更改您 Class<?>[] types以使用包装类而不是原语。例如

 Class<?>[] types = {
            String.class,
            Character.class,
            Integer.class,
            ...

这可能需要 Swing 找到正确的 Renderer/TableCellEditor。但我不确定...

于 2012-07-08T15:48:48.770 回答