UI属性不包含某些键

我有以下问题。 我需要获取UI属性:

UIManager.getString("OptionPane.okButtonText") 

返回字符串"OK" ,它的工作原理。 但是,如果我遍历UIDefaults键集,我永远不会得到键"OptionPane.okButtonText" 。 有谁知道它为什么会发生? 我以三种不同的方式获取UIDefaultsUIManager.getDefaults()UIManager.getLookAndFeel().getDefaults()UIManager.getLookAndFeelDefaults() ),但这些都没有。

编辑 :我还找到了类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)); } 

此代码返回打印这些属性 。 键"OptionPane.okButtonText"出现在输出中。

这可能是resourceBundles的一个问题:optionPane(以及fi 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,我的默认语言环境de

编辑:只是为了澄清 – 本地化资源不一定是keys()/ entrySet()中的直接条目,这些是Hashtable中未在UIDefaults中重写的方法。 因此,虽然我的代码片段中的查找应始终有效查询枚举是错误的 – 条目不在那里,但在一些由resourceBundles提供的缓存映射中。

编辑2:添加了确定的def(认为在关于那个键几个小时之后会很明显… 🙂

编辑3:对于进一步的实验,我们应该在Locales中查找一个与“OK”不同的值,fi 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)); } } 

似乎OptionPane.okButtonText是所有L&F中可用的Aqua独有的function ,如使用此方法所示,其中包括在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:

 ***金属javax.swing.plaf.metal.MetalLookAndFeel 636条目
  LAF:OK查找:OK默认值:OK
 *** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1054条目
  LAF:OK查找:OK默认值:OK
 *** CDE / Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550个条目
  LAF:OK查找:OK默认值:OK
 *** Mac OS X com.apple.laf.AquaLookAndFeel 711条目
  LAF:OK查找:OK默认值:OK

控制台,Windows 7:

 ***金属javax.swing.plaf.metal.MetalLookAndFeel 636条目
  LAF:OK查找:OK默认值:OK
 *** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1049条目
  LAF:OK查找:OK默认值:OK
 *** CDE / Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550个条目
  LAF:OK查找:OK默认值:OK
 *** Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel 637条目
  LAF:OK查找:OK默认值:OK
 *** Windows Classic com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel 637条目
  LAF:OK查找:OK默认值:OK