2012-11-17 33 views
0

我有2 JComboBox控件最初充满了项目。选择JComboBox中的一个项目将其移动到另一个JComboBox
JComboBox控件之一为空时,会发生此问题。当我尝试将项目移动到空的JComboBox时,它会触发actionPerformed事件。在空JComboBox触发器上调用addItem触发器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

下面的代码转储堆栈跟踪

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

0

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

例如DefaultComboBoxModel实现允许您向模型添加/删除元素。你得到模型,在模型上工作,当模型准备就绪时,你将它设置回组合框。

0

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

// AB LUND PE CHARHO