IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Problème look&feel et ClassLoader


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Problème look&feel et ClassLoader
    Salut,

    Si je mets le .jar du look & feel (Trendy) dans le classpath de mon application, ça marche très bien.



    Par contre, si je ne le mets pas dans le classpath (je veux être capable de charger et de changer des look&feels dynamiquement), et que je crée un ClassLoader pour qu'il le charge à la volée, ça marche presque... mais pas totalement.
    En effet, tout se charge correctement, pas d'exceptions, les composants sont tous bien dessinés avec le look&feel... sauf les bordures (des textfields, des listes, etc...) :



    Voici mon code (simplifié) qui charge le look&feel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Crée un ClassLoader référençant les librairies nécessaires pour le look and feel, en l'occurence ici Trendy_1.8.jar
    ClassLoader specificClassLoader = createClassLoader(lookAndFeel.getResources());
     
    //Utilise ce ClassLoader comme ClassLoader principal
    UIManager.put("ClassLoader", specificClassLoader);
     
    //Création de l'instance du look and feel
    LookAndFeel look = (LookAndFeel) Class.forName(lookAndFeel.getLookAndFeelClassName(), true, specificClassLoader).newInstance();
     
    //Affectation du look and feel
    UIManager.setLookAndFeel(look);
    L'appel à createClassLoader(lookAndFeel.getResources()) revient à ceci (je simplifie car c'est beaucoup plus générique que ça) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ClassLoader createClassLoader(String[] lib) {
        return new URLClassLoader(new File(libs[0]).toURI().toURL());
    }


    J'ai également vérifié, tout est bien exécuté dans l'EDT...



    Une idée de la cause du problème?

    Merci beaucoup d'avance !

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tu as essayé avec avec un appel à updateComponentTreeUI(Component c) de la classe SwingUtilities sur ta JFrame après le changement de look and feel?

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    En fait là c'est au démarrage du programme que je l'appelle, la frame n'est pas encore créée (par la suite ça pourra se faire également dynamiquement).

    Le problème, c'est que si c'est dans le classpath, ça marche nickel, si j'utilise un classloader, ça ne marche pas nickel. J'en conclus (peut-être hâtivement) que ça vient du classloader... mais pourquoi?

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il faudrait pister les clefs de l'UIManager pour vérifier si les bonnes UI et ressources sont bien installées.

    Le problème se pose avec tous les L&F ou seulement avec Trendy?

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par sinok Voir le message
    Le problème se pose avec tous les L&F ou seulement avec Trendy?
    J'ai testé avec Pgs et Liquid, il n'y a pas l'air d'y avoir ce problème.

    Cependant, même si ça peut venir de Trendy, je n'explique pas pourquoi il marche si je ne passe pas par mon propre ClassLoader? Comment faire pour que mon ClassLoader ait le même comportement que si le .jar était dans le classpath?

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Une idée?

    EDIT: résolu !

    J'ai rajouté cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.currentThread().setContextClassLoader(specificClassLoader);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Look and Feel metal problème
    Par storm_2000 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 30/12/2006, 12h43
  2. Java - Problème de Look'n'Feels
    Par TheReturnOfMuton dans le forum Interfaces Graphiques en Java
    Réponses: 8
    Dernier message: 16/08/2006, 15h13
  3. [JTable]Problême de Look and Feel???
    Par D-Phaz dans le forum Composants
    Réponses: 1
    Dernier message: 05/08/2005, 15h24
  4. [look and feel] Linux me pose un problème
    Par -=Spoon=- dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 26/09/2004, 23h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo