2009-06-19 65 views
1

此方法效果如預期 - 它產生具有一個根節點和兩個子容器節點(每個具有各自的葉節點),一個JTree:的Java Swing JTree的擴展

private JComponent createSideBar() 
{ 
    final DefaultMutableTreeNode top = new DefaultMutableTreeNode("Projects"); 
    final JTree tree = new JTree(top); 

    DefaultMutableTreeNode project = new DefaultMutableTreeNode("project 1"); 
    DefaultMutableTreeNode version = new DefaultMutableTreeNode("version 1"); 
    project.add(version); 
    top.add(project); 
    TreePath treePath = new TreePath(project.getPath()); 
    // tree.expandPath(treePath); 

    project = new DefaultMutableTreeNode("project 2"); 
    version = new DefaultMutableTreeNode("version 2"); 
    project.add(version); 
    top.add(project); 

    return tree; 
} 

在這種情況下,樹開始關閉。我想先從完全展開的所有節點的應用程序,所以我開始通過增加以下內容:

tree.expandPath(treePath); 

,但是當我從上面的代碼中取消註釋它,第二組的子節點不顯示即:項目2和版本2不顯示。事實上,所有隨後添加的節點都不會顯示出來。

對於它的價值,我使用的是JDK 1.5。從文檔中,我似乎看不到任何限制或爲什麼這種方法會產生這樣的不良影響......我將嘗試着看源代碼,但希望有人可能有一個好主意,是預期的行爲。我想知道是否每個後續節點「添加」以某種方式被禁止 - 但我無法想象會適用於大多數運行時用例。

感謝,

-Luther

回答

2

不幸的是,Swing通常是「有用的」。在這種情況下,它會根據提供的數據爲您創建一個模型,如果您提供Vector,則與JList將創建一個模型相同。

JTree和同謀(主要是Pluggable Look &感覺)將向模型添加偵聽器以便隨時瞭解更新。如果你只是改變(隱式)模型後面的數據,除了偶然的事情之外,沒有什麼會被更新。

所以,你應該做的是明確地創建一個模型。當模型數據發生變化(當然總是在EDT上),導致相關事件被解僱。

+0

+1,我不知道。 – 2009-06-20 04:21:34

1

如果節點添加到已經被擴大的一個節點,你需要reload the model

((DefaultTreeModel)tree.getModel()).reload(); 

((DefaultTreeModel)tree.getModel()).reload(top); 

此,如果你想重裝只有一個大的樹的一小部分second version是比較有用的。

0

啊...模型。

您的回答詳述了一下herehere ....甚至here

最後我做這樣的事情:

DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); 
model.insertNodeInto(newNode, parent, index); 

這使模型直接瞭解。在我的情況下,這很好。

現在,如何將其中的一個標記爲答案!?!