2010-09-07 15 views
8

Sto chiamando UIManager.getSystemLookAndFeelClassName(). E ottieni come risultato WindowsLookAndFeel, anche quando si imposta il tema corrente su WindowsClassicLookAndFeel. Ma mi aspetto WindowsClassicLookAndFeel. Domanda è come posso rilevare che il tema classico di Windows è ora attivonon è in grado di rilevare che il tema classico di Windows è attivo

+1

Non conosco la risposta, ma le persone che forniscono risposte non sembrano nemmeno leggere la domanda. Windows XP, Vista e 7 hanno il loro tema standard, ma possono anche essere fatti per assomigliare a Windows 2000 (il tema classico). La domanda è come scoprire quali di quelli a cui l'utente ha impostato Windows. –

+0

@Ricky Clarkson: dalla domanda capisco che dice che imposta il "tema" a 'WindowsClassicLookAndFeel' che è un LaF in java e vuole vedere se è attualmente installato. –

risposta

2

Non sono abbastanza sicuro di quello che stai chiedendo.

Se ti stai chiedendo quale tema/aspetto senti utilizzare attualmente SWING, prova UIManager.getSystemLookAndFeelClassName().

Se si sta tentando di scoprire quale tema utilizza Windows, non lo so. Probabilmente non è abbastanza facile scoprirlo.

Edit: Un hack rapido potrebbe essere (a parte utilizzando JNA/JNA per interrogare alcune API di Windows direttamente quale tema viene utilizzato) sarebbe la creazione di una nuova JFrame, metterlo in una certa zona, catturare una piccola parte della quel confine e confrontalo con campioni di bordi (che devi creare in anticipo e spedire con il tuo codice, in modo da poter confrontare a livello di codice il bit di acquisizione appena acquisito e tutte le immagini di confine che spedisci)

+0

sì, qualcosa del genere, ma com.sun.java.swing.plaf.windows.WindowsLookAndFeel e com.sun.jind.wind.windows.windows.WindowsClassicLookAndFeel, ma UIManager.getSystemLookAndFeelClassName() restituisce solo com.sun. java.swing.plaf.windows.WindowsLookAndFeel anche quando si applica il classico tema di Windows. – fland

+0

Fornisci un collegamento a un javadoc senza nemmeno sapere cosa sta facendo il metodo. –

+0

@tulskiy fland ha riformulato di recente la sua domanda, quindi ho potuto solo intuire cosa stava chiedendo. Quindi la mia risposta non ha più senso. – Tedil

-1

UIManager.getLookAndFeel() restituisce attualmente installato LaF. getSystemLookAndFeel() restituisce un aspetto che sembra il tema di un sistema attuale, ad es. WindowsLookAndFeel su Windows GTKLookAndFeel su Linux MOtifLookAndFeel su Solaris, ecc.

+1

Non risponde, come OP può rilevare se è installato il tema classico. –

14

Sembra che tu ti sia iscritto appositamente per fare questa domanda, e ora mi sto registrando appositamente per rispondere! Ero Googling per qualcosa di completamente diverso ma ero incuriosito e ho fatto qualche esperimento, ed ecco cosa ho trovato:

Hai ragione riguardo al WindowsClassicLookAndFeel. Questa classe estende WindowsLookAndFeel ma non sovrascrive nulla e non sembra essere utilizzata affatto, anche quando Windows Classic è attivo. Quindi, ho esaminato il codice di WindowsLookAndFeel e ho trovato un codice interno interessante che fa riferimento alla classe privata del pacchetto XPStyle. Questa classe sembra essere un Singleton e il metodo getter, getXP(), restituisce solo il suo esempio, se il tema 'XP' è attivo:

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

È interessante notare che il codice verifica per la WindowsClassicLookAndFeel nuovo, ma sappiamo che questo non è un più utilizzato (forse è cambiato) ... Ma la parte migliore è il controllo per la proprietà del desktop win.xpstyle.themeActive estrazione di questa dal codice, ho fatto il seguente 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(); 
    } 
}

è possibile importare questa classe nel vostro programma e chiama il metodo isWindowsClassicLAF() dopo aver impostato il tuo aspetto & Feel in qualsiasi punto. Ho anche fornito un esempio di come è possibile ascoltare le modifiche al tema in fase di esecuzione.

Questo è provato e testato su XP. Se l'utente passa da un tema XP a un altro, il listener non si attiva, ma se l'utente passa da un tema a Classic, o viceversa, lo farà.

Spero che questo aiuti!

+0

Vorrei poter contrassegnare questo come la risposta corretta! Ben fatto. –

Problemi correlati