16

自分の swing アプリケーションで、実行時に Locale を変更しようとしています。
しかし、それがどのように機能するのかわかりませんか、それともマスタープランがありませんか?

2 つの選択肢しか考え
られません。1. 最良のユーザー エクスペリエンスではなく、アプリケーションを再起動します。
2. コンポーネントを登録/登録解除できるローカリゼーション マネージャーを作成します。変更時には、すべてのコンポーネントを繰り返してテキストを変更するだけです。

1も2も気持ち悪い。

その他の情報:
現時点では向きはターゲットではありません。
アプリケーションは難読化されています。

例:

LocRes_en.properties:

    text1 = 英語のテキスト

LocRes_ja.properties

    text1 = 日本語テキスト

ChangeLocale.java:

    java.awt.EventQueue をインポートします。
    java.awt.FlowLayout をインポートします。
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    java.util.Locale をインポートします。
    java.util.ResourceBundle をインポートします。

    import javax.swing.JButton;
    javax.swing.JFrame をインポートします。
    javax.swing.JLabel をインポートします。

    パブリック クラス ChangeLocale {

        プライベート JFrame フレーム。

        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    試す {
                        ChangeLocale window = new ChangeLocale();
                        window.frame.setVisible(true);
                    キャッチ(例外e){
                        e.printStackTrace();
                    }
                }
            });
        }

        public ChangeLocale() {
            初期化();
        }

        プライベートボイド初期化(){
            フレーム = 新しい JFrame();
            frame.setBounds(100, 100, 450, 300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 5, 5);
            frame.getContentPane().setLayout(flowLayout);

            JButton btnChangeLoc = new JButton("ロケールの変更");
            frame.getContentPane().add(btnChangeLoc);

            final JLabel lblLabel1 = new JLabel("新しいラベル");
            frame.getContentPane().add(lblLabel1);
            Locale.setDefault(new Locale("en"));
            ResourceBundle r = ResourceBundle.getBundle("LocRes");
            lblLabel1.setText(r.getString("text1"));

            btnChangeLoc.addActionListener(新しいActionListener() {
                public void actionPerformed(ActionEvent e) {
                    Locale.setDefault(new Locale("ja"));
                    ResourceBundle r = ResourceBundle.getBundle("LocRes");
                    // すべてのコンポーネントを手動で繰り返します :(
                    lblLabel1.setText(r.getString("text1"));
                    ///
                }
            });
        }
    }
4

4 に答える 4

7

ResourceBundlesとEventBusを使用してこれを実装しました。

ロケールが変更されると、EventBusは。を起動しますlocaleChangedEventJFrameローカライズされた文字列を持つすべてのウィンドウは、このイベントにサブスクライブする必要があります。changeLocale()また、イベントの受信時に実行されるメソッドを実装する必要があります。

このメソッドでは、すべての文字列が現在のロケールに更新されます。

public void changeLocale(ResourceBundle rb) {
    lblLabel1.setText(rb.getString("text1"));
    lblLabel2.setText(rb.getString("text2"));
    ...
}
于 2012-10-31T06:43:57.717 に答える
4

LocaleChangeListenerインターフェースを試すことができます-

Swingで実行時にロケールを変更する

于 2012-10-31T06:43:21.767 に答える
2

私は一度似たようなことをしたことがあります。私の仕事はもっと単純でしたが、これはシステムトレイアプリケーションだったので、メニュー項目のテキストを変更するだけで済みました。

しかし、あなたの場合、これは実行可能だと思います。まず、GUIレイヤーでハードコードされた文字列を避けます。ロケールを変更してから、表示されているすべてのフレームを繰り返し、すべてのパネルとコンポーネントに移動して、それらに書き込まれているテキストを変更するクラスを作成します。ここで私が期待できる唯一の問題は、キャンバスに描かれたテキストです。

于 2012-10-31T06:38:21.537 に答える