正确设置JFileChooser的语言环境

5

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

目标

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

此Locale不一定与主机/操作系统Locale或JVM默认Locale相同。

此外,在调用应用程序时,我不能修改user.language。因此,我必须在运行时执行此操作。

问题

简要概述我的代码,我读取配置文件并获取不同的选项(包括Locale)。之后,我根据这些配置的选项初始化应用程序环境。

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

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个回答

5

看起来是 BasicFileChooserUI 使用的 acceptAllFilter 存在 bug,它没有按照应有的方式查找本地化版本的文本:

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

如果你的模型返回空值,就会使用此默认值。唯一可行的方法(依我之见)是让模型返回一个能够正确处理的筛选器,例如:

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

我刚刚找到了错误的解释。非常感谢您的答案,它比我的更为简洁。我会将您的答案标记为正确的! - Charliemops

1

我也在一个程序中遇到了这个问题,对我来说,在主方法中定义defaultLocale就足够了。

代码如下:

public static void main (String args []){

        Locale.setDefault(Locale.ENGLISH);

在调用Swing中的任何内容之前

1

我在寻找更多信息时发现了这个之前的问题

解释说这可能是一个bug,你必须在修改语言环境之前手动更改UIManager。这意味着需要添加以下行:

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

并且在更改区域设置之后。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接