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 :

Listage/Affichage d'image dans panels à plusieurs niveaux


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 39
    Points
    39
    Par défaut Listage/Affichage d'image dans panels à plusieurs niveaux
    Bonsoir

    Mon but est d'afficher toutes les images contenues dans un répertoire.

    A la base, je dispose d'un panel (qui est une composante de ma frame), qui contient un autre panel (nommé pListeImages) via un jScrollPane. Le but de pListeImages est d'afficher une liste de petits panels (PanelImages) affichant chacun l'image (ImageIcon contenue dans un JLabel) et le nom de cette images (dans un JLabel également). Voici le code de cette classe:

    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
     
    package picado.explorateur.recherche;
     
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
     
    public class PanelImage extends javax.swing.JPanel {
        /** l'image */
        private ImageIcon image;
        /** le nom de l'image */
        private String nom;
        /** le path de l'image */
        private String path;    
     
        /** Creates new form PanelImage */
        public PanelImage() {
            initComponents();
        }
     
        private void initComponents() {
            ... // supprimé pour les besoins de l'affichage
     
        }                    
            /** 
             *  Constructeur 
             *  @param  img         l'image
             *  @param  lab         le nom de l'image
             *  @param  fileName    le chemin absolu de l'image
             **/
            public PanelImage(ImageIcon img, String lab, String fileName){
                this.image = img;
                this.nom = lab;
                this.path = fileName;
            }
     
            /**
             *  Permet l'initialisation et l'instantiation des différents objets du panel
             **/
            public void initPanel(){
    // nb: j'ai du instancier les JLabel, qui sont pourtant des composantes 
    //      de mon panel, sinon j'avais droit à un 'Chemin invalide'
                this.lImage = new JLabel(this.image);
                this.lNom = new JLabel(this.nom);
            }
     
            /**
             *  Retourne la référence de l'IconImage
             *  @return référence vers l'image
             */
            public ImageIcon getImage(){
                return this.image;
            }
     
            /**
             *  Retourne le nom de l'image correspondant à l'icone
             *  @return nom de l'image
             */
            public String getNom(){
                return this.nom;
            }
     
            /**
             *  Retourne le chemin absolu vers l'image
             *  @return chemin absolu de l'image
             */
            public String getFileName(){
                return this.path;
            }
     
        private javax.swing.JLabel lImage;
        private javax.swing.JLabel lNom;                
    }
    A partir d'une autre classe (FiltreBrowser), je récupère un ArrayList<File> (attribut listeImages) contenant les chemins vers les images, je créé un tableau de PanelImage (qui va donc contenir tous les panels décrits plus haut) puis je lance un itérator sur l'ArrayList.
    A chaque itération, j'instancie donc un nouveau PanelImage, puis une fois sorti, je lance une autre boucle, cette fois sur le tableau de PanelImage et j'exécute la méthode add de ces derniers sur le panel de premier niveau pListeImages et pour terminer, après la boucle, je lance un repaint sur pListeImages.
    Voilà la méthode qui gère celà:

    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
        /**
         *  Lance l'affichage des images contenues dans le répertoire
         */
        public void affichage(){
            this.panImage = new PanelImage[this.listeImages.size()];
            int i=0;
            Iterator iter = listeImages.iterator();
            while(iter.hasNext()){
                File file = (File)iter.next();
                // instanciation du nouveau PanelImage correspondant au fichier de l'itération courante
                this.panImage[i] = new PanelImage(new ImageIcon(Toolkit.getDefaultToolkit().getImage(file.getAbsolutePath()).getScaledInstance(50,50,Image.SCALE_DEFAULT)),
                                                    file.getName(),
                                                    file.getAbsolutePath());
                // initialisation du PanelImage
                this.panImage[i].initPanel();        
                i++;
            }
     
            for(i=0;i<panImage.length;i++){
                pListeImages.add(this.panImage[i]);
            }
            pListeImages.repaint();
        }
    Mon problème est que je n'arrive pas à afficher les PanelImage. Je n'ai pas codé d'algorithme de répartition des PanelImage dans pListeImages, mais j'ai essayé au cas par cas avec les méthodes setAlignementX et setAlignementY sur un dossier de deux images, résultat rien.

    Est-ce que quelqu'un sait comment régler mon problème ? Est-ce que j'ai fait un oubli dans mon code (ça ne fait pas longtemps que je manipule SWING, il est facile d'oublier des trucs ) ???

    Merci de vos réponses

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,

    oui, tu as oublié d'ajouter les JLabels dans le PanelImage. Donc ton JPanel global ne contient que des PanelImages vides.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par xavlours
    Bonjour,

    oui, tu as oublié d'ajouter les JLabels dans le PanelImage. Donc ton JPanel global ne contient que des PanelImages vides.
    Ils sont déjà dans le panel, je les ai créés à la main avec l'interface graphique de netbeans
    J'ai trouvé pourquoi je devais faire un new sur les JLabel, en fait j'ai codé un nouveau constructeur de ma classe, et j'ai oublié de faire un appel à initComponents()

    Donc ce point est réglé, j'ai remplacé le code de initPanel() par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            public void initPanel(){
                this.lImage.setIcon(this.image);
                this.lNom.setText(this.nom);
            }
    Et je n'ai toujours rien sur le panel, please help

  4. #4
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bon, dans ce cas, quel est le layout du panel pListeImages ? Un GridLayout ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    ah ben voilà, c'était un problème de layout, en mettant un border ça passe, merci pour la solution ^^ (j'aurais jamais pensé à toucher au layout !!!)

    Maintenant autre problème, je peux donc afficher mes PanelImage.
    Au lancement de l'appli, j'affiche les images contenues dans un dossier, ok nickel (petits problèmes de dispositions mais on en reparlera plus tard)
    Toujours sous la même instance, j'affiche le contenu d'un second dossier et là c'est le drâme:


    Le premier cadre en blanc (je l'ai mis en blanc pour voir la forme du PanelImage) à gauche correspond à l'image contenue dans le premier dossier, le contenu du PanelImage est supprimé avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            public void effacerContenu(){
                this.removeAll();
                for (MouseListener m : getMouseListeners()) {  
                    this.removeMouseListener(m); 
                }
            }
    Puis au niveau du FiltreBrowser (donc qui gère l'ensemble des PanelImage), je lance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                for(int j=0;j<this.panImage.length;j++){
                    this.panImage[j].effacerContenu();
                    this.remove(panImage[j]);
                }
    Et donc je conserve l'emplacement du premier PanelImage affiché.
    Est-ce que quelqu'un pourrait m'aider ? Merci

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Points : 39
    Points
    39
    Par défaut
    j'ai pu résoudre ce problème, il manquait juste un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    this.panImage[j].setVisible(false);
    Maintenant, j'en ai un autre qui concerne le JScrollPane et le panel qui se trouve à l'intérieur (pListeImages).
    Le la barre de défilement verticale du JScrollPane (spListeImages) ne s'adapte pas au panel pListeImages

    Voici le contenu de la méthode initComponents du FiltreBrowser:
    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
        private void initComponents() {
            spListeImages = new javax.swing.JScrollPane();
            pListeImages = new javax.swing.JPanel();
     
            setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.X_AXIS));
     
            setMinimumSize(new java.awt.Dimension(19, 240));
            setPreferredSize(new java.awt.Dimension(2, 240));
            spListeImages.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            spListeImages.setAutoscrolls(true);
            spListeImages.setHorizontalScrollBar(null);
            spListeImages.setPreferredSize(new java.awt.Dimension(10, 240));
            spListeImages.setViewport(null);
            pListeImages.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
     
            pListeImages.setMaximumSize(new java.awt.Dimension(360, 360));
            pListeImages.setMinimumSize(new java.awt.Dimension(130, 240));
            pListeImages.setPreferredSize(new java.awt.Dimension(10, 240));
            spListeImages.setViewportView(pListeImages);
            pListeImages.getAccessibleContext().setAccessibleName("pListeImages");
     
            add(spListeImages);
     
        }
    J'ai aussi fait appel aux méthodes repaint() et revalidate() à tour de rôle sur spListeImages après avoir fait les modifications sur pListeImages mais RAS malheureusement
    J'ai parcouru pas mal de topics à ce sujet sur le forum ainsi que les tutoriaux swing de sun, rien n'y fait
    Est-ce que quelqu'un pourrait m'aider ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/01/2007, 16h46
  2. affichage d'image dans site php
    Par eurykane dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 21
    Dernier message: 08/07/2006, 17h22
  3. [MFC] Un simple affichage d'image dans CStatic
    Par rabobsky dans le forum MFC
    Réponses: 2
    Dernier message: 02/03/2006, 12h28
  4. Probleme d'affichage d'image dans une fenetre
    Par cgregueusse dans le forum MFC
    Réponses: 1
    Dernier message: 03/08/2005, 11h08
  5. Affichage d'images dans une fenêtre
    Par tonycalv dans le forum MFC
    Réponses: 6
    Dernier message: 20/04/2005, 20h02

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