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

0 ответов

Другие вопросы по тегам