Java 两级国际化;资源绑定

Java 两级国际化;资源绑定,java,internationalization,jbutton,resourcebundle,Java,Internationalization,Jbutton,Resourcebundle,我正在创建一个应用程序,有两个类-两个框架。用户打开应用程序,看到带有3个按钮的框架,这意味着不同的语言。当点击一个特定的按钮时,它应该打开下一个框架,其中包含所选语言的所有标签。问题是,无论我做什么,它都只以一种语言打开。我尝试了很多解决方案,但都不管用。我会很感激一些代码,什么会有帮助 第一类,带起始帧: import java.awt.*; import java.awt.event.*; import java.util.Locale; import java.util.Resource

我正在创建一个应用程序,有两个类-两个框架。用户打开应用程序,看到带有3个按钮的框架,这意味着不同的语言。当点击一个特定的按钮时,它应该打开下一个框架,其中包含所选语言的所有标签。问题是,无论我做什么,它都只以一种语言打开。我尝试了很多解决方案,但都不管用。我会很感激一些代码,什么会有帮助

第一类,带起始帧:

import java.awt.*;
import java.awt.event.*;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.*;
public class StartFrame extends JFrame {
public StartFrame() {
    setSize(480,360);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    panelFlags = new JPanel();

    this.add(panelFlags);
    panelFlags.setBackground(Color.white);
    buttonFlagPl= new JButton(new ImageIcon(((new ImageIcon("x.png")).getImage()).getScaledInstance(100, 75, java.awt.Image.SCALE_SMOOTH)));
    buttonFlagEn = new JButton(new ImageIcon(((new ImageIcon("y.jpg")).getImage()).getScaledInstance(100, 75, java.awt.Image.SCALE_SMOOTH)));
    buttonFlagDe = new JButton(new ImageIcon(((new ImageIcon("z.jpg")).getImage()).getScaledInstance(100, 75, java.awt.Image.SCALE_SMOOTH)));
    buttonFlagPl.setPreferredSize(new Dimension(100, 75));
    buttonFlagEn.setPreferredSize(new Dimension(100, 75));
    buttonFlagDe.setPreferredSize(new Dimension(100, 75));

    panelFlags.add(buttonFlagPl);
    panelFlags.add(buttonFlagEn);
    panelFlags.add(buttonFlagDe);


    buttonFlagPl.addActionListener (new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            MainFrame mainFramePl= new MainFrame();
            mainFramePl.setVisible(true);
            mainFramePl.setLocationRelativeTo(null);
            mainFramePl.resourceBundle = ResourceBundle.getBundle("labels_pl", new Locale ("pl"));
            dispose();  
        }           
    });

    buttonFlagEn.addActionListener (new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            MainFrame mainFrameEn = new MainFrame();
            mainFrameEn.setVisible(true);
            mainFrameEn.setLocationRelativeTo(null);
            mainFrameEn.resourceBundle = ResourceBundle.getBundle("labels_en",new Locale ("en"));
            dispose();  
        }           
    });

    buttonFlagDe.addActionListener (new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            MainFrame mainFrameDe = new MainFrame();
            mainFrameDe.setVisible(true);
            mainFrameDe.setLocationRelativeTo(null);
            mainFrameDe.resourceBundle =  ResourceBundle.getBundle("labels_de",new Locale ("de"));
            dispose();  
        }           
    });
}

JPanel panelFlags;
JButton buttonFlagPl;
JButton buttonFlagEn; 
JButton buttonFlagDe; 

public static void main(String[] args) {
    StartFrame startFrame = new StartFrame();
    startFrame.setVisible(true);
    startFrame.setLocationRelativeTo(null);     
}
}
这是带有主框架的部分:

public class MainFrame extends JFrame {
public MainFrame(){
    super();
    setSize(1000,640);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
mainPanel = new JPanel(new FlowLayout(500,200,5));
    mainPanelColor = new Color (200,200,230);
    mainPanel.setBackground(mainPanelColor);
    buttonBackToChooseLanguage = new JButton();
 buttonBackToChooseLanguage.setText((resourceBundle).getString("button.back"));
(……)


我故意错过了代码的其余部分。问题是,无论我在
“ResourceBundle ResourceBundle=ResourceBundle.getBundle(“标签”);”
中输入什么,它总是为所有按钮提供一种相同的语言,因此我假设,
“mainFramePl.ResourceBundle=ResourceBundle.getBundle(“标签”),新语言环境(“pl”);“
行不起作用

在将
resourceBundle
设置为新值之前,您要在
大型机
构造函数中设置
按钮backtochooselanguage
的标签——在构造函数运行时,它总是设置为
resourceBundle.getBundle(“标签”)

因此,
大型机
看起来像:

MainFrame(ResourceBundle bundle) {
    resourceBundle = bundle;
    // set up the frame ...
    // set labels using resourceBundle
}
您的actionListeners看起来像:

buttonFlagDe.addActionListener (new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        MainFrame mainFrameDe = new MainFrame(ResourceBundle.getBundle("labels_de",new Locale ("de")));
        mainFrameDe.setVisible(true);
        mainFrameDe.setLocationRelativeTo(null);
        dispose();  
    }           
});

请告诉我,我该怎么办?将资源束的名称传递给大型机构造函数,并在从构造函数中获取任何标签之前在构造函数中初始化
resourceBundle
。但是传递
resourceBundle resourceBundle=resourceBundle.getBundle(“标签”)将使其在
mainFrameEn.resourceBundle=resourceBundle.getBundle(“labels_en”,new Locale(“en”))中对StartFrame不可见好的,我刚刚想好了。但还有一个问题——这意味着什么:“在获得任何标签之前,在构造函数中初始化resourceBundle…”。用什么初始化?我仍然得到一种相同的语言,
mainFrameEn.resourceBundle=resourceBundle.getBundle(“labels_en”,newlocale(“en”)不工作。请你解释一下,好吗?我已经编辑了我的答案来解释你到底需要做什么
buttonFlagDe.addActionListener (new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        MainFrame mainFrameDe = new MainFrame(ResourceBundle.getBundle("labels_de",new Locale ("de")));
        mainFrameDe.setVisible(true);
        mainFrameDe.setLocationRelativeTo(null);
        dispose();  
    }           
});