Следующий фрагмент кода сбрасывает трассировку стека
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
. Если вы следуете исходному коду, нет механизма для его отключения. Тем не менее, вы можете отключить прослушиватель, прежде чем добавлять элемент, и затем включить его.