2015-02-25 26 views
15

Cosa fa super.paintComponent(g) (specialmente quando lo inseriamo nel metodo paintComponent())? Sono sorpreso di non vedere nessuno chiedere questo in SO prima.Cosa fa super.paintComponent (g)?

Estraggo le note della mia scuola su Java Graphics, l'unica cosa menzionata su questa riga di codice è "do not delete".

Tuttavia, in queste poche settimane mi sono esercitato e legato il metodo paintComponent() Java. Finora non ho incluso quella riga nei miei codici, e tutto sembra funzionare bene (finora). Quindi ..

Domande:

  1. Che cosa fa?
  2. Quando è necessario utilizzarlo?
  3. Quale vantaggio ci offre scrivendolo in paintComponent()?
+0

_ .. "e tutto sembra funzionare bene" _ - Prova a fare un po '[animazione] (http://stackoverflow.com/a/22123304/2587435) senza chiamare e vedere cosa succede. Il risultato dovrebbe darti una buona comprensione del perché dovremmo chiamarlo. Vedi [risultato di non chiamarlo] (http://stackoverflow.com/q/26477521/2587435) –

+0

Perché il voto negativo? – user3437460

+0

Non ero io ... –

risposta

14
  1. Che cosa fa?

stampa il componente come se non avesse sovrascritto il metodo paintComponent. Se si dispone di un set di colori di sfondo, ad esempio, questo è in genere dipinto dalla classe che si sta estendendo.

  1. Quando è necessario utilizzarlo?

Lo si utilizza se non si dipinge sull'intero componente. Le parti che non dipingerai "splenderanno", il che significa che dovresti lasciare che la super classe dipingi quelle parti. Come per l'esempio del colore di sfondo, ad esempio: se dipingi un cerchio al centro del componente, super.paintComponent assicurerà che il colore dello sfondo sia dipinto attorno al cerchio.

Se si do si dipinge l'intera area del componente, quindi si dipingerà sopra qualsiasi vernice di super.paintComponent e quindi non ha senso chiamare super.paintComponent.

  1. Quale vantaggio ci offre scrivendolo in paintComponent()?

Questo è l'unico posto logico per dirlo. paintComponent viene chiamato quando il componente deve essere dipinto e, come menzionato sopra, se non si dipinge l'intero componente da soli, è necessario super.paintComponent per dipingere sulle parti che passano attraverso.

The documentation di paintComponent dice abbastanza bene:

[...] se non si Invoker implementazione del super-è necessario onorare la proprietà opaco, cioè se questo componente è opaco, è necessario riempire completamente in lo sfondo in un colore non opaco. Se non onorate la proprietà opaca, probabilmente vedrete artefatti visivi.

+0

Grazie per la risposta. Sembra che dovrei sempre provare ad includere quella linea di codice. Comunque, c'è qualche situazione in cui non dovrei mettere quella riga di codice in 'paintComponent()'? – user3437460

+0

Sì. Se dipingi sull'intero componente (ad esempio, dipingi uno sfondo arcobaleno che copre l'intero componente per esempio), allora è assolutamente inutile fare prima super.paintComponent. – aioobe

+0

@aiobee Vedo, grazie mille per la risposta concisa e precisa. – user3437460

3

Dal Java Painting Tutorial:

La maggior parte dei componenti Swing standard, hanno il loro aspetto grafico adottate da "interfaccia utente delegare" oggetti separati. L'invocazione di super.paintComponent (g) passa il contesto grafico al delegato dell'interfaccia utente del componente, che dipinge lo sfondo del pannello. Per uno sguardo più ravvicinato a questo processo, vedere la sezione intitolata "Pittura e delegato UI" nell'articolo SDN sopra citato.