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

Composants Java Discussion :

[JList]Probleme de raffraichissement


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut [JList]Probleme de raffraichissement
    Bonjour à tous,
    Mon aplication contient une JList, avec en parallèle un DefaultListModel.
    Comme indiqué dans la javadoc de la classe JList, je souhaite que chaque élément de ma liste soit un JLabel, pour pouvoir avoir un Icon et un String pour chaque item.
    J'ai donc créé mon propre CellRender, classe dans laquelle je redéfinis la méthode getListCellRendererComponent.

    L'affichage me convient parfaitement, mais j'ai un bug lorsque je redimensionne ma fenêtre contenant la JList: la Jlist est aussi redimensionnée (normal), mais parfois l'Icon n'est pas affiché...
    Le plus étrange, c'est que cela arrive "parfois", et je ne comprend pas trop d'ou vient le problème...

  2. #2
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    tu peut nous donner le code de ton renderer?

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    oui c'est a peu de choses prés le même que celui de la javadoc de la classe JList

    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
     
    class MyCellRenderer extends JLabel implements ListCellRenderer {
     
     
         public Component getListCellRendererComponent(
           JList list,
           Object value,            // value to display
           int index,               // cell index
           boolean isSelected,      // is the cell selected
           boolean cellHasFocus)    // the list and the cell have the focus
         {
             String s = value.toString();
             setText(s);
             setIcon(new ImageIcon("test.gif"));
       	   if (isSelected) {
                 setBackground(list.getSelectionBackground());
    	       setForeground(list.getSelectionForeground());
    	   }
             else {
    	       setBackground(list.getBackground());
    	       setForeground(list.getForeground());
    	   }
    	   setEnabled(list.isEnabled());
    	   setFont(list.getFont());
             setOpaque(true);
             return this;
         }
     }

  4. #4
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    tu peut tester ca et me dire si tu as le meme probleme?
    moi j'ai tester ce que tu dit j'ai aucun probleme

    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
     
    import java.awt.Component;
    import java.awt.EventQueue;
    import java.awt.Color;
     
    import javax.swing.DefaultListModel;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    import javax.swing.ListCellRenderer;
     
    /**
     * @author bebe
     */
    public class TestListCellRenderer {
     
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    JFrame myFrame = new JFrame("Testing");
     
                    JList myList = new JList();
                    myList.setCellRenderer(new MyCellRenderer());
     
                    DefaultListModel model = new DefaultListModel();
                    for (int i = 0; i < 10; i++) {
                        model.add(i, i);
                    }
     
                    myList.setModel(model);
                    myFrame.setSize(400, 300);
                    myFrame.add(new JScrollPane(myList));
                    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    myFrame.setLocationRelativeTo(null);
                    myFrame.setVisible(true);
                }
            });
        }
    }
     
     
    class MyCellRenderer extends JLabel implements ListCellRenderer {
        public Component getListCellRendererComponent(
                JList list,
                Object value,            // value to display
                int index,               // cell index
                boolean isSelected,      // is the cell selected
                boolean cellHasFocus)    // the list and the cell have the focus
        {
            String s = value.toString();
            setText(s);
            setIcon(new ImageIcon(getClass().getResource("pictures/versionControl.png"))); // changer image!!
     
            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            } else {
                if (index % 2 == 0) {
                    setBackground(new Color(255, 255, 225));
                } else {
                    setBackground(list.getBackground());
                }
                setForeground(list.getForeground());
            }
            setEnabled(list.isEnabled());
            setFont(list.getFont());
            setOpaque(true);
            return this;
        }
     
     
     
        @Override
        protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
     
        }
     
        @Override
        public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
     
        }
     
        @Override
        public void validate() {
        }
     
        @Override
        public void revalidate() {
     
        }
    }

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    j'ai toujours le même problème...
    quand je clique sur un des items de la liste ou quand je redimensionne ma fenêtre, les images peuvent disparaitre...

    par contre je débute, et je n'ai pas compris le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setIcon(new ImageIcon(getClass().getResource("pictures/versionControl.png")));
    je l'ai remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setIcon(new ImageIcon("test.gif"));
    Je pense que ça ne change en rien le problème mais bon, je préfère te le signaler, au cas ou.

    Par contre est-il nécessaire de redéfinir les methodes validate(), revalidate(), et firePropertyChange()?

  6. #6
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    quand tu fais
    getClass().getResource c'est juste pour lire une image. c'est pas tres important pour ton probleme. (je croi pas )


    mes validate(), revalidate(), et firePropertyChange() sont redefini pour ne rien faire. c'est juste une petite optimisation que tu peut faire. t'es pas obliger de le faire.

    mais moi j'ai tout essayer pour avoir le probleme que tu a j'arrive pas a le faire. tu peut pas essayer de trouver un cas pour que je peut aussi tester?

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Je vais t'envoyer le code de la JFrame qui contient ma liste:

    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 Test extends JFrame {
     
    	private BorderLayout borderLayout;
    	private BorderLayout borderLayout2;	
    	private JPanel pListeUsers;	
    	private Contact user;
    	private java.util.List lesConversations;
    	private ContactList contactlist;	
    	private JButton parler;
     
    	private JMenuBar mbMenuPrincipale;
    	private JMenu mFichier;
    	private JMenuItem vAbout;
    	private JMenuItem vQuitter;
    	private JMenu mOptions;
    	private JMenuItem vProfil;
     
    public Test(Contact user) {
    		this.user = user;
    		this.lesConversations = new ArrayList();
     
    		this.borderLayout = new BorderLayout();
    		this.getContentPane().setLayout(this.borderLayout);
     
    		JLabel contact = new JLabel(" - Contacts - ");
     
    		this.contactlist = new ContactList();
    		this.contactlist.setFixedCellHeight(20);
    		this.contactlist.setFixedCellWidth(300);
     
    		this.borderLayout2 = new BorderLayout();
    		this.pListeUsers = new JPanel();
    		this.pListeUsers.setLayout(this.borderLayout2);
    		this.pListeUsers.add(contact, BorderLayout.NORTH);
    		this.pListeUsers.add(this.contactlist, BorderLayout.CENTER);
     
     
    		this.parler = new JButton("Parler");
    		this.parler.addActionListener(new ButtonListener(this));
     
     
    		this.mbMenuPrincipale = new JMenuBar();
     
    		this.mFichier = new JMenu();
    		this.mFichier.setText("Fichier");
     
     
    		this.mOptions = new JMenu();
    		this.mOptions.setText("Options");
     
    		this.vAbout = new JMenuItem();
    		this.vAbout.setText("A propos");
    		this.vAbout.addActionListener(new vAboutListener(this));
     
    		this.vProfil = new JMenuItem();
    		this.vProfil.setText("Profil");
    		this.vProfil.addActionListener(new vProfilListener(this));
     
    		this.vQuitter = new JMenuItem();
    		this.vQuitter.setText("Quitter");
    		this.vQuitter.addActionListener(new vQuitterListener(this));
     
    		this.mFichier.add(this.vAbout);
    		this.mFichier.addSeparator();
    		this.mFichier.add(this.vQuitter);
    		this.mOptions.add(this.vProfil);
    		this.mbMenuPrincipale.add(this.mFichier);
    		this.mbMenuPrincipale.add(this.mOptions);
     
    		this.getContentPane().add(this.mbMenuPrincipale, BorderLayout.NORTH);
    		this.getContentPane().add(this.pListeUsers, BorderLayout.CENTER);
    		this.getContentPane().add(this.parler, BorderLayout.SOUTH);
     
    		this.pack();
    		this.setLocationRelativeTo(getParent());
    		this.setSize(190, 300);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.addWindowListener(new WindowListener(this));
    		this.setTitle("test");
    		this.setVisible(true);
    	}
    en fait, c'est une application de type Messenger, et donc je gére une liste de contacts, et je veux que cette JList comporte des items qui soient des JLabel avec des ImageIcon...

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Grace à l'aide précieuse de bbclone, et apès avoir fais tester mon code sur d'autre machine, il s'avère que le bug apparait sur certaines configurations: je suis sous Windows avec java 5 et le bug apparait souvent lors du redimensionnement.
    Sous linux et java 6 aparament le bug n'intervient pas du tout...

  9. #9
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    mais comme je t'ai dit, je croit pas que ce soit un bug au niveau de java.
    c'est trop courant comme truc.

    ca doit etre un truc dans ta config.

Discussions similaires

  1. [JList] probleme d'affichage
    Par Sirkiller dans le forum Composants
    Réponses: 2
    Dernier message: 23/05/2006, 18h05
  2. [NetBeans] jList - problème d'ajout d'éléments
    Par HaaaWaaaX dans le forum NetBeans
    Réponses: 4
    Dernier message: 22/05/2006, 09h09
  3. la balise iframe et le probleme de raffraichissement
    Par abdou.sahraoui dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 27/12/2005, 10h54
  4. [JList] probleme avec le ListSelectionListener
    Par dzincou dans le forum Composants
    Réponses: 4
    Dernier message: 06/12/2004, 11h55
  5. Probleme de raffraichissement
    Par gimlithedwarf dans le forum Composants VCL
    Réponses: 5
    Dernier message: 12/08/2002, 06h31

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