使用资源包更改标签
Changing labels with resource bundle
我正在编写一个 Java 应用程序,我只是卡在了一个点上。我想制作一个带有菜单项语言的菜单,这显然会通过单击所需语言来更改应用程序的语言。为此,我编写了两个 .properties 文件:一个名为 LabelsBundle(英语)的默认文件和一个名为 LabelsBundle_de(德语)的扩展名。我有这样的 class:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;
public class MenuBar extends JFrame implements ActionListener
{
private JMenuBar menuBar;
private JMenu language, about;
private JMenuItem UKLang, DELang, FRLang, ESPLang, POLLang;
private ResourceBundle labels;
private Locale currentLocale;
public MenuBar()
{
menuBar = new JMenuBar();
language = new JMenu("Language");
about = new JMenu("About");
UKLang = new JMenuItem("English");
DELang = new JMenuItem("German");
FRLang = new JMenuItem("French");
//ESPLang = new JMenuItem("Spanish");
POLLang = new JMenuItem("Polish");
UKLang.addActionListener(this);
DELang.addActionListener(this);
language.add(UKLang);
language.add(DELang);
language.add(FRLang);
language.add(POLLang);
menuBar.add(Box.createVerticalGlue());
menuBar.add(language);
menuBar.add(about);
}
public JMenuBar getMenu()
{
return menuBar;
}
@Override
public void actionPerformed(ActionEvent e)
{
Object input = e.getSource();
if(input == UKLang)
{
currentLocale = new Locale("en");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == DELang)
{
currentLocale = new Locale("de");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == FRLang)
{
currentLocale = new Locale("fr");
labels = ResourceBundle.getBundle("LabelsBundle_fr", currentLocale);
}
else if(input == POLLang)
{
currentLocale = new Locale("pl");
labels = ResourceBundle.getBundle("LabelsBundle_pol", currentLocale);
}
}
}
而且我不知道下一步该做什么。我的伙伴告诉我
object.setText(resourceBundle.getString("blabla"));
但我真的不知道如何将它与类似这样的东西一起使用
resultWaveLabel = new JLabel("Result wave:");
我假设我需要写一些类似
的东西
resultWaveLabel.setText(...);
我说得对吗?
顺便说一下,当我在菜单列表中单击德语时收到错误消息
Exception in thread "AWT-EventQueue-0" java.util.MissingResourceException: Can't find bundle for base name LabelsBundle, locale de
编辑:我想强调的是,主要问题是如何更改上述内容的标签——而不是消除上述错误。已经解决了
异常
此输出是预期的,因为您的项目中没有名为“LabelsBundle”的资源文件或
如果资源文件存在,但所需资源不存在,也会出现同样的情况。
此外,将名为 LabelsBundle.properties 的资源文件和您想要的任何资源放在与 MenuBar
class 相同的目录中。意味着 java 文件和属性文件应该在同一目录中。
如果此 java 文件和属性文件在一个包中,您必须提供加载它的完全限定路径
例如,如果属性文件位于名为 newpackage 的包中,那么您应该像这样加载资源
ResourceBundle.getBundle("newpackage.LabelsBundle", currentLocale);
设置标签值
参考这个link。更详细
将 ResourceBundle 分配给变量后(您的情况是 labels
)只需将
resultWaveLabel.setText(labels.getString("blabla"));
更准确地说
@Override
public void actionPerformed(ActionEvent e)
{
Object input = e.getSource();
if(input == UKLang)
{
currentLocale = new Locale("en");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == DELang)
{
currentLocale = new Locale("de");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == FRLang)
{
currentLocale = new Locale("fr");
labels = ResourceBundle.getBundle("LabelsBundle_fr", currentLocale);
}
else if(input == POLLang)
{
currentLocale = new Locale("pl");
labels = ResourceBundle.getBundle("LabelsBundle_pol", currentLocale);
}
//Here you go. the magical code to do that
resultWaveLabel.setText(labels.getString("blabla"));///Here that's it your label is updated with the text
}
作为在 Madhan 的帮助下对我自己的问题的回答,我的 class 现在看起来像这样(Sounds 是另一个 class 的名字!):
package GuitarPro;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;
public class MenuBar extends JFrame implements ActionListener
{
private JMenuBar menuBar;
private JMenu language, program;
private JMenuItem UKLang, DELang, FRLang, ESPLang, POLLang, RUSLang, about, exit;
private ResourceBundle labels;
private Locale currentLocale;
private String aboutApplication;
public MenuBar()
{
menuBar = new JMenuBar();
language = new JMenu("Language");
program = new JMenu("Program");
UKLang = new JMenuItem("English");
DELang = new JMenuItem("German");
FRLang = new JMenuItem("French");
ESPLang = new JMenuItem("Spanish");
POLLang = new JMenuItem("Polish");
RUSLang = new JMenuItem("Russian");
exit = new JMenuItem("Exit");
about = new JMenuItem("About");
UKLang.addActionListener(this);
DELang.addActionListener(this);
POLLang.addActionListener(this);
FRLang.addActionListener(this);
ESPLang.addActionListener(this);
RUSLang.addActionListener(this);
about.addActionListener(this);
exit.addActionListener(this);
language.add(UKLang);
language.add(DELang);
language.add(FRLang);
language.add(POLLang);
language.add(ESPLang);
language.add(RUSLang);
program.add(about);
program.add(exit);
menuBar.add(Box.createVerticalGlue());
menuBar.add(program);
menuBar.add(language);
}
public JMenuBar getMenu()
{
return menuBar;
}
public void setLanguage()
{
Sounds.amplitudeLabel.setText(labels.getString("amplitude_label"));
Sounds.frequencyLabel.setText(labels.getString("frequency_label"));
Sounds.phaseLabel.setText(labels.getString("phase_label"));
Sounds.componentWavesLabel.setText(labels.getString("component_waves_label"));
Sounds.resultWaveLabel.setText(labels.getString("result_wave_label"));
Sounds.play.setText(labels.getString("play_button"));
Sounds.playTriade.setText(labels.getString("play_triade_button"));
Sounds.saveImage.setText(labels.getString("save_image_button"));
Sounds.saveWave.setText(labels.getString("save_sample_button"));
Sounds.info_message = labels.getString("save_success_message");
Sounds.err_message = labels.getString("save_error_message");
Sounds.wave_1 = labels.getString("wave_1");
Sounds.wave_2 = labels.getString("wave_2");
Sounds.wave_3 = labels.getString("wave_3");
aboutApplication = labels.getString("about");
}
@Override
public void actionPerformed(ActionEvent e)
{
Object input = e.getSource();
if(input == UKLang)
{
currentLocale = new Locale("en");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_en", currentLocale);
setLanguage();
}
else if(input == DELang)
{
currentLocale = new Locale("de");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_de", currentLocale);
setLanguage();
}
else if(input == FRLang)
{
currentLocale = new Locale("fr");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_fr", currentLocale);
setLanguage();
}
else if(input == POLLang)
{
currentLocale = new Locale("pl");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_pl", currentLocale);
setLanguage();
}
else if(input == ESPLang)
{
currentLocale = new Locale("esp");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_esp", currentLocale);
setLanguage();
}
else if(input == RUSLang)
{
currentLocale = new Locale("rus");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_rus", currentLocale);
setLanguage();
}
else if(input == about)
JOptionPane.showMessageDialog(null, aboutApplication);
else if(input == exit)
dispose();
}
}
我的一个包资源文件如下所示:
# This is the default LabelsBundle.properties file
amplitude_label = Amplitude
frequency_label = Frequency (Hz)
phase_label = Phase (Degrees)
component_waves_label = Component Waves
result_wave_label = Result Wave
play_button = Play
play_triade_button = Play Triad
save_image_button = Save Image
save_sample_button = Save Sample
save_success_message = File saved successfully
save_error_message = File could not be saved
wave_1 = Wave 1
wave_2 = Wave 2
wave_3 = Wave 3
about = test
为此,我必须将其他 classes 中的所有对象设为静态:
public static JLabel amplitudeLabel, frequencyLabel, phaseLabel, componentWavesLabel, resultWaveLabel;
public static JButton play, playTriade, saveImage, saveWave;
public static String info_message = "File saved successfully";
public static String err_message = "File could not be saved";
public static String wave_1 = "Wave 1";
public static String wave_2 = "Wave 2";
public static String wave_3 = "Wave 3";
然后我就可以做我想做的事了。谢谢,祝你好运!
我正在编写一个 Java 应用程序,我只是卡在了一个点上。我想制作一个带有菜单项语言的菜单,这显然会通过单击所需语言来更改应用程序的语言。为此,我编写了两个 .properties 文件:一个名为 LabelsBundle(英语)的默认文件和一个名为 LabelsBundle_de(德语)的扩展名。我有这样的 class:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;
public class MenuBar extends JFrame implements ActionListener
{
private JMenuBar menuBar;
private JMenu language, about;
private JMenuItem UKLang, DELang, FRLang, ESPLang, POLLang;
private ResourceBundle labels;
private Locale currentLocale;
public MenuBar()
{
menuBar = new JMenuBar();
language = new JMenu("Language");
about = new JMenu("About");
UKLang = new JMenuItem("English");
DELang = new JMenuItem("German");
FRLang = new JMenuItem("French");
//ESPLang = new JMenuItem("Spanish");
POLLang = new JMenuItem("Polish");
UKLang.addActionListener(this);
DELang.addActionListener(this);
language.add(UKLang);
language.add(DELang);
language.add(FRLang);
language.add(POLLang);
menuBar.add(Box.createVerticalGlue());
menuBar.add(language);
menuBar.add(about);
}
public JMenuBar getMenu()
{
return menuBar;
}
@Override
public void actionPerformed(ActionEvent e)
{
Object input = e.getSource();
if(input == UKLang)
{
currentLocale = new Locale("en");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == DELang)
{
currentLocale = new Locale("de");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == FRLang)
{
currentLocale = new Locale("fr");
labels = ResourceBundle.getBundle("LabelsBundle_fr", currentLocale);
}
else if(input == POLLang)
{
currentLocale = new Locale("pl");
labels = ResourceBundle.getBundle("LabelsBundle_pol", currentLocale);
}
}
}
而且我不知道下一步该做什么。我的伙伴告诉我
object.setText(resourceBundle.getString("blabla"));
但我真的不知道如何将它与类似这样的东西一起使用
resultWaveLabel = new JLabel("Result wave:");
我假设我需要写一些类似
的东西resultWaveLabel.setText(...);
我说得对吗?
顺便说一下,当我在菜单列表中单击德语时收到错误消息
Exception in thread "AWT-EventQueue-0" java.util.MissingResourceException: Can't find bundle for base name LabelsBundle, locale de
编辑:我想强调的是,主要问题是如何更改上述内容的标签——而不是消除上述错误。已经解决了
异常
此输出是预期的,因为您的项目中没有名为“LabelsBundle”的资源文件或
如果资源文件存在,但所需资源不存在,也会出现同样的情况。
此外,将名为 LabelsBundle.properties 的资源文件和您想要的任何资源放在与 MenuBar
class 相同的目录中。意味着 java 文件和属性文件应该在同一目录中。
如果此 java 文件和属性文件在一个包中,您必须提供加载它的完全限定路径
例如,如果属性文件位于名为 newpackage 的包中,那么您应该像这样加载资源
ResourceBundle.getBundle("newpackage.LabelsBundle", currentLocale);
设置标签值
参考这个link。更详细
将 ResourceBundle 分配给变量后(您的情况是 labels
)只需将
resultWaveLabel.setText(labels.getString("blabla"));
更准确地说
@Override
public void actionPerformed(ActionEvent e)
{
Object input = e.getSource();
if(input == UKLang)
{
currentLocale = new Locale("en");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == DELang)
{
currentLocale = new Locale("de");
labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
}
else if(input == FRLang)
{
currentLocale = new Locale("fr");
labels = ResourceBundle.getBundle("LabelsBundle_fr", currentLocale);
}
else if(input == POLLang)
{
currentLocale = new Locale("pl");
labels = ResourceBundle.getBundle("LabelsBundle_pol", currentLocale);
}
//Here you go. the magical code to do that
resultWaveLabel.setText(labels.getString("blabla"));///Here that's it your label is updated with the text
}
作为在 Madhan 的帮助下对我自己的问题的回答,我的 class 现在看起来像这样(Sounds 是另一个 class 的名字!):
package GuitarPro;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;
public class MenuBar extends JFrame implements ActionListener
{
private JMenuBar menuBar;
private JMenu language, program;
private JMenuItem UKLang, DELang, FRLang, ESPLang, POLLang, RUSLang, about, exit;
private ResourceBundle labels;
private Locale currentLocale;
private String aboutApplication;
public MenuBar()
{
menuBar = new JMenuBar();
language = new JMenu("Language");
program = new JMenu("Program");
UKLang = new JMenuItem("English");
DELang = new JMenuItem("German");
FRLang = new JMenuItem("French");
ESPLang = new JMenuItem("Spanish");
POLLang = new JMenuItem("Polish");
RUSLang = new JMenuItem("Russian");
exit = new JMenuItem("Exit");
about = new JMenuItem("About");
UKLang.addActionListener(this);
DELang.addActionListener(this);
POLLang.addActionListener(this);
FRLang.addActionListener(this);
ESPLang.addActionListener(this);
RUSLang.addActionListener(this);
about.addActionListener(this);
exit.addActionListener(this);
language.add(UKLang);
language.add(DELang);
language.add(FRLang);
language.add(POLLang);
language.add(ESPLang);
language.add(RUSLang);
program.add(about);
program.add(exit);
menuBar.add(Box.createVerticalGlue());
menuBar.add(program);
menuBar.add(language);
}
public JMenuBar getMenu()
{
return menuBar;
}
public void setLanguage()
{
Sounds.amplitudeLabel.setText(labels.getString("amplitude_label"));
Sounds.frequencyLabel.setText(labels.getString("frequency_label"));
Sounds.phaseLabel.setText(labels.getString("phase_label"));
Sounds.componentWavesLabel.setText(labels.getString("component_waves_label"));
Sounds.resultWaveLabel.setText(labels.getString("result_wave_label"));
Sounds.play.setText(labels.getString("play_button"));
Sounds.playTriade.setText(labels.getString("play_triade_button"));
Sounds.saveImage.setText(labels.getString("save_image_button"));
Sounds.saveWave.setText(labels.getString("save_sample_button"));
Sounds.info_message = labels.getString("save_success_message");
Sounds.err_message = labels.getString("save_error_message");
Sounds.wave_1 = labels.getString("wave_1");
Sounds.wave_2 = labels.getString("wave_2");
Sounds.wave_3 = labels.getString("wave_3");
aboutApplication = labels.getString("about");
}
@Override
public void actionPerformed(ActionEvent e)
{
Object input = e.getSource();
if(input == UKLang)
{
currentLocale = new Locale("en");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_en", currentLocale);
setLanguage();
}
else if(input == DELang)
{
currentLocale = new Locale("de");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_de", currentLocale);
setLanguage();
}
else if(input == FRLang)
{
currentLocale = new Locale("fr");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_fr", currentLocale);
setLanguage();
}
else if(input == POLLang)
{
currentLocale = new Locale("pl");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_pl", currentLocale);
setLanguage();
}
else if(input == ESPLang)
{
currentLocale = new Locale("esp");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_esp", currentLocale);
setLanguage();
}
else if(input == RUSLang)
{
currentLocale = new Locale("rus");
labels = ResourceBundle.getBundle("GuitarPro.LabelsBundle_rus", currentLocale);
setLanguage();
}
else if(input == about)
JOptionPane.showMessageDialog(null, aboutApplication);
else if(input == exit)
dispose();
}
}
我的一个包资源文件如下所示:
# This is the default LabelsBundle.properties file
amplitude_label = Amplitude
frequency_label = Frequency (Hz)
phase_label = Phase (Degrees)
component_waves_label = Component Waves
result_wave_label = Result Wave
play_button = Play
play_triade_button = Play Triad
save_image_button = Save Image
save_sample_button = Save Sample
save_success_message = File saved successfully
save_error_message = File could not be saved
wave_1 = Wave 1
wave_2 = Wave 2
wave_3 = Wave 3
about = test
为此,我必须将其他 classes 中的所有对象设为静态:
public static JLabel amplitudeLabel, frequencyLabel, phaseLabel, componentWavesLabel, resultWaveLabel;
public static JButton play, playTriade, saveImage, saveWave;
public static String info_message = "File saved successfully";
public static String err_message = "File could not be saved";
public static String wave_1 = "Wave 1";
public static String wave_2 = "Wave 2";
public static String wave_3 = "Wave 3";
然后我就可以做我想做的事了。谢谢,祝你好运!