2010-07-08 36 views
1

我一直在尋找JTree和TreeCellRenderer。一般來說,應用程序(只有一個JTree)只有一個TreeCellRenderer實例。應用程序對TreeCellRenderer的getTreeCellRendererComponent方法進行多次調用,以決定每個TreeCell的繪製方式,並且這種調用在很多場合(當一個單元格被選中,取消選擇,移動,滾動時等)進行。他們爲什麼決定這樣做,而不是有多個TreeCellRenderer實例,每個實例都負責一個單元格?Design for TreeCellRenderer

我正在嘗試使每個單元格包含一個複選框的JTree。該複選框可以被用戶選中/取消選中。然後,根據這些複選框的狀態設置TreeNode userObject的值。但是,從目前的JTree設計來看,這是不可能的 - 因爲只有一個JCheckBox實例,並且僅用於顯示Cell的外觀(您無法真正檢查它)。從某種意義上說,我想分開選擇TreeCell和檢查框。我有一些解決方法(實現MouseAdapter並檢查鼠標單擊是否靠近複選框的位置,然後通過更改它在TreeCellRenderer中的出現來模擬對該框的檢查),但仍然想知道這是否可以做得更直接。謝謝!

回答

2

他們爲什麼決定這樣做,而不是有多個TreeCellRenderer實例,每個實例都負責一個單元?

這是flyweight pattern的一個很好的例子。

對於複選框樹,我喜歡org.netbeans.swing.outline.Outline,提到here,但其他examples可用。

附錄:更緊密地讀你的問題,你問:

在某種意義上我想分開TreeCell的選擇和箱子的檢查。

這是正確的本能:數據(選中還是未選中)應被存儲在模型(TreeModel)而不是視圖(JCheckBox)。相應地,example在其(隱式)模型中使用CheckBoxNode的實例。

+0

我之前研究過這個例子。這並不是我想要的:只要選中了一個節點,他們就會選中該框,但我只想在鼠標單擊複選框時選中該框,而不是在鼠標單擊單元格時選中。順便說一句,這個例子有一個錯誤。在mouseClicked方法中,實際上需要調用tree.revalidate();即使行不是0.否則一些兒童細胞將不會在DIG_IN模式下更新。 我會看看Outline對象。謝謝。 – Raymond 2010-07-08 17:04:36

+0

@雷蒙德:不客氣。 – trashgod 2010-07-08 18:05:15

+0

嗯..看來netbeans包不是標準java的一部分,這是真的嗎?如果我的程序使用這些,那麼使用該代碼的任何人都需要安裝netbeans呢? – Raymond 2010-07-09 04:16:08