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 :

gestion des icones avec Swing


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 33
    Points : 35
    Points
    35
    Par défaut gestion des icones avec Swing
    Bonjour

    J'utilise toujours les mêmes icones dans une application. Pour les charger j'utilise cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jMenuItem1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/test/rcp/icon/exit.png")));
    Je pense que du coup pour une image identique chargée x fois, elle est montée en mémoire à chaque fois.

    Que pensez-vous de l'idée de faire un depository où je chargerais toutes mes icones en "public final static". Là je pense que même si on les applique à x boutons, l'image n'est montée qu'une seule fois en mémoire ?

    Je ne connais pas le comportement des composants Swing sur ce point.

    Merci de vos réponses.
    Laurent

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Personnellement j'utilise une classe Factory utilisant un système de cache.
    Ce qui m'évite de charger en static toutes les icônes (j'en ai une pété, ça ralentirait mon programme), et m'évite de charger 2x la même si je l'ai déjà en cache.

    Aucun problème pour utiliser la même instance d'icône à 20 endroits différents dans l'application, pas de soucis sur ce point (tant que tu ne la modifies pas bien sûr).
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    J'ai utilisé ton principe Factory + Depository. J'ai diminuer d'environ 20mo la taille de l'application.
    Cool
    Merci

  4. #4
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    @natha et/ou @laurentapologic:
    est-ce que l'on pourrait en savoir un peu plus sur ta Factory (éventuellement un bout de code) ça m'intéresse bien

    merci d'avance
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Ca manque surement de commentaire mais c'est pas très compliqué

    Pour la factory (un singleton):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    package com.test.rcp.util;
     
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Hashtable;
    import java.util.List;
    import javax.swing.ImageIcon;
     
    /**
     *
     * @author laurent
     */
    public final class IconFactory
    {
        //instance du factory (qui est en fait un singleton)
        private static IconFactory instanceIconFactory;
     
        //map des icones
        private Hashtable<String,ImageIcon> iconCache;
        private List<String> iconLst;
     
        // objet utilisé uniquement pour la synchronisation du singleton
        private static Object objetSynchrone = new Object();
     
     
        /** Creates a new instance of IconFactory */
        private IconFactory()
        {
            this.iconCache = new Hashtable<String,ImageIcon>();
            this.iconLst = new ArrayList<String>();
     
            Field[] champs = IconDepository.class.getFields();
            IconDepository iconDepository = new IconDepository();
     
            if(champs!=null)
            {
                for(Field field : champs)
                {
                    if(field.getName().startsWith("ICON_"))
                    {
                        try
                        {
                            this.iconLst.add((String)field.get(iconDepository));
                        } catch (IllegalArgumentException ex)
                        {
                            ex.printStackTrace();
                        } catch (IllegalAccessException ex)
                        {
                            ex.printStackTrace();
                        }
                    }
                }
            }
        }
     
        public static IconFactory getInstance() {
            if (instanceIconFactory == null) 
            { 
                // on s'assure de synchroniser la creation du singleton
                synchronized(objetSynchrone) {
                        instanceIconFactory = new IconFactory();
                }
            }
            return instanceIconFactory;
        }
     
        public ImageIcon getIcon(String cle)
        {
            ImageIcon img = null;
            if(isIconInDepository(cle))
            {
                if(iconCache.contains(cle))
                {
                    img = iconCache.get(cle);
                }
                else
                {
                    img = new javax.swing.ImageIcon(getClass().getResource(cle));
                    iconCache.put(cle,img);
                }
            }
            return img;
        }
     
        private boolean isIconInDepository(String cle)
        {
            boolean retour = false;
     
            if(this.iconLst.contains(cle))
            {
                retour=true;
            }    
            return retour;
        }
    }
    Pour le Depository:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package com.test.rcp.util;
     
     
    /**
     *
     * @author laurent
     */
    public class IconDepository
    {           
        /** 
         * Facturation : état de la facture calculée
         * /com/test/rcp/icon/calculator.png
         */
        public static final String ICON_SMALL_CALCULATOR = "/com/test/rcp/icon/calculator.png";
        /** 
         * Bouton valider dans les fiches de gestion, les listes de sélection, ...
         * /com/test/rcp/icon/check2.png
         */
        public static final String ICON_SMALL_CHECK2 = "/com/test/rcp/icon/check2.png";
    }
    Pour appeler une icone:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.test.rcp.util.IconFactory.getInstance().getIcon(com.test.rcp.util.IconDepository.ICON_CONTACT_MAIL)

  6. #6
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    ok merci je garde ça dans un coin on en apprend tous les jours
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et plutot que definir les chemins des icones dans le Repository sous forme de constantes autant utiliser un fichier .properties et un ResourceBundle (ce qui permet bien sur de faire varier l'icone, nottament celles ayant du texte sur le dessin, en fonction de la Locale).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    +1 pour bouye
    Je travaille également avec un properties.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

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

Discussions similaires

  1. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  2. [vb.net]Gestion des exceptions avec les web services
    Par mvr dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/12/2005, 22h41
  3. Gestion des factures avec interbase
    Par AlexB59 dans le forum Bases de données
    Réponses: 1
    Dernier message: 25/10/2005, 12h05
  4. Gestion des cookies avec Indy 10
    Par membrax dans le forum Web & réseau
    Réponses: 5
    Dernier message: 21/09/2005, 18h44
  5. Class de gestion des images avec rotation
    Par Johnny Boy dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 11h54

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