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