将语言环境正确设置为JFileChooser

时间:2013-07-03 10:52:39

标签: java swing localization locale jfilechooser

我在运行时更改Locale时遇到了一些问题。

目标

我必须根据配置文件更改我的应用程序语言的Locale。

此语言环境不一定与主机/操作系统语言环境相同,也不一定与JVM默认语言环境相同。

此外,我在调用应用程序时无法修改user.language。然后,我必须在运行时这样做。

问题

总结我的代码,我阅读配置文件并获取不同的选项(包括语言环境)。之后,我根据这些配置选项初始化应用程序环境。

之后,我构建我的框架并启动应用程序生命周期。

public static void main(String[] args) {
    File fichier;
    Ini ini; //Ini4J object
    Modele modele = new Modele(); //My Model class: it stores configuration and other stuff
    try {
        fichier = new File(Modele.CONFIGURATION);
        ini = new Ini(fichier);
        modele.setLocaleLang(ini.get(Modele.LOCALE, Modele.LANG, String.class));
        // read more options
    } catch(InvalidFileFormatException e) {
        // exception processing
    } catch (IOException e) {
        // exception processing
    } finally {
        ini = null;
        fichier = null;
    }

    // More code
    JComponent.setDefaultLocale(modele.getLocaleLang());

    // More initialization code
    MyFrame fenetre = new MyFrame(modele);
    fenetre.visualiser();
}

好吧,在生命周期中,您可以打开文件。显然,我使用JFileChooser来解决这个问题:

JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
jfc.setFileFilter(modele.FILTRE_OUVRIR);
jfc.showOpenDialog(null);

使用配置的区域设置设置的所有文件选择器,但类型选择器不会更改。下图显示了该问题(操作系统区域设置:es_ES,已配置的区域设置:fr_FR):

enter image description here

正如你所看到的,在组合框“Fichiers de type”中:选项用西班牙语而不是法语显示。

有人解释我这个问题吗?我的代码有问题吗?由于我使用的是文件过滤器,可能会出现问题吗?

我感谢你的任何建议。

3 个答案:

答案 0 :(得分:4)

看起来像BasicFileChooserUI使用的acceptAllFilter中的一个错误,它不会查找文本的本地化版本:

// BasicFileChooserUI
/**
 * Returns the default accept all file filter
 */
public FileFilter getAcceptAllFileFilter(JFileChooser fc) {
    return acceptAllFileFilter;
}

// buggy acceptAllFilter: doens't respect locale
protected class AcceptAllFileFilter extends FileFilter {

    public AcceptAllFileFilter() {
    }

    public boolean accept(File f) {
        return true;
    }

    public String getDescription() {
        return UIManager.getString("FileChooser.acceptAllFileFilterText");
    }
}

如果模型返回null,则使用此默认值。唯一的出路(我看到)就是让模型返回一个做正确事情的过滤器,比如f.i。:

protected class AcceptAllFileFilter extends FileFilter {

    private Locale locale;

    public AcceptAllFileFilter(Locale locale) {
        this.locale = locale;
    }

    @Override
    public boolean accept(File f) {
        return true;
    }

    @Override
    public String getDescription() {
        return UIManager.getString("FileChooser.acceptAllFileFilterText", locale);
    }
}

答案 1 :(得分:1)

正在寻找更多信息,我发现了previous question

有人解释说这是一个可能的错误,您必须“手动”更改它,在更改区域设置之前修改UIManager。这意味着,添加以下行:

UIManager.put("FileChooser.acceptAllFileFilterText",
               UIManager.get( "FileChooser.acceptAllFileFilterText", 
                               modele.getLocaleLang()));

更改区域设置后。

答案 2 :(得分:0)

我也在一个程序中偶然发现了这一点,对我来说,在 main 方法中定义 defaultLocale 就足够了。

看起来像这样:

public static void main (String args []){

        Locale.setDefault(Locale.ENGLISH);

在从 Swing 调用任何东西之前