我有以下问题。我需要获取 UI 属性:
UIManager.getString("OptionPane.okButtonText")
返回字符串 "OK"
,并且它有效。但是,如果我遍历 UIDefaults
键集,我永远不会得到键 "OptionPane.okButtonText"
。有谁知道为什么会这样?我以三种不同的方式获取 UIDefaults
(UIManager.getDefaults()
、UIManager.getLookAndFeel().getDefaults()
和 UIManager .getLookAndFeelDefaults()
),但这些都不起作用。
编辑:我也找到this list of properties类(class) JFileChooser ,其中包含一些未出现在 UIDefaults
键集中的属性。问题是:如何以编程方式获取所有这些属性?
编辑:代码示例:
UIDefaults defaults = UIManager.getDefaults();
String thekey = "OptionPane.okButtonText";
System.out.println(thekey + ": " + UIManager.getString(thekey));
for (Enumeration e = defaults.keys(); e.hasMoreElements();) {
Object key = e.nextElement();
System.out.println(key + ": " + defaults.get(key));
}
此代码返回打印 these properties .键 "OptionPane.okButtonText"
没有出现在输出中。
最佳答案
这可能是 resourceBundles 的问题: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,我默认的locale de
编辑:只是为了澄清 - 本地化资源不一定是 keys()/entrySet() 中的直接条目,这些是 Hashtable 中的方法,它们不会在 UIDefaults 中被覆盖。因此,虽然我的代码片段中的查找应该始终有效,但查询枚举是错误的 - 条目不存在,但在一些由 resourceBundles 提供的缓存 map 中。
Edit2:添加了 ok 的 def(认为这将是……在讨论该键几个小时后显而易见的 :-)
Edit3:为了进一步的实验,我们可能应该查找一个在 Locales 中比“OK”不同的值,f.i.取消按钮文本
编辑 4(重大突破之前的最后一次, promise :-) - 关于“如何找到所有本地化值”,如果不诉诸肮脏的手段(又名:实现细节)是不可能的。我能想到的唯一方法是查看假定加载的资源包,例如
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));
}
}
关于java - UI 属性不包含某些键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5729306/