SwingUtilities.invokeLater什么也不做

时间:2018-10-05 08:51:37

标签: java swing documentlistener swingutilities

我的要求是使用 addDocumentListener doSearchCmb 基本上缩小了组合框中的项目,如果使用按键,功能可以正常工作。如果我删除函数 Runnable doSearchCmb 并将项目的范围缩小不使用invokeLater插入insertUpdate中,则会收到“尝试突变通知”异常的错误。

在我当前的代码中,键入字母后屏幕冻结。等待几分钟后,我得到了java.lang.OutOfMemoryError错误:Java堆空间。 我尝试在 combo.repaint(); 之后添加 return; ,我的屏幕没有冻结,没有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 - Look and feel independent

如果使用keylistener的按键,我在 run()中指示的功能可以正常工作,但是我的要求是使用 addDocumentListener

0 个答案:

没有答案