【问题标题】:Calling addItem on an empty JComboBox triggers actionPerformed event在空的 JComboBox 上调用 addItem 会触发 actionPerformed 事件
【发布时间】:2012-11-17 20:55:13
【问题描述】:

我有 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 添加一个项目?填充后将项目添加到其中时,它不会触发。
如何防止事件为空时触发?

【问题讨论】:

    标签: java swing events actionlistener jcombobox


    【解决方案1】:

    以下代码转储堆栈跟踪

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        //AB LUND PE CHARHO

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 2012-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多