我最初有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
添加项目呢?当一个项目被填满时,它不会被激活
如何防止事件在空时触发?
答案 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