Java Swing JTree扩展

时间:2009-06-19 22:44:17

标签: 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);

但是当我从上面的代码中取消注释时,第二组子节点没有显示出来,即:Project 2和Version 2没有显示出来。事实上,所有随后添加的节点都不会出现。

为了它的价值,我正在使用JDK 1.5。从文档中,我似乎无法看到任何限制或为什么这种方法会产生这样的不良影响......我将尝试查看源代码,但希望有人可能知道这是什么以及为什么这样做是预期的行为。我想知道每个后续节点'add'是否以某种方式被禁止 - 但我无法想象它是否适用于大多数运行时用例。

谢谢,

-Luther

3 个答案:

答案 0 :(得分:2)

不幸的是,Swing经常“乐于助人”。在这种情况下,它会根据提供的数据为您创建模型,就像JList创建模型一样,如果您提供了Vector

JTree和同谋(主要是Pluggable Look& Feel)会将监听器添加到模型中以随时了解更新。如果你只是改变(隐式)模型背后的数据,那么除了偶然之外什么也不会得到更新。

所以,你应该做的是明确地创建一个模型。当模型数据发生变化时(当然,总是在EDT上),会导致相关事件被触发。

答案 1 :(得分:1)

如果将节点添加到已展开的节点,则需要reload the model

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

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

如果您只想重新加载一棵大树的一小部分,这个second version会更有用。

答案 2 :(得分:0)

啊......模特。

您的答案详细阐述了herehere ....甚至here

我最终做了类似的事情:

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

直接通知模型。在我的情况下,这可以很好地扩展。

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