UI属性不包含某些键

Alb*_*rto 5 java swing properties look-and-feel uimanager

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

UIManager.getString("OptionPane.okButtonText")
Run Code Online (Sandbox Code Playgroud)

返回字符串"OK",它的工作原理.但是,如果我遍历UIDefaults键集,我永远不会得到密钥"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));
}
Run Code Online (Sandbox Code Playgroud)

此代码返回打印这些属性.密钥"OptionPane.okButtonText"不会出现在输出中.

kle*_*tra 4

这可能是资源包的问题: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
Run Code Online (Sandbox Code Playgroud)

与当前安装的 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));

        }
    }
Run Code Online (Sandbox Code Playgroud)