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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    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).

  3. #3
    Membre averti
    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
    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 émérite 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
    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

  5. #5
    Membre averti
    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
    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 émérite 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
    Par défaut
    ok merci je garde ça dans un coin on en apprend tous les jours

+ 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