Java 对空JComboBox调用addItem会触发actionPerformed事件

Java 对空JComboBox调用addItem会触发actionPerformed事件,java,swing,events,actionlistener,jcombobox,Java,Swing,Events,Actionlistener,Jcombobox,我有2个JComboBox控件,最初填充了项。在JComboBox中选择一项会将其移动到另一个JComboBox。 当其中一个JComboBox控件为空时,就会出现问题。当我尝试将项目移动到空的JComboBox时,它会触发其actionPerformed事件 为什么向空的JComboBox添加一个项会这样做?当一个项目被添加到它时,它不会在它被填充时激发。 如何防止事件为空时触发?下面的代码将转储堆栈跟踪 import javax.swing.JComboBox; import java.aw

我有2个JComboBox控件,最初填充了项。在JComboBox中选择一项会将其移动到另一个JComboBox。 当其中一个JComboBox控件为空时,就会出现问题。当我尝试将项目移动到空的JComboBox时,它会触发其actionPerformed事件

为什么向空的JComboBox添加一个项会这样做?当一个项目被添加到它时,它不会在它被填充时激发。
如何防止事件为空时触发?

下面的代码将转储堆栈跟踪

import javax.swing.JComboBox;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EmptyComboboxTest {
  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        JComboBox<String> emptyBox = new JComboBox<String>();
        emptyBox.addActionListener( new ActionListener() {
          @Override
          public void actionPerformed( ActionEvent e ) {
            Thread.dumpStack();
          }
        } );
        emptyBox.addItem( "test" );
      }
    } );
  }
}
如果查看源代码,可以看到在添加元素时,当当前未选择任何内容时,将选中该元素

    if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
        setSelectedItem( anObject );
    }

更改选择可能导致触发ActionEvent。如果遵循源代码,则没有禁用此功能的机制。但是,您可以在添加元素之前禁用侦听器,然后再启用它。

下面的代码片段转储堆栈跟踪

import javax.swing.JComboBox;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EmptyComboboxTest {
  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        JComboBox<String> emptyBox = new JComboBox<String>();
        emptyBox.addActionListener( new ActionListener() {
          @Override
          public void actionPerformed( ActionEvent e ) {
            Thread.dumpStack();
          }
        } );
        emptyBox.addItem( "test" );
      }
    } );
  }
}
如果查看源代码,可以看到在添加元素时,当当前未选择任何内容时,将选中该元素

    if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
        setSelectedItem( anObject );
    }

更改选择可能导致触发ActionEvent。如果遵循源代码,则没有禁用此功能的机制。但是,您可以在添加元素之前禁用侦听器,然后再启用它。

避免actionPerformed事件的方法是使用组合框的模型,它是javax.swing.ComboxModel接口的实例

例如,DefaultComboxModel实现允许您在模型中添加/删除元素。获取模型,处理它,当模型准备好后,将其设置回组合框。

避免actionPerformed事件的方法是使用组合框的模型,它是javax.swing.ComboxModel接口的一个实例


例如,DefaultComboxModel实现允许您在模型中添加/删除元素。获取模型,然后处理它,当模型准备好后,将其设置回组合框。

更改选择可能会触发ActionEvent。如果遵循源代码,则没有禁用此功能的机制。但是,您可以在添加元素之前禁用侦听器,然后再启用它


//AB LUND PE CHARHO

更改选择可能会触发ActionEvent。如果遵循源代码,则没有禁用此功能的机制。但是,您可以在添加元素之前禁用侦听器,然后再启用它

//阿伯隆德佩查霍酒店