国际化,ComponentOrientation和从右到左

时间:2013-06-25 14:34:12

标签: java swing internationalization

我正在国际化一个相当大的Swing应用程序。我完成了所有ResourceBundle工作,接下来尝试了从右到左的工作。

我曾预料到只需从命令行设置Locale(通过JVM参数)就会传播到所有实例化的组件,但事实并非如此。我的默认语言环境是正确的(在我的测试用例中为iw_IL)但GridBag等布局不遵守默认值。

我尝试在main方法中显式设置默认值,然后使用applyComponentOrientation到我的父JFrame,但这也不起作用。应用于特定的JPanel确实有效(对于GridBag布局)但这不会影响子组件,例如ComboBoxes。

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

现在没有“应用”调用,一切正常(尽管默认的Locale是RTL)。如果我只使用第一个“应用”,则uno框位于左侧,但菜单和组合是正常的。使用第二个'apply'我得到菜单RTL,组合箭头在左边,但数据仍然是左对齐的。所以我想现在需要修改渲染器?

这是应该的方式吗?如果我在以色列的Windows机器上运行,我还需要做这一切吗?

由于

0 个答案:

没有答案