我有一个名为treefile的(哈希)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的路径,密钥是产品。 我用:
迭代Mapfor (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向我展示了每一个&#34; top.add(keyn)&#34;作为一个新节点,而不是将其添加到现有节点......
我该如何解决这个问题?那么,如果节点存在,那么它会添加到这个节点吗?
我希望看到JTree像:
Root
|
Mechanical Components
|
Mechanical Incidentals
|
Product A
|
Product B
而不喜欢它现在:
Root
|
Mechanical Components
|
Mechanical Incidentals
| |
| Product A
Mechanical Incidentals
|
Product B
答案 0 :(得分:0)
在添加叶节点时,您需要寻找匹配的祖先节点,而不是盲目添加新节点。
您的密钥代表叶节点,即应该没有子节点的节点,因此您绝对不应该执行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>
,这样您就可以更轻松地查找特定String的TreeNode。
另外,请注意并非所有Map实现都保持一致的顺序。您的Map<String, String>
应该是SortedMap或LinkedHashMap。