2011-04-20 4 views
5

다음과 같은 문제가 있습니다. 나는 UI 속성을 얻을 필요가 :UI 속성에 일부 키가 없습니다.

문자열 "OK"을 반환하고, 작동
UIManager.getString("OptionPane.okButtonText") 

. 그러나 UIDefaults 키 집합을 반복 할 경우 "OptionPane.okButtonText" 키를 얻지 못합니다. 왜 그런 일이 일어나는 지 아는 사람이 있습니까? 나는 UIDefaults을 3 가지 다른 방법 (UIManager.getDefaults(), UIManager.getLookAndFeel().getDefaults()UIManager.getLookAndFeelDefaults())으로 얻지 만이 중 아무 것도 작동하지 않습니다.

편집 : 나는 또한 클래스 JFileChooserthis list of properties 발견은, 그것은 UIDefaults 키 집합하는 int 표시하지 않는 일부 속성이 포함되어 있습니다. 문제는 프로그래밍 방식으로 모든 속성을 얻는 방법입니다.

편집 : 코드의 예 :

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

코드에 문제가 있습니까? - worksforme – kleopatra

+0

[UIManager 기본값] (http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/) – trashgod

+0

코드를 추가합니다. @trashgod이 사이트에서 코드를 얻습니다 :) – Alberto

답변

4

) 텍스트 속성은 현지화 된 번들에서로드됩니다. com.sun.swing.internal.plaf에서 내부 클래스를 사용하고 있습니다. LAF가 현재 설치되어

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 

독립적있는 : 어쩌면 뭔가

여기 WORKSFORME 코드 조각의 ... 잘못이 것입니다. 내 시스템이 승리/비스타, 내 기본 로케일

편집 : 현지화 된 리소스가 반드시 keys()/entrySet()에 직접 입력되는 것은 아니며, 이는 UIDefaults에서 재정의되지 않는 Hashtable의 메소드입니다 . 따라서 스 니펫에서와 같이 조회가 항상 열거 형 쿼리를 수행해야하지만 잘못된 항목은 없습니다. 그러나 항목은 거기에 없지만 resourceBundles가 제공하는 일부 캐시 된 맵에는 있습니다.

Edit2가이 :

EDIT3 :-) 그 키에 대해 몇 시간 동안 이야기 한 후 확인 (것 생각 ... 분명의 DEF를 추가 : 추가 실험을 위해, 우리는 아마 더 다른 값을 조회한다 로케일간에 "OK"보다 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

+0

이것은 내가 찾고있는 것입니다! 모든 답변을 주셔서 대단히 감사합니다! – Alberto

4

entrySet() 반복시 보지 지역화 된 값을 포함하여이 approach 같이 OptionPane.okButtonText 모든 L & Fs를 아쿠아 사용할 고유 한 특징, 것 같습니다.

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); 
     } 
    } 
} 

콘솔, 맥 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 

콘솔, 윈도우 7 :에서는, OptionPane (뿐만 아니라 Fi를 fileChooser 및 기타 :이 ResourceBundles을에 문제가 될 수

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

+0

@alberto : Windows 7에서'OptionPane.okButtonText' 항목을 보지 않았습니다; 결과가 위에 추가되었습니다. – trashgod

+0

항목을 통해 루프를 많이 이해가되지 않습니다, 내 대답 – kleopatra