【问题标题】:Set locale properly to a JFileChooser将语言环境正确设置为 JFileChooser
【发布时间】:2013-07-01 00:42:45
【问题描述】:

我在运行时更改语言环境时遇到了一点问题。

目标

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

此语言环境不一定与主机/操作系统语言环境或 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):

如您所见,在“Fichiers de type”组合框中:该选项以西班牙语而不是法语显示。

Colud 有人解释我的问题吗?我的代码有问题吗?可能是因为我使用了文件过滤器造成的问题?

感谢您的任何建议。

【问题讨论】:

    标签: java swing localization locale jfilechooser


    【解决方案1】:

    看起来像 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);
        }
    }
    

    【讨论】:

    • 我刚刚找到了错误解释。非常感谢您的回答,这是一个比我更清洁的解决方案。我会把你的标记为正确的!
    【解决方案2】:

    寻找更多信息我发现了这个previous question。

    解释说这是一个可能的错误,您必须“手动”更改它,在更改语言环境之前修改 UIManager。这意味着,添加以下行:

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

    在更改语言环境之后。

    【讨论】:

      【解决方案3】:

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

      看起来像这样:

      public static void main (String args []){
      
              Locale.setDefault(Locale.ENGLISH);
      

      在从 Swing 调用任何东西之前

      【讨论】:

        猜你喜欢
        • 2022-11-13
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 2010-09-09
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多