2010-09-07 5 views
8

Ich rufe UIManager.getSystemLookAndFeelClassName(). Und als Ergebnis WindowsLookAndFeel erhalten, auch wenn das aktuelle Thema auf WindowsClassicLookAndFeel festgelegt. Aber ich erwarte WindowsClassicLookAndFeel. Frage ist, wie kann ich erkennen, dass windows classic theme jetzt aktiv istkann nicht erkennen, dass windows classic theme aktiv ist

+1

Ich weiß nicht die Antwort, aber die Leute, die Antworten geben, scheinen nicht einmal die Frage zu lesen. Windows XP, Vista und 7 haben ihr Standardthema, können aber auch wie Windows 2000 (das klassische Thema) aussehen. Die Frage ist, wie man erkennt, auf welchen der Benutzer Windows eingestellt hat. –

+0

@Ricky Clarkson: Aus der Frage, die ich verstehe, sagt er, dass er das "Thema" auf "WindowsClassicLookAndFeel" setzt, welches ein LaF in Java ist und sehen möchte, ob es momentan installiert ist. –

Antwort

2

Ich bin mir nicht ganz sicher, was Sie fragen.

Wenn Sie fragen, welches Thema/Aussehen und Gefühl SWING derzeit verwendet, versuchen Sie UIManager.getSystemLookAndFeelClassName().

Wenn Sie versuchen herauszufinden, welches Thema Windows verwendet - ich weiß es nicht. Wahrscheinlich nicht ganz einfach, das herauszufinden.

Edit: Ein schneller Hack könnte (abgesehen von JNA/JNA mit direkt einig Windows-API abfragen, welches Thema verwendet wird) sein sein würde, eine neue JFrame erstellen, legen Sie sich in einem gewissen Bereich, erfaßt einen kleinen Teil Diese Grenze und vergleichen Sie sie mit Proben von Grenzen (die Sie vorher erstellen und mit Ihrem Code senden müssen, um das gerade aufgenommene Bildschirm-Capture-Bit und alle von Ihnen gelieferten Rahmenbilder programmatisch vergleichen zu können)

+0

Ja, etwas wie das, aber es gibt com.sun.java.swing.plaf.windows.WindowsLookAndFeel und com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel, aber UIManager.getSystemLookAndFeelClassName() gibt nur com.sun zurück. java.swing.plaf.windows.WindowsLookAndFeel, auch wenn das klassische Windows-Design angewendet wurde. – fland

+0

Sie geben einen Link zu einem Javadoc, ohne zu lesen, was die Methode gerade macht. –

+0

@tulskiy fland hat kürzlich seine Frage umformuliert, also konnte ich nur erraten, wonach er gefragt hat. Daher ist meine Antwort nicht mehr sinnvoll. – Tedil

-1

UIManager.getLookAndFeel() gibt aktuell installierte LaF zurück. getSystemLookAndFeel() gibt Look and Feel zurück, das als ein aktuelles Systemthema aussehen würde, z. WindowsLookAndFeel unter Windows GTKLookAndFeel unter Linux MOtifLookAndFeel unter Solaris usw.

+1

Es antwortet nicht, wie OP erkennen kann, ob das klassische Theme installiert ist. –

14

Es sieht so aus, als hätten Sie sich speziell angemeldet, um diese Frage zu stellen, und jetzt melde ich mich ausdrücklich an, um sie zu beantworten! Ich googelte für etwas völlig anderes, aber ich war fasziniert und experimentierte, und hier ist, was ich gefunden habe:

Sie haben Recht über die WindowsClassicLookAndFeel. Diese Klasse erweitert WindowsLookAndFeel, überschreibt jedoch nichts und wird selbst dann nicht verwendet, wenn Windows Classic aktiv ist. Also, ich schaute in den Code WindowsLookAndFeel und fand einige interessante interne Code, der das Paket-private Klasse XPStyle verweist. Diese Klasse wird ein Singleton und die Getter-Methode sein, getXP(), gibt nur die Instanz, wenn das Thema ‚XP‘ aktiv ist:

/** 
* 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; 
} 

Interessanterweise wieder die Codeüberprüfungen für die WindowsClassicLookAndFeel aber wir wissen, dass dies nicht ist mehr verwendet (vielleicht es geändert) ... Aber der beste Teil ist die Prüfung auf die Desktop Eigenschaft win.xpstyle.themeActive dies aus dem Code extrahieren, ich folgenden Test durchgeführt:

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

Sie diese Klasse in Ihr Programm importieren und Rufen Sie die isWindowsClassicLAF() Methode nach dem Einstellen Ihrer Look & Feel an jedem Punkt. Ich habe auch ein Beispiel dafür gegeben, wie Sie während der Laufzeit Änderungen am Thema abhören können.

Dies ist unter XP getestet und getestet. Wenn der Benutzer von einem XP-Thema zu einem anderen wechselt, wird der Listener nicht ausgelöst, aber wenn der Benutzer von einem Thema zu Classic wechselt, oder umgekehrt, wird dies der Fall sein.

Ich hoffe, dass hilft!

+0

Ich wünschte, ich könnte dies als die richtige Antwort markieren! Weg zu gehen. –

Verwandte Themen