2011-01-12 96 views
2

方法JComboBox.removeAllItems()是否会触发ItemStateChanged事件..?
如果是这样,我如何确定由于用户操作或由于方法removeAllItems()..的调用而生成事件的天气。
我在组合框的itemStateChanged()方法中有一些代码,当用户在组合框中更改他的选择时它将工作正常,但是通过代码的性质,它会在调用它时引发空指针异常由于在该组合框上调用removeAllItems()。如果我可以确定事件的原因是removeAllItems()方法并返回控件,那么我的问题就会解决。我该怎么做呢..?
UPDATE
后你的人都挂上了答案,我用下面的代码...如何识别事件的来源..?

@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) 

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

回答

1

我相信你最好的选择是要么

  1. 删除监听器当你不感兴趣的事件,哪怕是暂时的

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

    ,或者

  2. 引入一个布尔变量,称为ignoreEvents并做

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

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


关于你提到的更新:

你需要有

if (ignoreEvents == true) 
    return; 

在你的处理器的顶部。此外,在您的

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

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

1

做你试试event.getSource()

+0

这应该给组合框实例,不是吗? – aioobe 2011-01-12 13:32:22

+0

aioobe是正确的使用getSource()返回的组合框的实例,但是这不会解决问题... – sasidhar 2011-01-12 13:36:53

+0

请看我的更新,并尽早帮助我... – sasidhar 2011-01-12 17:34:55

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

我想你需要添加移除Item Listener。