0

JComboBox最初有 2 个控件,里面装满了项目。选择 a 中的一个项目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呢?填充时将项目添加到其中时,它不会触发。
如何防止事件在为空时触发?

4

3 回答 3

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

于 2012-11-17T21:04:39.503 回答
0

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

//AB LUND PE CHARHO

于 2017-05-17T04:35:01.017 回答
0

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

例如,DefaultComboBoxModel实现允许您在模型中添加/删除元素。你得到模型,处理它,当模型准备好时,你把它放回组合框。

于 2015-07-31T07:48:39.623 回答