Cómo cambiar el idioma en tiempo de ejecución en java swing
Frecuentes
Visto 15,328 equipos
16
Intento cambiar la configuración regional en tiempo de ejecución en mi aplicación swing.
Pero no puedo entender cómo se supone que funciona, ¿o no hay un plan maestro?
Solo se me ocurren dos opciones:
1. Reinicie la aplicación, no es la mejor experiencia de usuario.
2. Cree un administrador de localización que pueda registrar/anular el registro de componentes, en caso de cambio, simplemente itere todos los componentes y cambie el texto.
Tanto el 1 como el 2 se sienten incómodos.
Otra información:
Por el momento la orientación no es un objetivo.
La aplicación está ofuscada.
Ejemplo:
LocRes_es.propiedades:
texto1 = texto en inglés
LocRes_ja.propiedades
texto1 = texto en japonés
ChangeLocale.java:
importar java.awt.EventQueue; importar java.awt.FlowLayout; importar java.awt.event.ActionEvent; importar java.awt.event.ActionListener; importar java.util.Locale; importar java.util.ResourceBundle; importar javax.swing.JButton; importar javax.swing.JFrame; importar javax.swing.JLabel; public class ChangeLocale { marco JFrame privado; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ChangeLocale window = new ChangeLocale(); window.frame.setVisible(true); } catch (Exception e ) { e.printStackTrace(); } } }); } public ChangeLocale() { initialize(); } private void initialize() { frame = new JFrame(); marco.setBounds(100, 100, 450, 300); marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 5, 5); marco.getContentPane().setLayout(flowLayout); JButton btnChangeLoc = new JButton("Cambiar configuración regional"); marco.getContentPane().add(btnChangeLoc); final JLabel lblLabel1 = new JLabel("Nueva etiqueta"); marco.getContentPane().add(lblLabel1); Locale.setDefault(new Locale("en")); ResourceBundle r = ResourceBundle.getBundle("LocRes"); lblLabel1.setText(r.getString("texto1")); btnChangeLoc.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Locale.setDefault(new Locale("ja")); ResourceBundle r = ResourceBundle.getBundle("LocRes"); // Iterar manualmente a través de todos los componentes: ( lblLabel1.setText(r.getString("text1")); // } }); } }
4 Respuestas
7
He implementado esto con ResourceBundles y un EventBus.
Cuando se cambia la configuración regional, EventBus dispara un localeChangedEvent
. Todos JFrame
las ventanas que tienen cadenas localizadas deben suscribirse a este evento. También deben implementar un changeLocale()
método que se ejecuta cuando se recibe el evento.
En este método, todas las cadenas se actualizarán a la configuración regional actual.
public void changeLocale(ResourceBundle rb) {
lblLabel1.setText(rb.getString("text1"));
lblLabel2.setText(rb.getString("text2"));
...
}
Respondido 31 Oct 12, 06:10
4
Puedes probar LocaleChangeListener interfaz -
Cambio de configuración regional en tiempo de ejecución en Swing
contestado el 23 de mayo de 17 a las 13:05
4
Definir un GUI
y un cuadro combinado con los idiomas admitidos. Añadir un ItemListener
por lo que cuando se cambia el cuadro combinado, los textos se actualizan.
IdiomaGUIClient.java:
import javax.swing.*;
public class LanguageGUIClient
{
public static void main(String[] arguments) throws Exception
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(() ->
{
LanguageGUI languageGUI = new LanguageGUI();
languageGUI.setVisible(true);
});
}
}
IdiomaGUI.java:
import javax.swing.*;
import java.util.Locale;
import java.util.ResourceBundle;
public class LanguageGUI extends JFrame
{
public static ResourceBundle resourceBundle;
private JPanel rootPanel;
private JComboBox<Locale> languageComboBox;
private JLabel languageLabel;
public LanguageGUI()
{
configureFrameProperties();
}
private void configureFrameProperties()
{
add(rootPanel);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
languageComboBox.addItem(Locale.US);
languageComboBox.addItem(Locale.GERMANY);
languageComboBox.addItem(Locale.FRANCE);
setTexts();
languageComboBox.addItemListener(itemEvent -> setTexts());
setSize(300, 100);
}
private void setTexts()
{
Locale locale = languageComboBox.getItemAt(languageComboBox.getSelectedIndex());
resourceBundle = ResourceBundle.getBundle("Bundle", locale);
setTitle(resourceBundle.getString("application.title"));
languageLabel.setText(resourceBundle.getString("language") + ":");
languageComboBox.setToolTipText(resourceBundle.getString("language.tooltip"));
}
}
Tenga en cuenta que estoy usando IntelliJ's form designer
por lo que el .form
el contenido del archivo también es necesario.
LanguageGUI.form:
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="LanguageGUI">
<grid id="27dc6" binding="rootPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="500" height="400"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="eb651" class="javax.swing.JComboBox" binding="languageComboBox">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<toolTipText value=""/>
</properties>
</component>
<vspacer id="977c1">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="e59f" class="javax.swing.JLabel" binding="languageLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value=""/>
</properties>
</component>
</children>
</grid>
</form>
Además, debe crear los archivos del paquete de recursos respectivos en su directorio de recursos:
El resultado es un GUI
con un cuadro combinado que le permite cambiar el idioma inmediatamente:
Respondido el 29 de junio de 17 a las 00:06
No olvide agregar también la carpeta "recursos" a la ruta de compilación (Eclipse: haga clic con el botón derecho en el proyecto - Propiedades - Ruta de Java Builder - Fuente - Agregar carpeta), de lo contrario habrá una java.util.MissingResourceException: Can't find bundle for base name Bundle, locale en_US
excepción. - neph
2
He hecho algo similar una vez. Aunque mi tarea era más simple: esta era una aplicación de la bandeja del sistema, así que solo tenía que cambiar el texto de los elementos del menú.
Pero en tu caso creo que esto es factible. Primero, evite cadenas codificadas en su capa GUI. Cree una clase que cambie la configuración regional y luego itere sobre todos los marcos visibles y baje a todos los paneles y componentes y cambie el texto escrito en ellos. El único problema que puedo esperar aquí es el texto dibujado en el lienzo.
Respondido 31 Oct 12, 06:10
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java swing localization runtime locale or haz tu propia pregunta.
nunca necesité eso, pero debe haber algunos ejemplos sobre cómo cargar propiedades en HashMap o List - mKorbel