我的程序基于输入数据构建一棵树。在运行程序之前,无法知道应创建多少个节点以及节点的位置(在哪个父节点下)。
如果我们事先知道结构,那么使用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
答案 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)可以按名称标识/查找节点。