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。