Похоже, что вы подписались специально, чтобы задать этот вопрос, и теперь я подписываюсь специально, чтобы ответить на него! Я гуглил что-то совершенно другое, но я был заинтригован и провел некоторые эксперименты, и вот что я нашел:
Ты прав насчет WindowsClassicLookAndFeel
. Этот класс расширяет WindowsLookAndFeel
, но ничего не переопределяет и, кажется, не используется вообще, даже когда Windows Classic активна. Итак, я изучил код WindowsLookAndFeel
и нашел интересный внутренний код, который ссылается на закрытый для пакета класс XPStyle
. Этот класс представляется одноэлементным, а метод получения, getXP()
, возвращает свой экземпляр, только если тема 'XP' активна:
/**
* 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;
}
Интересно, что код снова проверяет WindowsClassicLookAndFeel
, но мы знаем, что он больше не используется (возможно, он изменился) ... Но лучшая часть - проверка свойства desktop win.xpstyle.themeActive
Извлечение этого из кода Я сделал следующий тест:
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();
}
}
Вы можете импортировать этот класс в свою программу и вызывать метод isWindowsClassicLAF()
после настройки Look & Feel в любой момент. Я также привел пример того, как вы можете прослушивать изменения темы во время выполнения.
Это проверено на XP. Если пользователь переключается с одной темы XP на другую, слушатель не запускается, но если пользователь переключается с темы на классическую или наоборот, он будет.
Надеюсь, это поможет!