2010-09-07 17 views
8

Estoy llamando a UIManager.getSystemLookAndFeelClassName(). Y obtenga como resultado WindowsLookAndFeel, incluso cuando configure el tema actual en WindowsClassicLookAndFeel. Pero espero WindowsClassicLookAndFeel. La pregunta es cómo puedo detectar que el tema clásico de Windows ahora está activono se puede detectar el tema clásico de Windows activo

+1

No sé la respuesta, pero las personas que brindan las respuestas ni siquiera parecen leer la pregunta. Windows XP, Vista y 7 tienen su tema estándar, pero también se pueden hacer para parecerse a Windows 2000 (el tema clásico). La pregunta es cómo detectar a cuál de los usuarios ha configurado Windows. –

+0

@Ricky Clarkson: de la pregunta entiendo que él dice que establece el "tema" para 'WindowsClassicLookAndFeel' que es un LaF en Java y quiere ver si está instalado actualmente. –

Respuesta

2

No estoy muy seguro de lo que está preguntando.

Si se está preguntando qué tema/verse y sentirse OSCILACIÓN está utilizando actualmente, intente UIManager.getSystemLookAndFeelClassName().

Si está tratando de averiguar qué tema está usando Windows, no sé. Probablemente no sea tan fácil de descubrir.

Editar: Un truco rápido podría ser (aparte de utilizar JNA/JNA para consultar alguna API de Windows directamente, que el tema se está utilizando) sería la creación de un nuevo JFrame, colocarlo en algún área, la captura de una pequeña parte de ese borde y compáralo con muestras de bordes (que necesitas crear de antemano y enviar con tu código, para poder comparar programáticamente el capturado-captura-pantalla-bit y todas las imágenes de bordes que envías)

+0

sí, algo así, pero hay com.sun.java.swing.plaf.windows.WindowsLookAndFeel y com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel, pero UIManager.getSystemLookAndFeelClassName() solo devuelve com.sun. java.swing.plaf.windows.WindowsLookAndFeel incluso cuando se aplica el tema clásico de Windows. – fland

+0

Proporciona un enlace a un javadoc sin siquiera leer lo que está haciendo el método. –

+0

@tulskiy fland recientemente reformuló su pregunta, por lo que solo pude adivinar lo que estaba pidiendo. Por lo tanto, mi respuesta ya no tiene mucho sentido. – Tedil

-1

UIManager.getLookAndFeel() devuelve LaF instalado actualmente. getSystemLookAndFeel() devuelve un aspecto que se vería como el tema de un sistema actual, p. WindowsLookAndFeel en Windows GTKLookAndFeel en Linux MOtifLookAndFeel en Solaris etc.

+1

No responde, cómo OP puede detectar si el tema clásico está instalado. –

14

Parece que se inscribió específicamente para hacer esta pregunta y ahora me suscribo específicamente para responderla. Buscaba en Google algo completamente diferente, pero estaba intrigado e hice algunos experimentos, y esto es lo que encontré:

Tienes razón sobre el WindowsClassicLookAndFeel. Esta clase se extiende a WindowsLookAndFeel pero no anula nada, y no parece usarse en absoluto, incluso cuando Windows Classic está activo. Entonces, miré el código de WindowsLookAndFeel y encontré un código interno interesante que hace referencia a la clase privada de paquete XPStyle. Esta clase parece ser un producto único y el método de obtención, getXP(), sólo devuelve su ejemplo, si el tema de la 'XP' está activo:

/** 
* Get the singleton instance of this class 
* 
* @return the singleton instance of this class or null if XP styles 
* are not active or if this is not Windows XP 
*/ 
static synchronized XPStyle getXP() { 
    if (themeActive == null) { 
     Toolkit toolkit = Toolkit.getDefaultToolkit(); 
     themeActive = 
      (Boolean)toolkit.getDesktopProperty("win.xpstyle.themeActive"); 
     if (themeActive == null) { 
      themeActive = Boolean.FALSE; 
     } 
     if (themeActive.booleanValue()) { 
      GetPropertyAction propertyAction = 
       new GetPropertyAction("swing.noxp"); 
      if (AccessController.doPrivileged(propertyAction) == null && 
       ThemeReader.isThemed() && 
       !(UIManager.getLookAndFeel() 
        instanceof WindowsClassicLookAndFeel)) { 

       xp = new XPStyle(); 
      } 
     } 
    } 
    return xp; 
} 

Curiosamente, el código comprueba para el WindowsClassicLookAndFeel de nuevo, pero sabemos que esto no es una ya utilizado (tal vez ha cambiado) ... Pero la mejor parte es la verificación de la propiedad de escritorio win.xpstyle.themeActive la extracción de esta a partir del código, hice la siguiente prueba:

package test; 

import java.awt.Toolkit; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import javax.swing.UIManager; 

public class WindowsClassicThemeDetector { 

    public static boolean isWindowsLAF() { 
     return UIManager.getLookAndFeel().getID().equals("Windows"); 
    } 

    public static boolean isWindowsClassicLAF() { 
     return isWindowsLAF() 
       && !(Boolean) Toolkit.getDefaultToolkit().getDesktopProperty(
         "win.xpstyle.themeActive"); 
    } 

    public static void main(String... args) throws Exception { 
     // Apply the system look and feel (which will be Windows) 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

     // Check the initial theme state on startup 
     System.out.println(UIManager.getLookAndFeel().getClass()); 
     System.out.println("Windows classic is initially: " + isWindowsClassicLAF()); 

     // Register a listener in case the theme changes during runtime. 
     Toolkit.getDefaultToolkit().addPropertyChangeListener("win.xpstyle.themeActive", 
       new PropertyChangeListener() { 
        @Override 
        public void propertyChange(PropertyChangeEvent evt) { 
         System.out.println("Windows classic is now: " + isWindowsClassicLAF()); 
        } 
       }); 

     // Wait until user presses ENTER in the console and then exit. 
     System.in.read(); 
    } 
}

puede importar esta clase en su programa y llama al método isWindowsClassicLAF() después de configurar tu Look & Feel en cualquier punto. También he dado un ejemplo de cómo puedes escuchar los cambios al tema en tiempo de ejecución.

Esto se ha probado en XP. Si el usuario cambia de un tema de XP a otro, el oyente no se dispara, pero si el usuario cambia de un tema a Clásico, o viceversa, lo hará.

Espero que ayude!

+0

¡Ojalá pudiera marcar esto como la respuesta correcta! Camino a seguir. –

Cuestiones relacionadas