如何从 Document Listener 更新 JComboBox 的列表?
Posted
技术标签:
【中文标题】如何从 Document Listener 更新 JComboBox 的列表?【英文标题】:How do I update a JComboBox's list from a Document Listener? 【发布时间】:2013-03-22 22:21:22 【问题描述】:我正在编写一个自定义 JComboBox,每当用户键入内容时,我都想更新 JComboBox 的下拉菜单。我遇到的问题是,一旦我的 DocumentListener 看到更新,当我尝试将项目添加到列表时就会收到错误消息。 这是一个不起作用的基本示例:
public class InputField extends JComboBox<String> implements DocumentListener
//when something is typed, gets suggestions and adds them to the popup
@Override
public void insertUpdate(DocumentEvent ev)
try
giveSuggestions(ev);
catch(StringIndexOutOfBoundsException e)
private void giveSuggestions(DocumentEvent ev)
this.addItem("ok");
这实际上不是我的程序的工作方式(我不只是在每次有人键入内容时都添加 OK),但让它工作将允许我以它需要的工作方式实现我的自定义 JComboBox。提前感谢您的帮助。
编辑:我得到的错误信息是:
线程“AWT-EventQueue-0”java.lang.IllegalStateException 中的异常:尝试在通知中变异
【问题讨论】:
1) 为了更好地帮助我们,请发布您的完整错误消息。您是否正在尝试从 DocumentListener 内部更改 Document?如果是这样,API 会告诉你你不能这样做(不是直接),而且真的不应该这样做。 2) 不,不,对空的 catch 块不。 3)我也想知道你真正想要使用的是 DocumentFilter。 4) 为了真正最好地帮助我们,请创建并发布sscce,向我们展示您正在尝试做的事情。 您正在尝试更改其侦听器中的 Document,正如 @HovercraftFullOfEels 所指出的那样,您不应该这样做。 @HovercraftFullOfEels 好的,我已经添加了错误消息。我知道 API 说我不应该这样做,但我没有尝试编辑其更改提醒 DocumentListener 的文本,我正在尝试更新列表,这不是一回事。 @hd1 我知道不应该这样做,尽管我不明白为什么。如果是这种情况,我应该如何在每次更改可编辑字段时更改下拉列表? 再次考虑创建和发布sscce。我们不想看到整个程序,而且我们很难根据代码 sn-ps 和描述找出问题所在。我要的是一个很小的新程序,它试图做的只是你上面描述的——修改相关 DocumentListener 中的“列表”。 【参考方案1】:SwingUtilities.invokeLater(new Runnable()
public void run()
this.addItem("ok");
// I can never remember the correct way to invoke a class method
// from witin and anonymous inner class
//InputField.addItem("ok");
);
【讨论】:
谢谢!这似乎可以解决问题。我只有一个问题:由于某种原因,当我输入一个字母时,run() 方法似乎被调用了 3 次:你知道这是为什么吗? 正如 Hovercraft 多次提到的,我们无法猜测您的代码是什么,因此当您发现意外行为时需要发布 SSCCE。 我发布我发布的代码是有原因的,除了将我的 InputField 放入 JFrame 并使 Frame 可见的简单主语句之外,实际上所有代码都在运行。出于同样的原因,我没有包含构造函数:我认为基本设置是多余的信息。 如果代码无法编译执行,我们应该如何测试?【参考方案2】:也许这就是你要找的东西
jComboBox2.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter()
public void keyReleased(java.awt.event.KeyEvent evt)
//add your handling code here:
);
【讨论】:
以上是关于如何从 Document Listener 更新 JComboBox 的列表?的主要内容,如果未能解决你的问题,请参考以下文章
它是如何工作的 - requestLocationUpdates() + LocationRequest/Listener
如何从firestore中删除文档时实时更新Recyclerview?
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as