lundi 4 mars 2019

JList (2) : Exemple avec écouteur (Listener) sur la liste elle-même

Ce code montre l'utilisation d'un écouteur (Listener) sur la liste elle-même pour détecter et gérer l'interaction entre cette dernière et l'utilisateur.

Ce code est le deuxième dans une série d'articles qui montrent l'utilité u modèle MVC respecté par les composants Swing et qui devient nécessaire pour les composants qui affichent plusieurs données.

Un premier exemple (avec une explication détaillée sur la création d'une JList avec un DefaultListModel) se trouve ici.

Dans ce deuxième code, la liste est associée à un écouteur pour surveiller les actions de sélection et de désélection des éléments de la liste.

Trois mode de sélection peuvent être définis pour une liste. La méthode setSelectionMode() prend un entier qui détermine le mode. Pour simplifier l'utilisation, les trois valeurs sont déclarées comme des constantes dans la classe ListSelectionModel avec des noms assez parlants. Elles sont :

  • ListSelectionModel.SINGLE_SELECTION 
  • ListSelectionModel.SINGLE_INTERVAL_SELECTION
  • ListSelectionModel.MULTIPLE_INTERVAL_SELECTION

Dans cet exemple, deux modes seront démontrés.

Pour pouvoir récupérer les changements dans la sélection, il suffit d'ajouter un ListSelectionListener. Ce dernier définit une seule méthode : public void valueChanged(ListSelectionEvent e). Malgré que l’événement ListSelectionEvent permet de récupérer toutes les informations utiles sur le changement dans la sélection, il est possible de faire appel à des méthodes dans la classe JList directement.


Néanmoins, les méthodes à appeler dépendent du modèle de sélection utilisé. En effet, si le mode de sélection est "SINGLE_SELECTION" alors il n'est pas pratique de faire appel aux méthodes qui récupèrent "la liste des éléments sélectionnés".

Pour basculer entre les deux modes de sélection démontrer, deux JRadioButton sont utilisés. Les deux sont associés à un écouteur (ChangeListener) pour surveiller le changement de la sélection et ainsi changer le mode de sélection de la liste.


Ainsi la partie la plus importante du code est :


 public void valueChanged(ListSelectionEvent e){
  if(uniqueSelection){
   
   int indice = liste.getSelectedIndex();
   
   if(indice != -1){
    String valeur = (String)liste.getSelectedValue();
    lblSelection.setText(valeur + "(" + indice + ")");
   }
   
  }else{
   
   int[] indices = liste.getSelectedIndices();
   List<String> valeurs = liste.getSelectedValuesList();
   
   String message = "";
   for(int i = 0; i < valeurs.size(); i++){ 
    message += valeurs.get(i) + "(" + indices[i] + ") ";
   }
   lblSelection.setText(message);
   
  }
 }

Le code complet :

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.List;

public class ExempleSelectionJList 
  extends JFrame 
   implements ChangeListener, ListSelectionListener{
 
 JList liste;
 DefaultListModel<String> modele;
 
 String[] quelquesDonnees = new String[]{"Alfa",
  "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf",
  "Hotel", "India", "Juliett", "Kilo", "Lima", "Mike",
  "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra",
  "Tango", "Uniform", "Victor", "Whiskey", "X-ray", "Yankee",
  "Zulu"};
 
 JRadioButton rdoUnique, rdoMultiple;
 ButtonGroup groupe;
 boolean uniqueSelection;
 
 JLabel lblSelection;
 JPanel pnlAjouter;
 
 public ExempleSelectionJList(){
  
  setTitle("Exemple Simple JList");
  setSize(800, 400);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  modele = new DefaultListModel();
  liste = new JList(modele);
  liste.addListSelectionListener(this);
  
  creerFormulaire();
  remplirListe();
  
  getContentPane().add(pnlAjouter, BorderLayout.CENTER);
  getContentPane().add(new JScrollPane(liste), BorderLayout.WEST);
  
 }
 
 public void creerFormulaire(){
  
  rdoUnique = new JRadioButton("Choix Unique");
  rdoUnique.setBounds(20, 20, 150, 30);
  rdoMultiple = new JRadioButton("Choix Multiple");
  rdoMultiple.setBounds(190, 20, 150, 30);
  
  rdoUnique.addChangeListener(this);
  rdoMultiple.addChangeListener(this);
  
  groupe = new ButtonGroup();
  groupe.add(rdoUnique);
  groupe.add(rdoMultiple);
  
  rdoUnique.setSelected(true);
  uniqueSelection = true;
  
  lblSelection = new JLabel("La sélection s'affiche ici");
  lblSelection.setBounds(20, 70, 450, 30);
  
  
  pnlAjouter = new JPanel();
  pnlAjouter.setLayout(null);
  pnlAjouter.add(rdoUnique);
  pnlAjouter.add(rdoMultiple);
  pnlAjouter.add(lblSelection);
  
 }
 
 public void remplirListe(){
  for(int i = 0; i < quelquesDonnees.length; i++)
   modele.addElement(quelquesDonnees[i]);
 }
 
 public void valueChanged(ListSelectionEvent e){
  if(uniqueSelection){
   
   int indice = liste.getSelectedIndex();
   
   if(indice != -1){
    String valeur = (String)liste.getSelectedValue();
    lblSelection.setText(valeur + "(" + indice + ")");
   }
   
  }else{
   
   int[] indices = liste.getSelectedIndices();
   List<String> valeurs = liste.getSelectedValuesList();
   
   String message = "";
   for(int i = 0; i < valeurs.size(); i++){ 
    message += valeurs.get(i) + "(" + indices[i] + ") ";
   }
   lblSelection.setText(message);
   
  }
 }
 
 public void stateChanged(ChangeEvent e){
  uniqueSelection = rdoUnique.isSelected();
  if(uniqueSelection)
   liste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  else
   liste.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
 }
 
 public static void main (String args[]) {
  
  (new ExempleSelectionJList()).setVisible(true);
 }
}

Quelques résultats :






Aucun commentaire: