2013-02-27 21 views
13

Ho provato su questo tutorial, ma ancora non lo capisco. Fondamentalmente la mia domanda è quale metodo è migliore e perché? Dovrei usare paint o paintComponent?Differenza tra paint() e paintcomponent()?

Si prega di provare a mantenere la risposta semplice, grazie.

+6

Vedi anche [* Pittura in AWT e Swing *] (http://www.oracle.com/ technetwork/java/pittura-140037.html). – trashgod

risposta

13

Citando la documentazione di paint() metodo

Questo metodo in realtà delega il lavoro della pittura a tre metodi protetti: paintComponent, paintBorder e paintChildren. ... Una sottoclasse che vuole solo specializzare il metodo di disegno del delegato dell'interfaccia utente (look and feel) dovrebbe semplicemente sovrascrivere paintComponent.

Sembra che il metodo paint() disegna effettivamente il componente, compresi il bordo e i bambini. Se si desidera personalizzare solo l'aspetto del componente escludendo il bordo e i bambini, si utilizza paintComponent().

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paint(java.awt.Graphics)

+0

Se corretto, sarebbe prudente collegarsi a un altro per aggiornare la versione di JavaDocs, solo per evidenziare agli sviluppatori potenziali modifiche all'API – MadProgrammer

+0

Ho modificato il collegamento. grazie @MadProgrammer per avermi ricordato di questo – christianhs

+0

Hai ancora un +1 per la risposta a prescindere;) – MadProgrammer

7

In generale, quando la pittura in Swing, si consiglia di ignorare paintComponent.

Ci sono diversi motivi per cui uno è paintComponent è dipinto nel livello inferiore, il che significa che non si cancellerà accidentalmente alcun componente che è stato sottoposto a rendering durante il processo di verniciatura - questo succede molto alle persone che pubblicano qui.

Ci sono un paio di volte in cui potrebbe essere necessario sostituire lo paint, ma vorrei sempre incoraggiarlo a provare a farlo funzionare prima con paintComponent.

Partenza

+2

Non penso che importi se si sostituisce paint() o paintComponent() da un doppio punto di vista del buffer. Vedi la sezione double buffering dell'articolo "Painting in AWT and Swing". Ora, se capita di sovrascrivere paint() a livello di frame (cosa che non consiglio mai) e dimenticare di invocare super.paint(), allora si può avere qualche problema. – camickr

+1

@camickr Ah sì, hai ragione, questo è l'argomento per non sovrascrivere i contenitori di livello superiore: P – MadProgrammer