SwingUtilities.invokeLater ничего не делает - PullRequest
0 голосов
/ 05 октября 2018

Мое требование - использовать addDocumentListener , doSearchCmb в основном сужает элементы в выпадающем списке, функция работает, если используется нажатие клавиши .Если я удаляю функцию Runnable doSearchCmb и помещаю сужение элементов в insertUpdate без использования invokeLater, я получаю ошибку исключения «Попытка изменить уведомление».

В моем текущем коде мой экран зависает после ввода буквы.После нескольких минут ожидания я получаю сообщение об ошибке java.lang.OutOfMemoryError: пространство кучи Java.Я попытался добавить return; после 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 в java - внешний вид и независимость

Моя функция, указанная в run () , работает нормально, если нажата клавишаKeylistener используется, но мое требование заключается в использовании addDocumentListener

...