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 :

[Swing][ListCellRenderer]Pas d'affichage des composants


Sujet :

AWT/Swing Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut [Swing][ListCellRenderer]Pas d'affichage des composants
    Salut à tous !
    J'essaye d'implémenter un ListCellRenderer pour avoir dans une JList un résultat style "Explorateur Windows", à priori rien de compliqué, mais j'ai beau recopier des codes qui marche le mien n'arrive pas au bon résultat.. Bref voici ce que j'ai :
    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
     
    public class SharedImagePanel extends javax.swing.JPanel implements ListCellRenderer
    {
        private String path;
        private String fileName;
        private Icon image = null;
        private Color selectedBackColor;
     
        public SharedImagePanel(SharedImage image, boolean selected)
        {   
            super();
            selectedBackColor = new Color(73,196,255);
            path = image.getPath();
            fileName = image.getName();
            this.image = image.getImage();
            if(selected)
                setBackground(selectedBackColor);
            initComponents();
        }
     
        public java.awt.Component getListCellRendererComponent(
                                           JList list,
                                           Object value,
                                           int index,
                                           boolean isSelected,
                                           boolean cellHasFocus)
        {
            return new SharedImagePanel((SharedImage)value,isSelected);
        }
     
        private void initComponents()
        {
           ...
           //Initialisations à partir de l'éditeur
        }
     
        // Variables declaration - do not modify
        private javax.swing.JLabel jLabel1;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JPanel jPanel2;
        private javax.swing.JLabel nameLabel;
        // End of variables declaration
    }
    Alors le problème, c'est quand j'affecte ce Renderer pour une liste je vois les bordures des cases, ainsi que la couleur de fond, qui s'adapte bien en fonction de si la case est sélectionnée ou non, mais c'est tout ! Avant j'affichais exactement le même objet mais dans un JPanel standard et là on voyait tout bien, et maintenant que je le renvois à travers le renderer, impossible d'afficher les composants qui sont à l'intérieur... Une idée ?

  2. #2
    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
    N'ayant pas le code d'initialisation de tes sous-composants, l'idee qui me vient est qu'au lieu de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public java.awt.Component getListCellRendererComponent( 
                                           JList list, 
                                           Object value, 
                                           int index, 
                                           boolean isSelected, 
                                           boolean cellHasFocus)  { 
            return new SharedImagePanel((SharedImage)value,isSelected); 
        }
    Il te faudrai mieux faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public java.awt.Component getListCellRendererComponent( 
                                           JList list, 
                                           Object value, 
                                           int index, 
                                           boolean isSelected, 
                                           boolean cellHasFocus)  { 
            // Configure THIS panel based on isSelected value (and others).
            this;
        }
    Il est probable que lors de la creation d'un nouveau panel, la nouvelle instance ne contenait rien (pas de sous-composants). Ou alors que tu modifiais les sous-composants de this et donc pas ceux du renderer retourne par la methode (auquel cas ils affichent leur contenu par defaut, c'est a dire rien).

    En plus en recreer un nouveau a chaque appel (donc au moins fois pour chaque element de la liste a peindre * nombre de fois que la liste est repeinte ; idem pour calculer la taille d'affichage de la liste...) c'est une mauvaise idee et une fuite memoire. Ca defie egalement le principe du renderer qui est de reutiliser le meme (seul et unique) composant pour une meme liste (comme un tampon encreur) juste en changeant sa configuration pour chaque element a afficher ; pas d'en creer un nouveau a chaque fois.
    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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bon, j'ai suivi ton conseil, un peu sceptique, pour obtenir le code suivant :
    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
     
    public class SharedImagePanel extends javax.swing.JPanel implements ListCellRenderer
    {
        private Color selectedBackColor;
        private Color normalBackColor;
     
        public SharedImagePanel()
        {
            selectedBackColor = new Color(73,196,255);
            normalBackColor = getBackground();
            initComponents();
        }
     
        public java.awt.Component getListCellRendererComponent(
                                           JList list,
                                           Object value,
                                           int index,
                                           boolean isSelected,
                                           boolean cellHasFocus)
        {
            if(isSelected)
                setBackground(selectedBackColor);
            else
                setBackground(normalBackColor);
     
            SharedImage img = (SharedImage)value;
            jLabel1.setIcon(img.getImage());
            nameLabel.setText(img.getName());
            return this;
        }
     
        private void initComponents()
        {
            jPanel1 = new javax.swing.JPanel();
            jLabel1 = new javax.swing.JLabel();
            jPanel2 = new javax.swing.JPanel();
            nameLabel = new javax.swing.JLabel();
     
            setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));
     
            setBorder(new javax.swing.border.EtchedBorder());
            setMaximumSize(new java.awt.Dimension(100, 114));
            setMinimumSize(new java.awt.Dimension(100, 114));
            setPreferredSize(new java.awt.Dimension(100, 118));
            jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.X_AXIS));
     
            jPanel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204)));
            jPanel1.setMaximumSize(new java.awt.Dimension(90, 90));
            jPanel1.setMinimumSize(new java.awt.Dimension(90, 90));
            jPanel1.setOpaque(false);
            jPanel1.setPreferredSize(new java.awt.Dimension(90, 90));
            jLabel1.setDoubleBuffered(true);
            jLabel1.setMaximumSize(new java.awt.Dimension(88, 89));
            jLabel1.setMinimumSize(new java.awt.Dimension(88, 89));
            jLabel1.setPreferredSize(new java.awt.Dimension(88, 89));
            jPanel1.add(jLabel1);
     
            add(jPanel1);
     
            jPanel2.setMaximumSize(new java.awt.Dimension(100, 28));
            jPanel2.setMinimumSize(new java.awt.Dimension(100, 28));
            jPanel2.setOpaque(false);
            jPanel2.setPreferredSize(new java.awt.Dimension(100, 28));
            nameLabel.setForeground(new java.awt.Color(51, 51, 51));
            nameLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            nameLabel.setDoubleBuffered(true);
            nameLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
            nameLabel.setMaximumSize(new java.awt.Dimension(20, 28));
            nameLabel.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
            jPanel2.add(nameLabel);
     
            add(jPanel2);
        }
     
     
        // Variables declaration - do not modify
        private javax.swing.JLabel jLabel1;
        ...
        private javax.swing.JLabel nameLabel;
        // End of variables declaration
     
    }
    Mais le résultat est exactement le même.. J'ai mis le code entier de initComponents des fois que ça inspirerait quelqu'un pour trouver la faille, mais bon c'est du code super standard généré par netbeans donc à priori pas de souci là-dedans..

  4. #4
    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
    En modifiant legerement ton code pour qu'il compile et s'execute chez moi (rajout du main pour le test, remplacement de SharedImage par ImageIcon, rajout des panels membres manquant a la fin), tout fonctionne normalement sans aucun probleme et ton render marche tres bien et la cellule selectionnee est bien en bleu.

    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
    97
     
    package test;
     
    import java.awt.*;
    import javax.swing.*;
     
    public class SharedImagePanel extends javax.swing.JPanel implements ListCellRenderer {
      private Color selectedBackColor;
      private Color normalBackColor;
     
      public SharedImagePanel() {
        selectedBackColor = new Color(73, 196, 255);
        normalBackColor = getBackground();
        initComponents();
      }
     
      public java.awt.Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        if (isSelected) {
          setBackground(selectedBackColor);
        } else {
          setBackground(normalBackColor);
        }
     
        ImageIcon img = (ImageIcon) value;
        jLabel1.setIcon(img);
        nameLabel.setText(img.toString());
        return this;
      }
     
      private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        nameLabel = new javax.swing.JLabel();
     
        setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));
     
        setBorder(new javax.swing.border.EtchedBorder());
        setMaximumSize(new java.awt.Dimension(100, 114));
        setMinimumSize(new java.awt.Dimension(100, 114));
        setPreferredSize(new java.awt.Dimension(100, 118));
        jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.X_AXIS));
     
        jPanel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204)));
        jPanel1.setMaximumSize(new java.awt.Dimension(90, 90));
        jPanel1.setMinimumSize(new java.awt.Dimension(90, 90));
        jPanel1.setOpaque(false);
        jPanel1.setPreferredSize(new java.awt.Dimension(90, 90));
        jLabel1.setDoubleBuffered(true);
        jLabel1.setMaximumSize(new java.awt.Dimension(88, 89));
        jLabel1.setMinimumSize(new java.awt.Dimension(88, 89));
        jLabel1.setPreferredSize(new java.awt.Dimension(88, 89));
        jPanel1.add(jLabel1);
     
        add(jPanel1);
     
        jPanel2.setMaximumSize(new java.awt.Dimension(100, 28));
        jPanel2.setMinimumSize(new java.awt.Dimension(100, 28));
        jPanel2.setOpaque(false);
        jPanel2.setPreferredSize(new java.awt.Dimension(100, 28));
        nameLabel.setForeground(new java.awt.Color(51, 51, 51));
        nameLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        nameLabel.setDoubleBuffered(true);
        nameLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        nameLabel.setMaximumSize(new java.awt.Dimension(20, 28));
        nameLabel.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        jPanel2.add(nameLabel);
     
        add(jPanel2);
      }
     
     
      // Variables declaration - do not modify
      private javax.swing.JLabel jLabel1;
      private javax.swing.JPanel jPanel1;
      private javax.swing.JPanel jPanel2;
      private javax.swing.JLabel nameLabel;
      // End of variables declaration
     
      /** Self-test main.
       * @param args Arguments from the command line.
       */
      public static void main(String ...args) {
        DefaultListModel iconListModel = new DefaultListModel();
        for (int i = 0; i < 5; i++) {
          ImageIcon icon = new ImageIcon(i + ".png");
          iconListModel.addElement(icon);
        }
        JList iconList = new JList(iconListModel);
        iconList.setCellRenderer(new SharedImagePanel());
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(iconList));
        frame.setSize(150, 200);
        frame.setVisible(true);
      }
    }
    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

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Waw, ça c'est bizarre.. Je vais essayer de voir les différences, si ça se trouve ça vient de ma SharedImage encore que j'en doute fortement mais bon, merci d'avoir fait tout ça je vais fouiller ^^

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bon, j'avais pensé que ça venait de l'affectation des éléments dans la liste, j'ai donc repris ton code avec le Model, je dois dire que c'est plus propre, mais malheureusement mon résultat est toujours le même... J'ai vérifié le code d'initialisation de ma liste, c'est exactement le même que le tien, et j'ai aussi vérifié les icones provenant des images, elles ne sont pas invalides... Je ne sais plus quoi faire ^^ Help !!

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Wahou, j'ai enfin trouvé !! Et c'est bien le genre d'erreur débile ultra-con à laquelle on ne pense jamais.. Détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Code de remplissage de la JList
    imageList.removeAll();
    DefaultListModel listModel = new DefaultListModel();
    for(int i = 0; i < s.getImages().size(); i++) 
        listModel.addElement(s.getImages().get(i));
    imageList.setModel(listModel);
    Dans un élan d'inspiration, je me suis dit qu'avec le setModel(..), le removeAll() n'était plus nécéssaire, je me suis donc dit tiens je vais le mettre en commentaire on verra.. Et là magie tout marche ! Je sais pas trop pourquoi, je cherche pas, ça marche c'est génial lol, la conclusion du jour c'est qu'il faut juste faire un setModel() quand on veut changer le contenu d'une JList... Merci beaucoup pour votre aide !!

  8. #8
    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
    Note que removeAll() est une methode de Container pour retirer tous les sous-composants d'un composant parent. Rien a voir avec le contenu du modele de la liste donc.

    Pense a marquer le topic comme etant
    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

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Ah ouais pas con.. Donc en fait, en faisait le removeAll(), il enlevait tous les composants contenus dans le JPanel, et du coup plus rien.. Cool ^^ ;-)

  10. #10
    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
    Non, plutot tous les sous-composants dans imageList (donc a priori ca n'enleve rien puisque la liste n'a pas de sous-composants), ce qui est bizarre c'est comment ca a interreagit avec le renderer. A moins que tu n'ais fait un imageList.add(renderer) quelque part ?

    Ou alors quand on fait imageList.setCellRenderer(renderer) ca rajoute implicitement le renderer en tant que sous-composant de la liste (ce qui n'est pas si con que ca ; nottement ca facilite des trucs quand on change le look and feel ou la taille du viewport). EDIT - apres avoir ete jeter un coup d'oeuil dans le code source ca n'a pas l'air d'etre le cas.
    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

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

Discussions similaires

  1. [AJAX] [Struts] Pas d'affichage des boutons lors du raffraîchissement
    Par AnneB dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/07/2007, 13h29
  2. Disposition et affichage des composants?
    Par dj_techno dans le forum Delphi
    Réponses: 4
    Dernier message: 31/05/2007, 08h47
  3. Pas d'affichage des valeurs nulles avec un COUNT
    Par phoenixz22 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 30/05/2007, 18h39
  4. [Kylix] Affichage des composants
    Par Tux74 dans le forum EDI
    Réponses: 5
    Dernier message: 20/02/2006, 10h13
  5. gestion de l'affichage des composants
    Par Foub dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2005, 11h37

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