将语言环境正确设置为JFileChooser

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

目标

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

此语言环境不一定与主机/ OS语言环境和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):

在此处输入图像描述

如您所见,在combobox“Fichiers de type”中:选项以西class牙语而非法语显示。

Colud有人解释我的问题? 我的代码有问题吗? 由于我使用文件filter可能是一个问题?

我感谢你的任何建议。

看起来像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,则使用此默认值。 唯一的出路(我看到)就是让模型返回一个filter来做正确的事情,比如fi:

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

寻找更多信息我发现了上一个问题 。

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

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

并在更改区域设置后。