首页 > 解决方案 > 运行时生成节点的 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的节点下,但在两个不同的路径中找到水果

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

标签: javajtree

解决方案


然后,您应该考虑提供自己的树模型

引用 JTree 的 Oracle教程

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

鉴于 OP 的评论:DefaultMutableTreeNode不支持“名称”。这意味着:您需要自己实现它,以一种超级简单的方法,可能像:

class MyTreeNode extends DefaultMutableTreeNode {
   private final String name;

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

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


推荐阅读