Свойства пользовательского интерфейса не содержат некоторых ключей


У меня есть следующая проблема. Мне нужно получить свойства пользовательского интерфейса:

UIManager.getString("OptionPane.okButtonText")

, который возвращает строку "OK", и это работает. Однако, если я перебираю набор ключей UIDefaults, я никогда не получаю ключ "OptionPane.okButtonText". Кто-нибудь знает, почему это происходит? Я получаю UIDefaults тремя различными способами (UIManager.getDefaults(), UIManager.getLookAndFeel().getDefaults() и UIManager.getLookAndFeelDefaults()), но никто из них не работает.

Edit : я также нахожу этот список свойств класса JFileChooser , который содержит некоторые свойства, которые не появится в наборе ключей UIDefaults. Проблема заключается в следующем: как программно получить все эти свойства?

Edit : пример кода:

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

Этот код возвращает print эти свойства . Ключ "OptionPane.okButtonText" не появляется в выводе.

2 5

2 ответа:

Это может быть проблемой с resourceBundles: свойства текста optionPane (а также f.i. fileChooser и другие) загружаются из локализованных пакетов. Они являются (раньше были, не совсем уверен, что это все еще так) внутренними классами под com.солнце.качать.внутренний.плаф. Может быть, там что-то не так ...

Вот фрагмент, который работает в формате:

    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 (), это методы в Hashtable, которые не переопределяются в UIDefaults. Поэтому, хотя поиск, как в моем сниппете, всегда должен работать, запрос перечислений неверен - записи не там, а в некоторых кэшированных картах, которые подаются resourceBundles.

Edit2: добавил def из ok (думал, что будет ... очевидно, после разговора в течение нескольких часов об этом ключе: -)

Edit3: для дальнейшего эксперименты, мы, вероятно, должны искать значение, которое отличается больше, чем" OK " в разных локалях, например cancelButtonText

Edit 4 (самый последний перед крупным перерывом, обещанный : -) - как "найти все локализованные значения" невозможно, не прибегая к грязным средствам (aka: детали реализации). Единственный способ, который я могу придумать, - это заглянуть в ресурсные пакеты, которые предположительно загружены, например

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

        }
    }

Похоже, что OptionPane.okButtonText являетсяособенностью, уникальной для Aqua , доступной во всех L&Fs, как показано с помощью этого подхода , который включает локализованные значения, не видимые при итерации над 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