2010-02-14 62 views
1

我正在嘗試爲我的JTable創建自己的自定義TableModel(因爲我想將JCheckBox的一行合併到我的表中)。 JScrollPane也是如此。在我試圖合併JCheckBox和自定義AbstractTableModel之前,如果我使用默認(Object [] [],Object [])構造函數,則JTable將顯示正常。我在Sun的JTable教程中讀到,那些構造函數使用默認方式將所有數據視爲字符串。獲取帶有自定義表模型的JTable以顯示在JScrollPane中

然後我創建我的自定義AbstractTableModel上,並從這個去:

JTable table = new JTable(dataArray, col); 

這樣:

JTable table = new JTable(); 

我假定這將呼叫嘗試與定製類創建的JTable它擴展了AbstractTableModel,但現在沒有在JScrollPane中顯示出來。

我用錯了嗎?我幾乎從Sun教程拷貝了代碼,只改變了涉及的數據文件的名稱。我也把這個方法放在同一個類中。有沒有其他方法來確保您的表格是使用您的自定義表格模型創建的?任何見解將不勝感激。

回答

1

JTable有幾個構造函數以TableModel作爲參數。那是你在找什麼?從您提供的代碼片段看來,您似乎在調用默認構造函數,並期望它以某種方式使用您的自定義表模型。 (也許有一些代碼丟失了嗎?)。如果使用默認構造函數,JTable將在內部創建一個DefaultTableModel實例並使用它。

編輯: 評論不採取代碼非常好,所以在這裏加入:要獲得使用模型中的表,你會做這樣的事情:

MyTableModel model = new MyTableModel(); 
// ...initialise model if required 
JTable table = new JTable(model); 
+0

我想這就是我所困惑的。 Sun網頁上的JTable信息指出: 有兩個直接接受數據的JTable構造函數(SimpleTableDemo使用第一個): JTable(Object [] [] rowData,Object [] columnNames) JTable(Vector rowData, Vector columnNames) 然後它聲明: 這些構造函數的優點是它們易於使用。但是,這些構造函數也有缺點: 它們將所有數據類型視爲相同(如字符串)。 – MarcZero 2010-02-14 01:37:24

+0

所以閱讀,我的印象是,我必須創建一個擴展AbstractTableModel的自定義類,並且不知何故,我創建的表將使用它而不是默認的構造函數。如果我使用JTable(Object [] [],Object [])構造函數,它將每個單元格視爲字符串,因此我「假設」調用沒有構造函數的方法:JTable()將使用我創建的自定義單元格,但我的屏幕現在是空白的。我可以回到默認的構造函數,它顯示得很好,但我似乎無法讓它使用我的自定義表模型。 – MarcZero 2010-02-14 01:37:44

+0

@MarcZero:查看我答案中的編輯。 (如果沒有意義,可能會發布一些更多的代碼,我覺得這種感覺可能會在你想要做的事情中錯過某些東西......) – Ash 2010-02-14 02:02:43

0

確定。在審查我的代碼後,我意識到,如果我遺漏了任何構造函數,它將不會找到到自定義表模型的鏈接。所以,如果你創建的類:

class MyTableModel extends AbstractTableModel { 
//code here 
} 

你需要初始化它在JTable構造是這樣的:

JTable table = new JTable(new MyTableModel()); 

所以你不能讓它空白,並期望它能夠「找到」新AbstractTableModel類。

1

正如您所觀察到的,Ash在構造函數JTable中傳遞您的數據模型是正確的。如果您的模型的getColumnClass()返回Boolean.class,您將看到一個複選框呈現器by default。您可能會喜歡這個使用自定義渲染器和編輯器的example

0

您需要擴展AbstractTableModel,並將其作爲JTable構造函數的參數傳遞。 (正如Marc所做的那樣)。除了所需的方法之外,還需要定義此方法以顯示實際的複選框:

public Class getColumnClass(int c) { 
     return getValueAt(0, c).getClass(); 
    } 

這會告訴您如何呈現每個單元格。如果你不重寫這個,它只會顯示爲一個字符串。

相關問題