如何识别事件的来源..?

时间:2011-01-12 13:27:13

标签: java events swing awt jcombobox

方法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)

依旧...........

3 个答案:

答案 0 :(得分:1)

你试过event.getSource()吗?

答案 1 :(得分:1)

我相信你最好的选择是

  1. 当您对事件不感兴趣时​​删除侦听器,即使它是临时的

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

  2. 引入一个名为ignoreEvents的布尔变量,并执行

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

    让处理程序方法尊重ignoreEvents值。


  3. 关于您的更新:

    你需要

    if (ignoreEvents == true)
        return;
    

    位于处理程序的顶部。另外,在你的

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

    您没有将ignoreEvents设置为false。您可以使用try / finally确保从方法返回时ignoreEvents始终设置为false。

答案 2 :(得分:0)

这是JComboBox.removeAllItem()的代码。

public void removeAllItems() {
        checkMutableComboBoxModel();
        MutableComboBoxModel model = (MutableComboBoxModel)dataModel;
        int size = model.getSize();

        if ( model instanceof DefaultComboBoxModel ) {
            ((DefaultComboBoxModel)model).removeAllElements();
        }
        else {
            for ( int i = 0; i < size; ++i ) {
                Object element = model.getElementAt( 0 );
                model.removeElement( element );
            }
        }
    selectedItemReminder = null;
    if (isEditable()) {
        editor.setItem(null);
    }
    }

我认为您需要添加删除项侦听器。