Image und Text in einer List anzeigen

Status
Nicht offen für weitere Antworten.

Paladin

Bekanntes Mitglied
Hi,

ich möchte gerne ein Image und einen Text in einer List anzeigen. Das soll praktisch so eine art
Userliste werden bei der immer zuerst ein Symbol steht und dahinter der Name.

Hat jemand ne Ahnung wie das geht?

Gruß

Paladin
 

Andre1002

Mitglied
Hallo,

Du schreibst einen eigenen CellRenderer, der mit
Code:
setCellRenderer(new MyListCellRenderer())
in Deiner Liste gesetzt wird.
Ein CellRenderer könnte etwa so aussehen:

Code:
public class MyListCellRenderer extends JCheckBox implements ListCellRenderer{
    public Component getListCellRendererComponent(JList list,
                  Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
           //je nach Selektion die Farbe setzen
      setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
      setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
      try{
        MyObjekt obj = (MyObjekt)value;    //MyObjekt ist der Container für einen User in Deinem Fall
        setText(obj.getName());              //der Text der in der Liste angezeigt werden soll
        Icon i = obj.getIcon();             //das zu setzende Icon...
        this.setIcon(i);                //...wird hier gesetzt
      }
      catch(Exception ex){
        ex.printStackTrace();
      }
      setFont(list.getFont());
      setBorder(UIManager.getBorder("List.focusCellHighlightBorder"));

      return this;
    }
}

probier mal ob's funktioniert...

Andre1002
 

Paladin

Bekanntes Mitglied
Hi Andre,

das klappt sehr gut mit dem CellRenderer solange man nicht für verschiedene User
verschiedene Icons/Texte benutzen möchte.
Hast du eine Ahnung wie man je nach User ein anderes Logo/einen anderen Text setzen kann?


Gruß

Paladin
 

Andre1002

Mitglied
Hallo Paladin,

wenn Du Deiner Liste immer wieder pro Userzeile eine neue Instanz deines Objektes addierst und dieses Objekt ein spezielles Icon erhält, dann wird vor jede auch immer das richtige Icon gezeichnet.

Ich hoffe dass ich Dich richtig verstanden habe...

Andre1002
 

Paladin

Bekanntes Mitglied
Hi Andre,

das leuchtet mir ein nur ich weiss nicht was für ein Objekt ausser dem Vektor
Text und ein Bild aufnehmen kann.

Mit einem Vektor klappt das schonmal nicht weil die JList einen Vektor nur per .setListData(Vektor) akzeptiert und mit diesem Befehl werden alle anderen Einträge gelöscht.
JList.add(Vektor) ist soweit ich weiss nicht möglich (jedenfalls meckert eclipse wenn ich das machen will).

Kannst du mir vielleicht ein kurzes Beispiel geben wie man der JList mittels einem Object Zeilen hinzufügt?

Gruß

Paladin
 

Andre1002

Mitglied
Hallo Paladin,

erstelle Dir doch einfach ein Objekt was Text und Bild aufnehmen kann:

Code:
public class MyObject {
    private Icon icon = null;
    private String text = "";
    
    public void setIcon(Icon aIcon){
      icon = aIcon;
    }
    public Icon getIcon(){
      return icon;
    }
    public void setText(String aText){
      text = aText;
    }
    public String getText(){
      return text;
    }
    public String toString(){
      return text;
    }
}

Die Instanzen des Objektes addierst Du dann Deiner Liste. Ob Du dann mit JList.setListData(Object[]) oder ob Du Deine Objekte in einem Vector sammelst oder mit einem DefaultListModel arbeitest dürfte dann egal sein.

Gruß

Andre1002
 
B

Beni

Gast
Paladin hat gesagt.:
JList.add(Vektor) ist soweit ich weiss nicht möglich (jedenfalls meckert eclipse wenn ich das machen will).
Weils dort eine Component erwartet?

Aber der Vector könnte schon funktionieren, er muss einfach weitere Vectors enthalten :wink:
Dann kommt diese *hässliche* Variante raus.

Code:
Vector data = new Vector();
Vector entry = new Vector();
data.add( entry );
entry.add( icon );
entry.add( text );

Object cellValue = ((Vector)((Vector)data).get( row )).get( column );

Nicht allzu ernst nehmen, die Lösung von Andre1002 ist 100 mal schöner.

mfg Beni
 

Paladin

Bekanntes Mitglied
Hi Andre,

das mit dem Objekt ist mir klar.
Ich erstelle also ein Array von diesem Objekt und schicke das ganze dann mit .setListData an den Renderer.
Allerdings gibt der Renderer jetzt in meiner Liste nichts mehr aus und ich verstehe nicht was an meiner
Version falsch ist. Nachfolgend schreibe ich mal einen kleinen Programmablaufplan damit du - wenn du noch
Geduld für meine Probleme hast - sehen kannst was ich (falsch) mache.

1. Klasse UserData
Ich habe eine Klasse mit namen UserData erstellt. Diese Klasse hat die Attribute String userName, String userPicture (Name der Bilddatei) und String userJob. + den get und set Methoden dazu.

2. Einsetzen der Daten in eine Instanz von UserData
In der Funktion welche die Userliste an die JList übergibt mache ich folgendes:

...
Code:
UserData user[] = new UserData[(m_client.userDataVektor.size()/4)+3]; 
//(m_client.userDataVektor.size()/4)+3 gibt die Zahl der benötigten Elemente an
...
user[0].setUserName("Alle");
user[0].setUserPicture("alle.gif");
user[0].setUserJob("");	
user[0].setUserAway(false);

//hier steht noch eine Schleife welche die User und ihre Daten in user[1], user[2] etc. einfügt.

m_client.ta_useronline.setListData(user);  //Werte in die Liste schreiben

3. Der CellRenderer
Ich schreibe hier mal den gesamten Code vom CellRenderer hin. Könnte ja sein, dass ich hier schon
irgendwo am Anfang murks gemacht habe.

Code:
class MyCellRenderer extends JLabel implements ListCellRenderer {
		
     public Component getListCellRendererComponent(
     JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
          UserData[] userData = (UserData[]) value;			
          icon = createImageIcon(String.valueOf(userData[index].getUserPicture()), "Bild");
          //createImageIcon(String dateipfad, String beschreibung) lädt die Bilddatei

          setIcon(icon);
          setText("(" + userData[index].getUserJob() + ")   " + userData[index].getUserName());		
          				
          return this;	
     }			
}


Das alles kompiliert einwandfrei und trotzdem bekomme ich in der JList nichts angezeigt (weder Text noch ein Bild).

Vielen Dank im voraus

Gruß

Paladin
 
B

Beni

Gast
Hallo Paladin

Ich hab deinen Code mal versucht nachzustellen, und bin auf ein leicht anderes Ergebnis gekommen.
Vielleicht hilft dir ein Vergleich:

Code:
// Etwas einfacher, ist ja auch nur ne Demo

public class UserData {
  private String name, job;
  public UserData( String name, String job ){
    this.name = name;
    this.job = job;
  }

  public String getName(){
    return name;
  }
  public String getJob(){
    return job;
  }

Code:
// Macht etwa dasselbe wie das Original

class Renderer extends JLabel implements ListCellRenderer {
  public Renderer(){
  }
  public Component getListCellRendererComponent( JList list, Object value, int index, boolean sel, boolean foc ){
    UserData u = (UserData)value;
    this.setText( u.getName() + " / " + u.getJob() );
    return this;
  }
}

Code:
public class ListTest extends JFrame{
  public ListTest() {
    JList list = new JList();

    UserData[] user = new UserData[3];
    user[0] = new UserData("Marie", "Köchin");
    user[1] = new UserData("Heinz", "Architekt");
    user[2] = new UserData("Fritz", "Wirt");

    list.setListData( user );      // Bis hier 1:1 Kopie von oben
    list.setCellRenderer( new Renderer() );  // Cell-Renderer setzen

    this.getContentPane().add( list );
    setBounds( 10, 10, 200, 200 );
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    setVisible( true );
  }
}

Das funktioniert recht gut (zumindest hat es Text).

Aber wie Du siehst, haben wir einen recht grossen Unterschied im CellRenderer. Ich muss dort nie ein Array benutzen!
Im Gegenteil, das würde bei mir eine Exception verursachen. Deshalb meine Frage: Wird die Methode getListCellRendererComponent bei Dir überhaupt aufgerufen ??

Gruss Beni

P.S. noch was: icon = createImageIcon(String.valueOf(userData[index].getUserPicture()), "Bild");
Das solltest einmal machen, und in UserData oder sonst wo abspeichern. Wenn Du jedesmal beim Neuzeichnen der Liste ein Bild lädst, wird dein Progi nie sehr schnell werden. :wink:
 

Paladin

Bekanntes Mitglied
Hi Beni,

Beni:
Wird die Methode getListCellRendererComponent bei Dir überhaupt aufgerufen ??

Wie mir gerade aufgefallen ist wird die Methode gar nicht aufgerufen aber das liegt
daran, dass ich bei der ausführung der folgenden Zeile eine NullPointer Exception bekomme:

Code:
user[0].setUserName("Alle"); 
user[0].setUserPicture("alle.gif"); 
user[0].setUserJob("");    
user[0].setUserAway(false);

Beni:
Das solltest einmal machen, und in UserData oder sonst wo abspeichern. Wenn Du jedesmal beim Neuzeichnen der Liste ein Bild lädst, wird dein Progi nie sehr schnell werden.

Tja, jetzt wo du das sagst fällt mir auch auf, dass das vielleicht nicht der beste Weg ist :oops:


Gruß

Paladin
 
R

Roar

Gast
den renderern musst du der list auch zuweiosen.
setDefaultRenderer() oder so ähnlich ist die methode => api :###
und dann musst du user[0] auch erstmal ein UserData object zuweisen.
 
B

Beni

Gast
@Roar

setCellRenderer :!:

Steht 2 Beiträge weiter oben, Quelltext lesen! :### :wink:

mfg Beni
 

Paladin

Bekanntes Mitglied
Hi,

ich hab das Problem gefunden. Ich habe einfach mal folgendes in meiner Initialisierungsschleife vergessen:
objekt = new Objekt();

Traurig aber wahr. :oops:
Vielen Dank an Andre1002 und Beni für die Geduld die Ihr mit mir hattet.

Gruß

Paladin
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
J Button (NOR-Text, CEN-Image, SOU-Text) AWT, Swing, JavaFX & SWT 7
R SWT: Button mit Text und Image AWT, Swing, JavaFX & SWT 10
R JCheckBox mit Image und Text AWT, Swing, JavaFX & SWT 5
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
K JavaFX Bildergalerie aus Image Ordner laden AWT, Swing, JavaFX & SWT 3
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
L AWT .gif image transparent machen AWT, Swing, JavaFX & SWT 3
kodela angezeigtes Image entfernen AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
T Swing Buffered Image anzeigen AWT, Swing, JavaFX & SWT 45
L Image kann nicht gefunden werden AWT, Swing, JavaFX & SWT 1
S Stretch Image in ImageView AWT, Swing, JavaFX & SWT 4
N Swing Image aus Web laden und in Icon umwandeln AWT, Swing, JavaFX & SWT 4
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
L JavaFX Image mit Blureffect AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Background Image Klasse AWT, Swing, JavaFX & SWT 14
Q AWT TicTacToe Image auf Button hinzufügen AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L JavaFX leeres weißes Image - javafx.scene.image.Image AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
B Graphics to Image AWT, Swing, JavaFX & SWT 3
L Image in anderes kopieren AWT, Swing, JavaFX & SWT 0
T Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 1
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
I Image im PopupMenu vom SystemTray AWT, Swing, JavaFX & SWT 8
F JavaFX Position von Image angeben/verändern AWT, Swing, JavaFX & SWT 2
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
F Swing Image einem Button hinzufügen AWT, Swing, JavaFX & SWT 5
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
T Image aus "nicht-src-ordner" AWT, Swing, JavaFX & SWT 5
vodkaz (javafx) Image Problem AWT, Swing, JavaFX & SWT 2
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Image in JTable einfügen AWT, Swing, JavaFX & SWT 9
M Image aus MS Access anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Image im Array per Knopfdruck ändern AWT, Swing, JavaFX & SWT 6
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
G JavaFX Image vergrößern AWT, Swing, JavaFX & SWT 5
U Image mit Zeichenbereich rotieren AWT, Swing, JavaFX & SWT 3
P Speicherproblem SWT.Image in Nebula-Gallery AWT, Swing, JavaFX & SWT 3
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
D JLabel Image ausrichten AWT, Swing, JavaFX & SWT 2
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
H Image Icon ersetzen AWT, Swing, JavaFX & SWT 8
I Image Button AWT, Swing, JavaFX & SWT 4
U IntBuffer zum Image konvertieren. AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T 2D-Grafik Slideshow (DoubleBuffering und Image transformieren/bewegen) AWT, Swing, JavaFX & SWT 6
K Swing Warum bleibt das Image immer gleich AWT, Swing, JavaFX & SWT 4
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
D Image.getScaledInstance() vs. Netzwerkverbindung??? AWT, Swing, JavaFX & SWT 2
reibi SWT Image viewer AWT, Swing, JavaFX & SWT 2
lumo SWT Image funktion auf ImageDaten AWT, Swing, JavaFX & SWT 9
A Applet .gif in applet Image nicht animiert angezeigt AWT, Swing, JavaFX & SWT 4
M Image wird nicht neugezeichnet nach dem Wechsel AWT, Swing, JavaFX & SWT 2
lumo SWT Image Pattern AWT, Swing, JavaFX & SWT 5
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
M Swing Image in JPanel als Componente AWT, Swing, JavaFX & SWT 2
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
S Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 2
0 Mousecurser mit Image hinterlegen AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
N Java Choice Bilderausgabe - images - - image - AWT, Swing, JavaFX & SWT 2
D iText PdfPCell mit Image AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Icon in Image (System Icons) AWT, Swing, JavaFX & SWT 2
S Button mit Image AWT, Swing, JavaFX & SWT 7
A Skaliertes Image pixelweise bearbeiten AWT, Swing, JavaFX & SWT 6
L Swing Image zur Laufzeit verändern AWT, Swing, JavaFX & SWT 6
F SWT GC drawText auf halbtransparentem Image AWT, Swing, JavaFX & SWT 21
G Swing JEdtitorPane und HTML Image Seite AWT, Swing, JavaFX & SWT 2
C Image mit Graphics2D zeichnen AWT, Swing, JavaFX & SWT 9
C Image performant skalieren AWT, Swing, JavaFX & SWT 5
D SWT Image Farbtiefe AWT, Swing, JavaFX & SWT 2
L Swing Auf unabhängiges Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 8
lumo SWT Composite + Image + zeichnen AWT, Swing, JavaFX & SWT 4
V Ein Image als Button (nicht mit JButton(Icon)) AWT, Swing, JavaFX & SWT 5
D Image Viewer gesucht AWT, Swing, JavaFX & SWT 5
Kr0e Image schärfen AWT, Swing, JavaFX & SWT 2
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
T Image auf Image zeichnen AWT, Swing, JavaFX & SWT 2
E Warum ist offscreen (mit Image) schneller? AWT, Swing, JavaFX & SWT 11
G Swing Image speichern / 0 Byte AWT, Swing, JavaFX & SWT 7
H Image abspeichern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben