我最初有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会这样做?在填充项目时向其添加内容时不会触发。
如何防止事件为空时触发事件?

最佳答案

以下代码转储堆栈跟踪

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。如果您遵循源代码,则没有机制可以禁用此功能。但是,可以在添加元素之前禁用侦听器,然后再启用它。

10-04 22:05
查看更多