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

 Java Discussion :

Selection Multiple Jlist


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 215
    Points : 65
    Points
    65
    Par défaut Selection Multiple Jlist
    Bonjour,

    Je n'arrive pas à obtenir une jlist avec sélection d'item multiple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	DefaultListModel listModel = new DefaultListModel();
     
     
    		for (int i = 0; i < CatTexte.size(); i++) 
                    {
     
    			listModel.add(i, CatTexte.get(i));
     
    	         }
     
    	Jlist listeCat = new JList((listModel) );
        listeCat.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); 
    this.panGCenter.add(listeCat);
    Avec ce code je ne peux pas faire plusieurs sélections dans la jlist

    Merci de votre aide

  2. #2
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Ben si ça fonctionne...
    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
    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.ListSelectionModel;
     
    public class Test {
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		DefaultListModel listModel = new DefaultListModel();
    		for (int i = 0; i < 10; i++) {
    			listModel.add(i, "élément "+i);
    	    }
    		JList listeCat = new JList((listModel) );
    		listeCat.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); 
    		frame.getContentPane().add(listeCat);
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 215
    Points : 65
    Points
    65
    Par défaut
    J'entends par multiple sélection :

    --> Je sélectionne dans la jlist l'élément1 avec clic gauche
    --> Element1 est sélectionné (fond bleu)
    --> Je sélectionne dans la jlist l'élément2 avec clic gauche
    --> Element2 est sélectionné (fond bleu)
    --> Element1 est toujours sélectionné (fond bleu)

    Moi quand je sélectionne le deuxième élément, uniquement ce dernier est sélectionné.

    Merci de ton aide

  4. #4
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Le mécanisme de sélection multiple se fait avec les touches CTRL (pour ajouter un unique élément) ou avec SHIFT (jusqu'à cet élément) en respectant cette façon de faire standard (en tout cas Win et Linux) auquel les utilisateurs sont habitués.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 215
    Points : 65
    Points
    65
    Par défaut
    D'accord merci de ta réponse.

    J'ai ajouté un ListSelectionListener sur la 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
     
     listCat.addListSelectionListener(this);
     
    @Override
    public void valueChanged(ListSelectionEvent e) {
    	// TODO Auto-generated method stub
     
    	if(e.getSource()==this.listCat){ 
     
     
    		System.out.println("je choisi une catégorie");
     
     
    	}
     
     
     
    }
    Quand je clic sur un item de la Jliste, le message "je choisi une catégorie" s'affiche deux fois.

    Est-ce normal ??

    Merci

  6. #6
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Oui, cela est indiqué dans la Javadoc.
    Utilise la méthode getValueIsAdjusting() pour régler ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void valueChanged(ListSelectionEvent e) {
    	if (e.getValueIsAdjusting()) {
    		if (e.getSource() == listeCat) { 
    			System.out.println("je choisi une catégorie");
    		}
    	}
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 215
    Points : 65
    Points
    65
    Par défaut
    Merci encore,

    Une dernière question :

    j'ai crée une méthode pour tous sélectionner dasn la jlist

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void SelelctAll(){
    	System.out.println("SelectAll");
    	int[] all = new int[listModel.size()];
    	for (int i = 0; i < all.length; i++) {
     
    		all[i]=i;
     
    	}
    	this.listCat.setSelectedIndices(all);
    }
    Je suis étonné que l'appel de SelectAll() n'appelle pas :
    public void valueChanged(ListSelectionEvent e)

    Car par contre tous les items sont bien sélectionnés

    As tu une idée ?

    merci

  8. #8
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Mais si ça fonctionne !!

    Mais pas besoin de réinventer la roue, utilise le ListSelectionModel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void SelectAll() {
    	ListSelectionModel selectModel = listCat.getSelectionModel();
    	int maxIndex = listModel.getSize() - 1;
    	selectModel.setSelectionInterval(0, maxIndex);
    }

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 215
    Points : 65
    Points
    65
    Par défaut
    Effectivement valueChanged() est bien appelé, par contre cela ne rentre pas dans le premier if : if (e.getValueIsAdjusting()) {

    Donc pas dans le deuxieme if : if(e.getSource()==this.listCat){

    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
     
    public void valueChanged(ListSelectionEvent e) {
    	// TODO Auto-generated method stub
    	if (e.getValueIsAdjusting()) {
    	Object[] vals = null;
    	if(e.getSource()==this.listCat){ 
     
     
    		System.out.println("je choisi une catégorie");
     
    		vals = this.listCat.getSelectedValues();
    		String selec="";
    		for (int i = 0; i < vals.length; i++) {
    			selec=selec+vals[i]+" et";
    		}
    		System.out.println("items selectionnés : "+selec);
    	}
     
    	}
     
    }
    Comment faire pour rentrer, aussi, dans ce premier if , quand on appelle SelectAll() ?

    J'ai essayé d'ajouter à la fin de SelectAll() mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    listCat.setValueIsAdjusting(true);
    ou
    selectModel.setValueIsAdjusting(true);

  10. #10
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    J'ai essayé d'ajouter à la fin de SelectAll() mais sans succès
    Si, c'est bien ça, mais tu dois le mettre avant le changement de sélection.

    Voici un exmple complet :
    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
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.DefaultListModel;
    import javax.swing.DefaultListSelectionModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
     
    @SuppressWarnings("serial")
    public class Fenetre extends JFrame {
     
    	public static void main(String[] args) {
    		Fenetre frame = new Fenetre();
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    	private DefaultListModel listModel;
    	private DefaultListSelectionModel selectionModel;
    	private JList list;
     
    	public Fenetre() {
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		this.listModel = new DefaultListModel();
    		for (int i = 1; i < 10; i++) {
    			this.listModel.addElement("Élément "+i);
    	    }
    		this.list = new JList(this.listModel);
    		this.selectionModel = new DefaultListSelectionModel();
    		this.list.setSelectionModel(this.selectionModel);
    		this.list.addListSelectionListener(new ListSelectionListener() {
    			@Override
    			public void valueChanged(ListSelectionEvent e) {
    				if (e.getValueIsAdjusting()) {
    					if (e.getSource() == Fenetre.this.list) { 
    						System.out.println("\r\nLa sélection change");
    					}
    				}
    			}
    		});
    		this.list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
    		JButton btn = new JButton("Tout sélectionner");
    		btn.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				selectAll();			
    			}
    		});
    		JButton btnClear = new JButton("Tout desélectionner");
    		btnClear.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				clearSelection();			
    			}
    		});
    		getContentPane().setLayout(new BorderLayout());
    		JPanel panel = new JPanel(new FlowLayout());
    		panel.add(btn);
    		panel.add(btnClear);
    		getContentPane().add(panel, BorderLayout.NORTH);
    		getContentPane().add(this.list, BorderLayout.CENTER);
    	}
     
    	public void selectAll() {
    		this.selectionModel.setValueIsAdjusting(true);
    		this.selectionModel.setSelectionInterval(0, this.listModel.getSize() - 1);
    	}
     
    	public void clearSelection() {
    		this.selectionModel.clearSelection();
    	}
     
    }

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 215
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup

Discussions similaires

  1. Select multiple
    Par lfournial dans le forum Struts 1
    Réponses: 20
    Dernier message: 24/02/2011, 12h14
  2. selection multiple JList et récupération tableau d'objet
    Par allserv dans le forum Composants
    Réponses: 1
    Dernier message: 29/10/2008, 17h59
  3. [VB6] sélection multiple de colonne dans excel grâce à VB
    Par biquet dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/08/2004, 12h44
  4. <select multiple ...>
    Par ayobo dans le forum ASP
    Réponses: 2
    Dernier message: 06/07/2004, 08h49
  5. [C#]Sauvegarde d'une selection multiple d'une listbox?
    Par onouiri dans le forum ASP.NET
    Réponses: 7
    Dernier message: 29/04/2004, 17h16

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