SwingUtilities.invokeLater ничего не делает
Мое требование - использовать addDocumentListener, doSearchCmb в основном сужает элементы в выпадающем списке, функция работает, если используется нажатая клавиша. Если я удаляю функцию Runnable doSearchCmb и помещаю сужение элементов в insertUpdate без использования invokeLater, я получаю ошибку исключения "Попытка изменить уведомление".
В моем текущем коде мой экран зависает после ввода буквы. После нескольких минут ожидания я получаю сообщение об ошибке java.lang.OutOfMemoryError: пространство кучи Java. Я пытался добавить возврат; после combo.repaint ();, мой экран не зависает, нет ошибки пространства кучи Java, но ничего не произошло вообще. Я прикрепил код без возврата.
Что я могу сделать здесь, чтобы продолжать использовать addDocumentListener и функцию, которая сужает элементы списка?
TCombo combo = new TCombo();
JTextComponent editor = (JTextComponent) combo.getEditor().getEditorComponent();
editor.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent arg0) {
}
public void insertUpdate(DocumentEvent arg0) {
searchCmb();
}
public void removeUpdate(DocumentEvent arg0) {
searchCmb();
}
private void searchCmb() {
Runnable doSearchCmb = new Runnable() {
@Override
public void run() {
String item = combo.getEditor().getItem().toString().trim();
boolean isEmpty = item.equals("");
CmbElement[] foundList = null;
String toFind = "";
List list = new ArrayList(0);
if (!isEmpty) {
combo.removeAllItems();
combo.setItems(elements);
for (int i = 1; i < elements.length; i++) {
if (elements[i].getName().contains(toFind)) {
if (i == 1) {
list.add("");
}
list.add(elements[i]);
}
foundList = (CmbElement[]) list.toArray(new CmbElement[list.size()]);
}
if (list.size() > 0) {
combo.removeAllItems();
combo.setItems(foundList);
} else {
combo.removeAllItems();
if (toFind.equals("")) {
combo.setItems(elements);
}
list.add(new DCmbElement("", ""));
foundList = (CmbElement[]) list.toArray(new CmbElement[list.size()]);
combo.setItems(foundList);
}
combo.repaint();
}
}
};
SwingUtilities.invokeLater(doSearchCmb);
}
});
CmbElement:
public abstract interface CmbElement {
public abstract String getKey();
public abstract String getName();
}
Примечание. Сужение элементов в поле со списком означает, что когда пользователь вводит букву или вставляет слово, элементы в поле со списком фильтруются с использованием текущей буквы или слова в качестве параметра. Он просматривает предметы и сужает их. Для справки, поведение похоже на изображение здесь: jcombobox filter in java - выглядит и чувствуется независимо
Моя функция, указанная в run(), работает нормально, если используется нажатие клавиши keylistener, но мое требование - использовать addDocumentListener