2015-04-01 105 views
1

你好我一直在使用javax swing,並且遇到了一個奇怪的問題,讓我質疑。 I例如:Javax Swing JTable :: getModel vs JTable :: getColumnModel

JTable table = new JTable(); 
// Indeed, 2 different objects: 
// The TableModel (which, i think is supposed to contain rows and columns? 
DefaultTableModel dtm = (DefaultTableModel) table.getModel(); 
// And the column model, supposed to define the columns of a table? 
TableColumnModel tcm = table.getColumnModel(); 

// I can add columns to my table in two different manners 
dtm.addColumn("A Column"); 
// or 
TableColumn column = new TableColumn(); 
column.setHeaderValue("Another column"); 
column.setWidth(120); 
column.setMinWidth(120); 
column.setMaxWidth(120); 
tcm.addColumn(column); 
// And notice that both commands will add a column in the table 
// So our table model should now have 2 columns. 

// But does it? 
System.out.println(dtm.getColumnCount()); // outputs 1; 
System.out.println(tcm.getColumnCount()); // outputs 2; 
System.out.println(table.getColumnCount()); // outputs 2; 

// The visual shows 2 columns, but the model has only 1. 

,從我可以告訴JTable使用的TableColumnModel和TableColumnModel中得到的所有列添加到TableModel的,但是,當我添加到TableModel的它被添加到表中的列,但tableModel仍然過時。

現在,問題是:通過columnModel添加一個列是非常有趣的,因爲我可以在那裏定義大小,佈局和可編輯選項,但是這樣我就不能從tableModel向它添加任何數據,因爲該列不會出現在tableModel上。 對此有何想法?

+0

發佈無效代碼示例對任何浪費時間閱讀您的問題的人來說都是一種侮辱。 您不聲明或初始化變量「列」,最重要的一個。 – 2015-04-01 14:36:51

+0

@LorenzoGatti我做了,我只是拼寫錯誤的Ctrl + V'ng一個片段的聲明。固定順便說一句。 – Felype 2015-04-01 14:38:14

+0

這是這個[SO張貼]的副本(http://stackoverflow.com/questions/3696112/tablemodel-vs-columnmodel-who-owns-the-column-value) – hfontanez 2015-04-01 15:22:05

回答

3

TableModel用於包含數據。數據可以按行/列訪問。

JTable使用TableColumnModel來控制數據的View。這就是它控制在JTable中顯示的列。您也可以對列進行重新排序,以不同的順序顯示數據。

...但這種方式我不能將任何數據從TableModel的添加到它,因爲該列不上的TableModel

這是正確的出現。 TableColumnModel的目的是簡單地定製視圖,而不是操縱數據。

也許你有一個包含許多列數據的應用程序,但對特定列的訪問受「安全級別」限制。在這種情況下,數據總是存儲在TableModel中,但您需要更改視圖以控制哪些列數據可見。所以你可以從TableColumnModel中刪除/添加列。

向TableModel添加列時,JTable會收到通知,併爲您重新創建所有TableColumns。這可能是好事或壞事,因爲當重新創建TableColumnModel時,會丟失可能已添加到TableColumn的任何自定義渲染器和編輯器。您可以防止這種情況發生購買使用:

table.setAutoCreateColumnsFromModel(false); 

現在的TableColumnModel將不會被更新,這是你的責任,手動創建和TableColumn中添加的TableColumnModel。

但一般而言,您:

  1. 通過TableModel的添加/更改數據。
  2. 通過TableColumnModel更改視圖。
+0

清楚,謝謝 – Felype 2015-04-01 15:28:43