JTree脱离Hashmap
JTree out of Hashmap
我有一个名为 treefile 的 (Hash)Map,其示例内容为:
treefile.put("Adhesive Tapes", "Mechanical Components|Mechanical Incidentals|Fastening Elements");
treefile.put("Bayonet Fitting, Snap Locks, Spring Locks", "Mechanical Components|Mechanical Incidentals|Fastening Elements");
treefile的值是JTree的路径,key是产品。
我正在迭代地图:
for (Map.Entry<String, String> entry : file.entrySet()) {
String key = entry.getKey();
String values[] = entry.getValue().split("\|");
DefaultMutableTreeNode keyn = new DefaultMutableTreeNode(key);
for (String k : values) {
DefaultMutableTreeNode n = new DefaultMutableTreeNode(k);
keyn.add(n);
}
top.add(keyn);
}
DefaultMutableTreeNode top = new DefaultMutableTreeNode(firstn);
现在的问题是,JTree 将每个 "top.add(keyn)" 显示为一个新节点,而不是将其添加到现有节点中...
我该如何解决这个问题?因此,如果节点存在,则将其添加到此节点?
我想看到像这样的 JTree:
Root
|
Mechanical Components
|
Mechanical Incidentals
|
Product A
|
Product B
不像现在这样:
Root
|
Mechanical Components
|
Mechanical Incidentals
| |
| Product A
Mechanical Incidentals
|
Product B
不是盲目添加新节点,而是需要在添加叶节点时寻找匹配的祖先节点。
您的键代表叶节点,即不应有子节点的节点,因此您绝对不应该这样做 keyn.add(n)
。相反,您应该 根据需要 为拆分值表示的树路径创建节点。如果您希望能够将多个节点置于同一个父节点下,“按需”部分很重要。
for (Map.Entry<String, String> entry : file.entrySet()) {
String key = entry.getKey();
String values[] = entry.getValue().split("\|");
DefaultMutableTreeNode parent = top;
for (String k : values) {
DefaultMutableTreeNode n = null;
Enumeration<?> e = parent.children();
while (e.hasMoreElements()) {
n = (DefaultMutableTreeNode) e.nextElement();
if (k.equals(n.getUserObject())) {
// Existing node matches; use that one.
break;
}
n = null;
}
if (n == null) {
// No existing node matches; add it.
n = new DefaultMutableTreeNode(k);
parent.add(n);
}
parent = n;
}
DefaultMutableTreeNode keyn = new DefaultMutableTreeNode(key);
parent.add(keyn);
}
有更有效的方法可以做到这一点。例如,您可以创建自己的 TreeNode 实现,而不是依赖 DefaultMutableTreeNodes,它在内部使用 LinkedHashMap<String, TreeNode>
,这样您就可以更轻松地查找特定字符串的 TreeNode。
另外,请注意并非所有 Map 实现都保持一致的顺序。您的 Map<String, String>
应该是 SortedMap 或 LinkedHashMap。
我有一个名为 treefile 的 (Hash)Map,其示例内容为:
treefile.put("Adhesive Tapes", "Mechanical Components|Mechanical Incidentals|Fastening Elements");
treefile.put("Bayonet Fitting, Snap Locks, Spring Locks", "Mechanical Components|Mechanical Incidentals|Fastening Elements");
treefile的值是JTree的路径,key是产品。 我正在迭代地图:
for (Map.Entry<String, String> entry : file.entrySet()) {
String key = entry.getKey();
String values[] = entry.getValue().split("\|");
DefaultMutableTreeNode keyn = new DefaultMutableTreeNode(key);
for (String k : values) {
DefaultMutableTreeNode n = new DefaultMutableTreeNode(k);
keyn.add(n);
}
top.add(keyn);
}
DefaultMutableTreeNode top = new DefaultMutableTreeNode(firstn);
现在的问题是,JTree 将每个 "top.add(keyn)" 显示为一个新节点,而不是将其添加到现有节点中...
我该如何解决这个问题?因此,如果节点存在,则将其添加到此节点?
我想看到像这样的 JTree:
Root
|
Mechanical Components
|
Mechanical Incidentals
|
Product A
|
Product B
不像现在这样:
Root
|
Mechanical Components
|
Mechanical Incidentals
| |
| Product A
Mechanical Incidentals
|
Product B
不是盲目添加新节点,而是需要在添加叶节点时寻找匹配的祖先节点。
您的键代表叶节点,即不应有子节点的节点,因此您绝对不应该这样做 keyn.add(n)
。相反,您应该 根据需要 为拆分值表示的树路径创建节点。如果您希望能够将多个节点置于同一个父节点下,“按需”部分很重要。
for (Map.Entry<String, String> entry : file.entrySet()) {
String key = entry.getKey();
String values[] = entry.getValue().split("\|");
DefaultMutableTreeNode parent = top;
for (String k : values) {
DefaultMutableTreeNode n = null;
Enumeration<?> e = parent.children();
while (e.hasMoreElements()) {
n = (DefaultMutableTreeNode) e.nextElement();
if (k.equals(n.getUserObject())) {
// Existing node matches; use that one.
break;
}
n = null;
}
if (n == null) {
// No existing node matches; add it.
n = new DefaultMutableTreeNode(k);
parent.add(n);
}
parent = n;
}
DefaultMutableTreeNode keyn = new DefaultMutableTreeNode(key);
parent.add(keyn);
}
有更有效的方法可以做到这一点。例如,您可以创建自己的 TreeNode 实现,而不是依赖 DefaultMutableTreeNodes,它在内部使用 LinkedHashMap<String, TreeNode>
,这样您就可以更轻松地查找特定字符串的 TreeNode。
另外,请注意并非所有 Map 实现都保持一致的顺序。您的 Map<String, String>
应该是 SortedMap 或 LinkedHashMap。