2011-08-16 33 views
3

我一直在閱讀Swing教程「如何使用表」,雖然它已經爲JTable新手提供了非常豐富的內容,但我馬上就遇到了障礙,第二次嘗試偏離示例,我自己的。JTable瘋了嗎?

所以,如果你希望你的Swing應用程序有一個漂亮的,定製的桌子,看起來他們是你會在最起碼是工作的幾個核心類:

  • JTable中
  • 的TableModel
  • TableModelListener
  • TableModelEvent
  • 的TableColumnModel
  • TableColumnModelListener
  • TableColumnModelEvent
  1. 只需從閱讀教程和Javadoc,這不是明擺着給我的區別是什麼TableModel的TableColumnModel中,以及它們如何相互關聯之間。顯然,列模型僅適用於單列或所有列(?),而表模型更一般。 但是他們如何相互關聯?每個人都負責哪些責任領域? TableModel是否管理,控制或以某種方式包含TableColumnModel?

  2. 與第一個問題密切相關,我在哪個模型中指定了單元格編輯器和渲染器?

  3. 我認爲,對於這些對象中的每一個,我都應該繼承/實現它們,這樣我就可以爲我的項目定製它們。 這是普遍接受的方式定製表(JTable的「核心」類的子類),還是這些足夠強大的支持任何類型的表創建?

回答

2

通常情況下,你只是定義了一個TableModel的(通過繼承AbstractTableModel),並構建一個JTable實例與此表模型參數。

如果您在表格模型中正確執行getColumnClass()JTable將自動爲您的每個列選擇適當的渲染器。如果某些單元格是可編輯的(通過覆蓋表格模型中的isCellEditable()),則相應的單元格編輯器也將與列關聯。模型更改時,必須觸發事件(使用AbstractTableModel中的一個fireXxx方法)。當然,如果你的單元格中有特殊對象(即String,Boolean,Integer等之外的東西),那麼必須將渲染器關聯到列(以及編輯器,如果這些列中的單元格單元格是可編輯的)。這是通過在列模型的列上設置渲染器/編輯器來完成的。儘管如此,列模型是由JTable從表模型自動創建的。你通常不需要自己創建一個。

因此,要回答你的具體問題:

  1. TableModel的是用來裝JTable中顯示的數據。你必須自己實現它。 TableColumnModel由JTable自動創建,通常用於將渲染器和編輯器關聯到特定的列。
  2. 如果您需要第n列的特定渲染器,則會從JTable的列模型中獲取第n列,然後在此列上設置渲染器。
  3. 通常子類AbstractTableModel就足夠了。
+0

哇@JB尼澤 - 真棒答案!在它逃脫我之前的最後一個問題:我的單元格的類型(取決於表)將是JButtons或JComboBoxes ...所以我假設我將不得不實現我自己的TableCellRenderer,是的?那麼TableCellEditor呢?如果用戶必須單擊JButton或從JComboBox中進行選擇,那麼在技術上不會進行編輯?再次感謝這樣一個真棒迴應! – IAmYourFaja

+0

將按鈕或組合框作爲值有點奇怪,如果有很多行,則效率就不高。關於組合,數據應該是組合的選定值,而組合應該是該列的編輯器。關於按鈕,你應該解釋爲什麼你需要在桌子上放一個按鈕。通常的方法是選擇一行或多行,然後單擊表格外的按鈕以觸發所選行上的操作。 –

+0

Gotchya - 再次感謝! – IAmYourFaja