2009-03-05 56 views
19

Me gustaría poder cambiar la configuración regional en mi aplicación Swing en tiempo de ejecución y hacer que todos los elementos de texto en la pantalla se actualicen con texto localizado de un ResourceBundle de la nueva configuración regional.Cambiar la configuración regional en tiempo de ejecución en Swing

¿Se puede hacer esto sin personalizar los componentes oscilantes o crear UIDelegates para todos los componentes que manejan la representación de texto localizado?

Si no, ¿cuál es una buena solución que puedo considerar implementar?

+0

respondend aquí: http: // stackoverflow.com/questions/14810454/swing-internationalization-how-to-update-language-at-runtime/30960413 # 30960413 – Heitor

Respuesta

12
  1. Tiene un método que se utiliza para cambiar la configuración regional de la aplicación (y probablemente persista el nuevo valor) y otra para obtener cadenas localizadas.

  2. crear una interfaz:

    interface LocaleChangeListener { 
        void onLocaleChange(); 
    } 
    

    implementarlo por componentes de interfaz que deben ser capaces de cambiar la configuración regional en tiempo de ejecución y establecer los nuevos valores en las anulaciones onLocaleChange().

  3. Ahora, tenga una lista de oyentes que serán notificados sobre el cambio de lugar por el primer método.

+0

Decidimos hacer algo muy similar a esto. Excepto que vamos a utilizar un par de propiedades del sistema y la reflexión para intentar actualizar todos los componentes en la pantalla cuando ocurre el evento. El nivel superior Jpanel escuchará los cambios locales. –

-1

Hay dos enfoques obvios que veo:

En lugar de obtener un String del ResourceBundle, obtener algún tipo de evento de código String soporte. Document sería la solución más pesada, pero cualquier cosa que pueda manejar el reemplazo de un valor inmutable lo hará. En lugar de simplemente configurar el texto en una etiqueta, digamos, tener un método que también configure un oyente. Tenga en cuenta que esta es una solución bastante "pesada".

Como alternativa, tenga un depósito central de oyentes que se activen en un cambio de configuración regional, que cada uno vuelva atrás y vuelva a ejecutar la parte relevante del código de configuración (no duplicar). Para casos comunes en los que tiene, por ejemplo, un JLabel usando literalmente una cadena de recursos, puede combinarlos todos en un solo oyente con un WeakHashMap<JLabel,String>. A veces resulta mejor evitar a muchos pequeños oyentes.

2

Es posible que desee guardar la preferencia de idioma y luego requerir un reinicio de la aplicación para que los cambios surtan efecto.

Luego, debería poder usar Locale.setDefault(Locale.<desired language>); al inicio, antes de procesar la GUI. Eso debería cambiar correctamente su configuración regional, lo que dará como resultado la carga de los archivos .properties deseados.

+0

Esto es lo que haremos si no podemos encontrar algo que se ajuste a la línea de tiempo. Gracias –

+0

El OP quiere algo en tiempo de ejecución. Reiniciar no es una opción. – FaithReaper

16

usa ResourceBundle.getBundle(BUNDLE_NAME).getString(key); para acceder a las cuerdas.

al actualizar la configuración regional predeterminada, p. a través de Locale.setDefault(Locale.GERMAN); clara la caché ResourceBundle: ResourceBundle.clearCache();

la siguiente llamada de ResourceBundle.getBundle(BUNDLE_NAME).getString(key); caso de que el retorno de la cadena localizada de la localización elegida.

+1

Aunque la otra es bastante buena e interesante, creo que esa es la respuesta que debería ser realmente aceptada – Whimusical

+0

En mi caso también tuve que agregar JComponent.setDefaultLocale (Locale.GERMAN); – ktulinho

+0

No puedo verlo funcionar. En realidad, no sé cómo puedes hacer que funcione. – FaithReaper

0

¿Qué tal, al cambiar la configuración regional, hacer un firePropertyChangeEvent ("locale", "..."), luego agregar propertyChangeListener() y registrarlos, dondequiera que se vayan a actualizar las etiquetas y similares?

Cuestiones relacionadas