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!