2011-01-09 8 views
8

Sto cercando di cambiare le diverse icone del mio JTree (Swing)Change Jtree icone dei nodi a seconda del livello di profondità

La documentazione java spiega come cambiare le icone se un nodo è una foglia o no, ma questo è davvero non quello che sto cercando.

Per me non importa se un nodo è una foglia o, voglio solo cambiare le icone se il nodo è nel primo/secondo/terzo livello di profondità dei tre.

risposta

5

Implementare un'abitudine TreeCellRenderer - utilizzare un JLabel per il componente e impostare l'icona come si preferisce utilizzando i dati dell'oggetto archiviato nella struttura. Potrebbe essere necessario per avvolgere l'oggetto per memorizzare la sua profondità, ecc se l'oggetto è primitivo (String, ad esempio)

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

+0

Bello grazie, è esattamente quello che voglio. – Soulou

8

In alternativa a un costume TreeCellRenderer, è possibile sostituire le impostazioni predefinite UI per collapsedIcon e 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 è semplicemente un'implementazione dell'interfaccia 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

Ehi, grazie per quel trashgod - mi ha aiutato molto. – hamo

Problemi correlati