ListCellRenderer text verschwindet, erst sichtbar nach erster Action

phouli89

Grünschnabel
Hallo, ich habe ein Problem mit einer JComboBox, mit Hilfe eines ListCellRenderer erweitere ich die Liste zur Darstellung von ImageIcons zu den Einträgen, ich habe allerdings das Problem, dass anfangs kein Text hinter dem Icon steht, wenn ich die Combobox anklicke erscheint in der Liste der Text, nach der Auswahl ist der Text nciht sichtbar. Wenn ich allerdings eine Action ausführe (Button drücke) erscheint der Text aufeinmal, bei neuauswahl ist er wieder verschwunden. Hinter dem Button liegt keine Action, erst einfach nur auf dem ContentPane().

Code:
    ImageIcon[] images;
    String[] titel;
// Die Arrays mit Titel und ImageIcons werden woanders gefüllt
     
class ListBoxRenderer extends JLabel implements ListCellRenderer {

            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                int selectedIndex = ((Integer) value).intValue();
                ImageIcon icon = images[selectedIndex];
                setIcon(icon);
                setText(titel[selectedIndex]);
                repaint();
                return this;
            }
        }

Ich habe schon verschiedene Objecte mit repaint oder revailidate versucht zu aktualisieren, allerdings ohne Erfolg. Hat jemand vieleicht schonmal das selbe Problem oder ne Ahnung was passiert wenn ein leerer Button gedrückt wird, also was da neu gezeichnet wird?

Vielen Dank!
 
Hast du irgend eine paint() oder paintComponent()-Methode überschrieben?
Wird vllt. ein Teil deines Codes erst aufgerufen, nachdem ein bestimmter Listener (ActionListener, ComponentListener, ...) aktiviert wurde?
 
die Combobox befindet sich einem seperaten Dialog, es wird keine paint() oder painComponent()-Methode verwendet und nichts überschrieben, die einzige Anpassung ist der ListCellRenderer, sonst handelt es sich um einen leeren Dialog ohne weitere Funktionen (Ich hab lles rausgeworfen und neu angefangen, nur der Dialog, die Buttons und die Combobox). Das muss an dem ListCellRenderer liegen, ich habe allerdings noch nie damit richtitg gearbeitet und konnte auch keine brauchbaren Informationen zu diesem Problem finden.

Ich weis nicht genau wie der ListCellRenderer ausgelöst wird, wenn ich den mit einem System.out kontrolliere scheinen mir die ausgelösten Aktionen recht willkürlich. Wie gesagt bei einem leeren Button wird der Text anschliesend gezeichnet, eigentlich dürfte der Button doch nur sich selber neu zeichnen und ohne sonsitge funktionale Abhängigkeit keine Auswirkung haben, oder?
 
Nutzt du verschiedene Threads?
Wenn nein, habe ich leider keine Ahnung was die Ursache sein könnte.
(Idee: vielleicht liegt es daran, dass der CellRenderer erst beim ersten paint erzeugt wird und dank double-buffering nicht gezeichnet wird ?)

Ok, ich würde etwas anderes probieren:
JComboBox<E> ist ja offen für Generics. Anstatt den CellRenderer zu überschreiben kannst du auch einfach deine JLabel an den Constructor oder eine Instanz der JComboBox übergeben:
Java:
final ImageIcon[] images;
final String[] titel;
// Die Arrays mit Titel und ImageIcons werden woanders gefüllt

final Vector<JLabel> elements = new Vector<JLabel>();
for (int i = 0; i < images.length; i++) {
	final JLabel label = new JLabel(titel[i]);
	label.setIcon(images[i]);
	elements.add(label);
}

final JComboBox<JLabel> combo = new JComboBox<JLabel>(elements);
So funktioniert es jedenfalls bei mir.
 
Das klingt schonmal sehr vielversprechend, vor allem weil das weniger Leistung brauchen würde als der Renderer, allerdings komme ich mit dem Code nicht ganz zurecht, ich hatte Anfang schonmal daran gedacht, Label als Items zu verwenden, allerdings erscheinen die Einträge bei mir so wie wenn man ein Label mit System.out.println() ausgibt. Problem sind die Parameter an der JComboBox, wenn ich die Combobox mit den von dir angegebenen Parametern <JLabel> sagt mir Netbeans "JComboBox does not take Parameters" daher wird es vermutlich daran liegen
 

Neue Beiträge

Zurück