Hallo Forum!
Ich möchte eine JComboBox so umfunktionieren, dass die Selektion anhand der Eingabe im Textfeld angepasst wird.
Ich möchte folgendes erreichen:
Angenommen in der Liste stehen "Hund", "Tier", "Vogel" und "Zoo".
Wenn ich dann in dem TextFeld ein "T" eingebe soll er automatisch auf "Tier" springen. Entweder es selektieren oder ganz nach oben schubsen (also nach unten scrollen).
Die JComboBox ist editierbar, was den Einsatz von JComboBox.setKeySelectionManager() ausschließt.
Ich habe versucht auf das TextFeld des Editors einen DocumentListener zu legen, die Eingabe auszuwerten und dann anhand dessen eine Selektion vorzunehmen, bekommen aber leider den folgenden Fehler.
Exception occurred during event dispatching:
java.lang.IllegalStateException: Attempt to mutate in notification
Der Fehler tritt in der Zeile auf in der ich die Selektion ändern möchte (also hier in Zeile 24).
Hier ist der Code den ich verwende:
Die Variable combolock habe ich verwendet weil ich dachte, dass es daran liegen könnte, dass er durch selektieren wieder den Inhalt des Textfelds ändert.
Auf diese Weise wollte ich verhindern, dass die Methode sich immer wieder selber auslöst. Das cheint aber nicht der Fehler gewesen zu sein.
Weiß jemand Rat?
Ich möchte eine JComboBox so umfunktionieren, dass die Selektion anhand der Eingabe im Textfeld angepasst wird.
Ich möchte folgendes erreichen:
Angenommen in der Liste stehen "Hund", "Tier", "Vogel" und "Zoo".
Wenn ich dann in dem TextFeld ein "T" eingebe soll er automatisch auf "Tier" springen. Entweder es selektieren oder ganz nach oben schubsen (also nach unten scrollen).
Die JComboBox ist editierbar, was den Einsatz von JComboBox.setKeySelectionManager() ausschließt.
Ich habe versucht auf das TextFeld des Editors einen DocumentListener zu legen, die Eingabe auszuwerten und dann anhand dessen eine Selektion vorzunehmen, bekommen aber leider den folgenden Fehler.
Exception occurred during event dispatching:
java.lang.IllegalStateException: Attempt to mutate in notification
Der Fehler tritt in der Zeile auf in der ich die Selektion ändern möchte (also hier in Zeile 24).
Hier ist der Code den ich verwende:
Code:
[...]
probertyjCombobox.setEditable(true);
ComboBoxEditor editor = probertyjCombobox.getEditor();
JTextField editorField = (JTextField)editor.getEditorComponent();
editorField.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) { fieldChanged(); }
public void removeUpdate(DocumentEvent e) { fieldChanged(); }
public void changedUpdate(DocumentEvent e) { fieldChanged(); }
});
[...]
private void fieldChanged() {
if (combolock == false) {
probertyjCombobox.showPopup();
combolock = true;
ComboBoxEditor editor = probertyjCombobox.getEditor();
JTextField editorField = (JTextField)editor.getEditorComponent();
String given = editorField.getText();
for (int i = 0; i < probertyjCombobox.getItemCount(); i++) {
String entry = (String)probertyjCombobox.getItemAt(i);
if (entry.startsWith(given)) {
probertyjCombobox.setSelectedIndex(i);
editorField.setText(given);
break;
}
}
combolock = false;
}
}
Die Variable combolock habe ich verwendet weil ich dachte, dass es daran liegen könnte, dass er durch selektieren wieder den Inhalt des Textfelds ändert.
Auf diese Weise wollte ich verhindern, dass die Methode sich immer wieder selber auslöst. Das cheint aber nicht der Fehler gewesen zu sein.
Weiß jemand Rat?