Dynamiczna zmiana tekstów Swing

0

Witam

Mam JFrame i 2 pliki properties w języku PL i EN.
W JFrame poprzez kliknięcie jednego z dwóch przycisków chciałbym zmienić język z jednego na drugi, jeden przycick do PL drugi do EN.
I tutaj moje pytanie. Jak odświeżyć JFrame, tak aby wszystkie znajdujące się w nim komponenty automatycznie pobrały odpowiedni język?

Nie wklejam całego kodu tylko wybrane fragmenty odnoszące się do tej sprawy.

 
static private ResourceBundle rb = ResourceBundle.getBundle("Budget.sources.lang_pl_PL");

btnPolish.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				setProperFlagIcon("pl");
			}
		});

public void setProperFlagIcon(String l) {
		if (l == "pl") {
			rb = ResourceBundle.getBundle("Budget.sources.lang_pl_PL");
			System.out.println(rb.getString("language"));
			buttonsPanel.repaint();
		} else if (l == "en") {
			rb = ResourceBundle.getBundle("Budget.sources.lang_en_EN");
			System.out.println(rb.getString("language"));
			buttonsPanel.repaint();

Nie chce ustawiać wszystkich komponentów oddzielnie poprzez setText(), Tylko jedną metodą grupowo to zrobić da się?
Co powinno być zamiast buttonsPanel.repaint(); ?
Zaznaczę, że System.out.println(rb.getString("language")); wyświetla poprawną nazwę w danym języku.

0

Wydaje mi się że inaczej niż przez setText się nie da. Ale z drugiej strony możesz przecież zrobić listę funkcji które mają zmieniać tekst jednego elementu tekst i robić to w kilku linijkach.

        //1) Stworzenie jakichś kontrolerk
        JButton button = new JButton();
        JLabel label = new JLabel();

        //2) Dodanie metod zmieniających tekst do listy        
        List<Consumer<ResourceBundle>> i18nList= new ArrayList<>();
        i18nList.add(rb -> button.setText(rb.getString("keyOfButtonText")));
        i18nList.add(rb -> label.setText(rb.getString("keyOfLabelText")));
        
        
        //3) Podmiana wszystkich tekstów na te z bundla
        i18nList.forEach(resourceBundleConsumer -> resourceBundleConsumer.accept(rb));

Przy czym, zauważ że punkt 1 i tak gdzieś tam robisz. Punkt 2 będzie się rozrastał wraz z listą wszystkich kontrolek. Możesz zrobić też osobny value class dla tego typu list i zrobić metody które będą wprost dodawać różne typy kontrolek (setText na JLabel to nie jest to samo co setText na JButton :/). Punkt 3 będzie zawsze stały i zmieści się w jednej linijce.

@Edit wersja z value class

    public class I18N {
        List<Consumer<ResourceBundle>> value = new ArrayList<>();

        public I18N add(JLabel component, String key) {
            value.add(rb -> component.setText(rb.getString(key)));
            return this;
        }

        public I18N add(JButton component, String key) {
            value.add(rb -> component.setText(rb.getString(key)));
            return this;
        }

        public void changeTexts(ResourceBundle rb) {
            value.forEach(resourceBundleConsumer -> resourceBundleConsumer.accept(rb));
        }
    }
        //1) Stworzenie jakichś kontrolerk
        JButton button = new JButton();
        JLabel label = new JLabel();

        //2) Dodanie metod zmieniających tekst do listy   
        I18N i18n = new I18N();
        i18n.add(button, "buttonKey")
            .add(label, "labelKey");

        //3) Podmiana wszystkich tekstów na te z bundla
        i18n.changeTexts(rb);
0

Dzięki za odp. Ale myślę, że musi być jakiś rozsądniejszy sposób, no bo co jeżeli moja aplikacja ma 20 buttonów, przy nich 20 labelów, itp, i każdego z nich mam tak ręcznie ustawiać?

0

@mevius Zrób kolekcję dla słów w danym języku i powiąż je z określonym kontrolerem (tj. label, button itp.). Potem przy kliknięciu przycisku zmieniającego język iteruj po kolekcji i ustawiaj tekst w kontrolerach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1