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:

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 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.

Dans le onClick sur validate, j'apelle une methode:
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);
        }
    }
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.

Dans le onClick sur cancel, j'apelle la methode:
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);
            }
        }
    }
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).

Pour pouvoir utiliser setSelectedItem , je surcharge la methode equals de l'objet Interface (Interface = classe persistante utilisée pour Hibernate), de cette facon :
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());
    }
Et voici la belle erreur que je me tape:
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)
...
Les lignes correspondantes, sont:
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);
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.

Avez-vous quelques idées pour arranger ce probleme? Ou une autre approche a proposer?