【问题标题】:How do I update a JComboBox's list from a Document Listener?如何从 Document Listener 更新 JComboBox 的列表?
【发布时间】: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 中的“列表”。

标签: java swing jcombobox 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:
}   });

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 2014-04-11
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多