JTree: Knoten-Item Desaster!

Flex IV

Mitglied
Liebe Java Fangemeinde,

ich komm ja von Delphi und mir hats jetzt echt die Sprache versghlagen beim Versuch den Knoten im JTree Icons zuzuweisen, weil ich es unglaublich kompliziert und von hinten durch die Brust ins Auge finde.
Was ist die Aufgabe: in einem JTree abhängig von der Knotenebene ein Icon setzen (unabhänging vom Zustand ob selekiert/aufgeklappt/...)

In Delphi hab ich also eine Image-Liste zum Tree geheftet und konnte dann (beim Aufbau des Trees) jedem Knoten ein Icon (bzw. dessen Index in der Image-Liste) zuweisen:

Code:
nNode.ImageIndex := ElementTable[i].level;

und das wars. Ich zähle hier genau eine Zeile.

Nach einem halben Tag Recherche (ausgehend von http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html)
bin ich nun zu folgendem Java-Ergebnis gekommen:
Java:
	...
	jSelTree = new JTree();
	jSelTree.setModel (buildTreeModel());
	jSelTree.setCellRenderer(new MyRenderer());
	...

	private TreeModel buildTreeModel()
	{
		DefaultMutableTreeNode root;
		DefaultMutableTreeNode child;
		DefaultMutableTreeNode subchild;
		
	//	root = new DefaultMutableTreeNode("Root");
	//	geht nicht so einfach, weil ich den level brauche!!
		root = new DefaultMutableTreeNode(new MyNode (0,"Root"));
		child = new DefaultMutableTreeNode(new MyNode (1,"Child 1"));

		subchild = new DefaultMutableTreeNode(new MyNode (2,"Subchild 1.1"));
		child.add(subchild);
		subchild = new DefaultMutableTreeNode(new MyNode (2,"Subchild 1.2"));
		child.add(subchild);
		root.add(child);
		
		child = new DefaultMutableTreeNode(new MyNode (1,"Child 2"));
		subchild = new DefaultMutableTreeNode(new MyNode (2,"Subchild 2.1"));
		child.add(subchild);
		root.add(child);
		
		jSelTree.setModel(new DefaultTreeModel(root));

        return new DefaultTreeModel(root);
    }
	private class MyNode {
		protected int level;
		protected String nName;
		
		public MyNode (int lev, String name) {
			level = lev;
			nName = name;
		}
		public String toString () {
			return nName;
		}
		public int nLevel () {
			return level;
		}
	}

    private class MyRenderer extends DefaultTreeCellRenderer {
 		private static final long serialVersionUID = 1L;
 		Icon[] Icons = new ImageIcon[4];

        public MyRenderer() {
            Icons[0] = new ImageIcon(getClass().getResource("res/world.png"));
            Icons[1] = new ImageIcon(getClass().getResource("res/b1.png"));
            Icons[2] = new ImageIcon(getClass().getResource("res/index.png"));
            Icons[3] = new ImageIcon(getClass().getResource("res/tri_R.png"));
        }

        public Component getTreeCellRendererComponent(
                            JTree tree,
                            Object value,
                            boolean sel,
                            boolean expanded,
                            boolean leaf,
                            int row,
                            boolean hasFocus) {

            super.getTreeCellRendererComponent(
                            tree, value, sel,
                            expanded, leaf, row,
                            hasFocus);
        	DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
        	Object obj = node.getUserObject();
        	setText(obj.toString());
        	MyNode nodeobj = (MyNode)obj;
        	setIcon(Icons[nodeobj.level]);
 
            return this;
        }

    }

Und das ist ja erst der Anfang, denn wenn ein knoten ausgewählt wird, brauche ich den Knoten-level ja auch wieder, und den liefert mir der default-Listener ja wohl auch nicht (vermute ich jetzt schonmal...)

ich bin echt sprachlos, wenn das in Java nicht einfacher geht, schmeiss ich glaub ich hin.
Irgendwelche Vorschläge?
 
Das Level bekommst du über das Event, brauchst du also nicht mitführen

TreeSelectionEvent.getNewLeadSelectionPath().getPathCount()
 
Zurück