簡體   English   中英

Java Swing JTree擴展

[英]Java Swing JTree Expansion

此方法按預期方式工作-它創建一個帶有根節點和兩個子容器節點(每個都有各自的葉節點)的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);

但是當我從上面的代碼中取消注釋時,第二組子節點不會顯示,即:Project 2和Version 2不顯示。 實際上,所有隨后添加的節點都不會出現。

對於它的價值,我正在使用JDK 1.5。 從文檔中,我似乎看不到任何限制,或者為什么這種方法會產生不良影響……我將嘗試查看源代碼,但是希望有人可能對這有什么想法和原因有所了解是預期的行為。 我想知道每個后續節點“添加”是否都因某種原因而被禁止-但我無法想象對於大多數運行時用例都可以。

謝謝,

-Luther

不幸的是,Swing通常是“有幫助的”。 在這種情況下,它將根據所提供的數據為您創建模型,與如果您提供VectorJList會創建模型幾乎相同。

JTree和幫凶(主要是Pluggable Look&Feel)會將偵聽器添加到模型中,以隨時通知更新。 如果僅更改(隱式)模型背后的數據,則除了偶然之外不會更新任何內容。

因此,您應該做的是明確創建一個模型。 當模型數據更改時(當然,始終在EDT上),將引發相關事件。

如果將節點添加到已經擴展的節點,則需要重新加載模型

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

要么

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

如果您只想重新加載一棵大樹的一小部分,則第二個版本更有用。

啊...模特兒。

您的答案在這里這里 ....甚至在這里都有詳細闡述。

我最終做了類似的事情:

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

使模型直接了解情況。 就我而言,這很好。

現在,如何將其中之一標記為答案!?!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM