かなり大きな Swing アプリケーションを国際化しています。すべてのResourceBundle
作業を完了し、次に右から左の向きを試しました。
コマンド ラインから (JVM 引数を介して) Locale を設定するだけで、インスタンス化されたすべてのコンポーネントに反映されると予想していましたが、そうではないようです。デフォルトの Locale は正しい (iw_IL
私のテスト ケースでは) ですが、GridBag などのレイアウトはデフォルトを尊重しません。
メインメソッドでデフォルトを明示的に設定してapplyComponentOrientation
から、親の JFrame にも使用しようとしましたが、これも機能しません。特定の JPanel への適用は機能しますが (GridBag レイアウトの場合)、これは ComboBox などの子コンポーネントには影響しません。
public class TestI18N extends JFrame {
TestI18N() {
super("Test I18N");
//test 1 - set orientation at instantiation, this just affects the border layout not the menu or combos
applyComponentOrientation(ComponentOrientation.getOrientation(Locale.getDefault()));
JComponent comp = (JComponent)getContentPane();
setJMenuBar(getTestMenuBar());
comp.setLayout(new BorderLayout());
JComboBox<String> box1 = new JComboBox<String>(new DefaultComboBoxModel<String>(new String[] {"one", "two", "three"}));
comp.add(box1, BorderLayout.LINE_START);
JComboBox<String> box2 = new JComboBox<String>(new DefaultComboBoxModel<String>(new String[] {"uno", "dos", "tres"}));
comp.add(box2, BorderLayout.LINE_END);
//test 2 - this orients the menu and combo box arrows
//but the renderers are still LTR
applyComponentOrientation(ComponentOrientation.getOrientation(Locale.getDefault()));
}
private JMenuBar getTestMenuBar() {
JMenuBar bar = new JMenuBar();
bar.add(new JMenuItem("Menu item"));
return bar;
}
public static void main(String[] args) {
Locale locale = new Locale("iw", "IL");
Locale.setDefault(locale);
System.out.println("default locale="+Locale.getDefault());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestI18N me = new TestI18N();
me.pack();
me.setVisible(true);
}
});
}
}
「apply」の呼び出しがなければ、すべて正常です (デフォルトのロケールが RTL であるにもかかわらず)。最初の「適用」だけを使用すると、uno ボックスは左側にありますが、メニューとコンボは正常です。2 番目の「適用」を使用すると、メニュー RTL が表示され、コンボ矢印が左側に表示されますが、データは依然として左揃えになっています。では、レンダラーを変更する必要があると思いますか?
これはそれが機能するはずの方法ですか?イスラエルの Windows ボックスで実行していた場合でも、これらすべてを実行する必要がありますか?
ありがとう