Java 当从弹出窗口更改选择时,可编辑JCombobox可避免多个DocumentEvents

Java 当从弹出窗口更改选择时,可编辑JCombobox可避免多个DocumentEvents,java,swing,events,listener,jcombobox,Java,Swing,Events,Listener,Jcombobox,我有一个可编辑的JComboBox,上面有一个侦听器 它是一个documentListener,当用户在combobox文本字段中插入或删除某些文本时,执行一些代码: ((JTextComponent)combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(..) 我的问题是,当用户从弹出窗口中选择一个元素并且combobox文本字段的内容发生更改时,documentListener中会执行两个

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

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

 ((JTextComponent)combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(..)
我的问题是,当用户从弹出窗口中选择一个元素并且combobox文本字段的内容发生更改时,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");
       }
  }
});
myCombobox=newjavax.swing.JComboBox();
myCombobox.setEditable(true);
((JTextComponent)myCombobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(
新建DocumentListener(){
@凌驾
公共作废插入更新(文档事件e){
系统输出打印项次(“执行插入”);
}
@凌驾
公共作废移除更新(文档事件e){
系统输出打印项次(“删除已执行”);
}
@凌驾
公共作废更改日期(记录事件e){
系统输出打印项次(“执行的变更”);
}
});
myCombobox.addItemListener(新的ItemListener(){
@凌驾
公共无效itemStateChanged(ItemEvent事件){
if(event.getStateChange()==ItemEvent.SELECTED){
System.out.println(“执行的操作”);
}
}
});

请注意,在本例中,我使用的是ItemEvent而不是ActionEvent,因为我正在继续修改代码搜索解决方案。在任何情况下,行为都不应受到此影响。

您可以选中
((JTextComponent)combobox.getEditor().getEditorComponent()).hasFocus()
确保用户在编辑器中键入内容。

是的,但以这种方式,我无法捕获与通过弹出窗口进行的选择更改相关的事件。为什么您无法捕获?此外,您还可以尝试列出编辑开始设置一些标志,并在编辑结束/取消后将其重置。不幸的是,当我从弹出窗口中选择一个条目时,editorComponent也会继续具有焦点。此外,我不能使用变量,因为当选择更改时,DocumentEvent似乎在actionEvent之前触发。请使用更新您的问题SSCCE@user2572526,
我无法使用变量,因为当选择更改时,DocumentEvent似乎在actionEvent之前触发
-将DocumentEvent代码包装在SwingUtilities.invoke(…)因此,代码被放置在EDT的末尾,这意味着它将在ActionEvent之后执行。
根据请求,我更新了添加SSCCE的代码。
-该代码不是SSCCE。我们无法编译或执行代码。