[英]Set locale properly to a JFileChooser
我在运行时更改区域设置时遇到了一个小问题。
目标
我必须根据配置文件更改应用程序语言的区域设置。
此语言环境不一定与主机/操作系统语言环境或 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);
它使用配置的语言环境设置了所有文件选择器,但类型选择器不会更改。 下图显示了问题(OS Locale:es_ES,配置的locale:fr_FR):
如您所见,在“Fichiers de type”组合框中:该选项以西班牙语而不是法语显示。
Colud有人向我解释这个问题吗? 我的代码有问题吗? 由于我正在使用文件过滤器,这可能是一个问题吗?
我感谢你的任何建议。
看起来像是 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,则使用此默认值。 唯一的出路(我看到的)是让模型返回一个做正确事情的过滤器,比如 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()));
并在更改语言环境后。
我也在一个程序中偶然发现了这个,对我来说,在 main 方法中定义 defaultLocale 就足够了。
看起来像这样:
public static void main (String args []){
Locale.setDefault(Locale.ENGLISH);
在从 Swing 调用任何东西之前
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.