Newsgroup: it.comp.java
Titolo: Aiuto - Comp

Un saluto a tutti i partecipanti di it.comp.java.
Un quesito su un problema che mi sta creando qualche problema.
Ho creato una serie di pagine web contenenti delle applets java basate su
swing, che interagiscono con un server via socket. Quando le pagine vengono
caricate per la prima volta il "look" della pagina è, sotto ambienti
windows, per così dire "normale". Se però il browser passa ad un'altra
pagina e successivamente ritorna alla pagina di partenza, il look della
pagina assomiglia a quello dell'x-windows di Linux o di Motif: le listbox
cambiano completamnete il tipo di grafica, ed i pulsanti perdono la
dimensione in rilievo. I componenti a cui faccio riferimento sono quelli
Swing, mi pare che con il vecchio AWT questo non accadeva. Qualcuno ha una
idea su come evitare questo strano effetto? Un ringraziamento a chi vorrà
rispondere.
Fabrizio

 ...
Normalmente impostando un certo LookAndFeel per l'applet swing (derivata da
JApplet) questo viene mantenuto nonostante le operazione di loading e
reloading delle pagine. Forse il problema sta nel modo in cui setti il
LookAndFeel (es. in quale metodo?) nel tuo codice oppure potrebbe dipendere
dal browser utilizzato (per quanto ho potuto sperimentare Explorer e HotJava
non danno problemi, ma altri browser potrebbero non comportarsi
correttamente nel reinizializzare/riavviare la applet oppure comportarsi in
modo diverso.)
Potresti provare a scrivere una piccola applet swing che riproduca il
problema (prestando particolare attenzione all'accrocchio html che serve ad
includere l'applet swing in una pagina in modo che funzioni correttamente) e
poi postare il codice sul NG. Senza avere visto il codice non saprei quali
altri consigli darti.
Marco.
--
Per scrivermi direttamente elimina
__TOGLIMI__ dall'indirizzo e-mail.

 > windows, per così dire "normale". Se però il browser passa ad un'altra


 Se puoi consigliarmi te ne sarò molto grato.
Il  metodo che hai usato va bene in linea di principio, ma è più adatto per
cambiare il L&F a runtime. Sai perché hai dovuto usare un sistema del
genere? Semplice, perché hai istanziato la JLabel ed i tre JButton
direttamente nel corpo della classe anziché farlo nel metodo init() (o
jbInit()). In questo modo i componenti ereditano il L&F impostato in quel
momento (ovvero Metal, che è quello di default) perché vengono istanziati
prima della chiamata a setLookAndFeel. Dopo aver chiamato setLookAndFeel (il
che di solito avviene all'interno del costruttore) sei costretto a chiamare
SwingUtilities.updateComponentTreeUI() per cambiare a runtime il L&F dei
componenti da Metal a windows.
Il modo corretto di procedere è invece il seguente:
1) Non istanziare i componenti nel corpo della classe, ma farlo nel metodo
init() o jbInit().
2) Chiamare setLookAndFeel nel costruttore della JApplet
3) Quando viene chiamato il metodo init(), dove vengono istanziati i
componenti, il L&F è già impostato su quello desiderato ed i componenti lo
ereditano direttamente
Devi quindi ripulire il tuo codice così:
1) Elimina le istanziazioni dei componenti dal corpo della classe
spostandole all'inizio di init() o jbInit()
2) Elimina tutte le chiamate a setLookAndFeel e updateComponentTreeUI
(elimina anche la porzione static{...} dal corpo della classe)
3) Chiama setLookAndFeel nel costruttuore della JApplet.
Non escludo che si verifichino altre stranezze dovuto al diverso
comportamento dei vari browser (alcuni fermano le applet quando si cambia
pagina e le reinizializzano al rientro, altri semplicemente le riavviano,
altri ancora ricreano l'istanza), ma in linea di massima così dovrebbe
funzionare a dovere. Buon lavoro!
