在空的JComboBox上调用addItem会触发actionPerformed事件

时间:2012-11-17 20:55:14

标签: java swing events actionlistener jcombobox

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

private void leftComboActionPerformed(java.awt.event.ActionEvent evt) {                                          
        Object selectedItem = leftCombo.getSelectedItem();
        leftCombo.removeItem(selectedItem);
        rightCombo.addItem(selectedItem);
    }                                         

    private void rightComboActionPerformed(java.awt.event.ActionEvent evt) {                                           
        Object selectedItem = rightCombo.getSelectedItem();
        rightCombo.removeItem(selectedItem);
        leftCombo.addItem(selectedItem);
    }

为什么要向空JComboBox添加项目呢?当一个项目被填满时,它不会被激活 如何防止事件在空时触发?

3 个答案:

答案 0 :(得分:4)

以下代码转储堆栈跟踪

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" );
      }
    } );
  }
}

相关部分

at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1260)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1331)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:94)
at javax.swing.DefaultComboBoxModel.addElement(DefaultComboBoxModel.java:132)

如果您查看源代码,可以看到添加元素时,当前没有选择时会选择它

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

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

答案 1 :(得分:0)

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

E.g。 DefaultComboBoxModel实现允许您在模型中添加/删除元素。你得到模型,对它进行处理,当模型准备就绪时,你将它设置回组合框。

答案 2 :(得分:0)

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

// AB LUND PE CHARHO