JTree脱离Hashmap

时间:2017-01-24 13:22:31

标签: java jtree

我有一个名为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的路径,密钥是产品。 我用:

迭代Map
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向我展示了每一个&#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

1 个答案:

答案 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。