UI属性不包含某些键

时间:2011-04-20 11:09:55

标签: java swing properties look-and-feel uimanager

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

UIManager.getString("OptionPane.okButtonText")

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

修改:我还找到类this list of propertiesJFileChooser,其中包含一些未出现在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"不会出现在输出中。

2 个答案:

答案 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));

        }
    }