Swing ListCellRenderer einer JList zeichnet sporadisch falsch

hansmueller

Bekanntes Mitglied
Hallo,

ich habe einen ListCellRenderer so modifiziert, damit man damit auch mehrere Zeilen in einen Listeneintrag darstellen kann.
Es handelt sich dabei um ein JPanel, in dem mit Hilfe des GroupLayout-Managers diverse JLabels angeordnet sind. Die JLabels, welche nicht gebraucht werden, werden auf .setVisible(false) gesetzt.
Es ist in vom Prinzip in etwa so aufgebaut wie http://www.java-forum.org/awt-swing-swt/102014-jlist-jspinner.html, nur ohne JSpinner. Durch das Einsetzen von Rahmen lasse ich das ganze wie eine JTable aussehen.

Ich benutze ein DefaultListModel für die Daten.
Wenn ich neue Daten in der Liste darstellen will, lösche ich zuerst mit .clear das DefaultListModel und füge die neuen Daten hinzu (aus einer Datenbank). Dann wird der selektierte Eintrag gesetzt.
Diese ganze Aktion wird in einem separaten Thread ausgeführt, da unter anderem die Datenbankabfrage doch sehr Zeitaufwendig ist.
Danach wird für das ganze Fenster .pack() und .repaint() ausgeführt.

Mein Programm ist mehrsprachig und beim Wechseln der Sprache wird die Liste neu erstellt.
Dabei tritt nun sporadisch manchmal ein Fehler auf.
Machmal stimmt bei einem Listeneintrag die Höhe nicht mehr. Das tritt wie gesagt nur sporadisch auf und meist ist es einer der oberen Listeneinträge.
Wenn man den entsprechenden Eintrag markiert, verändert sich seine Höhe nicht.
Erst wenn man das DefaultListModel leert und wieder neu befüllt, verschwindet der Fehler wieder, manchal aber auch wieder nicht.
Es wird auch keinerlei Fehlermeldung ausgegeben.
Ich habe es schon mit .validate() und .revalidate() probiert, das hat aber nichts genützt.

Leider ist der Code zu umfangreich und kompliziert um ihn hier zu posten.
Und ich habe es nicht geschafft ein KSKB zu erstellen, das diesen Fehler reproduziert.

Würdet ihr bitte eure Kristallkugeln zu rate ziehen um mir ein paar Tipps zu geben, woran das liegen könnte und wie man es abstellt.
Ich schätze mal, daß das evtl. irgendwas mit den Thread zu tun hat.

Im Anhang sind ein paar Bilder der Liste. Beispiel00 und Beispiel02 sind in Ordnung, Beispiel01 und Beispiel03 weisen den besagten Fehler auf.
Es ist noch anzumerken, daß die Listeneinträge in dieser Liste momentan nur 1 oder 3 zeilig sind.

MfG
hansmueller
 
Warum lässt du es wie eine Tabelle aussehen?
Was spricht dagegen einfach eine Tabelle zu benutzen?

Zu deinem Fehler kann vieles schiefgehen.
Falsches Layout, Zeichnen im falschen Thread, Falscher Renderer der sich falsch zeichnet...
 
Hallo,

ich konnte den Fehler etwas eingrenzen.
Er tritt anscheinend nur auf, wenn es einen markierten Eintrag in der Liste gibt.

Ich experimentiere jetzt mal mit .clearSelection() herum.

MfG
hansmueller
 
SirWayne hat gesagt.:
Wie gesagt mach es doch einfach gescheit mit ner JTable

Habe mal im Netz geschaut und es ist nicht gerade einfach einer JTable die Mehrzeiligkeit in einer Zelle beizubringen.

Zumal die JTable ja eigendlich "nur" eine sehr komplizierte JList ist. Da beide was den Renderer betrifft, auf dem selben Prinzip beruhen, fürchte ich fast, daß auch bei einer JTable dasselbe Problem wieder auftauchen könnte.

Mit der JTable werde ich mich in ein paar Monaten sowieso näher beschäftigen, weil ich diese für mein Programm brauche, aber dann reicht eine einfache einzeilige Zellendarstellung.

Nun gut, ich glaube ich habe eine Lösung gefunden. Vielleicht kann das ja irgendwer mal gebrauchen:

Zuerst habe ich meinen ListCellRenderer etwas angepaßt. In der zu implementierenden Methode getListCellRendererComponent() setze ich am Anfang alle JLabels auf .setVisible(false). (Eigendlich ist diese Aktion überflüssig, da beim Ausführen dieser Methode alle JLabels den richtigen Zustand bekommen, aber vom Gefühl her taucht der Fehler dann weniger auf.)

Als zweiten Schritt habe ich die Methode etwas ergänzt, die die Liste befüllt. Wenn die Liste geändert werden soll, rufe ich zuerst mal .clearSelection() in einem SwingUtilities.invokeAndWait auf, um sicher zu gehen, das es keinen markierten Eintrag mehr gibt.
Dann setze ich die Liste mit .setVisible(false) unsichtbar (ebenfalls in einem SwingUtilities.invokeAndWait).
Dann lasse ich die Liste neu befüllen und eine Zeile markieren.
Zum Schluß setzt ich die Liste wieder auf .setVisible(true).

Der Fehler scheint jetzt nicht mehr aufzutreten.
Ich schätze mal, daß das .setVisible() auf die JList den Ausschlag gibt.

MfG
hansmueller
 

Zurück
Oben