Originariamente inviato da andbin
Le altre soluzioni sono almeno tre:
1) Notificare all'utente che il cambio di lingua avverrà al prossimo avvio della applicazione (ovviamente la lingua devi salvarla in modo persistente da qualche parte, es. file di configurazione o altro). Non è una soluzione tanto brutta quanto sembra. Molte applicazioni multi-lingua fanno così.
2) Senza dover terminare l'applicazione, semplicemente "distruggere" il/i frame/dialog della applicazione (che vuol solo dire chiuderli e farli diventare non più raggiungibili) e poi ricrearli con la nuova lingua.
Chiaramente ci vuole un po' di "logica", nel senso che si tratta di predisporre un possibile "loop" per ricreare la GUI. Ma nulla di complicato.
Interessante, hai previsto tutti i casi possibili, tralasciamo la 3 che è un po' complicata e oltre le mie necessità.
Il primo caso in effetti è semplice da fare e mi risolverebbe numerosi problemi. L'ho già implementato e funziona 
Il secondo caso, che era quello che cercavo, l'ho fatto così (bottone per settare inglese)
codice:
frame.dispose();
ConfigurationProperties.setProperty("LANGUAGE", "en_US");
createAndShowGUI();
In pratica distruggo la finestra, memorizzo la nuova lingua nel mio file di proprietà, ConfigurationProperties è una classe che ho creato con il metodo statico setProperty e infine richiamo la funzione che mi crea la GUI, presente su questo stesso file dove è presente questo codice.
Tuttavia solo la JMenuBar cambia lingua (aggiunta col il codice)
codice:
frame.setJMenuBar(myJMenuBar);
Il resto è tutta una serie di .add tra elementi.
E' come se il dispose non eliminasse tutto ciò che è interno al frame, restano elementi quali JTextArea, JLabel etc.. contenenti testo in italiano. Il dispose non dovrebbe eliminare anche i sottocomponenti del frame?
Altra idea, provo con il codice
codice:
frame.dispose();
ConfigurationProperties.setProperty("LANGUAGE", "en_US");
new MyGUI();
Dove MyGUI è il nome della classe che crea la GUI. Ottengo l'effetto di avere tutti i testi in inglese, ma mi rendo conto di non aver fatto una cosa pulita, essendo ancora vivo il vecchio oggetto MyGUI. Provo allora
codice:
this.finalize();
} catch (Throwable ex) {
Logger.getLogger(MyGUI.class.getName()).log(Level.SEVERE, null, ex);
}
ConfigurationProperties.setProperty("LANGUAGE", "en_US");
new MyGUI();
Il codice funziona, ma non so quanto possa essere corretto. In un oggetto chiamo un finalize su se stesso, e il codice successivo viene eseguito? All'inizio credevo si fermasse il thread che gestisce la GUI nel punto della chiamata a finalize().
Dunque le mie domande sono, perché il dispose non elimina tutto ciò che è interno al frame?
L'ultimo codice postato, con il finalize, è una soluzione corretta?
Ti ringrazio