2012-11-07 250 views
1

我正在研究一個需要使用樹型數據結構的項目。在做了一些研究後,我發現Java JTree對我的項目非常有用,但是我偶然發現了一個問題,我花了一週的時間修復,但無濟於事。如何動態填充JTree?

問題出在這裏,爲了創建一個新的節點,一個DefaultMutableTreeNode必須被實例化,我不確定在一個循環中如何做到這一點。通常情況下,當我們想創建JTree的一個新節點,我們會首先以下列方式申報的節點:

DefaultMutableTreeNode parent = new DefaultMutableTreeNode("This is parent node."); 
DefaultMutableTreeNode child = new DefaultMutableTreeNode("This is child node."); 

然後,爲了添加/鏈路子節點父節點,我們將做到以下幾點:

parent.add(child); 

我有包含父節點和子節點的兩個的ArrayLists,它們彼此對應在父 - 子關係,這意味着arraylistParent.get(X)將總是arraylistChild.get的父(X )。

我的想法是通過使用for循環,我可以這樣做:

for (int x = 0; x < arraylistParent.size(); x++){ 
    parent.add(new DefaultMutableTreeNode(arraylistChild.get(x))); 
} 

這隻能在一個平面層次結構樹,這顯然是不適合我的情況下工作。我將在arrayListParent中有不同的父節點,我需要在添加子節點之前進行檢查,但再次,並非所有子節點都具有相同的單個父節點。我的ArrayList可能包含這樣的事:

arraylistParent = [root, p1, p2, p2, p3, p1] 
arraylistChild = [p1, p2, p5, p3, p4, p5] 

,我想生成樹狀結構是這樣的:

root 
    ..p1 
    ..p2 
     ..p5   
     ..p3 
     ..p4 
    ..p5 

很顯然,我可以拋出一些,如果內循環,以檢查是否parent.getUserObject()與arraylistParent.get(x)相同,但只有匹配字符串「This is parent node」的字符將被檢查並添加。

如果在循環中找到不同的,不存在的父代,則需要創建新的父代,這是棘手的部分,我不知道如何解決,因爲我不知道如何獲得循環自動爲子節點創建一個新的父實例。

+0

這樣的功課氣味 - 如果是這樣,請標記爲 – tucuxi

+0

對不起,這裏很新,不知道我必須標記它作爲家庭作業,但是,是的,這是一個學期的項目。 –

+1

@tucuxi'家庭作業'標籤現已正式棄用。見http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated。我會從這個問題中刪除它,但請不要推薦使用它。 – Caltor

回答

2

讓我們假設你的節點數據是字符串(也就是說,你的ArrayLists的內容是字符串)。不過,該解釋將適用於任何其他Java對象。我們將這些內容稱爲「節點」,與「樹節點」不同。

您可以創建一個HashMap<String, DefautMutableTreeNode> m,以便m.get(node)將返回相應的TreeNode

現在,你必須遍歷父母的數組列表。在每個位置,你都會有一個父母和一個孩子。在地圖上查找它們。如果父節點TreeNode不存在,您將首先創建它。如果子TreeNode不存在,則同樣適用。您應該確保在創建任何TreeNodes後更新地圖。最後,你會將孩子標記爲父母的孩子。

在該算法的末尾,您應該查看子數組中的所有節點。沒有父母的人是根。這是你的樹的根。

+0

非常感謝您的時間並回答@tucuxi。我很瞭解整個事情是如何完成的。但是,問題是我如何處理循環中的多個父節點創建?如果我需要創建一個新的父項,我需要給它一個變量名,以便我可以執行variableName.add(child),這意味着每個不同的父項必須具有不同的變量名才能完成parent.add(child ),因爲變量名是JTree中的標識符,應該鏈接到子節點。 –