JTree具有在运行时生成的节点

时间:2018-08-14 13:09:49

标签: java jtree

我的程序基于输入数据构建一棵树。在运行程序之前,无法知道应创建多少个节点以及节点的位置(在哪个父节点下)。

如果我们事先知道结构,那么使用JTree可以轻松添加节点

例如

//create the root node
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
/create the child nodes
DefaultMutableTreeNode vegetableNode = new DefaultMutableTreeNode("Vegetables");
vegetableNode.add(new DefaultMutableTreeNode("Capsicum"));
vegetableNode.add(new DefaultMutableTreeNode("Carrot"));
vegetableNode.add(new DefaultMutableTreeNode("Tomato"));
vegetableNode.add(new DefaultMutableTreeNode("Potato"));
root.add(vegetableNode);

但是,一旦指定了根节点,我的树便会逐步构建。因此,我希望JTree随时在特定父级下添加一个节点。

请注意,该树还将在递归方法中构建。这意味着应在此方法之外创建主JTree对象。

树可能有不止一层,这意味着从节点到叶的路径可能需要例如10跳。

在运行时向节点JTree添加一个仅了解其父节点的最佳方法是什么?

这里需要说明的是,两个不同的父母有相同的名字,例如如果节点 apple 应该位于名为 fruit 的节点下,但在两个不同的路径中找到了 fruit

root -> aaa -> bbb -> ccc -> fruit
root -> aaa -> fff -> ggg -> hhh -> fruit

1 个答案:

答案 0 :(得分:2)

那么您应该考虑提供自己的树模型

使用Oracle tutorial替代JTree:

  

您可以延迟加载Tree子级的一种方法是利用TreeWillExpandListener接口。例如,您可以声明并加载Tree的根,祖父母和父级以及应用程序,如以下代码所示:

OP提供的注释:DefaultMutableTreeNode不支持“名称”。那意味着:您需要以一种非常简单的方法自己实现,可能像这样:

class MyTreeNode extends DefaultMutableTreeNode {
   private final String name;

   MyTreeNode(String name, ... whatever ) {
     ...
     SOME_NODE_REGISTRY.put(name, this);
   }

然后,您需要提供该注册表,可能作为某种单例地图实例。换句话说:您必须编写代码,以使A)可以按名称存储节点,然后B)可以按名称标识/查找节点。