使用资源包更改标签

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";

然后我就可以做我想做的事了。谢谢,祝你好运!