方法JComboBox.removeAllItems()是否会依次触发ItemStateChanged事件。
如果是这样,我如何确定天气是由于用户操作还是由于调用方法removeAllItems()而产生的?
我在组合框的itemStateChanged()方法中有一些代码,当用户在组合框中更改其选择时,此方法可以正常工作,但是由于代码的性质,由于以下原因,它在调用时会引发空指针异常在该组合框上调用removeAllItems()。如果我可以确定事件的原因是removeAllItems()方法并返回控件,那么我的问题将得到解决。我该怎么做呢..?
更新
大家提出答案后,我使用了以下代码...

 @Override
        public void itemStateChanged(ItemEvent e) {
            if(e.getSource()==branch_list)
            {
                if(!UserConstants.FID.contains("hod"))
                {
                    ignoreEvents=true;//static boolean variable not used by any other methods
                    year_list.removeAllItems();
                    year_list.addItem(" ");
                    sem_list.removeAllItems();
                    sem_list.addItem(" ");
                    branch_list.removeAllItems();
                    branch_list.addItem(" ");
                    if(branch_list.getSelectedItem().equals(" "))
                        return;
                    Iterator year_it=DatabaseConnector.map.get(branch_list.getSelectedItem().toString()).keySet().iterator();
                    while(year_it.hasNext())
                    {
                        year_list.addItem(year_it.next());

                    }
                    ignoreEvents=false;
                }
                return;
            }
            else if(e.getSource()==year_list)
            {
                if((branch_list.getSelectedItem()==null)||branch_list.getSelectedItem().toString().equals(" ")||ignoreEvents)
                return;
                sem_list.removeAllItems();
                section_list.removeAllItems();
                sem_list.addItem(" ");
                section_list.addItem(" ");
                Iterator i=DatabaseConnector.map.get(branch_list.getSelectedItem().toString()).get(year_list.getSelectedItem().toString()).iterator();
                int first=0;
                while(i.hasNext())
                {
                    String cur=i.next().toString();
                    if(first==0)
                    {
                        sem_list.addItem(cur.charAt(0));
                        section_list.addItem(cur.charAt(1));
                        first++;
                    }
                    else
                    {
                        section_list.addItem(cur.charAt(1));
                    }

                }


            }

        }
I am getting the following error:-
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(SingleByteEncoder.java:91)
    at sun.nio.cs.SingleByteEncoder.encodeLoop(SingleByteEncoder.java:130)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
    at java.io.PrintStream.write(PrintStream.java:476)
    at java.io.PrintStream.print(PrintStream.java:619)
    at java.io.PrintStream.println(PrintStream.java:756)
    at attendence.Home.itemStateChanged(Home.java:427)


等等...........

最佳答案

我相信您最好的选择是


如果您对事件不感兴趣,请删除它,即使它是临时的

cb.removeItemListener(listener);
cb.removeAllItems();
cb.addItemListener(listener);


要么,
引入一个名为ignoreEvents的布尔变量,然后执行

ignoreEvents = true;
cb.removeAllItems();
ignoreEvents = false;


并让处理程序方法遵守ignoreEvents值。




关于您的更新:

你需要

if (ignoreEvents == true)
    return;


在您的处理程序的顶部。另外,在您的

if(branch_list.getSelectedItem().equals(" "))
    return;


您不要将ignoreEvents设置为false。您可以使用try / finally来确保从方法返回时,总是将ignoreEvents设置回false。

09-04 12:01