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的节点下,但在两个不同的路径中找到水果
root -> aaa -> bbb -> ccc -> fruit
root -> aaa -> fff -> ggg -> hhh -> fruit
解决方案
然后,您应该考虑提供自己的树模型。
引用 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)按名称识别/查找节点。
推荐阅读
- .net-core - 是什么导致了我的 DbUpdateConcurrencyException?
- javascript - JS Math setinterval 一个范围内的随机数
- reactjs - 如何在使用 npx 创建 React 应用程序时解决错误
- angular - 在 Angular NGRX Effect 中链接两个 API 调用
- node.js - 如何在shell脚本文件中执行nodejs文件
- javascript - I keep getting the error: TypeError Cannot read property 'getContext' of null and can't figure out why
- python - 尝试用石榴绘制 HMM 时出现 Errno 13
- python - 如何匹配从一个字符开始并以相同字符结束但不包括匹配中的最后一个字符的模式?
- python - 根据列值创建行
- arrays - Angular 10 - 数组上的链式承诺不计算所有属性