combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Within actionPerformed/ItemStateChange");
}
});
System.out.println("Added items to combo");
for (int i = 0; i < 5; i++) {
combo.addItem(i);
}
调用addItem在内部调用这些方法
1)addElement
2)fireIntervalAdded
3)((的ListDataListener)侦听第[i + 1])intervalAdded(E);
4)intervalAdded调用 - &gt; SelectedItemChanged()
5)最后是stateChange。
所以我的问题是在组合框中添加每个项目时,应该调用Listener。但是只能调用一次监听器。在内部实现中,他们使用了ListDataListener。这个听众如何知道所有元素都已被添加或者&#34; x&#34;元素是最后一个元素...... ???
代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
public class test {
private static JComboBox combo;
public static void main(String[] args) {
combo = new JComboBox<>();
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Within actionPerformed/ItemStateChange");
}
});
System.out.println("Added items to combo");
for (int i = 0; i < 5; i++) {
combo.addItem(i);
}
System.out.println("Removed Items from Combo");
invokeRemove();
}
private static void invokeRemove() {
combo.removeAllItems();
}
}
答案 0 :(得分:1)
对我而言,行为是正确的。在组合框中添加内容不会改变选择。因此,首次添加的元素选择从nothing
变为first element
(0)。之后,您添加了多个元素,但仍然选择了0。并且不会触发行动。
删除所有元素后,选择从0
移动到nothing
,然后调用该操作。
答案 1 :(得分:0)
感谢您分享您的想法。我刚刚找到添加addItem时发生ItemState Change的部分。
<强> JCombo.class 强>
protected void selectedItemChanged() {
if (selectedItemReminder != null ) {
fireItemStateChanged(new ItemEvent(this,ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.DESELECTED));
}
// set the new selected item.
selectedItemReminder = dataModel.getSelectedItem();
if (selectedItemReminder != null ) {
fireItemStateChanged(new ItemEvent(this,ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.SELECTED));
}
}
他们使用了ListDataListener。将ActionListener添加到jcombo会将ActionListener添加到ListDatalistener的列表中。每当发生项状态更改时,注册到ListDataListener的侦听器都会收到通知。所以我在addActionListener中获得了sysout。
在JCOMBOX构造函数中调用此方法。这会将addActionListener注册到ListDataListener。当项目状态发生变化时会发出通知。
public void setModel(ComboBoxModel<E> aModel) {
ComboBoxModel<E> oldModel = dataModel;
if (oldModel != null) {
oldModel.removeListDataListener(this);
}
dataModel = aModel;
dataModel.addListDataListener(this);
// set the current selected item.
selectedItemReminder = dataModel.getSelectedItem();
firePropertyChange( "model", oldModel, dataModel);
}