Bonjour,
Je cherche à utiliser une JList avec un type de donnée non basique qui est composé d'un string et d'un enum pouvant prendre trois valeurs.
Cette classe est définie de la manière suivante :
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 public class CassyOption { enum Type{ UNKNOWN, REPLACE, MERGE }; Type type; String name; public CassyOption(String name) { this.name = name; this.type = Type.UNKNOWN; } public CassyOption(String name, Type t){ this.name = name; this.type = t; } public String getName(){ return this.name; } public Type getType(){ return this.type; } }
Pour permettre un affichage de la JList avec ma classe, j'ai implémenté l'inteface ListCellRenderer pour cette classe. L'affichage doit être le nom du string de la classe CassyOpt ainsi que des JRadioButton qui permettront à un utilisateur final de sélectionner une des valeurs.
La définition de cette classe est la suivante :
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 public class CassyOptionCellRenderer extends JPanel implements ListCellRenderer { JRadioButton jrad1, jrad2, jrad3; JLabel jlab; public CassyOptionCellRenderer(){ } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { CassyOption caOpt = (CassyOption)value; jlab = new JLabel(); jlab.setText(caOpt.getName()); this.add(jlab); if(caOpt.getType() == CassyOption.Type.UNKNOWN){ jrad1 = new JRadioButton("?", true); jrad2 = new JRadioButton("M", false); jrad3 = new JRadioButton("R", false); } else if(caOpt.getType() == CassyOption.Type.MERGE){ jrad1 = new JRadioButton("?", false); jrad2 = new JRadioButton("M", true); jrad3 = new JRadioButton("R", false); } else { jrad1 = new JRadioButton("?", false); jrad2 = new JRadioButton("M", false); jrad3 = new JRadioButton("R", true); } this.add(jrad1); this.add(jrad2); this.add(jrad3); System.out.println("getLisCellRenderer : " + caOpt.getName()); return this; } }
Dans la JList, j'insère initialement deux éléments. Le code de construction de la JList dans la classe de la fenêtre principale est le suivant :
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 this.setLayout(new BorderLayout()); DefaultListModel listModel = new DefaultListModel(); listModel.addElement(new CassyOption("nom1",CassyOption.Type.MERGE)); listModel.addElement(new CassyOption("nom2",CassyOption.Type.REPLACE)); JList list = new JList(listModel); list.setCellRenderer(new CassyOptionCellRenderer()); JScrollPane listScroller = new JScrollPane(list); this.getContentPane().add(listScroller,BorderLayout.EAST); this.pack(); this.setVisible(true);
Lors de l'exécution, j'aimerai obtenir tous les éléments de la liste en colonne avec les boutons jradio sur leur droite. Or, à l'exécution de ce code, j'obtiens 2 lignes (attendu), mais sur chaque ligne j'ai les éléments objets 1 et objets 2 qui sont affichés (pas attendu).
Quelqu'un aurait t'il une idée de ce qui cloche dans ce que j'ai fait ?
D'avance merci?






Répondre avec citation
Partager