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 :

[JComboBox]Problème d'Event ou de Thread


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut [JComboBox]Problème d'Event ou de Thread
    Bonjours,

    J'essaye de créer une JComboBox éditable qui filtre la litre déroulante en fonction du texte saisi dans le JTextField de la JComboBox. J'ai donc créé une class implémentant l'interface ComboBoxEditor, qui 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
    public class MyComboBoxEditor implements ComboBoxEditor {
     
        private JTextField jtRecherche = new JTextField("");
     
        public MyComboBoxEditor() {
        }
     
        @Override
        public Component getEditorComponent() {
            return jtRecherche;
        }
     
        @Override
        public void setItem(Object anObject) {        
            if (anObject != null) {
                jtRecherche.setText(anObject.toString());
            }else{
                jtRecherche.setText("");
            }
        }
     
        @Override
        public Object getItem() {
            return jtRecherche.getText();
        }
     
        @Override
        public void selectAll() {
            jtRecherche.selectAll();
        }
     
        @Override
        public void addActionListener(ActionListener l) {
            jtRecherche.addActionListener(l);
        }
     
        @Override
        public void removeActionListener(ActionListener l) {
            jtRecherche.removeActionListener(l);
        }
     
        public void addCaretListener(CaretListener l) {
            jtRecherche.addCaretListener(l);
        }
     
        public void removeCaretListener(CaretListener l) {
            jtRecherche.removeCaretListener(l);
        }
    }
    J'ai rajouté les méthode addCaretListener et removeListener pour pouvoir utiliser ce Listener sur le JTextfield.

    Voici le code de l'initialisation de JComboBox :
    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
    for (int I = 0; I < tben.length; I++) {
                cb_beneficiaire.addItem(tben[I][1] + "  " + tben[I][2]);
            }        
            cb_beneficiaire.setEditable(true);
            cb_beneficiaire.setEditor(new MyComboBoxEditor());
            cb_beneficiaire.getEditor().setItem("");
            ((MyComboBoxEditor) cb_beneficiaire.getEditor()).addCaretListener(new CaretListener() {
     
                @Override
                public void caretUpdate(CaretEvent e) {
                    final String recherche = (String) cb_beneficiaire.getEditor().getItem();
                    tben = db.getTable("SELECT ben_id, ben_nom, ben_prenom FROM beneficiaire WHERE ben_nom LIKE '" + recherche + "%' ORDER BY ben_nom ASC", false);
                    cb_beneficiaire.removeAllItem();
                    for (int I = 0; I < tben.length; I++) {
                        cb_beneficiaire.addItem(tben[I][1] + "  " + tben[I][2]);
                    }
                    cb_beneficiaire.getEditor().setItem(recherche);
                    try {
                        //cb_beneficiaire.setPopupVisible(true);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
    Lorsque je lance le programme, la JComboBox s'affiche. Mais quand je clique sur le JTextField, la JComboBox s'efface et une exception est levé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
    Elle est levé au niveau de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cb_beneficiaire.getEditor().setItem(recherche);
    Enfin plus exactement à cette ligne dans la class MyComboBoxEditor :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jtRecherche.setText(anObject.toString());
    J'ai donc farfouillé sur internet pour savoir qu'est ce que c'était comme erreur, et j'ai compris que je modifiais peut être une méthode de notification. J'ai donc rajouté ces lignes :

    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
     
    ((MyComboBoxEditor) cb_beneficiaire.getEditor()).addCaretListener(new CaretListener() {
     
                @Override
                public void caretUpdate(CaretEvent e) {
                    final String recherche = (String) cb_beneficiaire.getEditor().getItem();
                    tben = db.getTable("SELECT ben_id, ben_nom, ben_prenom FROM beneficiaire WHERE ben_nom LIKE '" + recherche + "%' ORDER BY ben_nom ASC", false);
                    cb_beneficiaire.removeAllItem();
                    for (int I = 0; I < tben.length; I++) {
                        cb_beneficiaire.addItem(tben[I][1] + "  " + tben[I][2]);
                    }
                    SwingUtilities.invokeLater(new Runnable() {
     
                        public void run() {
                            cb_beneficiaire.getEditor().setItem(recherche);
                        }
                    });
                    try {
                        //cb_beneficiaire.setPopupVisible(true);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
    J'ai donc toujours la même erreur, mais sur une nouvelle ligne dans la méthode public void caretUpdate(CaretEvent e) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cb_beneficiaire.addItem(tben[I][1] + "  " + tben[I][2]);
    Voila je suis bloqué, je n'ai plus d'idée pour trouver le moyen de corriger ça. Je m'en remet donc à vous.

    Merci d'avance pour vos réponses.

    Erouan

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    J'ai trouvé la solution. J'ai remarqué que la méthode caretUpdate, quand elle était appelée faisait une boucle, car le curseur du JTextfield bougeais de place tout le temps. j'ai donc fait en sorte d'enlever le CaretListener au début des instruction de la méthode et de le remettre a la fin. Et ça marche parfaitement.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Par défaut
    Bonjour Erouan,

    Je suis en train d'essayer de faire la même chose que toi.
    STP pourrais-tu m'expliquer où et comment retirer le CareListener puis le remettre ?

    Merci beaucoup car c'est un gain de temps énorme piur moi si je pouvais réutiliser ta méthode.

    Merci

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

Discussions similaires

  1. [JCombobox] problème d'event
    Par isoman dans le forum Composants
    Réponses: 9
    Dernier message: 21/06/2009, 01h30
  2. Problème avec event handler
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2005, 09h31
  3. [JComboBox] Problème dans le PopMenu après ajout
    Par bidon dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 29/03/2005, 15h52
  4. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 01h03
  5. [swing][JComboBox]Problème de taille
    Par n!co dans le forum Composants
    Réponses: 8
    Dernier message: 06/03/2004, 10h53

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