Свойства пользовательского интерфейса не содержат некоторых ключей
У меня есть следующая проблема. Мне нужно получить свойства пользовательского интерфейса:
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 ответа:
Это может быть проблемой с 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()
.Консоль, Mac OS X: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); } } }
*** 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