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