我有以下问题。我需要获取UI属性:
UIManager.getString("OptionPane.okButtonText")
返回字符串"OK"
,它可以正常工作。但是,如果我遍历UIDefaults
键集,我永远不会得到键"OptionPane.okButtonText"
。有谁知道它为什么会发生?我以三种不同的方式获得了UIDefaults
(UIManager.getDefaults()
,UIManager.getLookAndFeel().getDefaults()
和UIManager.getLookAndFeelDefaults()
),但这些都没有。
修改:我还找到类this list of properties的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"
不会出现在输出中。
答案 0 :(得分:4)
OptionPane.okButtonText
似乎是所有L& F中可用的Aqua 特有的功能,如使用此approach所示,其中包含迭代时未见到的本地化值entrySet()
。
import javax.swing.UIDefaults;
import javax.swing.UIManager;
/** @see https://stackoverflow.com/questions/5729306 */
public class OptionPaneDefaults {
public static void main(String[] args) throws Exception {
UIManager.LookAndFeelInfo[] lfa =
UIManager.getInstalledLookAndFeels();
for (UIManager.LookAndFeelInfo lf : lfa) {
UIManager.setLookAndFeel(lf.getClassName());
UIDefaults uid = UIManager.getLookAndFeelDefaults();
System.out.println("***"
+ " " + lf.getName()
+ " " + lf.getClassName()
+ " " + uid.size() + " entries");
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);
}
}
}
控制台,Mac OS X:
*** Metal javax.swing.plaf.metal.MetalLookAndFeel 636 entries LAF: OK lookup: OK default: OK *** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1054 entries LAF: OK lookup: OK default: OK *** CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550 entries LAF: OK lookup: OK default: OK *** Mac OS X com.apple.laf.AquaLookAndFeel 711 entries LAF: OK lookup: OK default: OK
控制台,Windows 7:
*** Metal javax.swing.plaf.metal.MetalLookAndFeel 636 entries LAF: OK lookup: OK default: OK *** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1049 entries LAF: OK lookup: OK default: OK *** CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550 entries LAF: OK lookup: OK default: OK *** Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel 637 entries LAF: OK lookup: OK default: OK *** Windows Classic com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel 637 entries LAF: OK lookup: OK default: OK
答案 1 :(得分:4)
这可能是resourceBundles的一个问题:optionPane(以及f.i. fileChooser和其他)文本属性是从本地化的bundle加载的。 com.sun.swing.internal.plaf下的内部类是(过去不完全确定是否仍然如此)。也许那里出了点问题...
这是workforme的片段:
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,我的默认语言环境
编辑:只是为了澄清 - 本地化资源不一定是keys()/ entrySet()中的直接条目,这些是Hashtable中未在UIDefaults中重写的方法。因此,虽然我的代码片段中的查找应该总是工作查询枚举是错误的 - 条目不在那里,但在一些缓存的地图中由resourceBundles提供。
Edit2:添加了确定的def(认为在谈了几个小时关于那个键之后会很明显: - )
Edit3:对于进一步的实验,我们应该在Locales,f.i中查找一个与“OK”不同的值。 cancelButtonText
编辑4(在重大突破之前的最后一次,承诺:-) - 关于“如何找到所有本地化的值”是不可能的,如果不诉诸于脏手段(又名:实现细节)。我能想到的唯一方法是查看 - 假设 - 加载的resourceBundles,如
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));
}
}