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
Répondre
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)
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
Vous donnez un lien vers un javadoc sans même lire ce que fait la méthode. –
@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
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.
Il ne répond pas, comment OP peut détecter si le thème classique est installé. –
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!
Souhaite que je pourrais marquer cela comme la bonne réponse! Marche à suivre. –
- 1. 6 ----- pourquoi drupal thème() ne peut pas émettre
- 2. détecter Server.Transfer dans ASP classique
- 3. Zend Studio ne peut pas détecter Zend Server
- 4. Windows ne peut pas écrire à log.txt
- 5. L'application .Net ne peut pas détecter ODP.NET 2.111.6.20 dans Windows 64 bits
- 6. Windows 7 Aero thème
- 7. Lors du passage à Windows thème classique combo contribution élément shirnks
- 8. Que peut faire ce que sed ne peut pas faire?
- 9. QT/CE sur Windows CE 6.0, l'application ne fonctionnera pas
- 10. PreferenceActivity et le thème ne pas appliquer
- 11. Comment installer le thème sur Windows CE 5.0
- 12. Thème Aero Glass (Windows Forms)
- 13. mode jMeter serveur - Windows ne peut pas trouver "rmiregistry"
- 14. Gridview dans C++ Windows formulaire application ne peut pas modifier
- 15. ne peut pas obtenir django pour travailler dans Eclipse + windows
- 16. Le service Windows ne peut pas accéder au partage réseau
- 17. Comment faire pour ouvrir le dialogue "Windows ne peut pas ouvrir ce fichier"?
- 18. ne peut pas commencer à scala sur Windows 7
- 19. fonction classique d'ouverture DB ASP ne fonctionne pas
- 20. fonction de Symbol est vide: couleur thème classique
- 21. Est-ce que Windows peut détecter quand un moniteur, une souris, un clavier est déconnecté?
- 22. Delphi Windows Service ne peut pas télécharger le fichier d'Internet
- 23. Ruby ne peut pas trouver le pilote sqlite3 sur Windows
- 24. DDE - Windows ne peut pas trouver le chemin
- 25. Eclipse CDT créé makefile ne peut pas "nettoyer" sur Windows
- 26. drupal --- un thème ne peut pas fonctionner avec le module ajax comments
- 27. ERREUR HEAPSPACE: ne peut pas comprendre ce qui cause l'erreur
- 28. délégué JQuery ce qui peut l'amener à ne pas fonctionner
- 29. ... ne peut pas être utilisé dans ce contexte ... tout sérialisation
- 30. Pourquoi Java ne peut-il pas trouver ce constructeur?
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. –
@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é. –