Bonjour à tous,
je dispose d'une JDialog qui s'ouvre lorsqu on clique sur une telle image (qui est en fait un Materiel - representation d'un reseau). Celle-ci sert a parametrer le materiel.
Voici a quoi ressemble cette fenetre:
http://www.imagehosting.com/out.php/i365766_dialog.png
Comme vous pouvez le voir, sur la droite de cette JDialog il y a 20 JComboBox + 20 RadioButton pour savoir si utilisé ou pas.
Voici comment ca se passe et le probleme rencontré:
Je crée mes comboBox dans une boucle, je remplit en fournissant en parametre du constructeur une List d'objet (liste d'interfaces , recue par une requete Hibernate). Ces objets ont un toString pour afficher ce qu'il faut dans la JComboBox.
Ensuite je positionne l'index à -1 pour dire que aucune interface n'est sélectionnée.
Ensuite je dis que onItemChanged le RadioButton associé est coché, par contre je ne permet QUE de décocher ce radioButton pour remettre l'index à -1. Pas possible de cocher le radioButton soit meme donc, cela se fait obligatoirement en passant par la ComboBox.
Le probleme principal est : je change des valeurs des combobox, puis je click sur CANCEL au lieu de VALIDATE. Les ComboBox ne se réinitialisent pas à leurs valeurs correctes, mais restent dans le dernier état a savoir la modif faite (meme si cancel). Ce qui est logique.
J'ai donc décidé de mettre les comboBox dans une List, mettre les Radio dans une List, et avoir une List<Interfaces> qui serait l'ensemble des interfaces utilisées pour le matériel (c'est la sauvegarde en fait).
Voici comment je procede donc:
Dans cette méthode, comme vous pouvez le voir je crée les label, combobox, radiobuttons, les positionnent aux bons endroits dans le Panel, associer les listener, bla bla bla.
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 private void initInterfaces() { int val = 10; for (int i = 0; i < 20; i++) { jPanel1.add(new JLabel(""+(i+1)), new org.netbeans.lib.awtextra.AbsoluteConstraints(10, val, 20, 20)); final JComboBox comboTmp = new JComboBox (CmxHib.getInterfaces().toArray()); comboTmp.setSelectedIndex(-1); final JRadioButton radioTmp = new JRadioButton("used"); comboTmp.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (comboTmp.getSelectedIndex()!=-1) radioTmp.setSelected(true); } }); radioTmp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (radioTmp.isSelected()) radioTmp.setSelected(false); else comboTmp.setSelectedIndex(-1); } }); combos.add(comboTmp); radios.add(radioTmp); jPanel1.add(comboTmp, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, val, 80, 20)); jPanel1.add(radioTmp, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, val, 55, 20)); val+=30; } }
Dans le onClick sur validate, j'apelle une methode:
Où je parcoure toutes les combobox de la liste de combo. Si index == -1 (rien de select) je met l'interface correspondante à null (pas propre il est vrai), sinon j'add l'interface dans la liste d'interfaces du matériel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 private void modifInterfaces() { interfaces.clear(); for (JComboBox c : combos) { if (c.getSelectedIndex()!=-1) interfaces.add(((Interface)c.getSelectedItem()).getInterf()); else interfaces.add(null); } }
Dans le onClick sur cancel, j'apelle la methode:
qui permet de remettre les combobox et radiobuttons a leurs valeurs correctes selon ce qu' il y a dans la liste d'interfaces du materiel (le concret en qque sorte).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 private void reinitInterfaces() { for (int i = 0; i<combos.size(); i++) { if (interfaces.get(i)==null) { combos.get(i).setSelectedIndex(-1); radios.get(i).setSelected(false); } else { combos.get(i).setSelectedItem(interfaces.get(i)); radios.get(i).setSelected(true); } } }
Pour pouvoir utiliser setSelectedItem , je surcharge la methode equals de l'objet Interface (Interface = classe persistante utilisée pour Hibernate), de cette facon :
Et voici la belle erreur que je me tape:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public boolean equals(Object obj) { return (this.id == ((Interface)obj).getId()); }
Les lignes correspondantes, sont:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Exception in thread "main" java.lang.NullPointerException at simulator.hibernate.pojo.Interface.equals(Interface.java:52) at javax.swing.JComboBox.setSelectedItem(JComboBox.java:531) at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:593) at simulator.materiels.dialogues.CmxDialog.initInterfaces(CmxDialog.java:48) ...
J'avoue ne pas trop comprendre, nullPointer, je sais qu'il y a des 'null' dans mes List, mais il me semble bien les gerer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Interface.java:52 return (this.id == ((Interface)obj).getId()); CmxDialog.java:48 comboTmp.setSelectedIndex(-1);
Avez-vous quelques idées pour arranger ce probleme? Ou une autre approche a proposer?
Partager