1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

JTree - Eigene Icons

Dieses Thema im Forum "Java" wurde erstellt von ExtremeSnail, 2. Mai 2006.

  1. ExtremeSnail

    ExtremeSnail Erfahrenes Mitglied

    Hallo,

    ich hab mal wieder ein Problem mit dem JTree. Wie kann ich es anstellen, dass ich eigen Icons verwende, anstatt die von Java vorgegebenen? Ausserdem möchte ich die Icons nicht nur nach Ordner und Blatt auseinanderhalten, sondern nach einem Kriterium, das ich in meiner eigenen Node-Klasse festgelegt habe.

    Kann mir da jemand helfen?

    Ausserdem weiß jemand wie man die Java eigenen Bilder bekommen kann? Also z.B. das Ordnersymbol des JTrees...

    Für Hilfe wäre ich sehr dankbar
  2. illaX

    illaX Erfahrenes Mitglied

    Stichwort Renderer, aber wahrscheinlich kennst du den schon. Mehr Erfahrung habe ich dort auch nicht. Habe nur einmal die Systemicons benutzt.
  3. ExtremeSnail

    ExtremeSnail Erfahrenes Mitglied

    Gehört hab ich von Renderern schon und mich auch ein bisschen versucht, bekomme da aber nichts anständiges zustande :-(

    Hat da vielleicht jemand ein Beispiel?
  4. Thomas Darimont

    Thomas Darimont Administrator

  5. ExtremeSnail

    ExtremeSnail Erfahrenes Mitglied

    Danke für den Link, aber der brintg mich leider nicht viel weiter, da ich auch bei den Leafs noch die Grafiken unterscheiden möchte. Also als letzter Eintrag eines Astes einmal "Auto" und in einem anderen Ast ein letzter Eintrag "Buch" und es sollen nicht beide das LeafIcon haben sondern beide unterschiedliche Icons.

    So stelle ich mir das ungefähr vor:

    Code (Text):
    1. tree.setCellRenderer(new DefaultTreeCellRenderer(){
    2.             public void setLeafIcon(Icon arg0) {
    3.                 if(((MyTreeNode)[COLOR="Red"]aktuellesNode[/COLOR]).[COLOR="Blue"]isCategory() [/COLOR]== true){
    4.                     super.setLeafIcon(new ImageIcon("folder.gif"));
    5.                 }
    6.                 else{
    7.                     super.setLeafIcon(new ImageIcon("details.gif"));
    8.                 }
    9.             }
    10.         });
    Wo der rote Text (aktuellesNode) der Node sein soll, der gerade gezeichnet wird und der blaue Text (isCategory) ist eine Methode meiner MyTreeNode Klasse, die einen Boolean zurückliefert.

    Ist mein Problem soweit verständlich?
  6. javaprogger1987

    javaprogger1987 Erfahrenes Mitglied

    Also ich würde das so lösen:
    Code (Java):
    1. /**
    2.  * <p>Überschrift: Ein TreeRenderer mit variablen Leaf-Icons</p>
    3.  *
    4.  * <p>Beschreibung: </p>
    5.  *
    6.  * <p>Copyright: Copyright (c) 2005</p>
    7.  *
    8.  * <p>Organisation: None</p>
    9.  *
    10.  * @author Tobias Viehweger
    11.  * @version 1.0
    12.  */
    13.  
    14. import javax.swing.*;
    15. import javax.swing.tree.*;
    16. import java.awt.Component;
    17.  
    18. public class IconTreeRenderer extends DefaultTreeCellRenderer
    19. {
    20.   private boolean isCategory = false;
    21.   private Icon leafCategoryIcon = new ImageIcon( "folder.gif" );
    22.   private Icon leadIcon = new ImageIcon("details.gif");
    23.  
    24.   public IconTreeRenderer()
    25.   {
    26.    
    27.     super();
    28.   }
    29.  
    30.   public Icon getLeafIcon()
    31.   {
    32.     if ( isCategory )
    33.       return leafIconCategory;
    34.     else
    35.       return leafIcon;
    36.   }
    37.  
    38.   public Component getTreeCellRendererComponent( JTree tree, Object value,
    39.                                                  boolean sel,
    40.                                                  boolean expanded,
    41.                                                  boolean leaf, int row,
    42.                                                  boolean hasFocus ) {
    43.     String stringValue = tree.convertValueToText( value, sel,
    44.                                                   expanded, leaf, row, hasFocus );
    45.    
    46.     if (value instanceof (MyTreeNode)) //Sollte immer erfuellt sein
    47.       isCategory = ((MyTreeNode) value).isCategory();
    48.    
    49.     this.hasFocus = hasFocus;
    50.     setText( stringValue );
    51.     if ( sel )
    52.       setForeground( getTextSelectionColor() );
    53.     else
    54.       setForeground( getTextNonSelectionColor() );
    55.     // There needs to be a way to specify disabled icons.
    56.     if ( !tree.isEnabled() ) {
    57.       setEnabled( false );
    58.       if ( leaf ) {
    59.         setDisabledIcon( getLeafIcon() );
    60.       }
    61.       else if ( expanded ) {
    62.         setDisabledIcon( getOpenIcon() );
    63.       }
    64.       else {
    65.         setDisabledIcon( getClosedIcon() );
    66.       }
    67.     }
    68.     else {
    69.       setEnabled( true );
    70.       if ( leaf ) {
    71.         setIcon( getLeafIcon() );
    72.       }
    73.       else if ( expanded ) {
    74.         setIcon( getOpenIcon() );
    75.       }
    76.       else {
    77.         setIcon( getClosedIcon() );
    78.       }
    79.     }
    80.     setComponentOrientation( tree.getComponentOrientation() );
    81.  
    82.     selected = sel;
    83.  
    84.     return this;
    85.   }
    86.  
    87. }
    88.  
    Erklärung:
    Ich hab einfach erstmal eine neue Klasse angelegt, ich find das zu unübersichtlich, wenn man das alles in den Methoden Aufruf reinschreibt.. Deinen Code änderst du also in:
    Code (Java):
    1. tree.setCellRenderer(new IconTreeRenderer());
    Die Methode getTreeCellRendererComponent ist eigentlich komplett aus dem DefaultRenderer übernommen, nur der Teil
    Code (Java):
    1.     if (value instanceof (MyTreeNode)) //Sollte immer erfuellt sein
    2.       isCategory = ((MyTreeNode) value).isCategory();
    ist ergänzt, er sorgt dafür, das getLeafIcon() weiß welches Icon genommen werden soll..

    Ist vermutlich eher die Q'nD-Lösung, vllt weiß Tom noch was :)
    Gruß
    Tobias
  7. Thomas Darimont

    Thomas Darimont Administrator

    Hallo!

    Ich haette das ungefaehr so gemacht:
    Code (Java):
    1.  
    2.         DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
    3.             final ImageIcon CAR_ICON = new ImageIcon("c:/car.jpg");
    4.             final ImageIcon MOTOBIKE_ICON = new ImageIcon("c:/motobike.jpg");
    5.             public Component getTreeCellRendererComponent(JTree tree,
    6.                     Object value, boolean sel, boolean expanded, boolean leaf,
    7.                     int row, boolean hasFocus) {
    8.                 DefaultMutableTreeNode currentTreeNode = (DefaultMutableTreeNode) value;
    9.                 TreeEntry userObject = (TreeEntry) currentTreeNode
    10.                         .getUserObject();
    11.                 if (Vehicle.CAR.equals(userObject.getCategory())) {
    12.                     setLeafIcon(CAR_ICON);
    13.                 } else if (Vehicle.MOTO_BIKE.equals(userObject.getCategory())) {
    14.                     setLeafIcon(MOTOBIKE_ICON);
    15.                 }
    16.                 return super.getTreeCellRendererComponent(tree, value, sel,
    17.                         expanded, leaf, row, hasFocus);
    18.             }
    19.         };
    20.         tree.setCellRenderer(renderer);
    21.  
    Gruss Tom
  8. javaprogger1987

    javaprogger1987 Erfahrenes Mitglied

    Okay.. du lässt den restlichen Methodenrupf weg :D
    Das ist natrürlich eleganter - geht bei mir aber auch ;)
    Nur warum castet du value erst in einen DefaultMutableTreeNode wenn du das anschließend nur als TreeEntry brauchst?
  9. incertus

    incertus Grünschnabel

    Hallo,

    ich bin grade zufällig drüber gestolpert per Google und es hat mich mit ein paar Änderungen weitergebracht :)
    Diese waren leider nötig, da ich (und Netbeans) mit dem TreeEntry nichts anfangen konnten...
    Trotzdem vielen Dank an Tom.

    Code (Text):
    1.  
    2.        private final ImageIcon BELEG_ICON = new ImageIcon("beleg.png");
    3.        private final ImageIcon REISE_ICON = new ImageIcon("reise.png");
    4.        tree = new JTree();
    5.         DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
    6.             @Override
    7.             public Component getTreeCellRendererComponent(JTree tree,
    8.                     Object value, boolean sel, boolean expanded, boolean leaf,
    9.                     int row, boolean hasFocus) {
    10.                 DefaultMutableTreeNode currentTreeNode = (DefaultMutableTreeNode) value;
    11.                 Object userObject = (Object) currentTreeNode.getUserObject();
    12.                 if (userObject.getClass() == Beleg.class) {
    13.                     setLeafIcon(BELEG_ICON);
    14.                 } else if (userObject.getClass() == Reise.class) {
    15.                     setLeafIcon(REISE_ICON);
    16.                     setClosedIcon(REISE_ICON);
    17.                     setOpenIcon(REISE_ICON);
    18.                 }
    19.                 return super.getTreeCellRendererComponent(tree, value, sel,
    20.                         expanded, leaf, row, hasFocus);
    21.             }
    22.         };
    23.         tree.setCellRenderer(renderer);
    24.  
    25.  

Diese Seite empfehlen