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?
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 Nachrichtrevalidate
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 Methodenvalidate
,invalidate
,revalidate
,repaint
undfirePropertyChange
als No-Ops und überschreibt die MethodeisOpaque
ausschließlich, um die Leistung zu verbessern. Wenn Sie einen eigenen Renderer schreiben, beachten Sie bitte diese Leistungsaspekte.
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 ...
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: -)
Tags und Links java swing subclassing jlabel cellrenderer