# DefaultMutableTreeNode Icon



## Timmah (18. Dez 2005)

Wie kann man das Icon des Nodes setzen? 
Würde gerne für alle Elemente im meinem JTree ein eigenes Icon setzen...


----------



## math66 (19. Dez 2005)

so...eventuell:


```
// Retrieve the three icons
    Icon leafIcon = new ImageIcon("leaf.gif");
    Icon openIcon = new ImageIcon("open.gif");
    Icon closedIcon = new ImageIcon("closed.gif");
    
    // Create tree
    JTree tree = new JTree();
    
    // Update only one tree instance
    DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer();
    renderer.setLeafIcon(leafIcon);
    renderer.setClosedIcon(closedIcon);
    renderer.setOpenIcon(openIcon);
    
    // Remove the icons
    renderer.setLeafIcon(null);
    renderer.setClosedIcon(null);
    renderer.setOpenIcon(null);
    
    // Change defaults so that all new tree components will have new icons
    UIManager.put("Tree.leafIcon", leafIcon);
    UIManager.put("Tree.openIcon", openIcon);
    UIManager.put("Tree.closedIcon", closedIcon);
    
    // Create tree with new icons
    tree = new JTree();
```

hilft das?

gruß


----------



## Timmah (20. Dez 2005)

Okay, danke (wann denk ich endlich mal eigenständig an MVC  )

Das klappt zumindest schonmal soweit, dass jetzt die einzelnen "Arten" von Elementen im Tree ein unterschiedliches Icon haben, so wie es auch vorher vom Standard her war, nur eben nun meine eigenen Icons, was ja auch erstmal nicht schlecht ist.

Evtl. hast du ja auch noch ne Idee, wie ich dann für jedes Element ein eigenes Icon setzen kann


```
TREE <<< ein ICON
    MENU1 <<< ein anderes ICON
        A <<< ein anderes ICON
        B <<< ein anderes ICON
        C <<< ein anderes ICON
```


----------



## SamHotte (20. Dez 2005)

Indem du in einen eigenen TreeCellRenderer von DefaultTreeCellRenderer ableitest und dort die folgende Methode überschreibst (der String-Vergleich ist natürlich sehr langsam, du solltest bei vielen Typen evtl. einen int-Wert in deinen Knotentypen einbauen, dann kannst du statt der if..else-Konstrukte ein switch benutzen und der Baum zeichnet sich schneller):


```
public final Component getTreeCellRendererComponent (final JTree tree,
      final Object value, final boolean sel, final boolean expanded,
      final boolean leaf, final int row, final boolean hasfocus)
  {
    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row,
        hasfocus);
    // hier deinen Knotentyp einbauen
    if (value instanceof DefaultMutableTreeNode) {
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
      MeinObjekt obj = (MeinObjekt) node.getUserObject();
      // hier den Vergleich auf deinen Knotentyp, ich habs mal als String-Vergleich gebaut
      if (obj.getName.equals("TREE")) {
        this.setLeaf("Icon1");
      } else if (obj.getName.equals("MENU1")) {
        this.setLeaf("Icon2");
      } else if ... // beliebig viele weitere Typen
      } else {
        // default-Icon
        this.setLeaf("default");
      }
    }
    else {
      System.err.println("Falscher Typ: " + value.getClass().toString());
    }
    return this;
  }
```

Gib mal Bescheid, ob das geholfen hat!


----------



## flash0r (20. Dez 2005)

Ich glaube du suchst das:
http://www.codeguru.com/java/articles/187.shtml


----------



## Timmah (20. Dez 2005)

Jep, das suche ich 

Werde ich nachher mal ausprobieren zu Hause.


----------

