2012-03-20 6 views
23

Non riesco a trovare alcuna documentazione ufficiale che dica che è sicuro chiamare Component.repaint da un altro thread rispetto al Thread di invio eventi, l'EDT.Sicuro da usare Component.repaint() fuori EDT?

È così? E dove posso trovare documentazione/codice?

+0

buona domanda +1, le mie opinioni elicottero :-) -> 'a)' tutto funziona fino riverniciare () non è bloccato da Thread.sleep (int), 'b)' c'erano alcuni argomenti su isEventDispatchThread(), ma quei file sono persi su Java.Net 'c)' concordato con API per AWT Components e per i loro classi annidate in Swing – mKorbel

risposta

25

Ecco un quote from an official page affermando che:

i seguenti metodi JComponent sono sicuri di chiamare da qualsiasi thread:repaint(), revalidate(), e invalidate(). I metodi e revalidate() accodano le richieste per il thread di invio eventi per chiamare rispettivamente paint() e validate().

EDIT 1:


Dal momento che il link precedente citato è stato spostato. Sto pubblicando uno new link, anche se potrebbe volerci un po 'più di tempo per conoscere l'autenticità di questa pagina, dal momento che sembra essere dal Java sebbene sia originato dal server di alcuni University, come si può vedere dalla barra degli indirizzi.

7

È thread-safe. Lo RepaintManager assicura che tali chiamate vengano inserite nel thread di invio eventi.

Painting in AWT and Swing ("official" documentation)

Lo scopo della classe di swing RepaintManager è quello di massimizzare la efficienza della trasformazione ridipingere su una gerarchia swing di contenimento, e anche ad attuare il meccanismo 'revalidation' Swing (quest'ultimo sarà un soggetto per un articolo separato). Implementa il meccanismo di riverniciatura intercettando tutte le richieste di riverniciamento sui componenti Swing (quindi sono non elaborati più da AWT) e mantenendo il proprio stato su ciò che deve essere aggiornato (noto come "regioni sporche"). Infine, utilizza invokeLater() per elaborare le richieste in sospeso sul thread di invio dell'evento , come descritto nella sezione "Ridisegno Elaborazione" (opzione B).

Per la maggior parte dei programmi, RepaintManager può essere visualizzato come parte del sistema interno di Swing e può essere virtualmente ignorato. Tuttavia, la sua API fornisce ai programmi l'opzione di ottenere un controllo più preciso su determinati aspetti di pittura di .

+1

Grazie per questo meraviglioso Painting Doc, avevo bisogno di questa roba per così tanto tempo :-), proprio non riuscivo a trovarla. Sembra che stavo aspettando che tu ti riferissi a questo :-) –

+2

@GagandeepBali: anche io me ne fido. Un pratico modo per trovarlo è attraverso l'API ['Component'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html). – trashgod

3

le esperienze su questo forum

(+1 per entrambi answerers), ma, penso che non è possibile rispondere alla tua domanda in modo corretto, parte di metodi Graphics(2D) chiamata richiesto per repaint() programmaticamente, resto della loro attuazione di questo metodo (in API) direttamente (sicuro che alcuni di loro manca questo metodo in API)

per una parte del Swing JComponents è forse meglio da dis-accordo, questo forum è pieno di domande su Concurency in Swing, a partire da Graphics(2D) pensiero JTextComponents, JTree, e estremità (Allo stesso modo è dichiarato come thread-safe) con setText(),

circa Concurency in Swing sono lì numeri notevoli di domande

+1

ehhh ........? La risposta alla domanda è chiaramente SÌ - non c'è bisogno di confondere le acque con un codice forse univoco – kleopatra

+0

Approverò lo scetticismo di mKorbel: 1) Le API possono [cambiare] (http://stackoverflow.com/a/3245805/230513), anche se probabilmente non 'repaint()'. 2) Mentre 'repaint()' stesso è thread-safe, normalmente lo chiama dopo aver aggiornato un componente, che non è thread-safe. – trashgod

+0

@trahgod grazie per la traduzione :-) Anche se tendo a non essere un po 'd'accordo: a) non c'è stato alcun cambiamento, ma una correzione di un errore doc (probabilmente lo stesso thingy, era una lunga storia) b) se è così, il il codice _before_ che si chiama repaint è sbagliato, non il repaint stesso – kleopatra

Problemi correlati