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
Odpowiedz
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)
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
Dajesz link do javadoc, nawet nie czytając, co robi metoda. –
@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
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.
Nie odpowiada, w jaki sposób OP może wykryć instalację klasyczną. –
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!
Chciałbym zaznaczyć to jako poprawną odpowiedź! Droga do celu. –
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. –
@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. –