2010-09-07 6 views
8

Dzwonię do UIManager.getSystemLookAndFeelClassName(). I otrzymaj jako wynik WindowsLookAndFeel, nawet przy ustawianiu bieżącego motywu na WindowsClassicLookAndFeel. Ale oczekuję WindowsClassicLookAndFeel. Pytanie, w jaki sposób można wykryć, że klasyczny motyw systemu Windows jest teraz aktywnynie może wykryć, że motyw klasyczny Windows jest aktywny

+1

Nie znam odpowiedzi, ale ludzie udzielający odpowiedzi nie czytają nawet tego pytania. Windows XP, Vista i 7 mają swój standardowy motyw, ale można go również ustawić tak, aby wyglądał jak Windows 2000 (klasyczny motyw). Pytanie brzmi, jak wykryć, który z użytkowników ustawił system Windows. –

+0

@Ricky Clarkson: od pytania Rozumiem, że on mówi, że ustawia "motyw" na "WindowsClassicLookAndFeel", który jest LaF w java i chce zobaczyć czy jest on aktualnie zainstalowany. –

Odpowiedz

2

Nie jestem do końca pewien, o co pytasz.

Jeśli pytasz, którego motywu/wyglądu i stylu używa obecnie SWING, spróbuj UIManager.getSystemLookAndFeelClassName().

Jeśli próbujesz ustalić, którego motywu używa system Windows - nie wiem. Prawdopodobnie nie jest to łatwe.

Edit: Szybkie Hack może być (oprócz korzystania jna/JNA do kwerendy niektóre Windows API bezpośrednio którego tematem jest używany) byłoby stworzenie nowego JFrame, umieścić go w jakimś miejscu, przechwytywanie niewielką część tę granicę i porównaj ją z próbkami obramowań (które musisz wcześniej utworzyć i przesłać wraz z kodem, aby móc programowo porównać odebrany obraz i wszystkie obrazy obramowania, które wysyłasz)

+0

Tak, coś podobnego, ale jest com.sun.java.swing.plaf.windows.WindowsLookAndFeel i com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel, ale UIManager.getSystemLookAndFeelClassName() zwraca tylko com.sun. java.swing.plaf.windows.WindowsLookAndFeel nawet jeśli zastosowano klasyczny motyw systemu Windows. – fland

+0

Dajesz link do javadoc, nawet nie czytając, co robi metoda. –

+0

@tulskiy fland ostatnio przeformułował swoje pytanie, więc mogłem tylko zgadywać, o co prosił. Dlatego moja odpowiedź nie ma już większego sensu. – Tedil

-1

UIManager.getLookAndFeel() zwraca aktualnie zainstalowany LaF. getSystemLookAndFeel() zwraca wygląd i styl przypominający bieżący motyw systemu, np. WindowsLookAndFeel w systemie Windows GTKLookAndFeel w systemie Linux MOtifLookAndFeel w systemie Solaris itp.

+1

Nie odpowiada, w jaki sposób OP może wykryć instalację klasyczną. –

14

Wygląda na to, że zarejestrujesz się specjalnie, aby zadać to pytanie, a teraz rejestruję się specjalnie, aby odpowiedzieć na to pytanie! Szukałem czegoś zupełnie innego, ale byłem zaintrygowany i eksperymentowałem, a oto, co znalazłem:

Masz rację co do WindowsClassicLookAndFeel. Klasa ta rozszerza się o WindowsLookAndFeel, ale niczego nie zastępuje i nie wydaje się być w ogóle używana, nawet jeśli aktywny jest system Windows Classic. Tak więc zajrzałem do kodu WindowsLookAndFeel i znalazłem interesujący kod wewnętrzny, który odwołuje się do pakietu-prywatnej klasy XPStyle. Klasa ta wydaje się być pojedyncza i metoda getter, getXP(), tylko zwraca jego wystąpienie, jeśli tematyka „Xp” jest aktywny:

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

ciekawe, kod sprawdza dla WindowsClassicLookAndFeel ponownie, ale wiemy, że to nie jest jest już używany (może to zmienić) ... Ale najlepsze jest sprawdzenie dla właściwości pulpitu win.xpstyle.themeActive Wyodrębnianie z tego kodu, zrobiłem następujący test:

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

można zaimportować tę klasę do swojego programu i wywołaj metodę isWindowsClassicLAF() po ustawieniu Look & Poczuj W każdym punkcie. Podałem także przykład, w jaki sposób można wysłuchać zmian w temacie w czasie wykonywania.

To jest wypróbowane i przetestowane na XP. Jeśli użytkownik zmieni jedną kompozycję XP na inną, słuchacz nie uruchamia się, ale jeśli użytkownik zmieni temat z klasycznego na klasyczny lub odwrotnie, to tak zrobi.

Mam nadzieję, że to pomoże!

+0

Chciałbym zaznaczyć to jako poprawną odpowiedź! Droga do celu. –