2011-01-09 21 views
8

Busco cambiar los diferentes iconos de mi JTree (Swing)iconos de nodo Cambio JTree de acuerdo con el nivel de profundidad

La documentación de Java se explica cómo cambiar los iconos si un nodo es una hoja o no, pero eso es realmente no es lo que estoy buscando.

Para mí no importa si un nodo es una hoja o, solo quiero cambiar los iconos si el nodo está en el primer/segundo/tercer nivel de profundidad de los tres.

Respuesta

5

Implemente un TreeCellRenderer personalizado: utilice un JLabel para el componente y establezca su icono como prefiera utilizando los datos del Objeto almacenado en el árbol. Es posible que necesite para envolver el objeto de almacenar su profundidad, etc. si el objeto es primitivo (String, por ejemplo)

http://download.oracle.com/javase/7/docs/api/javax/swing/tree/TreeCellRenderer.html http://www.java2s.com/Code/Java/Swing-JFC/TreeCellRenderer.htm

+0

Gracias, es exactamente lo que quiero. – Soulou

8

Como alternativa a una costumbre TreeCellRenderer, puede reemplazar los valores por defecto para la interfaz de usuario collapsedIcon y expandedIcon:

Icon expanded = new TreeIcon(true, Color.red); 
Icon collapsed = new TreeIcon(false, Color.blue); 
UIManager.put("Tree.collapsedIcon", collapsed); 
UIManager.put("Tree.expandedIcon", expanded); 

TreeIcon es simplemente una implementación de la interfaz de Icon:

class TreeIcon implements Icon { 

    private static final int SIZE = 14; 
    private boolean expanded; 
    private Color color; 

    public TreeIcon(boolean expanded, Color color) { 
     this.expanded = expanded; 
     this.color = color; 
    } 

    //@Override 
    public void paintIcon(Component c, Graphics g, int x, int y) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setPaint(color); 
     if (expanded) { 
      g2d.fillOval(x + SIZE/4, y, SIZE/2, SIZE); 
     } else { 
      g2d.fillOval(x, y + SIZE/4, SIZE, SIZE/2); 
     } 
    } 

    //@Override 
    public int getIconWidth() { 
     return SIZE; 
    } 

    //@Override 
    public int getIconHeight() { 
     return SIZE; 
    } 
} 
+1

Oye, gracias por ese trashgod - solo me ayudó mucho. – hamo

Cuestiones relacionadas