2012-07-08 28 views
2

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

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

+0

如果您确信isEditable返回true,你可能要检查的这个编辑器柱。 – mort 2012-07-08 14:16:42

+0

看到您的通知,但为了更好地帮助更快地发布[SSCCE](http://sscce.org/)展示您的问题与JTable – mKorbel 2012-07-08 14:18:32

+0

你是什么意思的“设置类型为int”? – kleopatra 2012-07-08 14:48:43

回答

3

嗯。我从来没有使用getColumnClass()的原始类型(例如int.class)。我一直使用“包装”类型,例如Integer.class

尝试更改Class<?>[] types以使用包装类代替原语。例如

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

+0

这让我编辑除char列之外的所有列。奇怪的。我会接受这个答案,但我很想知道a)为什么原语不起作用,以及b)为什么字符仍然不可编辑? – Logan 2012-07-08 15:54:24

+0

至少在Java 6中,JTable.createDefaultEditors()创建编辑器的HashMap,但是对于Number.class。 getDefaultEditor()将(最终)发现Number是Integer的超类,并使用适当的编辑器。但是int.class不匹配。可以说,这是Swing代码中的一个错误。还有另一个由自动装箱造成的怪异错误的例子。 – user949300 2012-07-08 17:34:36

3

回答后续问题

  • 为什么是char还是不可编辑

原因是默认的通用编辑器:它可以只处理具有以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中处理空值:

// 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; 
    } 
+0

这可能就是为什么它不喜欢原语,他们都没有使用字符串,或者他们甚至有构造函数? – Logan 2012-07-08 16:56:44

相关问题