2011-04-20 59 views
5

我有以下问题。我需要一个UI特性:UI属性不包含某些键

UIManager.getString("OptionPane.okButtonText") 

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

编辑:我也发现了类JFileChooserthis list of properties,包含不会出现的int 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"不会出现在输出中。

+0

你的代码有什么问题吗? - 工作组 – kleopatra 2011-04-20 11:20:15

+0

参考[UIManager的默认值](http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/) – trashgod 2011-04-20 12:12:34

+0

我添加代码。 @trashgod我从这个网站:) – Alberto 2011-04-20 12:25:23

回答

4

这可能是把ResourceBundle一个问题:选项窗格(以及网络文件选择器等)文本属性从本地化的bundle中加载。它们(以前并不完全确定是否仍然如此)com.sun.swing.internal.plaf下的内部类。也许什么地方出了错那里...

下面是WORKSFORME片断:这

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中,我的默认语言环境去

编辑:只是为了澄清 - 本地化的资源在关键不一定直接项()/的entrySet(),这些都是在哈希表方法未在UIDefaults的覆盖。所以尽管在我的代码片段中查找应始终查询枚举是错误的 - 这些条目并不存在,但是在由resourceBundles提供的一些缓存映射中。

EDIT2:添加OK(以为会是...明显的Def数小时有关关键:-)

EDIT3交谈后:进一步的实验中,我们或许应该查找哪些不同更值而不是跨越语言环境“fi”,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)); 

     } 
    } 
+0

谢谢澄清。我认为你的分析是正确的,但我没有投票。本地化的资源似乎不出现在UIDefaults的'entrySet()'中。 – trashgod 2011-04-20 18:27:58

+0

这正是我所期待的!非常感谢所有的答案! – Alberto 2011-04-21 21:45:46

4

似乎OptionPane.okButtonText 在所有L个& Fs的独有的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 
+0

但我尝试在Windows 7与系统L&F,如果我用'getString'方法得到属性它工作正常。问题是得到关键_。我认为我们应该得到的所有各种_ComponentClass_ UI和按键诠释这种方式,但如何? – Alberto 2011-04-20 14:38:48

+0

@alberto:我没有看到的'在Windows 7 OptionPane.okButtonText'的条目;以上结果添加。 – trashgod 2011-04-20 14:54:44

+0

不通过条目多大意义,循环,见澄清(希望:-)我的答案 – kleopatra 2011-04-20 15:10:13

相关问题