2011-04-20 61 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

相關問題