не могу определить, что классическая тема Windows активна - PullRequest
8 голосов
/ 07 сентября 2010

Я звоню UIManager.getSystemLookAndFeelClassName ().И получить в результате WindowsLookAndFeel, даже если текущая тема установлена ​​в WindowsClassicLookAndFeel.Но я ожидаю WindowsClassicLookAndFeel.Вопрос в том, как определить, что тема windows classic теперь активна

Ответы [ 3 ]

14 голосов
/ 08 декабря 2010

Похоже, что вы подписались специально, чтобы задать этот вопрос, и теперь я подписываюсь специально, чтобы ответить на него! Я гуглил что-то совершенно другое, но я был заинтригован и провел некоторые эксперименты, и вот что я нашел:

Ты прав насчет 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 на другую, слушатель не запускается, но если пользователь переключается с темы на классическую или наоборот, он будет.

Надеюсь, это поможет!

2 голосов
/ 07 сентября 2010

Я не совсем уверен, что вы спрашиваете.

Если вы спрашиваете, какую тему / внешний вид и стиль использует SWING, попробуйте UIManager.getSystemLookAndFeelClassName () .

Если вы пытаетесь выяснить, какую тему использует Windows - я не знаю.Наверное, не совсем легко это выяснить.

Редактировать: Возможно, будет создан быстрый взлом (помимо использования JNA / JNA для запроса некоторых API Windows напрямую, какая тема используется)новый JFrame, поместите его в какую-то область, захватите небольшую часть этой границы и сравните ее с образцами границ (которые необходимо предварительно создать и отправить с вашим кодом, чтобы иметь возможность программно сравнить только что сделанный экран-capture-bit и все пограничные изображения, которые вы отправляете)

0 голосов
/ 07 сентября 2010

UIManager.getLookAndFeel() возвращает текущий установленный LaF.getSystemLookAndFeel() возвращает внешний вид, который будет выглядеть как тема текущей системы, например, WindowsLookAndFeel в Windows GTKLookAndFeel в Linux MOtifLookAndFeel в Solaris и т. Д.

...