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 avec le ListSelectionListener


Sujet :

Composants Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 38
    Par défaut [JList] probleme avec le ListSelectionListener
    Bonjour,
    voila, j'ai une liste d'elements et j'aimerai associer une action au fait que l'on change d'element selectionné dans cette liste. J'ai donc ajouté un ListSelectionListener a ma liste et ercit la methode valueChanged, mais voila mon probleme, ce bout de code est executé 2 fois ...

    Voila une classe Test qui illustre parfaitement mon probleme...
    Je n'ai pas l'impression d'ajouter 2 listeners a ma liste, je ne vois vraiment pas d'ou vient ce probleme!

    merci de votre aide

    Eric

    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
     
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.table.DefaultTableModel;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
     
     
    public class Test extends JPanel implements ListSelectionListener {
     
        JList categoryList;
        String [] listItems;
        JButton button = new JButton ("Test");
     
        public Test () {
            this.setLayout(new FlowLayout());
            this.setPreferredSize(new Dimension (500, 300));
     
            setCategoryList();
     
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                   addData();
                }
            });
            this.add(button);
            this.add(categoryList);
        }
     
        private void setCategoryList () {
            listItems = new String [] {"category 1", "category 2", "category 3"};
            categoryList = new JList (listItems);
            categoryList.addListSelectionListener(this);
        }
     
        private void addData () {
        }
     
        public void valueChanged (ListSelectionEvent e) {
               String selected = "" + categoryList.getSelectedIndex();
               System.out.print ("item selected = " + selected);
               System.out.println (" - value = " + categoryList.getSelectedValue().toString());
        }
     
     
        public static void main(String[] args) {
            JFrame frame = new JFrame ();
            frame.getContentPane().add(new Test());
            frame.setBounds (100, 100, 500, 500);
            frame.setVisible(true);
     
        }
    }

  2. #2
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    Ce n'est pas que tu as ajouté deux fois le listener le problème, c'est que l'évènement se produit effectivement deux fois je pense. En tout cas d'après la JavaDoc, valueChanged est appelée "whenever the value of the selection changes". Donc ce qui se passe à mon avis c'est que si tu sélectionnes un élément alors qu'un autre était déjà sélectionné, un premier appel de valueChanged a lieu lorsque l'ancien est désélectionné (premier changement de sélection) et un second appel quand tu sélectionnes le nouvel élément (deuxième changement de sélection).

    Enfin je pense...

    Bon courage @+++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 38
    Par défaut
    ok merci, tu as peut etre raison, mais dans ce cas, c'est un peu problematique pour moi ...
    est ce que tu (ou qq'un d'autres) connaitrait un moyen d'outrepasser ce genre de chose et de n'avoir qu'une seule execution de code lors d'un changement de selection ?
    Car dans la javadoc, je ne vois pas d'autre moyen de faire ca

  4. #4
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Bonjour,

    il y a dans la classe ListSelectionEvent un méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public boolean getValueIsAdjusting()Returns true if this is one of multiple change events. 
     
    Returns:
    true if this is one of a rapid series of events
    il faut donc remplacer ton code par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void valueChanged (ListSelectionEvent e) { 
    	if(!e.getValueIsAdjusting()){
           String selected = "" + categoryList.getSelectedIndex(); 
           System.out.print ("item selected = " + selected); 
           System.out.println (" - value = " + categoryList.getSelectedValue().toString()); 
    	}
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 38
    Par défaut
    super, ca marche !
    merci beaucoup!
    Sinon, en attendant, j'avais cherché a proceder autrement, et je mets qd meme la solution que j'ai trouvé :

    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
     
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
     
     
    public class Test extends JPanel {
     
        JList categoryList;
        String [] listItems;
        JButton button = new JButton ("Test");
     
        public Test () {
            this.setLayout(new FlowLayout());
            this.setPreferredSize(new Dimension (500, 300));
     
            setCategoryList();
     
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                   addData();
                }
            });
            this.add(button);
            this.add(categoryList);
        }
     
        private void setCategoryList () {
            listItems = new String [] {"category 1", "category 2", "category 3"};
            categoryList = new JList (listItems);
            categoryList.addMouseListener(new MouseAdapter() {
               public void mouseClicked(MouseEvent e) {
                   if ( e.getClickCount() == 1 ) {
                         String selected = "" + categoryList.getSelectedIndex();
                         System.out.print ("item selected = " + selected);
                         System.out.println (" - value = " + categoryList.getSelectedValue().toString());
                   }
                }
            });
        }
     
        private void addData () {
        }
     
        public static void main(String[] args) {
            JFrame frame = new JFrame ();
            frame.getContentPane().add(new Test());
            frame.setBounds (100, 100, 500, 500);
            frame.setVisible(true);
     
        }
    }

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

Discussions similaires

  1. [Evenement] Probleme avec un JList
    Par mawashee dans le forum Composants
    Réponses: 3
    Dernier message: 06/12/2004, 18h45
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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