2009-06-19 36 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); 

这使模型直接了解。在我的情况下,这很好。

现在,如何将其中的一个标记为答案!?!