Java 检测JComboBox编辑

Java 检测JComboBox编辑,java,swing,jcombobox,Java,Swing,Jcombobox,我有一个JComboBox,每秒我想从数据库中检索一组字符串,并将这些字符串设置为JComboBox的内容,其中一个作为当前选择的值。但我也希望用户能够编辑JComboBox,向数据库添加一个值,并将其设置为当前值 我希望能够检测何时将字符输入JComboBox,这样我就可以重置倒计时,只要它不是零,就可以阻止更新JComboBox。我的第一反应是使用KeyListener,但组合框的Java教程中说 尽管JComboBox继承了为其注册侦听器的方法 低级事件—例如焦点、按键和鼠标事件—我们 建

我有一个JComboBox,每秒我想从数据库中检索一组字符串,并将这些字符串设置为JComboBox的内容,其中一个作为当前选择的值。但我也希望用户能够编辑JComboBox,向数据库添加一个值,并将其设置为当前值

我希望能够检测何时将字符输入JComboBox,这样我就可以重置倒计时,只要它不是零,就可以阻止更新JComboBox。我的第一反应是使用KeyListener,但组合框的Java教程中说

尽管JComboBox继承了为其注册侦听器的方法 低级事件—例如焦点、按键和鼠标事件—我们 建议不要在组合框中侦听低级事件


他们接着说,触发的事件可能会根据外观而变化。

这有点冒险,但在编辑器组件(JTextField)上侦听文档更新应该是可行的


对于从JComboBox中键入/删除的每个字符,都应该调用那些*Update(DocumentEvent DocumentEvent)方法。

我想补充的是,changedUpdate方法不会触发纯文本文档的通知。如果您使用的是纯文本组件,则必须使用insertUpdate和/或removeUpdate

最近,如果用户正在编辑组合框,我不得不使用文档侦听器来禁用/启用按钮。我做了类似的事情,工作非常出色:

public class MyDocumentListener implements DocumentListener
{

  @Override
  public void insertUpdate(DocumentEvent e)
  {
     setChanged();
     notifyObservers(true);
  }

  @Override
  public void removeUpdate(DocumentEvent e)
  {
     setChanged();
     notifyObservers(false);
  }

  @Override
  public void changedUpdate(DocumentEvent e)
  {
     // Not used when document is plain text
  }
}
然后,我将此侦听器添加到组合框中,如下所示:

((JTextComponent) combobox.getEditor().getEditorComponent())
    .getDocument().addDocumentListener(new MyDocumentListener());

这是因为与组合框关联的文档是纯文本。当我使用changedUpdate时,它没有。

我喜欢这样的问题。Swing是一个有趣的框架,正确地使用它比不知道一系列奇怪但可行的黑客更常见
((JTextComponent) combobox.getEditor().getEditorComponent())
    .getDocument().addDocumentListener(new MyDocumentListener());