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 :
J'ai rajouté les méthode addCaretListener et removeListener pour pouvoir utiliser ce Listener sur le JTextfield.
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); } }
Voici le code de l'initialisation de JComboBox :
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
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(); } } });
Elle est levé au niveau de cette ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
Enfin plus exactement à cette ligne dans la class MyComboBoxEditor :
Code : Sélectionner tout - Visualiser dans une fenêtre à part cb_beneficiaire.getEditor().setItem(recherche);
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 jtRecherche.setText(anObject.toString());
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
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(); } } });
Voila je suis bloqué, je n'ai plus d'idée pour trouver le moyen de corriger ça. Je m'en remet donc à vous.
Code : Sélectionner tout - Visualiser dans une fenêtre à part cb_beneficiaire.addItem(tben[I][1] + " " + tben[I][2]);
Merci d'avance pour vos réponses.
Erouan
Partager