2010-09-07 3 views
8

J'appelle UIManager.getSystemLookAndFeelClassName(). Et obtenir comme résultat WindowsLookAndFeel, même lors de la définition du thème en cours à WindowsClassicLookAndFeel. Mais je m'attends à WindowsClassicLookAndFeel. Question est comment puis-je détecter que le thème Windows classique est maintenant actifne peut pas détecter ce thème classique windows

+1

Je ne connais pas la réponse, mais les personnes qui fournissent des réponses ne semblent même pas lire la question. Windows XP, Vista et 7 ont leur thème standard, mais peuvent aussi ressembler à Windows 2000 (le thème classique). La question est de savoir comment détecter ceux auxquels l'utilisateur a configuré Windows. –

+0

@Ricky Clarkson: de la question je comprends qu'il dit qu'il met le "thème" à "WindowsClassicLookAndFeel" qui est un LaF en java et veut voir s'il est actuellement installé. –

Répondre

2

Je ne suis pas sûr de ce que vous demandez.

Si vous demandez quel est le thème/l'aspect et la convivialité que SWING utilise actuellement, essayez UIManager.getSystemLookAndFeelClassName().

Si vous essayez de trouver quel thème Windows utilise - je ne sais pas. Probablement pas assez facile à trouver.

Edit: Un hack rapide peut être (à l'exception de l'utilisation de la JNA/JNA pour interroger une API Windows directement dont le thème est utilisé) serait la création d'une nouvelle JFrame, placez-le dans un domaine, la capture d'une petite partie de cette bordure et comparez-la avec des échantillons de bordures (que vous devez créer au préalable et expédier avec votre code, pour pouvoir comparer par programme le bit de capture d'écran et toutes les images de bordure que vous expédiez)

+0

oui, quelque chose comme ça, mais il y a com.sun.java.swing.plaf.windows.WindowsLookAndFeel et com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel, mais UIManager.getSystemLookAndFeelClassName() renvoie uniquement com.sun. java.swing.plaf.windows.WindowsLookAndFeel même lorsque le thème des fenêtres classiques est appliqué. – fland

+0

Vous donnez un lien vers un javadoc sans même lire ce que fait la méthode. –

+0

@tulskiy fland a récemment reformulé sa question, donc je ne pouvais que deviner ce qu'il demandait. Par conséquent, ma réponse n'a plus beaucoup de sens. – Tedil

-1

UIManager.getLookAndFeel() renvoie actuellement installé LaF. getSystemLookAndFeel() renvoie l'aspect et le toucher qui apparaîtraient comme le thème d'un système actuel, par ex. WindowsLookAndFeel sur les fenêtres GTKLookAndFeel sur Linux MOtifLookAndFeel sur Solaris etc.

+1

Il ne répond pas, comment OP peut détecter si le thème classique est installé. –

14

Il semble que vous vous soyez inscrit spécifiquement pour poser cette question, et maintenant je m'inscris spécifiquement pour y répondre! Je cherchais Google pour quelque chose de complètement différent mais j'étais intrigué et j'ai fait quelques expériences, et voici ce que j'ai trouvé:

Vous avez raison sur le WindowsClassicLookAndFeel. Cette classe s'étend WindowsLookAndFeel mais ne remplace rien et ne semble pas être utilisée du tout, même lorsque Windows Classic est actif. Donc, j'ai regardé dans le code de WindowsLookAndFeel et trouvé un code interne intéressant qui fait référence à la classe de paquet privé XPStyle. Cette classe semble être un singleton et la méthode getter, getXP(), ne retourne son exemple, si le thème « XP » est actif:

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

Fait intéressant, les contrôles de code pour le nouveau WindowsClassicLookAndFeel mais nous savons que ce n'est plus utilisé (peut-être il a changé) ... Mais la meilleure partie est la vérification de la propriété de bureau win.xpstyle.themeActive Extraire ce à partir du code, j'ai fait le test suivant:

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(); 
    } 
}

Vous pouvez importer cette classe dans votre programme et appelez la méthode isWindowsClassicLAF() après avoir défini votre apparence. & Feel à tout moment. J'ai également donné un exemple de la façon dont vous pouvez écouter les modifications apportées au thème lors de l'exécution.

Ceci est essayé et testé sur XP. Si l'utilisateur passe d'un thème XP à un autre, l'écouteur ne se déclenche pas, mais si l'utilisateur passe d'un thème à Classic, ou inversement, il le fera.

J'espère que cela aide!

+0

Souhaite que je pourrais marquer cela comme la bonne réponse! Marche à suivre. –

Questions connexes