2012-07-08 55 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

相關問題