这可能是资源包的问题:optionPane(以及 f.i. fileChooser 和其他)文本属性是从本地化包加载的。它们是(曾经是,不完全确定是否仍然如此)com.sun.swing.internal.plaf 下的内部类。也许那里出了什么问题......
这是有效的片段:
String ok = "OptionPane.okButtonText";
String text = "";
text += " LAF: " + UIManager.getLookAndFeelDefaults().get(ok);
text += " lookup: " + UIManager.get(ok);
text += " default: " + UIManager.getDefaults().get(ok);
System.out.println(text);
// output, whereever I add that:
LAF: OK lookup: OK default: OK
与当前安装的 LAF 无关。我的系统是win/vista,我的默认语言环境
编辑:只是为了澄清 - 本地化资源不一定是 key()/entrySet() 中的直接条目,这些是 Hashtable 中的方法,在 UIDefaults 中不会被覆盖。因此,虽然我的代码片段中的查找应该始终有效,但查询枚举是错误的 - 条目不在那里,而是在由 ResourceBundles 提供的一些缓存映射中。
Edit2:添加了 ok 的 def (认为在谈论该键几个小时后这将是显而易见的:-)
Edit3:为了进一步的实验,我们可能应该查找一个在区域设置中比“OK”不同的值,例如取消按钮文本
编辑4(重大突破前的最后一次,承诺:-) - 至于“如何找到所有本地化值”,如果不诉诸肮脏的手段(又名:实现细节)是不可能的。我能想到的唯一方法是查看已加载的资源包,例如
import com.sun.swing.internal.plaf.basic.resources.basic;
String cancel = "OptionPane.cancelButtonText";
ListResourceBundle bundle = new basic();
for (String key : bundle.keySet()) {
if(cancel.equals(key)) {
System.out.println(key
+ ": " + bundle.getString(key));
}
}