2011-04-20 14 views
5

Tengo el siguiente problema. Necesito conseguir una propiedades de interfaz de usuario:Las propiedades de la IU no contienen algunas claves

UIManager.getString("OptionPane.okButtonText") 

que devuelve la cadena "OK", y funciona. Sin embargo, si iterar a través del conjunto de claves UIDefaults, nunca obtengo la clave "OptionPane.okButtonText". ¿Alguien sabe por qué sucede? Obtengo el UIDefaults de tres maneras diferentes (UIManager.getDefaults(), UIManager.getLookAndFeel().getDefaults() y UIManager.getLookAndFeelDefaults()), pero ninguno de estos funciona.

Editar: También me parece this list of properties de la clase JFileChooser, que contiene algunas propiedades que no aparecen int UIDefaults el conjunto de claves. El problema es: ¿cómo obtiene programáticamente todas estas propiedades?

Editar: Ejemplo de código:

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

este código de retorno de impresión these properties. La clave "OptionPane.okButtonText" no aparece en la salida.

+0

¿Hay algún error en tu código? - worksforme – kleopatra

+0

Cf. [Predeterminados de UIManager] (http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/) – trashgod

+0

Agrego el código. @trashgod Obtengo el código de este sitio :) – Alberto

Respuesta

4

Esto podría ser un problema con ResourceBundles: la optionPane (así como fi selectorArchivo y otra) las propiedades de texto se cargan desde paquetes localizados. Son (solía ser, no del todo seguro si ese es todavía el caso) clases internas en com.sun.swing.internal.plaf. Tal vez algo va mal allí ...

aquí es el fragmento que 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 

independiente de los cuales LAF está instalado actualmente. Mi sistema es win/vista, mi ubicación predeterminada de

Edición: solo para aclarar: los recursos localizados no son necesariamente entradas directas en las teclas()/entrySet(), estos son métodos en Hashtable que no se anulan en UIDefaults . Entonces, aunque la búsqueda como en mi fragmento siempre debería funcionar, consultar las enumeraciones es incorrecto: las entradas no están allí, sino en algunos mapas almacenados en caché que son alimentados por resourceBundles.

Edit2: se ha añadido la definición de bien (pensamiento que sería obvia ... después de hablar durante varias horas sobre esa clave :-)

Edit3: para experimentos adicionales, probablemente deberíamos operaciones de búsqueda un valor que difiere más que "OK" en Locales, fi cancelButtonText

Editar 4 (la última antes de un salto importante, prometido :-) - en cuanto a "cómo encontrar todos los valores localizados" no es posible sin recurrir a medios sucios (también conocido como: detalles de implementación).La única forma en que se me ocurre es buscar en el resourceBundles que están, supuestamente, cargados, como

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

Gracias por aclarar. Creo que su análisis es correcto, pero no tengo votos. Los recursos localizados no parecen aparecer en 'entrySet()' de 'UIDefaults'. – trashgod

+0

¡Esto es exactamente lo que estaba buscando! ¡Muchas gracias por todas las respuestas! – Alberto

4

Parece que OptionPane.okButtonText es una característica única en Aqua disponible en todas las L & Fs, como se muestra el uso de este approach que incluye valores localizados que no se ve cuando iterar sobre la 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); 
     } 
    } 
} 

consola, 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 

consola, 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 
+0

Pero lo intento en Windows 7 con el sistema L & F, y si obtengo la propiedad con el método 'getString', funciona bien. El problema es obtener _todas las llaves_. Creo que deberíamos obtener todos los diversos _ComponentClass_ UI y las teclas int de esta manera, pero ¿cómo? – Alberto

+0

@alberto: No veo una entrada para 'OptionPane.okButtonText' en Windows 7; resultados agregados arriba. – trashgod

+0

no tiene mucho sentido recorrer las entradas, ver la aclaración (con suerte :-) de mi respuesta – kleopatra

Cuestiones relacionadas