5

次の問題があります。UIプロパティを取得する必要があります:

UIManager.getString("OptionPane.okButtonText")

それは文字列を返し、"OK"それは機能します。ただし、キーセットを反復処理すると、UIDefaultsキーを取得できません"OptionPane.okButtonText"。なぜそれが起こるのか誰かが知っていますか?私UIDefaultsは3つの異なる方法(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));
}

このコードは、これらのプロパティを出力します。キー"OptionPane.okButtonText"は出力に表示されません。

4

2 に答える 2

4

を反復処理したときに見られないローカライズされた値を含むこのアプローチを使用して示されているように、すべてのL&Fで使用可能なAquaに固有の機能OptionPane.okButtonTextあるように見えます。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.MetalLookAndFeel636エントリ
 LAF:OKルックアップ:OKデフォルト:OK
*** Nimbuscom.sun.java.swing.plaf.nimbus.NimbusLookAndFeel1054エントリ
 LAF:OKルックアップ:OKデフォルト:OK
*** CDE / Motifcom.sun.java.swing.plaf.motif.MotifLookAndFeel550エントリ
 LAF:OKルックアップ:OKデフォルト:OK
*** Mac OS Xcom.apple.laf.AquaLookAndFeel711エントリ
 LAF:OKルックアップ:OKデフォルト:OK

コンソール、Windows 7:

***メタルjavax.swing.plaf.metal.MetalLookAndFeel636エントリ
 LAF:OKルックアップ:OKデフォルト:OK
*** Nimbuscom.sun.java.swing.plaf.nimbus.NimbusLookAndFeel1049エントリ
 LAF:OKルックアップ:OKデフォルト:OK
*** CDE / Motifcom.sun.java.swing.plaf.motif.MotifLookAndFeel550エントリ
 LAF:OKルックアップ:OKデフォルト:OK
*** Windowscom.sun.java.swing.plaf.windows.WindowsLookAndFeel637エントリ
 LAF:OKルックアップ:OKデフォルト:OK
*** Windows Classiccom.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel637エントリ
 LAF:OKルックアップ:OKデフォルト:OK
于 2011-04-20T12:57:32.040 に答える
4

これは、resourceBundlesで問題になる可能性があります。optionPane(およびfi fileChooserなど)のテキストプロパティは、ローカライズされたバンドルからロードされます。それらは、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で、デフォルトのロケールde

編集:明確にするために-ローカライズされたリソースは必ずしもkeys()/ entrySet()の直接エントリではありません。これらは、UIDefaultsでオーバーライドされないHashtableのメソッドです。したがって、私のスニペットのようなルックアップは常に機能するはずですが、列挙型のクエリは間違っています-エントリはそこにはありませんが、resourceBundlesによって供給されるいくつかのキャッシュされたマップにあります。

Edit2:okの定義を追加しました(そのキーについて数時間話し合った後、それは明らかだと思いました:-)

Edit3:今後の実験では、ロケール間で「OK」よりも異なる値を検索する必要があります。ficancelButtonText

編集4(大きな休憩の前の最後、約束:-)-「すべてのローカライズされた値を見つける方法」に関しては、汚い手段(別名:実装の詳細)に頼らなければ不可能です。私が考えることができる唯一の方法は、次のように、おそらくロードされているresourceBundlesを調べることです。

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

        }
    }
于 2011-04-20T14:49:20.563 に答える