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 :

JCheckbox icones persos - Bug sous linux mais pas sous Windows


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut JCheckbox icones persos - Bug sous linux mais pas sous Windows
    Bonjour à tous !
    J'ai fait une recherche sur google puis sur ce forum, mais je n'arrive pas à trouver réponse à ma question. Voyez-vous, j'ai une JCheckbox dont je personnalise les icones afin qu'elle affiche une étoile pleine ou vide selon qu'elle est sélectionnée ou non. Sous Windows, ça marche sans souci ! Mais sous Linux, mon image ne s'affiche juste pas... J'utilise JDK 7 sur les deux OS.

    Donc voilà, si je labellise bien ma JCheckbox, je vois le texte mais aucune icone, pas même celle par défaut (si j'ai fait les setIcon, setSelectIcon etc).
    C'est vraiment bizarre. Pourquoi cela fonctionnerait-il sous WIndows 7 et pas Linux ? Mystère...

    Mes icones sont des png, et le chargement se passe sans soucis car il est fait dans une classe séparée (ProgramIcons), et si je veux afficher l'icone dans un bouton (new JButton("un bouton", ProgramIcons.favEnabled)), elle s'affiche bien. J'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class ProgramIcons {
      //...
     
      public static final ImageIcon favEnabledIcon     = new ImageIcon("img/favEnabled.png");
      public static final ImageIcon favPressedIcon     = new ImageIcon("img/favPressed.png");
      public static final ImageIcon favDisabledIcon    = new ImageIcon("img/favDisabled.png");
      public static final ImageIcon favDisabledSelIcon = new ImageIcon("img/favDisabledSel.png");
     
      private ProgramIcons() {}
    }
    Pour le chargement de mes images. Ensuite, je crée ma checkbox comme ceci dans mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        JCheckbox favToggleComponent = new JCheckBox("");
        favToggleComponent.setIcon(ProgramIcons.favDisabledIcon);
        favToggleComponent.setSelectedIcon(ProgramIcons.favEnabledIcon);
        favToggleComponent.setPressedIcon(ProgramIcons.favPressedIcon);
        favToggleComponent.setDisabledIcon(ProgramIcons.favDisabledIcon);
        favToggleComponent.setDisabledSelectedIcon(ProgramIcons.favDisabledSelIcon);
    Et comme je vous l'ai dit : sous Windows, nickel, sous linux, il n'y a rien d'affiché.

    J'espère que vous pourrez m'aider...

    Bien à vous,
    Hemophilius

    EDIT : J'ai oublié de vous dire, mais je charge d'autres images de la même façon (dans le "//...") et je les affiche dans des boutons sans aucun problème sous Linux comme sous Windows, mais dans des boutons... Quelle que soit l'image que je sélectionne pour l'icone de ma checkbox, rien n'apparait.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Il est préférable de mettre ces icônes dans le jar de ton appli et d'y accéder via le classpath.

    Imaginons que tu aies un package img dans ton projet contenant tes icônes:

    Ta première ligne de chargement deviendrait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final ImageIcon favEnabledIcon = new ImageIcon(ProgramIcons.class.getRessource("/img/favEnabled.png"));
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    En fait c'est un projet à faire pour l'unif, et dans les consignes il est bien spécifié qu'on ne peut pas faire de JAR...

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ce n'est pas grave, ça marche tant qu'il y a un package dans ton projet

    Le jar n'est qu'une archive de livraison/déploiement.
    Ton classpath existe quoi qu'il en soit, et si tu as des ressources (images) utilisées par ton programme, il est amplement recommandé de les mettre dans le classpath de ton projet (aka dans un des package de ton projet).

    Cela permet de s'abstraire des contraintes de chemin relatives aux OS.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    C'est le cas mais quand j'utilisais cette méthode, ça ne marchait pas... Trop long à expliquer ici mais ce n'est pas le problème car je peux mettre ces images chargées ainsi dans mes boutons. C'est juste sur la checkbox que ça ne marche pas, et que sous linux. Tu vois ? :s

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    La solution que je t'ai proposé marche sur tout les système.

    Tu passes bien par un appel à la méthode getResource à laquelle tu passes le chemin absolu dans le classpath?
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Non et justement, même sans, sous linux, ben les images apparaissent dans les boutons ! Mais pas dans la checkbox, c'est tout...

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Commence par essayer.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  9. #9
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Je viens d'essayer et maintenant il met des nullException comme si il ne trouvait pas l'image. Voilà mon arborescence :


    et j'avais modifié la ligne en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final ImageIcon favEnabledIcon = new ImageIcon(MainWindow.class.getResource("/img/favEnabled.png"));
    Sous Windows, compile fine, display fine. Sous linux, une erreur à l'ouverture de l'application...
    EDIT : Aussi, sous windows, si je lance sans la première "/" du chemin, ça plante pour la même raison...

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Il faut que ton dossier img fasse partie du classpath, or là ce n'est pas le cas.

    Il faut que tu crées un package pour contenir tes images.

    Par exemple un package resource.images fera amplement l'affaire.

    Puis tu déplace toutes tes images dans ce package.

    Enfin pour accéder à tes images il faudra procéder de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final ImageIcon favEnabledIcon = new ImageIcon(MainWindow.class.getResource("/resource/images/favEnabled.png"))
    Il semble que tu n'aies pas réellement intégré la notion de classpath.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  11. #11
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Sûrement... :/
    J'ai créé un package "img" avec Eclipse sous "gui", et j'ai mis mes images dedans. Ensuite, dans mon fichier c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final ImageIcon favEnabledIcon     = new ImageIcon(MainWindow.class.getResource("/img/favEnabled.png"));
    Et là il lance bien le programme, mais plus rien n'est affiché, même plus sous Windows...
    Et j'ai vérifié, les images sont bien dans le dossier.

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Si MainWindow est dans le package gui alors enlève le premier slash.
    En fait il y a deux façon d’accéder à une ressource en passant par Class.getResource(String), relative ou absolue (c'est expliqué dans la javadoc)

    Sinon quel Look&Feel utilises tu ? (sous Windows et Linux)

  13. #13
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    J'utilise celui de l'OS :s
    Et si j'enlève le slash, ça va mais rien ne s'affiche, et avec tout plante au lancement, il ne trouve pas les images :s
    J'ai essayé de supprimer cette option, mais même avec le look&feel de la javamachine, il ne les affiche pas

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Fais nous une nouvelle capture de l'arborescence de ton projet Eclipse
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    Voilà :

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Normal, tu as mis les package img dans le package gui.

    Donc le chemin à utiliser est /gui/img/favEnabled.png
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  17. #17
    Membre du Club Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 68
    Points
    68
    Par défaut
    J'ai trouvé.
    Le fichier s'appelle non pas favEnabled mais... FavEnabled. Windows ne prenant pas en compte la casse du nom de fichier, pour lui c'était OK, le **** !

    Merci à vous !!!

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

Discussions similaires

  1. [LibreOffice][Tableur] Une macro qui fonctionne sous Linux mais pas sous windows
    Par ludox62 dans le forum OpenOffice & LibreOffice
    Réponses: 3
    Dernier message: 07/01/2014, 21h26
  2. Bad_alloc sous Linux mais pas sous mac
    Par betaplus dans le forum C++
    Réponses: 4
    Dernier message: 11/03/2013, 14h03
  3. Script qui marche sous Linux mais pas sous Windows et vice versa
    Par tu-phat dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 26/11/2009, 02h39
  4. Réponses: 5
    Dernier message: 13/04/2009, 23h12
  5. [JMF] Code fonctionnant sous Linux mais pas sous XP
    Par Monsieur_Max dans le forum Multimédia
    Réponses: 4
    Dernier message: 25/05/2006, 18h57

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