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 :

Un mix entre JComboBox et JCheckBox


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut Un mix entre JComboBox et JCheckBox
    Bonjour à tous,
    Un élément m'était capital pour l'ergonomie de mon application(qui s'affiche sur une fenêtre de taille réduite: 320*480 pour répondre à des spécifications...): faire une liste déroulante façon JComboBox qui autorise la multi-sélection.
    Après plusieurs recherches sur le net, j'ai trouvé un code qui semblait pas trop mal, et je l'ai quelque peu transformé.

    Voyez par vous même la classe, avec un main au cas où vous voudriez l'exécuter:

    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
    98
    99
    100
    101
    102
    103
    104
    package fr.unice.polytech.mediamanager.view;
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
     
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.ListCellRenderer;
     
     public class CheckCombo implements ActionListener  
     {  
     
    	 private String[] ids;
    	 private Boolean[] values;
     
     
    	 public CheckCombo(String[] ids,
       		  Boolean[] values) {
    		 this.ids = ids;
    		 this.values = values;
    	 }
     
     
         public void actionPerformed(ActionEvent e)  
         {  
             JComboBox cb = (JComboBox)e.getSource();  
             CheckComboStore store = (CheckComboStore)cb.getSelectedItem();  
             CheckComboRenderer ccr = (CheckComboRenderer)cb.getRenderer();  
             ccr.checkBox.setSelected((store.state = !store.state));  
         }  
     
         /**
          * Prépare le contenu de la liste déroulante en fonction de la liste donnée en paramètre
          * @param ids la liste à ajouter
          * @param values les valeurs de cochage initial
          * @return 
          */
         public JPanel getContent()  
         {  
             CheckComboStore[] stores = new CheckComboStore[ids.length];  
             for(int j = 0; j < ids.length; j++)  
                 stores[j] = new CheckComboStore(ids[j], values[j]);  
             JComboBox combo = new JComboBox(stores);  
             combo.setRenderer(new CheckComboRenderer());  
             combo.addActionListener(this);  
             JPanel panel = new JPanel();  
             panel.add(combo);  
             return panel;  
         }  
     
         public static void main(String[] args)  
         {  
             JFrame f = new JFrame();  
             f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
             String[] ids = { "north", "west", "south", "east" };
             Boolean[] values = {Boolean.TRUE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE  };
             f.getContentPane().add(new CheckCombo(ids, values).getContent());  
             f.setSize(300,160);  
             f.setLocation(200,200);  
             f.setVisible(true);  
         }  
     }  
     
     /** adapted from comment section of ListCellRenderer api */  
     class CheckComboRenderer implements ListCellRenderer  
     {  
         JCheckBox checkBox;  
     
         public CheckComboRenderer()  
         {  
             checkBox = new JCheckBox();  
         }  
         public Component getListCellRendererComponent(JList list,  
                                                       Object value,  
                                                       int index,  
                                                       boolean isSelected,  
                                                       boolean cellHasFocus)  
         {  
             CheckComboStore store = (CheckComboStore)value;  
             checkBox.setText(store.id);  
             checkBox.setSelected(((Boolean)store.state).booleanValue());  
             checkBox.setBackground(isSelected ? Color.red : Color.white);  
             checkBox.setForeground(isSelected ? Color.white : Color.black);  
             return checkBox;  
         }  
     }  
     
     class CheckComboStore  
     {  
         String id;  
         Boolean state;  
     
         public CheckComboStore(String id, Boolean state)  
         {  
             this.id = id;  
             this.state = state;  
         }  
     }

    Maintenant je cherche à ajouter un aspect à cette classe: le fait que le tableau de Boolean values se mette à jour au fur et à mesure de l'utilisation(c'est à dire que lorsque l'utilisateur clique sur une partie, la cellule de tableau associée values[X] se mettrait à jour). En effet, mon programme prépare une de ces CheckCombo pour éditer des données, donc avec des valeurs déjà définies que l'on peut modifier. Ce que je veux, c'est que lorsque je clique sur le bouton "OK" en dessous, je puisse attraper tous les items sélectionnés pour éditer mes données...
    Cependant le code que j'ai trouvé sur internet était déjà à la base pas évident à comprendre, mais là, je ne vois vraiment pas du tout où ajouter quelque chose pour arriver à mon résultat(d'autant que c'est la première fois que je touche aux ListRenderers...)

    Quelqu'un aurait-il une idée? Je pense qu'il faut ajouter quelque chose dans l'actionPerformed, évidemment, mais je ne sais pas comment récupérer la cellule correspondante...


    Merci d'avance!

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Si je ne me trompe pas, lorsque l'on click sur le bouton OK on récupère les éléments sélectionnées du JComboBox.

    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
     
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.ListCellRenderer;
     
     public class CheckCombo implements ActionListener  
     {  
    	 
    	 private String[] ids;
    	 private Boolean[] values;
    	 private CheckComboStore[] stores;	 
    	 
    	 public CheckCombo(String[] ids,
       		  Boolean[] values) {
    		 this.ids = ids;
    		 this.values = values;
    	 }
    	 
    	 
         public void actionPerformed(ActionEvent e)  
         {  
        	 if(e.getActionCommand().equals("OK")){
        		 
        		 System.out.println(stores[0].id+" : "+stores[0].state);
        		 System.out.println(stores[1].id+" : "+stores[1].state);
        		 System.out.println(stores[2].id+" : "+stores[2].state);
        		 System.out.println(stores[3].id+" : "+stores[3].state);	 
     		
        	 }else{
        		 JComboBox cb = (JComboBox)e.getSource();  
                 CheckComboStore store = (CheckComboStore)cb.getSelectedItem();  
                 CheckComboRenderer ccr = (CheckComboRenderer)cb.getRenderer();  
                 ccr.checkBox.setSelected((store.state = !store.state));  
        	 }
             
         }  
        
         /**
          * Prépare le contenu de la liste déroulante en fonction de la liste donnée en paramètre
          * @param ids la liste à ajouter
          * @param values les valeurs de cochage initial
          * @return 
          */
         public JPanel getContent()  
         {  
             stores = new CheckComboStore[ids.length];  
             for(int j = 0; j < ids.length; j++)  
                 stores[j] = new CheckComboStore(ids[j], values[j]);  
             
             JComboBox combo = new JComboBox(stores);  
             combo.setRenderer(new CheckComboRenderer());  
             combo.addActionListener(this);  
             JPanel panel = new JPanel();  
             JButton bouton = new JButton("OK");
             bouton.addActionListener(this);         
             panel.add(combo);  
             panel.add(bouton);
             return panel;  
         }  
        
         public static void main(String[] args)  
         {  
             JFrame f = new JFrame();  
             f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
             String[] ids = { "north", "west", "south", "east" };
             Boolean[] values = {Boolean.TRUE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE  };
             f.getContentPane().add(new CheckCombo(ids, values).getContent());  
             
             f.setSize(300,160);  
             f.setLocation(200,200);  
             f.setVisible(true);  
             
         }  
     }  
        
     /** adapted from comment section of ListCellRenderer api */  
     class CheckComboRenderer implements ListCellRenderer  
     {  
         JCheckBox checkBox;  
        
         public CheckComboRenderer()  
         {  
             checkBox = new JCheckBox();  
         }  
         public Component getListCellRendererComponent(JList list,  
                                                       Object value,  
                                                       int index,  
                                                       boolean isSelected,  
                                                       boolean cellHasFocus)  
         {  
             CheckComboStore store = (CheckComboStore)value;  
             checkBox.setText(store.id);  
             checkBox.setSelected(((Boolean)store.state).booleanValue());  
             checkBox.setBackground(isSelected ? Color.red : Color.white);  
             checkBox.setForeground(isSelected ? Color.white : Color.black);  
             return checkBox;  
         }  
     }  
        
     class CheckComboStore  
     {  
         String id;  
         Boolean state;  
        
         public CheckComboStore(String id, Boolean state)  
         {  
             this.id = id;  
             this.state = state;  
         }  
     }
    Ici, j'affiche les résultats, à toi de faire le reste

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ou sinson une bonne vieille JTable (ou encore un JPanel avec un layout bien foutu) dans un popup menu et l'affaire est jouée

Discussions similaires

  1. Mix entre C et C++, probleme au linkage
    Par elraton dans le forum Débuter
    Réponses: 2
    Dernier message: 10/02/2009, 13h07
  2. Réponses: 4
    Dernier message: 15/01/2008, 09h59
  3. conflit d'ecoute d'evenement entre jcombobox et jlist
    Par henpower dans le forum Composants
    Réponses: 3
    Dernier message: 15/09/2007, 13h01
  4. Probleme entre JComboBox/CheckBox
    Par bygui dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 11/05/2006, 11h26
  5. Réponses: 5
    Dernier message: 27/09/2005, 17h25

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