# JList + ListCellRenderer



## Bud (27. Jun 2012)

Hallo Leute,

um die Elemente einer JList zu verändern, muss man einen eigenen ListCellRenderer programmieren.

Hier ist ein gutes Beispiel:

http://www.java-forum.org/awt-swing-swt/17329-jlist-listcellrenderer.html

Insgesamt habe ich den Code noch nicht vollständig verstanden. Aber vielleicht könnt ihr mir die folgende Frage beantworten:

Das in dem Beispiel erzeugte JList entspricht nicht dem default-JList. Wenn ich die identlischen Listenelemente eintrage, ist das default-JList im Vergleich zu dem Programmierbeispiel kleiner. 

Wenn ich den ListCellRenderer deaktiviere, hat die JLIst wieder die gwünschten Maße. 

Was muss ich machen, um die JList aus dem Beispiel grafisch an die default-Jlist anpassen will?

Gruß,
B


----------



## bERt0r (27. Jun 2012)

Wie bitte!?!?!
Ein ListCellRenderer verändert das Aussehen (und nur das Aussehen) der Listenelemente.
Was soll ein default-JList sein? Es geht mir jetzt nicht ums "ein", vielmehr verstehe ich nicht ob du mit default-JList auch wirklich eine stinknormale JList meinst.
Wenn du das Aussehen einer JList nicht an individuelle Bedürfnisse anpassen willst, brauchst du auch keinen ListCellRenderer...


----------



## KrokoDiehl (27. Jun 2012)

> Was muss ich machen, um die JList aus dem Beispiel grafisch an die default-Jlist anpassen will?



Prinzipiell gibt es zu den Renderern (und Editoren) auch Default-Implementierungen (z.B. DefaultListCellRenderer). Wenn man von denen erbt hat man grundsätzlich den Standard-Renderer und kann ihn anpassen. Das ist vom Verhalten er meistens besser als direkt das Interface zu implementieren weil man dann nicht alles selbst machen muss (Selektion, Fokussierung, Farben, ...).


----------



## Bud (27. Jun 2012)

Hallo! 

Ja, ich befürchte ich habe mein Vorhaben nicht gut genug erklärt:

Ich will eine JList mit verschiedenen Elementen anzeigen. In dieser JList soll der Benutzer auch die Möglichkeit haben die Elemente anzuwählen.Neben dieser ersten Jlist soll noch eine zweite angezeigt werden. In dieser soll der Benutzer aber nichts anwählen können. Diese zweite Jlist soll nur den Status der verschiedenen Elemente anzeigen.

Das Deaktivieren der Auswahl und das verändern des Aussehens der einzelnen Elemente kann ich nur mit einem eigenen ListCellRenderer machen. Ich habe es so wie in dem Link gemacht und es funktioniert.

Link: http://www.java-forum.org/awt-swing-swt/17329-jlist-listcellrenderer.html

Da aber beide Listen nebeneinander stehen, sollten auch die Abstände und Formatierungen übereinsteimmen. Das tun sie aber nicht. Schaut euch den Screenshot an. Die linke Liste ist die ganz normale JList (mit dem default Renderer) und die rechte mit dem eigenen Renderer.

Ich habe mich an diesem Code orientiert:


```
// Liste mit Dummy-Daten
    JList list = new JList(new String[]{"path_1", "path_2", "path_3", "path_4", "path_5", "path_6"});

    // Vector mit Pseudo-Vergleichs-Daten
    Vector<String> paths = new Vector<String>();
    paths.addElement( "path_2" );
    paths.addElement( "path_5" );
    
    // Render setzen
    list.setCellRenderer(new ColorListRender(paths));


 class ColorListRender extends JLabel implements ListCellRenderer {

     private Vector paths;
 
     public ColorListRender(Vector paths) {
         this.paths = paths;
         setOpaque(true);
     }
     
     private boolean shouldMark( String s ) {
        return paths.contains(s);
     }
     
     public Component getListCellRendererComponent(
         JList list,
         Object value,
         int index,
         boolean isSelected,
         boolean cellHasFocus)
     {
         // Dem Label den Text zuweisen
         setText(value.toString());
         // Background-Selektiert = rot ansonsten weiss
         setBackground(isSelected ? Color.red : Color.white);
         if ( shouldMark(value.toString( ))) {
             // Schriftart der zu markierende Sätze ist blau...
             setForeground( Color.blue );
         } else {
             // ... ansonsten schwarz
             setForeground(Color.black);
         }
         return this;
     }
 }
```


----------



## bERt0r (27. Jun 2012)

Wie gesagt, viel einfacher ist es den DefaultListCellRenderer zu verwenden. Was dich aber anscheinend stört ist die insgesamte Größe deiner JList und die hat nichts mit dem CellRenderer zu tun. Das hängt ausschließlich vom Layout ab, das du verwendest.
Ich hoffe mal du hantierst nicht mit null-Layout, also ohne Layout, herum.


----------



## Bud (27. Jun 2012)

Ja, ich Trottel! 

Danke, ich erbe jetzt von "DefaultListCellRenderer" und nicht mehr von "JLabel" - jetzt ist alles Super.

Merci!


----------

