此方法按预期工作 - 它创建一个带有根节点和两个子容器节点的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
答案 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)