Warum erweitern Cell-Renderer oft JLabel?

8

Ich habe bemerkt, dass das üblich ist. Zum Beispiel verwenden DefaultListCellRenderer, DefaultTableCellRenderer und DefaultTreeCellRenderer alles. Auch viele der benutzerdefinierten CellRenderer, die ich online sehe, verwenden dies ebenfalls. Ich möchte einen benutzerdefinierten TableCellRenderer in meinem Code verwenden, aber ich bin nicht sicher, ob ich wirklich JLabel ableiten muss. Was ist der Vorteil von JLabel-Unterklassen?

    
Eva 06.10.2011, 02:58
quelle

3 Antworten

10

Die API für den DefaultTableCellRenderer lautet:

  

Die Tabellenklasse definiert einen einzelnen Zellenrenderer und verwendet ihn als einen Stempel zum Rendern aller Zellen in der Tabelle. es rendert die erste Zelle, ändert den Inhalt des CellRenderers, verschiebt den Ursprung an den neuen Ort, zeichnet ihn neu und so weiter. Die Standardkomponente JLabel wurde nicht für die Verwendung auf diese Weise entworfen, und wir möchten vermeiden, dass jedes Mal, wenn die Zelle gezeichnet wird, revalidate ausgelöst wird. Dies würde die Leistung stark verringern, da die Nachricht revalidate an die Hierarchie des Containers übergeben würde, um festzustellen, ob andere Komponenten betroffen sind. Da der Renderer nur für die Lebensdauer eines Malvorgangs parented ist, möchten wir in ähnlicher Weise den Overhead vermeiden, der mit dem Durchlaufen der Hierarchie für Malvorgänge verbunden ist. Daher überschreibt diese Klasse die Methoden validate , invalidate , revalidate , repaint und firePropertyChange als No-Ops und überschreibt die Methode isOpaque ausschließlich, um die Leistung zu verbessern. Wenn Sie einen eigenen Renderer schreiben, beachten Sie bitte diese Leistungsaspekte.

    
camickr 06.10.2011, 03:19
quelle
5

JLabel hat die ganze Feuerkraft, die sie brauchen, und dann einige - es handhabt Texte und Icons, es kann sich zentrieren, es hat standardmäßig einen undurchsichtigen Hintergrund, .... und ich könnte weiter und weiter gehen ...

    
Hovercraft Full Of Eels 06.10.2011 02:59
quelle
4

Weil jeder - auch das frühe Swing Team - dazu berechtigt ist, gelegentlich Dinger zu machen: -)

Und es ist falsch , eine Komponente zu erweitern, anstatt die Renderer-Schnittstelle zu implementieren und diese Implementierung an eine Komponente delegieren zu lassen (dies könnte eine speziell implementierte JLabel mit allen Pfiffen sein, die sie für notwendig hielten persönlich bin ich nicht überzeugt). Wir alle leiden immer noch unter dieser schlechten Implementierungsentscheidung - der ominöse "Farbspeicher" von DefaultTableCellRenderer ist eine direkte Konsequenz.

Also: Do-not-subclass-someComponent-zu-implementieren-someRenderer. Vor allem nicht für einigeComponent == DefaultTableCellRenderer, es ist kaputt!

BTW, SwingX macht es richtig: -)

    
kleopatra 06.10.2011 10:07
quelle