2009-03-05 16 views
19

Vorrei poter modificare le impostazioni internazionali dell'applicazione Swing in fase di runtime e avere tutti gli elementi di testo sullo schermo che si aggiornano con testo localizzato da un ResourceBundle della nuova locale.Modifica locale in runtime in Swing

Questo può essere fatto senza la personalizzazione dei componenti di rotazione o la creazione di UIDelegati per tutti i componenti che gestiscono il rendering del testo localizzato?

In caso negativo, qual è una buona soluzione che posso considerare implementata?

+0

rispondere qui: http: // stackoverflow.it/questions/14810454/swing-internazionalizzazione-how-to-update-language-at-runtime/30960413 # 30960413 – Heitor

risposta

12
  1. di avere un metodo che viene utilizzato per cambiare locale app (e probabilmente persistono il nuovo valore) e un altro per ottenere le stringhe localizzate.

  2. creare un'interfaccia:

    interface LocaleChangeListener { 
        void onLocaleChange(); 
    } 
    

    attuarla da componenti dell'interfaccia utente che devono essere in grado di cambiare locale in fase di esecuzione e impostare i nuovi valori di override onLocaleChange().

  3. Ora, avere un elenco di listener che verrà notificato sul cambiamento di locale con il primo metodo.

+0

Abbiamo deciso di fare qualcosa di molto simile a questo. Tranne che useremo un paio di proprietà e riflessioni di sistema per tentare di aggiornare tutti i componenti sullo schermo quando si verifica l'evento. Il livello più alto di Jpanel ascolterà le modifiche locali. –

-1

Ci sono due approcci evidenti che vedo:

Invece di ottenere un String dal ResourceBundle, ottenere un qualche tipo di evento-source String titolare. Document sarebbe la soluzione molto pesante, ma tutto ciò che può gestire la sostituzione di un valore immutabile farà. Invece di impostare semplicemente il testo su un'etichetta, ad esempio, disponi di un metodo che imposta anche un listener. Nota, questa piuttosto una soluzione "pesante".

In alternativa, disporre di un repository centrale di listener che viene attivato in una modifica della locale, che quindi restituiscono e rieseguono la parte pertinente del codice di installazione (non duplicare). Per i casi comuni in cui si dispone, ad esempio, di uno JLabel utilizzando una stringa di risorse letteralmente, è possibile combinarli tutti in un listener con un WeakHashMap<JLabel,String>. A volte funziona meglio per evitare un sacco di piccoli ascoltatori.

2

Si consiglia di salvare la preferenza della lingua e quindi di riavviare l'applicazione affinché le modifiche abbiano effetto.

Quindi, si dovrebbe essere in grado di utilizzare Locale.setDefault(Locale.<desired language>); all'avvio, prima di eseguire il rendering della GUI. Questo dovrebbe cambiare correttamente le impostazioni locali, il che comporterà il caricamento dei file .properties desiderati.

+0

Questo è ciò che faremo se non riusciamo a trovare qualcosa che si adatti alla timeline. Grazie –

+0

L'OP desidera qualcosa in fase di runtime. Il riavvio non è un'opzione. – FaithReaper

16

utilizzare ResourceBundle.getBundle(BUNDLE_NAME).getString(key); per accedere alle stringhe.

durante l'aggiornamento delle impostazioni internazionali predefinite, ad es. via Locale.setDefault(Locale.GERMAN); chiara la cache ResourceBundle: ResourceBundle.clearCache();

la prossima chiamata di ResourceBundle.getBundle(BUNDLE_NAME).getString(key); qualora il ritorno la stringa localizzata del Locale prescelto.

+1

Anche se l'altro è abbastanza buono e interessante, penso che sia la risposta che dovrebbe essere veramente accettata – Whimusical

+0

Nel mio caso ho dovuto aggiungere anche questo JComponent.setDefaultLocale (Locale.GERMAN); – ktulinho

+0

Impossibile vederlo funzionare. In realtà non so come puoi farlo funzionare. – FaithReaper

0

Che dire, cambiando locale, eseguire firePropertyChangeEvent ("locale", "..."), quindi aggiungere propertyChangeListener() e registrarli, ogni volta che si devono aggiornare etichette e simili?