【问题标题】:UI properties does not contain some keysUI 属性不包含某些键
【发布时间】:2011-08-09 09:57:48
【问题描述】:

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

UIManager.getString("OptionPane.okButtonText")

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

编辑:我还找到了JFileChooser 类的this list of properties,其中包含一些未出现在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" 不会出现在输出中。

【问题讨论】:

  • 您的代码有问题吗? - 工作表
  • 参见。 UIManager Defaults
  • 我添加代码。 @trashgod 我从这个网站得到代码 :)
  • 相对于您系统的默认语言环境,您是否正在做一些不寻常的事情(无论这意味着什么;-)?喜欢使用意大利语默认设置并尝试访问英文版本?
  • ahh - 刚刚注意到“迭代密钥集”:没有意义,这不是它们的存储位置,请参阅我的回答中的说明(并忽略我在这里的最后评论;-)

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


【解决方案1】:

这可能是 resourceBundles 的问题:optionPane(以及 f.i. fileChooser 和其他)文本属性是从本地化包中加载的。它们是(过去是,不完全确定是否仍然如此)com.sun.swing.internal.plaf 下的内部类。也许那里出了点问题......

这是运行形式的 sn-p:

    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中没有被覆盖。因此,虽然我的 sn-p 中的查找应该始终有效,但查询枚举是错误的 - 条目不存在,而是在一些由 resourceBundles 提供的缓存映射中。

Edit2:添加了 ok 的定义(认为这将是......在讨论了几个小时之后就很明显了 :-)

Edit3:为了进一步的实验,我们可能应该在区域设置中查找一个不同于“OK”的值,f.i.取消按钮文本

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

        }
    }

【讨论】:

  • 感谢您的澄清。我认为你的分析是正确的,但我没有选票。本地化资源似乎没有出现在UIDefaults entrySet() 中。
  • 这正是我想要的!非常感谢所有的答案!
【解决方案2】:

OptionPane.okButtonText 似乎是 Aqua 独有的功能 可在所有 L&F 中使用,如使用此 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:

*** 金属 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

【讨论】:

  • 但是我在带有系统 L&F 的 Windows 7 上尝试了它,如果我使用 getString 方法获得该属性,它工作正常。问题是得到所有的钥匙。我认为我们应该以这种方式获取所有各种 ComponentClass UI 和键,但是如何?
  • @alberto:我在 Windows 7 上没有看到 OptionPane.okButtonText 的条目;上面添加的结果。
  • 循环遍历条目没有多大意义,请参阅我的回答的澄清(希望:-)
  • @kleopatra:啊哈,我想我现在明白了;我已使用您的方法更新了此答案以反映我的 Windows 7 和 Mac OS X 结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多