2017-01-24 11 views
0

У меня есть (Hash) Карта под названием treefile с содержанием образца:JTree из Hashmap

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 и ключ продукта. я итерация карте с:

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 
+0

В нижней части вашего вопроса, под затененными ключевыми прямоугольниками, есть ссылка «изменить». Пожалуйста, используйте это, чтобы обновить свой вопрос простым текстовым макетом того, что вы ожидаете от контента JTree. У меня есть предположение, но я бы предпочел не отвечать без четкого понимания того, что вы хотите. – VGR

ответ

0

Вместо того, чтобы слепо добавляющие новые узлы, вам нужно искать для узла сопоставления предка, как вы добавить узлы листа.

Ваши ключи представляют собой узлы листьев, то есть узлы, у которых не должно быть детей, поэтому вы определенно не должны делать keyn.add(n). Скорее, вы должны создать узлы по мере необходимости для пути дерева, представленного значением split. «Необходимая» часть важна, если вы хотите разместить несколько узлов под одним и тем же родителем.

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); 
} 

Есть более эффективные способы сделать это. Например, вместо того, чтобы полагаться на DefaultMutableTreeNodes, вы можете создать свою собственную реализацию TreeNode, которая внутренне использует LinkedHashMap<String, TreeNode>, что позволит вам легче искать TreeNode для конкретной строки.

Кроме того, имейте в виду, что не все реализации Карты поддерживают согласованный порядок. Ваш Map<String, String> должен быть SortedMap или LinkedHashMap.

+0

спасибо, ваше решение работало отлично, как ожидалось! Проблема в том, что эта карта происходит от другого класса/системы, и я не могу быть уверен, что она отсортирована ... Могу ли я сортировать карту заранее? – IVIike

+0

Да, довольно легко: «Карта sorted = new TreeMap <> (Collator.getInstance()); sorted.putAll (файл); ' – VGR