检测JComboBox编辑

时间:2012-01-21 00:03:35

标签: java swing jcombobox

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

我希望能够检测何时将字符输入JComboBox,因此我可以重置倒计时,这可以防止更新JComboBox,只要它不为零。我的第一直觉是使用KeyListener,但组合框上的Java教程说明了这一点,

  

虽然JComboBox继承了为其注册侦听器的方法   低级事件 - 例如焦点,键和鼠标事件 - 我们   建议您不要在组合框上监听低级事件。

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

2 个答案:

答案 0 :(得分:4)

这有点冒险,但它应该可以在Editor组件(A JTextField)上收听Document更新。

    JComboBox cb = new JComboBox();
    Component editor = cb.getEditor().getEditorComponent();
    if (editor instanceof JTextField) {
        ((JTextField) editor).getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent documentEvent) {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public void removeUpdate(DocumentEvent documentEvent) {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public void changedUpdate(DocumentEvent documentEvent) {
                //To change body of implemented methods use File | Settings | File Templates.
            }
        });                                      
    }

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

答案 1 :(得分:2)

我想补充一点,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时,它没有。