[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:
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:
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:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
Elle est levé au niveau de cette ligne :
Code:
cb_beneficiaire.getEditor().setItem(recherche);
Enfin plus exactement à cette ligne dans la class MyComboBoxEditor :
Code:
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:
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:
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