Свойства пользовательского интерфейса не содержат некоторые ключи - PullRequest
5 голосов
/ 20 апреля 2011

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

UIManager.getString("OptionPane.okButtonText")

, который возвращает строку "OK", и это работает. Однако, если я перебираю набор ключей UIDefaults, я никогда не получу ключ "OptionPane.okButtonText". Кто-нибудь знает, почему это происходит? Я получаю UIDefaults тремя разными способами (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" не отображается на выходе.

Ответы [ 2 ]

4 голосов
/ 20 апреля 2011

Это может быть проблемой с resourceBundles: текстовые свойства optionPane (а также fi fileChooser и другие) загружаются из локализованных пакетов.Они (раньше были, не совсем уверены, так ли это до сих пор) являются внутренними классами в com.sun.swing.internal.plaf.Возможно, там что-то идет не так ...

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

    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

Edit: просто для пояснения - локализованные ресурсы не обязательно являются прямыми записями в keys () / entrySet (), это методы в Hashtable, которые не переопределяютсяв UIDefaults.Поэтому, хотя поиск, как в моем фрагменте, всегда должен работать, запрос перечислений является неправильным - записи не там, а в некоторых кэшированных картах, которые заполняются resourceBundles.

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

Edit3: для дальнейших экспериментов нам, вероятно, следует поискать aзначение, которое отличается от «OK» в разных языковых стандартах, например, cancelButtonText

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

        }
    }
4 голосов
/ 20 апреля 2011

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