2009-06-28 186 views
2

我正在實施Java JTree面板。此面板包含樹狀結構的樹狀結構,樹狀結構是樹狀結構(複合材料列表 - 不同類別的列表)。我根據我定義的一組接口從外部jar實現中獲得這些數據結構。如何在節點對象的狀態更改時動態更改JTree視圖?

treenodes包含一個複選框,用戶可以檢查以指示被檢查節點和所有子節點將變爲「活動」,也就是說,由節點表示的對象應該執行某些操作,例如從一個數據庫。

也可以在不激活它們的情況下選擇treenodes,也就是說,沒有檢查複選框。

最重要的是,程序的其他部分也可以切換數據模型對象的激活狀態。所以構建樹模型的數據模型就是激活狀態的來源。這必須通過動態地(取消)選中複選框來反映在樹視圖中。

現在,我該如何實現這個整體?誰應該聽取哪些更改?

我現在已經將所有在節點中的類從包含激活字段的抽象類擴展而來。這是真正的數據源。當此字段更改時,應通知所有訂閱的偵聽器(EventListener),其中包括複選框。

我也有一個TreeSelectionModel,它基於默認的TreeSelectionModel,但擴展了功能來檢查是否需要檢查孩子/父母。

我的問題也許不是很清楚,但這段複雜的代碼也是如此。希望你能幫助。

回答

2

你似乎有一堆活動部件。通過您的TreeModel匯入所有更改可能會很好,並且讓您的JTree成爲收聽者,因爲它會自動進行。如果你的TreeModelDefaultTreeModel的一個子類,你會得到一個fire*fireTableStructureChanged,fireTreeNodesChanged等)的方法,它會提醒你的JTree重繪。確保你在AWT EventQueue中執行了這個事件。

here is a good tutorial加載使用Tree s的示例負載。

1

查看jide組件。它包括一個checkboxtree也:

alt text

1

這聽起來像你對我有個好主意 - 使節點的典型來源爲「激活」的知識,並觸發事件的正規來源。然後你可以讓TreeModel收聽,並將這些事件翻譯成fireTreeNodesChanged()等,這應該會導致JTree自動更新自己。

爲了避免麻煩,嘗試保持節點 - >樹事件關係的一種方式 - 也就是說,不要使用該樹作爲控制器,也不要讓樹事件更改激活狀態。