IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

probleme avec setSelectedItem


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut 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 : 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?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Résolu, en fait à premiere vue lors de la construction, setSelectedItem est appellé avec donc index à -1, donc objet à null. Donc plante.

    Il m' a donc suffit de modifier la methode equals de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public boolean equals(Object obj) {
            if (obj==null)
                return false;
            return (this.id == ((Interface)obj).getId());
        }
    Merci a moi de m'être répondu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo