当弹出窗口

时间:2015-07-24 11:38:48

标签: java swing events listener jcombobox

我有一个可编辑的JComboBox,上面有一个监听器。

当用户在组合框文本字段中插入或删除一些文本时,它是一个documentListener,它执行一些代码:

 ((JTextComponent)combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(..)

我的问题是,当用户从弹出框中选择一个元素并且组合框文本字段的内容发生变化时,在documentListener中执行了两个事件,一个是删除前一个内容而另一个是删除对应的removeUpdate()是插入新值的insertUpdate()。 我希望我的代码只执行一次,而不是两次。当用户从弹出窗口中选择一个条目时,如何避免代码被执行两次?

我尝试了不同听众的各种组合,但现在没有结果。

我最终想要的是我的代码只执行一次:   - 用户将文本更改为组合框文本字段。   - 用户从组合框弹出窗口中选择一个元素

提前致谢。

[编辑1] 根据要求,我更新了添加SSCCE

myCombobox = new javax.swing.JComboBox<String>();
myCombobox.setEditable(true);
((JTextComponent)myCombobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(
    new DocumentListener(){
    @Override
    public void insertUpdate(DocumentEvent e) {
        System.out.println("insert performed");
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        System.out.println("remove performed");
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        System.out.println("change performed");
    }
});

myCombobox.addItemListener(new ItemListener() { 
    @Override
    public void itemStateChanged(ItemEvent event) {
       if (event.getStateChange() == ItemEvent.SELECTED) {
          System.out.println("Action performed");
       }
  }
});

请注意,在这种情况下,我有一个ItemEvent而不是ActionEvent,因为我继续修改我的代码,在任何情况下都不会受到这种行为的影响。

1 个答案:

答案 0 :(得分:1)

您可以在编辑器中检查[["key1","value1"], ["key2","value2"], ["key1", "value3"]] .group_by(&:first).each{|_, v| v.map!(&:last)} 以确保用户类型。