5

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

UIManager.getString("OptionPane.okButtonText")

返回字符串"OK",它可以工作。但是,如果我遍历UIDefaultskeyset,我永远不会得到 key "OptionPane.okButtonText"。有谁知道为什么会这样?我得到了UIDefaults三种不同的方式(UIManager.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"不出现在输出中。

4

2 回答 2

4

这似乎OptionPane.okButtonText是所有 L&F中 Aqua 独有的功能,如使用这种方法所示,其中包括迭代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 经典 com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel 637 个条目
 LAF:OK 查找:OK 默认值:OK
于 2011-04-20T12:57:32.040 回答
4

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

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

Edit2:添加了 ok 的 def (认为这将是......在谈论了几个小时关于那个键之后很明显:-)

Edit3:为了进一步的实验,我们可能应该在区域设置中查找一个不同于“OK”的值,fi cancelButtonText

编辑 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));

        }
    }
于 2011-04-20T14:49:20.563 回答