Discussione: Come si fa ?
View Single Post
Old 07-05-2007, 11:52   #113
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Be' dipende. Supponendo che quel metodo main di quella classe Main sia il punto d'entrata di un programma Java, il fatto che prima dell'esecuzione del metodo run del Runnable passato ad invokeLater esistano degli eventi pendenti è un dettaglio di realizzazione del framework Swing/AWT.

Cioè osservando quel codice io dovrei dire che non ce ne sono e che, quindi, l'esecuzione di new Main().start() è il primo compito spettante all'EDT (Event Dispatcher Thread).

Tuttavia, esaminando le regole del framework Swing/AWT, si scopre che potrebbero già esserci eventi in consumazione, perchè le norme del framework non lo escludono.

Nel caso in cui il programma Java non parta dal metodo main di quella classe Main la preesistenza di eventi AWT nella coda degli eventi AWT è un fatto che dipende da cosa il programma abbia già fatto prima di invocare quel main.

Ciò detto, quell'arzigogolo di parentesi ha l'unico scopo di causare l'esecuzione di:

new Main().start()

equivalente a:

Main main = new Main();
main.start();

all'interno dell'EDT. Il motivo sta nel fatto che quella particolare classe Main possiede, vuoi nel costruttore, vuoi nel metodo start, vuoi negli inizializzatori, istruzioni che maneggiano componenti Swing proiettabili.

Swing è un framework a Thread singolo. Per una librerie che maneggia interfacce grafiche utente significa che esiste un solo Thread che si occupa di aggiornare l'aspetto dei componenti proiettabili sullo schermo.

L'aspetto di un componente dipende da un insieme di proprietà dell'oggetto che lo rappresenta. Swing presuppone che le mutazioni di stato dell'oggetto-componente proiettabile, siano affidate all'EDT. Lo presuppone ma non lo impone. Ciò significa che io posso cambiare il valore del colore di un componente tramite un Thread diverso dall'EDT. Qual'è il risultato? Il risultato è indeterminato. E' indeterminato per via di alcune regole del linguaggio di programmazione Java le quali trattano il caso dell'accesso in lettura o scrittura al valore di variabili residenti nella regione di memoria condivisa dai Thread (c.d. Heap).

Dunque, se, in ipotesi, cambio il colore di un componente all'interno dell'EDT io so che quella mutazione si rifletterà sul componente. Se cambio il colore all'interno di un Thread diverso dall'EDT io non posso essere certo del risultato.

La cosa vale per ogni proprietà di ogni oggetto-componente Swing. Dimensioni, componenti contenuti, font, bordi eccetera.

Quando maneggio le proprietà di un componente Swing lo devo fare all'interno dell'EDT altrimenti l'effettività (cioè il fatto che quei maneggiamenti producano l'effetto desiderato) è incerta.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso