虽然为每个项目调用了FireIntervalChanged,但在JCOMBOBOX中添加所有项目后,Listener仅被触发ONCE

时间:2015-03-10 09:31:55

标签: java actionlistener 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);
    }

调用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();

    }

}

2 个答案:

答案 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);
}