probleme avec setSelectedItem
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:
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:
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:
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:
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:
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:
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?