Newsgroup: it.comp.java
Titolo: In Visual Basic e' doEvents, in Java? Cursori e clessidre non congelate.

Ciao, realizzando un'applicazione grafica in cui ad esempio si devono
usare dei JOptionPane per rispondere si o no oppure JFileChooser per
caricare file, succede che quando si preme su "SI" oppure su "SALVA"
oppure su "APRI" l'applicazione rimane "congelata" con la finestra
nella finestra attiva sino a che non e' terminata l'operazione che
SEGUE le righe riguardanti il JOptionPane o il JFileChooser.
In Visual Basic basta mettere una riga doEvents() per permettere
all'ambiente grafico di chiudere il lavoro corrente "grafico"
(finestra di apertura di un file o altro) per poi svolgere cio' che si
deve. E' una specie di "svuota buffer delle operazioni correnti e
mettiti pronto ad eseguire quelle nuove"
Sono a chiedermi se in Java esiste qualcosa di simile.
Perche' penso che a tutti possa essere successo di caricare un file
con un JFileChooser e di voler fare comparire una clessidra nel caso
che il file da caricare sia parecchio grosso. Altrimenti attualmente
quello che succede nella mia applicazione e' vedere il programma
congelato sul bottone "APRI" o "SALVA" sino a che l'apertura o il
salvataggio non sono terminati e la clessidra che non compare (anche
se le istruzioni sono corrette perche' le ho provate in altri punti).
Io vorrei far comparire la clessidra, ma se la metto sia subito prima,
che subito dopo dell'apertura o chiusura ad esempio del JFileChooser,
avviene questo brutto effetto di finestre congelate SENZA la
visualizzazione della clessidra.
A voi succede? Come fare?
Grazie!
Paolo Guagliumi - ICQ 46580228
--
Newsletter <infosapere>: programmi, siti interessanti, recensioni
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
· Per iscriverTi: 
http://web.tiscali.it/infosapere
· Oppure: 
http://it.groups.yahoo.com/group/infosapere

Come fare?
Basta leggersi il capitolo 14 di "Thinking in Java" (sembra fatto 
apposta per la tua domanda) e poi anche le parti sul multithreading e 
Swing sul tutorial.
HTH
-- 
Ciao
	Fabrizio C.

Swing sul tutorial.
Ciao Fabrizio, innanzi tutto complimenti per l'assiduita' con la quale
rispondi un po' a tutti nel newsgroup. In secondo luogo ho guardato il
capitolo che mi hai consigliato ma sinceramente, visto che l'icona con
la clessidra rappresenta solo un piccolo abbellimento, non mi sembra
il caso di scomodare i thread se mi dici che questo 'congelamento' e'
una cosa comune. A mio parere Java in questa circostanza non si
comporta proprio bene nella visualizzazione, perche' nel momento in
cui in un JFileChooser clicco su "Salva" o "Apri" (o in altri
componenti) dovrebbe DA SOLO, a mio parere, immediatamente chiudere la
finestra ed eseguire le istruzioni successive. Invece ciò che capita,
almeno sul mio computer un po' lento, e' che esegue le istruzioni
successive di caricamento del file 'congelando' per un attimo
l'ambiente grafico e mantenendo aperto questo JFileChooser. Non mi
sembra un qualcosa di molto pulito. Comunque ti ringrazio per la
risposta. Ho provato a risolvere la cosa anche usando:
fileChooser.setVisible(false);
(visto che l'analoga fileChooser.hide() e' stata deprecata)
ma niente da fare... anche se c'e' questa istruzione... la finestra
del JFileChooser rimane aperta e ben visibile, esegue le istruzioni
successive di caricamento e posizionamento del file e quando ha finito
tutto... la chiude. Apprezzo da ogni linguaggio di programmazione cio'
che offre e mi dispiace che in Java non vi sia una semplice istruzione
come doEvents() di VB.
Grazie ancora, ciao!
--
Paolo Guagliumi - ICQ 46580228
http://web.tiscali.it/infosapere

 mettiti pronto ad eseguire quelle nuove"
Visual Basic non ha il supporto per il multithreading quindi non puo' che
offrire un meccanismo (un trucchetto...) per simularlo. Per questo il
programmatore é costretto a inserire in punti strategici del codice
l'appello a funzioni come doEvents() per trattare la fila degli eventi
inviati dal sistema operativo (come i click del mouse per esempio). In
Delphi c'é l'istruzione application.processmessages per esempio.
Java, o meglio Swing, non offre questo meccanismo semplicemente perché
avendo il multithreading a disposizione non ha bisogno di simularlo...
Trattare gli eventi grafici e effettuare una lunga operazione
*contemporaneamente*? L'uso dei thread s'impone chiaramente. Devi
"incapsulare" la tua  lunga operazione in un thread e lanciarlo quando
intercetti il click sul bottone.
Certo, devi imparare un nuovo concetto e il famoso doEvents() puo' sembrarti
più facile e immediato. Pero' questa immediatezza apparente si paga perché
questo meccanismo é molto limitato. Fintanto che si tratta di permettere la
chiusura di una finestra non ci sono problemi, ma ci sono bisogni ben più
complessi di questo.
I thread sono un concetto più potente e elegante, non facili lo concedo, e
ti invito a approfondirne lo studio. Non potrai che guadagnarci.
bye
Carlo

Carlo
Grazie Carlo per la lunga ed esaustiva spiegazione: diverse
osservazioni che hai elencato non le sapevo, bello il paragone con il
VB. I Thread li ho usati in due laboratori, un piccolo gioco in rete
(battaglia navale) con un gameserver e 2 client che giocavano e anche
in una rubrica gestita a distanza in un'applet dal browser che
scriveva i dati in un server centrale. Hai ragione, dovrei certamente
approfondirli e studiarli meglio. 
Comunque, in questo progetto, essendo cio' che volevo realizzare un
piccolo abbellimento grafico, visto che in effetti in nessun programma
Java che ho provato ho trovato i thread utilizzati per aprire o
chiudere un file... che dire... "l'utente" dovra' fare a meno di
vedere le belle iconcine. Penso tu sia d'accordo con me sul fatto che
e' un dettaglio carino ma non essenziale, meglio che mi concentri su
cose piu' importanti del progetto.
Grazie mille comunque per l'osservazione esauriente che mi e' servita,
un saluto caloroso. Ciao!
--
Paolo Guagliumi - ICQ 46580228
http://web.tiscali.it/infosapere

come doEvents() di VB.
Io, invece, sono contento che non ci sia :-) (gusti personali).
Prova a guardare sul Tutorial nella parte che tratta questi temi.
C'è una classe molto utile che vale la pena di studiare un po': 
SwingWorker.
