Интернационализация в двух классах; пакет ресурсов - PullRequest
0 голосов
/ 05 мая 2018

Я создаю приложение, с двумя классами - два кадра. Пользователь открывает приложение и видит фрейм с 3 Jbuttons, что означает разные языки. При нажатии на одну конкретную кнопку предполагается открыть следующий кадр со всеми метками на выбранном языке. Проблема в том, что он открывается только на одном языке, независимо от того, что я делаю. Я пробовал много решений, но это никогда не работает. Буду признателен за некоторый код, который поможет.

Первый класс, с начальной рамой:

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("labels");

public static void main(String[] args) {
    MainFrame window = new MainFrame();
    window.setLocationRelativeTo(null);
    window.setVisible(true);

}

Я пропустил остальную часть кода специально. Дело в том, что независимо от того, что я вставил в "ResourceBundle resourceBundle = ResourceBundle.getBundle("labels");", он всегда дает мне один и тот же язык для всех кнопок, поэтому я предполагаю, что строки "mainFramePl.resourceBundle = ResourceBundle.getBundle("labels_pl", new Locale ("pl"));" не работают.

1 Ответ

0 голосов
/ 05 мая 2018

Вы устанавливаете метку buttonBackToChooseLanguage в конструкторе MainFrame, прежде чем вы установите resourceBundle в новое значение - во время работы конструктора всегда устанавливается значение ResourceBundle.getBundle("labels").

Так MainFrame выглядит так:

MainFrame(ResourceBundle bundle) {
    resourceBundle = bundle;
    // set up the frame ...
    // set labels using resourceBundle
}

А ваши actionListener выглядят так:

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();  
    }           
});
...