我的要求是使用 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