2010-09-07 53 views
8

我打電話給UIManager.getSystemLookAndFeelClassName()。 即使將當前主題設置爲WindowsClassicLookAndFeel,也會得到WindowsLookAndFeel的結果。但我期望WindowsClassicLookAndFeel。 問題是我如何檢測Windows經典主題現在是活動的無法檢測到窗口經典主題活動

+1

我不知道答案,但提供答案的人似乎甚至沒有看到這個問題。 Windows XP,Vista和7有他們的標準主題,但也可以看起來像Windows 2000(經典主題)。問題是如何檢測哪些用戶已將Windows設置爲。 – 2010-09-07 15:52:28

+0

@Ricky Clarkson:從這個問題我明白,他說他將「主題」設置爲'WindowsClassicLookAndFeel',它是一個Java中的LaF,並且想要查看它是否已安裝。 – 2010-09-08 03:12:03

回答

2

我不太確定你在問什麼。

如果您問的是SWING當前正在使用的主題/外觀,請嘗試使用 UIManager.getSystemLookAndFeelClassName()

如果您試圖找出Windows正在使用哪個主題 - 我不知道。可能不太容易發現。 (除了使用JNA/JNA直接查詢某些Windows API的哪個主題被使用)將創建一個新的JFrame,將它放置在某個區域,捕獲一小部分該邊框並將其與邊界樣本進行比較(您需要事先創建並隨代碼一起提供,以便能夠以編程方式比較剛剛拍攝的屏幕捕獲位和您發貨的所有邊框圖像)

+0

是的,類似這樣的,但有com.sun.java.swing.plaf.windows.WindowsLookAndFeel和com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel,但UIManager.getSystemLookAndFeelClassName()只返回com.sun。 java.swing.plaf.windows.WindowsLookAndFeel即使應用了經典的Windows主題。 – fland 2010-09-07 13:43:38

+0

你給一個javadoc鏈接,甚至沒有讀取該方法正在做什麼。 – 2010-09-07 15:31:17

+0

@tulskiy fland最近重新提出了他的問題,所以我只能猜測他在問什麼。因此我的回答沒有多大意義了。 – Tedil 2010-09-08 12:38:31

-1

UIManager.getLookAndFeel()返回當前安裝的LaF。 getSystemLookAndFeel()返回看起來像是當前系統的主題,例如WindowsLookAndFeel on Windows GTKLookAndFeel Linux上的MOirtLookAndFeel等

+1

它沒有回答,OP如何檢測經典主題是否安裝。 – 2013-01-28 13:31:43

14

它看起來像你註冊專門問這個問題,現在我特地註冊回答它!我是谷歌搜索的東西完全不同,但我很好奇,做了一些實驗,這裏是我發現的:

你是對的WindowsClassicLookAndFeel。該課程擴展了WindowsLookAndFeel,但不覆蓋任何內容,即使在Windows Classic處於活動狀態時也不會被使用。所以,我查看了WindowsLookAndFeel的代碼,並發現了一些引用包私有類XPStyle的有趣內部代碼。這個類似乎是一個單身主義者和getter方法,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代碼再次檢查,但我們知道,這是不不再使用(也許它已經改變)......但最好的部分是從代碼中提取此桌面屬性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(); 
    } 
}

可以導入這個類到你的程序和設置完Look後請撥打isWindowsClassicLAF()方法&感受在任何時候。我還給出了一個例子,說明如何在運行時聆聽主題的變化。

這是在XP上嘗試和測試的。如果用戶從一個XP主題更改爲另一個主題,則該偵聽器不會觸發,但如果用戶從主題更改爲經典,或反之亦然,則會執行此操作。

我希望有幫助!

+0

希望我可以將此標記爲正確答案!路要走。 – 2013-06-25 19:07:43