2012-08-28 12 views
5

Ich verwende einen benutzerdefinierten CellRenderer, der TableCellRenderer implementiert und JTextArea (anstelle von JLabel) für jede Zeile anzeigt. Ich überschreibe grundsätzlich die Methode getTableCellRendererComponent (...) mit meiner, die einige zusätzliche Berechnungen pro Zeile durchführt. Diese Berechnungen müssen nur einmal pro Tabellenaktualisierung durchgeführt werden. Da die Methode getTableCellRendererComponent mit jeder Mausbewegung aufgerufen wird, tritt Verzögerung auf. Also dachte ich, ich sollte verhindern, dass getTableCellRendererComponent aufgerufen wird, um Verzögerungen zu vermeiden.Anzahl der GetTableCellRendererComponent-Aufrufe reduzieren

Überlegungen:

1) Meine Tabelle nur 1 Spalte und keinen Header hat.

2) Meine Daten sind statisch und werden von einer ArrayList-Methode getValueAt (int row, int column) in einer benutzerdefinierten tablemodel-Klasse gelesen, die AbstractTableModel implementiert.

3) Ich muss nicht über Mausbewegungsereignisse wachen.

4) Ich erwarte nicht viele Daten, daher möchte ich die ganze Tabelle auf einmal anzeigen oder sie vollständig zwischenspeichern.

5) Die meisten Verzögerungen werden dadurch verursacht, dass jedes Mal bei der Rückgabe von getTableCellRendererComponent Text gesetzt wird, da einige Zeilen Zeichen von rechts nach links verwenden und RTL-Text zusätzliche Zeit zum Rendern benötigt.

+1

nur um @Robins Antwort zu unterstreichen: nie-jemals _any_ Berechnung in getXXRendererComponent. Die Häufigkeit der Anrufe ist hoch und völlig außerhalb Ihrer Kontrolle. – kleopatra

+0

@kleopatra k hat es geschafft. Aber wie kontrolliere ich dann interne Vorgänge? Wie setText und setFont-Methoden verwende ich (für meine JTextArea-Zelle) innerhalb der getCellRendererComponent-Methode. –

+0

Konfigurieren des _Renderer_ ist in Ordnung .. klingt wie ich falsch verstehe, was Sie wirklich mit "Berechnung" meinen. Zeit für eine SSCEE (oder zumindest für den Code des Renderers :-) – kleopatra

Antwort

7

Versuchen Sie nicht, die Anzahl der getTableCellRendererComponent Anrufe zu begrenzen. Stattdessen sollten Sie die Implementierung des Renderers verbessern, indem Sie die Ergebnisse der Berechnung zwischenspeichern.

Sie können dem tableModel einfach einen Listener hinzufügen, damit Ihr Renderer weiß, wann das Modell aktualisiert wird. Nur dann sollte es markieren, dass die gespeicherten Berechnungsergebnisse ungültig sind, und sie beim nächsten Aufruf getTableCellRendererComponent neu berechnen.

Verwandte Themen