当单元格类型不是String时,JTable中的单元格是不可编辑的?

时间:2012-07-08 14:09:44

标签: java swing jtable tablecellrenderer tablecelleditor

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

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

2 个答案:

答案 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;
    }