Differenza tra paint, paintComponent e paintComponents in Swing
-
29-10-2019 - |
Domanda
Qual è l'effettiva differenza tra paint()
, paintComponent()
e paintComponents()
in Java Swing?
Ho cercato di capire cosa spiegato nei documenti Oracle ma non mi è chiaro.
Soluzione
- AWT, sovrascrivi
paint()
. - Swing contenitore di primo livello (ad esempio, sono
JApplet
,JFrame
,JWindow
,JDialog
..), sovrascrivepaint()
.Ma ci sono una serie di buone ragioni non per dipingere in un TLC.Un argomento per una domanda a parte, forse. - Il resto di Swing, sovrascrive
paintComponent()
. - Non sovrascrivere né chiamare esplicitamente
paintComponents()
, lasciare che sia l'API a chiamarlo quando necessario.
Assicurati di utilizzare anche la notazione @Override
ogni volta che sovrascrivi un metodo.
In questo modo si suggerirebbe il problema di provare a sovrascrivere paintComponent(..)
in un JFrame
(non ha tale metodo), cosa abbastanza comune da vedere.
Altri suggerimenti
Potresti essere interessato a leggere Pittura in AWT e Swing
Una citazione:
Le regole che si applicano ai componenti leggeri di AWT si applicano anche ai componenti Swing - ad esempio, paint () viene chiamato quando è il momento di eseguire il rendering - tranne per il fatto che Swing considera ulteriormente la chiamata paint () in tre metodi separati, invocato nel seguente ordine:
protected void paintComponent(Graphics g)
protected void paintBorder(Graphics g)
protected void paintChildren(Graphics g)
I programmi Swing dovrebbero sovrascrivere paintComponent () invece di sovrascrivere paint (). Sebbene l'API lo consenta, generalmente non c'è motivo di sovrascrivere paintBorder () o paintComponents () (e se lo fai, assicurati di sapere cosa stai facendo!). Questa fattorizzazione rende più facile per i programmi sovrascrivere solo la parte del dipinto che devono estendere. Ad esempio, questo risolve il problema AWT menzionato in precedenza in cui il mancato richiamo di super.paint () ha impedito la visualizzazione di qualsiasi bambino leggero.