PDA

Visualizza la versione completa : [JAVA] aggiornare la lingua settata da radioButton


speriamobene
27-09-2004, 01:11
Salve.
Ho realizzato un menu LANGUAGE in cui è possibile scegliere tra 2 radioButton corrispondenti a INGLESE e ITALIANO che mi consentono di aggiornare le varie label dei pulsanti della mia interfaccia SWING.

Ecco quanto fatto x l'inglese:



public JRadioButtonMenuItem getEnglishRadio() {
if (englishRadio == null) {
englishRadio = new JRadioButtonMenuItem();
englishRadio.setText("English");
englishRadio.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent e) {
if ((e.getPropertyName().equals("enabled"))) {
lang.setActiveLanguage(0);
repaint();
}
}
});
}
return englishRadio;
}



quel "repaint()" l'ho messo xkè vorrei in qualche modo, magari il più elegante, aggiornre tutte la label o i setText delle varibili dell'interfaccia.

Se la setto manualmente in inizializzazione tutto funziona ma come asociare il "cambio" alla selezione del rispettivo Radio??

kateetak
27-09-2004, 14:03
Inceve di chiamare un repaint(), ti costruisci un metodo (changeToEnglish() ad esempio) che all'interno cambia tutte le label che vuoi.

chiaro?

:ciauz:

speriamobene
27-09-2004, 16:43
si, l'avevo pensato... ma son tantissime e poi......... cmq il layout verrebbe spostato dal momento che la lunghezza di alcuni pulsanti cambierà!

qualche situazione + elegante?

speriamobene
29-09-2004, 09:55
ammesso che nello specifico risolvo in questo modo...

...in generale come si può aggiornare un jframe? quale metodo usare?

LeleFT
29-09-2004, 11:09
Credo che la via più semplice sia quella di definire un metodo che ricrea tutti gli oggetti del JFrame. A questo punto, ognivolta che modifichi la lingua, richiami quel metodo che, automaticamente, si va a pescare i dati nuovi con cui costruire gli oggetti.


Ciao. :ciauz:

speriamobene
29-09-2004, 11:20
siccome il metodo costruttore della classe principale (del jframe) non è richiamabile oltre la prima volta, tu mi suggerisci quindi di rinominare quel metodo e di chiamare il metodoB, diciamo, dal costruttore.

in questo modo costruisco bene il jframe e soprattutto posso richiamare il metodo la seconda volta...

beh... la trovo una soluzione interessante, anche se dispendiosa, con l'unico limite "severo":
- ricomincerei tutto daccapo! mi spiego: se ad esempio ho scritto del testo in un campo testo (swing) poi faccio quell'operazione da menu.... pederei tutto il lavoro fatto!! un repaint() farebbe meglio al caso mio... se esistesse... ma esiste qualcosa di indolore?

LeleFT
29-09-2004, 11:30
Non era esattamente quello che intendevo: intendevo "creare un metodo ad hoc" che vada a ricostruire tutti gli oggetti che sono interessati dal cambio di lingua (Labels, principalmente) e vada a modificare le proprieta per quegli oggetti che necessitano solamente di una nuova visualizzazione (pulsanti, generalmente).

La soluzione più rapida sarebbe quella di avere tanti array di stringhe, in modo tale che a posizione uguale nei diversi array corrisponda la stessa lingua (ora non ti posso fare un esempio, perchè stò lavorando su una macchina configurata da cani che mi sballa sempre la tastiera e non si riesce a digitare caratteri speciali, come le parentesi quadre o i due punti, se non tramite COPIA e INCOLLA :D )


Ciao. :ciauz:

speriamobene
29-09-2004, 11:55
ecco la mia soluzione adottata fin qui, dimmi se migliorarla.

non ho usato gli Array in quanto l'indice nn può essere una stringa ma un numero. trovo più mnemonica la chiave stringa. Ho pertanto dichiarato:

private Hashtable h = null;
che vado a popolare a col metodo di inizializzazione in base al valore di lingua restituitomi dal radiobutton del relativo menu language. Per l'inglese ad esempio:
private void initializeEnglish().

Tale metodo contiene:
h = new Hashtable(); e le varie
h.put("idButtonOMsg","EnglishLabel"); per le varie label di pulsanti e di info da restituire.

Quello che tu mi suggerisci, ma anche kateetak nel suo precedente intervento, è questo:
- scrivere un metodo che cambi tutte le label.

Trovo però queste difficoltà non implementative ma diciamo "concettuali":

le label sono tante, considerando tutte le varie voci dei menu. Possibile soluzione "ad hoc": dare come chiave della hashtable il nome della variabile da modificare e utilizzare questo x cambiare le varie label.
Limite alla soluzione appena indicata: il vocabolario della hash table è popolato anche da "messaggi di ritorno" informativi che comunico all'utente in una "labelInfo".
Possibile soluzione al limite: scorrere la hashtable escludendo le chiavi che comincino per "msg" ad esempio...

Ho dei dubbi su questo tipo di implementazione... in quanto cmq dovrei capire che messaggio sto visualizzando nella label info e restituire quello esatto...

arrivato a tutti questi ragionamenti mi blocco e mi chiedo: esiste di meglio? esiste una soluzione più "pulita" (sempre considerando che la mia hashtable potra' arrivare a contenere molte put -un centinaio circa-)?

kateetak
29-09-2004, 13:38
1. Prova ad utilizzare dei file di Bundle che vengono solitamente usati per localizzare delle informazioni.

2. Però resta sempre il fatto che tu vuoi delle label che non cambino dimensione a seconda del testo... questo credo che sia quasi improponibile da gestire.

:ciauz:

speriamobene
29-09-2004, 13:53
no no ovviamente possono cambiare dimensione... nn me ne frega nulla di quello.

quello che voglio è:
1. cambio lingua
2. tutte le label si aggiornino senza mutare quello che "stavo facendo" ossia gli elementi correnti del jframe rimangono tutti.

puoi spiegarmi meglio i file di bundle come fanno e come dovrei impiegarli nel mio problema?

Loading