JTable mit eigenem Renderer: wie entsprechende Zeilenhöhen setzen?

DarthShader

Erfahrenes Mitglied
Hallo,

ich benutze eine JTable mit einem eigenen CellRenderer, abgeleitet von JLabel.

Was ich nun erreichen möchte ist, dass sich die Zeilenhöhen der Höhe des JLabels anpassen. Nehmen wir an, ich füge meinem TableModel 3 Objekte hinzu, und durch meinen Renderer werden diese Objekte mehrzeilig dargestellt, dann muss ja auch die Zeilenhöhe entsprechend angepasst werden.

Ich weiß, dass JTable eine MEthode setRowHeight anbietet, mit der man die Zeilenhöhe angeben kann. Ich will aber nicht alle Zeilen gleich hoch machen, sondern jede genau so, wie sie es benötigt - getPrefferedSize().height gibt mir diese Information innerhalb des CellRenderers.

Setze ich jedoch die Zeilenhöhe innerhalb des Renderers, löst das wieder ein Repaint aus, und er landet in einer Endlosschleife.

Wie also kann ich es umsetzen, dass meine Zeilen der Tabelle alle ihre entsprechende Höhe (abhängig von dem JLabel, von dem ja der Renderer abgeleitet ist) erhalten (und das sind verschiedene Höhen)?


Ich wäre für jeden Vorschlag dankbar


Vielen Dank für Eure Hilfe!
 
Hallo,

danke für Deine Antwort. Ich habe gerade vor einer Stunde für mich noch eine andere Lösung gefunden. Ich habe meinen Renderer etwas modifiziert - dieser besitzt nun eine update Methode, welche einen internen Cache der Objekte (JLabels) anlegt, die in die Tabelle sollen. Wird die Tabelle dann gerendert, holt der Renderer diese Objekte einfach aus seinem Cache. Der Nachteil ist natürlich, dass zusätzlich zum Tabellen-Model auch noch der Cache Daten für die Tabelle enthält, obwohl sich der Speicherverbrauch aufgrund einfacher JLabels wirklich in Grenzen hält. Der Vorteil ist aber entscheident: ich kann auf den Cache zugreifen, und die preferredSize der JLabels abfragen, und setze dann die Zeilen der Tabelle einzeln.

Leider löst jedes Setzen einer Zeile einen repaint aus, d.h. bei 10 Zeilen macht er 10 repaints, was natürlich nicht so schön ist. Wohlmöglich werde ich die JTable hier noch subclassen, und dann die setRowHeight Methode dahingehen überschreiben, sodass er nicht sofort ein Repaint macht.
 
Zurück