Wie lassen sich eigene Icons für einen JTree erstellen?

Durch Erweitern eines DefaultTreeCellRenderer ist es möglich, eigene Icons für die Anzeige eines Datenbaumes zu definieren.

Das Beispiel definiert einen einfachen JFrame, der als einzige Komponente einen JTree enthält. Die Routinen zum Erstellen und Hinzufügen des Baumes enthält die MethodeinitTree(). Hier wird zuerst ein Wurzelknoten deklariert, dem zwei Blätter hinzugefügt werden. Der Inhalt des Baumes wird durch ein Model vom Typ DefaultTreemodel verwaltet, das durch Übergabe des Wurzelknotens an den Konstruktor gebildet wird. Mit diesem wird schließlich der eigentliche Baum erstellt.
Der JTree erhält nun einen TreeCellRenderer, der für die Definition der Baum-Icons zuständig ist. Die Klasse erweitert DefaultTreeCellRenderer und erhält außer dem Konstruktor nur eine Methode zum Laden der Icon-Dateien. Mit deren Hilfe werden drei Felder initialisiert (openIcon, closedIcon und leafIcon), die von der Elternklasse zur Verfügung gestellt werden. Den Rest erledigt der Renderer von selbst.

import java.awt.GridLayout;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

public class CustomTreeIcons extends JFrame {

    public CustomTreeIcons(){
        this.setLayout(new GridLayout(1,1));
        initTree();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 300);
        this.setLocationRelativeTo(null);
        this.setTitle("Custom Tree Icons");
        this.setVisible(true);
    }
    
    private void initTree(){
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        root.add(new DefaultMutableTreeNode("Blatt 1"));
        root.add(new DefaultMutableTreeNode("Blatt 2"));
        DefaultTreeModel model = new DefaultTreeModel(root);
        JTree tree = new JTree(model);
        tree.setCellRenderer(new MyCellRenderer());
        this.add(tree);
    }
    
    public static void main(String[] args) {
        new CustomTreeIcons();

    }
}

class MyCellRenderer extends DefaultTreeCellRenderer {
    
    public MyCellRenderer(){
        openIcon = createImageIcon("img/open.png");
        closedIcon = createImageIcon("img/closed.png");
        leafIcon = createImageIcon("img/leaf.png");
    }
    
    protected ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = getClass().getClassLoader().getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        }
        System.err.println(path + " nicht gefunden!");
        return null;
    }
}