ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
9733
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    ExtremeSnail ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Hamburg
    Beiträge
    157
    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. #2
    illaX ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Konstanz
    Beiträge
    268
    Stichwort Renderer, aber wahrscheinlich kennst du den schon. Mehr Erfahrung habe ich dort auch nicht. Habe nur einmal die Systemicons benutzt.
     
    MfG
    illaX

  3. #3
    ExtremeSnail ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Hamburg
    Beiträge
    157
    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. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    10.222
     
    Du kommst aus dem Saarland oder Umgebung? Du hast Interesse an Java-Technologie Themen? Then let's Meetup!

    Java rocks! http://www.jugsaar.de

    Does IT in Java and .Net
    Xing
    Twitter

  5. #5
    ExtremeSnail ist offline Mitglied Gold
    Registriert seit
    Nov 2003
    Ort
    Hamburg
    Beiträge
    157
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    tree.setCellRenderer(new DefaultTreeCellRenderer(){
                public void setLeafIcon(Icon arg0) {
                    if(((MyTreeNode)[COLOR="Red"]aktuellesNode[/COLOR]).[COLOR="Blue"]isCategory() [/COLOR]== true){
                        super.setLeafIcon(new ImageIcon("folder.gif"));
                    }
                    else{
                        super.setLeafIcon(new ImageIcon("details.gif"));
                    }
                }
            });

    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. #6
    javaprogger1987 ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    284
    Also ich würde das so lösen:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    
    /**
     * <p>Überschrift: Ein TreeRenderer mit variablen Leaf-Icons</p>
     *
     * <p>Beschreibung: </p>
     *
     * <p>Copyright: Copyright (c) 2005</p>
     *
     * <p>Organisation: None</p>
     *
     * @author Tobias Viehweger
     * @version 1.0
     */
     
    import javax.swing.*;
    import javax.swing.tree.*;
    import java.awt.Component;
     
    public class IconTreeRenderer extends DefaultTreeCellRenderer
    {
      private boolean isCategory = false;
      private Icon leafCategoryIcon = new ImageIcon( "folder.gif" );
      private Icon leadIcon = new ImageIcon("details.gif");
      
      public IconTreeRenderer() 
      {
        
        super();
      }
      
      public Icon getLeafIcon() 
      {
        if ( isCategory )
          return leafIconCategory;
        else
          return leafIcon;
      }
      
      public Component getTreeCellRendererComponent( JTree tree, Object value,
                                                     boolean sel,
                                                     boolean expanded,
                                                     boolean leaf, int row,
                                                     boolean hasFocus ) {
        String stringValue = tree.convertValueToText( value, sel,
                                                      expanded, leaf, row, hasFocus );
        
        if (value instanceof (MyTreeNode)) //Sollte immer erfuellt sein
          isCategory = ((MyTreeNode) value).isCategory();
        
        this.hasFocus = hasFocus;
        setText( stringValue );
        if ( sel )
          setForeground( getTextSelectionColor() );
        else
          setForeground( getTextNonSelectionColor() );
        // There needs to be a way to specify disabled icons.
        if ( !tree.isEnabled() ) {
          setEnabled( false );
          if ( leaf ) {
            setDisabledIcon( getLeafIcon() );
          }
          else if ( expanded ) {
            setDisabledIcon( getOpenIcon() );
          }
          else {
            setDisabledIcon( getClosedIcon() );
          }
        }
        else {
          setEnabled( true );
          if ( leaf ) {
            setIcon( getLeafIcon() );
          }
          else if ( expanded ) {
            setIcon( getOpenIcon() );
          }
          else {
            setIcon( getClosedIcon() );
          }
        }
        setComponentOrientation( tree.getComponentOrientation() );
     
        selected = sel;
     
        return this;
      }
     
    }

    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
    2
    
        if (value instanceof (MyTreeNode)) //Sollte immer erfuellt sein
          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. #7
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    10.222
    Hallo!

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

    Gruss Tom
     
    Du kommst aus dem Saarland oder Umgebung? Du hast Interesse an Java-Technologie Themen? Then let's Meetup!

    Java rocks! http://www.jugsaar.de

    Does IT in Java and .Net
    Xing
    Twitter

  8. #8
    javaprogger1987 ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    284
    Okay.. du lässt den restlichen Methodenrupf weg
    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. #9
    incertus ist offline Grünschnabel
    Registriert seit
    Apr 2011
    Beiträge
    1
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
           private final ImageIcon BELEG_ICON = new ImageIcon("beleg.png");
           private final ImageIcon REISE_ICON = new ImageIcon("reise.png");
           tree = new JTree();
            DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
                @Override
                public Component getTreeCellRendererComponent(JTree tree,
                        Object value, boolean sel, boolean expanded, boolean leaf,
                        int row, boolean hasFocus) {
                    DefaultMutableTreeNode currentTreeNode = (DefaultMutableTreeNode) value;
                    Object userObject = (Object) currentTreeNode.getUserObject();
                    if (userObject.getClass() == Beleg.class) {
                        setLeafIcon(BELEG_ICON);
                    } else if (userObject.getClass() == Reise.class) {
                        setLeafIcon(REISE_ICON);
                        setClosedIcon(REISE_ICON);
                        setOpenIcon(REISE_ICON);
                    }
                    return super.getTreeCellRendererComponent(tree, value, sel,
                            expanded, leaf, row, hasFocus);
                }
            };
            tree.setCellRenderer(renderer);
     

Thema nicht erledigt

Ähnliche Themen

  1. Eigene Icons für Dateityp
    Von Jellysheep im Forum Vektor-Programme
    Antworten: 11
    Letzter Beitrag: 30.12.09, 11:46
  2. Eigene UI laden+3d Icons einstellen
    Von Jan-Frederik Stieler im Forum 3D Studio Max
    Antworten: 1
    Letzter Beitrag: 22.12.07, 08:52
  3. Icons für eigene Programme mit Lazarus
    Von DeChecka im Forum Delphi, Kylix, Pascal
    Antworten: 0
    Letzter Beitrag: 04.07.07, 20:51
  4. JTree und eigene Objekte
    Von Lasix im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 15.04.05, 07:17
  5. Eigene Icons verwenden in Steuerelement
    Von markus-heinisch im Forum .NET Archiv
    Antworten: 9
    Letzter Beitrag: 14.05.04, 09:09