2009-03-05 7 views
19

実行時にSwingアプリケーションのロケールを変更し、画面上のすべてのテキスト要素を新しいロケールのResourceBundleからのローカライズされたテキストで更新できるようにしたいと考えています。Swingで実行時にロケールを変更する

スイングコンポーネントをカスタマイズしたり、ローカライズされたテキストのレンダリングを処理するすべてのコンポーネントに対してUIDelegatesを作成することなくこれを行うことはできますか?

いいえの場合、実装することを検討できる良い解決策は何ですか?

+0

ここに応答してください:http:// stackoverflow。com/questions/14810454/swing-internationalization-how-to-update-language-at-runtime/30960413#30960413 – Heitor

答えて

12
  1. アプリのロケールを変更する(おそらくは新しい値を保持する)方法と、ローカライズした文字列を取得する方法があります。

  2. インターフェースを作成します。

    interface LocaleChangeListener { 
        void onLocaleChange(); 
    } 
    

    は、実行時にロケールを変更して上書きonLocaleChange()で新しい値を設定できるようにする必要があるUIコンポーネントによって、それを実装します。

  3. ここでは、最初の方法でロケールの変更を通知されるリスナーのリストを用意します。

+0

私たちはこれに非常に似た何かをすることに決めました。イベントが発生したときに、システムのプロパティとリフレクションを使用して画面上のすべてのコンポーネントを更新しようとします。トップレベルのJpanelは、ローカルの変更をリッスンします。 –

-1

私が見る2つの明白なアプローチがあります:代わりにResourceBundleからStringを得ることの

、イベント・ソースStringホルダーのいくつかの種類を取得します。 Documentは非常に重い解決策になりますが、不変の値を置き換えることができるものはすべて行います。ラベルにテキストを設定するだけでなく、リスナーを設定するメソッドも用意してください。これは非常に重い解決策です。

また、ロケールの変更に応じて起動されるリスナーの中央リポジトリを用意し、それぞれが元に戻り、セットアップコードの関連部分を再実行します(複製しないでください)。たとえば、JLabelというリソース文字列を文字通り使用している一般的なケースでは、これらすべてを1つのリスナーにまとめてWeakHashMap<JLabel,String>とすることができます。時々、多くの小さなリスナーを避けるほうが効果的です。

2

言語設定を保存してから、変更を有効にするにはアプリを再起動する必要があります。

次に、GUIをレンダリングする前に、起動時にLocale.setDefault(Locale.<desired language>);を使用できるはずです。ロケールを適切に切り替える必要があります。その結果、目的の.propertiesファイルがロードされます。

+0

これはタイムラインに収まるものを考え出すことができない場合に実行します。ありがとう –

+0

OPは実行時に何かをしたいです。再起動はオプションではありません。 – FaithReaper

16

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);を使用して文字列にアクセスします。

デフォルトロケールの更新時など。 Locale.setDefault(Locale.GERMAN); 明確なのResourceBundleキャッシュ経由:ResourceBundle.clearCache();

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);の次呼び出す必要がありますリターン選ばれたロケールのローカライズされた文字列。

+1

もう1つはかなり面白いですが、私はそれが本当に受け入れられるはずの答えだと思っています。 – Whimusical

+0

私の場合は、これも追加しなければなりません。 JComponent.setDefaultLocale(Locale.GERMAN); – ktulinho

+0

動作しないことがあります。実際に私はあなたがどのように動作させることができるのか分かりません。 – FaithReaper

0

ロケールの変更時に、firePropertyChangeEvent( "locale"、 "...")を実行してから、propertyChangeListener()を追加して登録してください。

関連する問題