2013-12-19 10 views
7

Ich möchte für jeden Knoten in meinem JTree ein anderes Icon setzen, eigentlich lade ich jeden Knoten aus einer Datenbank, mit einem "while" setze ich jedes Icon wie eine Wurzel, Blatt oder Elternteil. Wie folgt aus:Setze ein Icon auf jeden Knoten in Jtree

Alle meine Erklärungen sind global:

private ResultSet myResultSet; 
protected DefaultTreeModel treeModel; 
private DefaultMutableTreeNode rootNode,childNode,parent1,parent2; 

Und dies ist der Code, wo ich meine Knoten gesetzt:

myResultSet=rtnNodes(); /*Method that returns a RS with my nodes*/ 
while(myResultSet.next()){ 
    switch(myResultSet.getInt(1)){ /*The first column is the type of node: root, parent, leaf...*/ 
    case 0: treeModel = new DefaultTreeModel((rootNode=new DefaultMutableTreeNode(myResultSet.getString(2)))); break; /*root node*/ 
    case 1: case 4: parent1 = parent2 = makeNode(rootNode); break; /*parent node*/ 
    case 2: makeNode(parent2); break; /*leaf node*/ 
    case 3: parent2 = makeNode(parent1); break; /*sub patern node*/ 
    } /*makeNode is the method where I create the nodes*/ 
} 

Verfahren makeNode ist dies:

public DefaultMutableTreeNode makeNode(DefaultMutableTreeNode parent){ 
    //The second column in the RS is the name of the node 
    treeModel.insertNodeInto((childNode=new DefaultMutableTreeNode(myResultSet.getString(2))),parent,parent.getChildCount()); 
    return childNode; 
} 

Nachdem ich das Treemodel mit meinen Knoten gefüllt habe, setze ich das Modell auf meinen JTree:

myJTree.setModel(treeModel); 
myJTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 

Aber das Problem ist. wenn ich versuche, die Symbole zu setzen. Ich erstelle eine Unterklasse namens myTreeRenderer, und ich verwende diese:

myJTree.setCellRenderer(new treeRenderer()); 

Aber es stellt nicht die Symbole, wie ich will, ist die Unterklasse:

private ImageIcon root,parent,leaf; 

public myTreeRenderer() { 
    root=setIcons(2); /*setIcons is a method that I dont publish in this post, that helps me to set the path of the icons*/ 
    parent=setIcons(3); 
    leaf=setIcons(4); 
} 

@Override 
public Component getTreeCellRendererComponent(JTree tree,Object value,boolean selected,boolean expanded,boolean leaf,int row,boolean hasFocus){    
    super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus); 
    DefaultMutableTreeNode nodo = (DefaultMutableTreeNode)value; 
    TreeNode t = nodo.getParent(); 
    if(t!=null){ 
     setIcon(root); 
    } 
    return this; 
} 

Wie ich das Symbol für jeden Satz kann Knoten ohne seinen Namen zu verwenden? Der Code der Unterklasse setzt alle Knoten mit demselben Symbol, und jedes Mal, wenn ich im jtree einen Knoten auswähle, läuft die getTreeCellRendererComponent, das will ich nicht.

Antwort

15

Sie können Standard-UI-Werte für die Symbole von JTree Knoten ohne benutzerdefinierten Renderer ändern:

URL resource = logaff.class.getResource(IMAGE); 
Icon icon = new ImageIcon(resource); 

UIManager.put("Tree.closedIcon", icon); 
UIManager.put("Tree.openIcon", icon); 
UIManager.put("Tree.leafIcon", icon); 

oder so etwas wie nächstes verwenden:

@Override 
public Component getTreeCellRendererComponent(JTree tree, 
    Object value, boolean selected, boolean expanded, 
    boolean leaf, int row, boolean hasFocus) { 
     super.getTreeCellRendererComponent(tree, value, selected,expanded, leaf, row, hasFocus); 
     DefaultMutableTreeNode nodo = (DefaultMutableTreeNode) value; 
     if (tree.getModel().getRoot().equals(nodo)) { 
      setIcon(root); 
     } else if (nodo.getChildCount() > 0) { 
      setIcon(parent); 
     } else { 
      setIcon(leaf); 
     } 
     return this; 
} 

auch über rendering mechanism lesen.

+0

WOW! Ich habe zwei Wochen lang eine solche Antwort gesucht, ein Freund und ich haben viel gelesen und die ganze Zeit waren wir verwirrt. Zur einfachen Ansicht ist der Code perfekt, ich werde ihn testen und später erzählen, wie es funktioniert. Vielen Dank für Ihre Hilfe !!! – Vlad

+0

Ja! Es funktioniert perfekt !!! Danke noch einmal!!! – Vlad

1

Sie können es verwenden, einen kürzeren Weg. "Baum" ist meine JTree-Komponente.

DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer(); 
Icon closedIcon = new ImageIcon("closed.png"); 
Icon openIcon = new ImageIcon("open.png"); 
Icon leafIcon = new ImageIcon("leaf.png"); 
renderer.setClosedIcon(closedIcon); 
renderer.setOpenIcon(openIcon); 
renderer.setLeafIcon(leafIcon);  
Verwandte Themen