2011-01-12 2 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 и do

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

    и пусть метод обработчика соответствует значению ignoreEvents.


Что касается вашего обновления:

Вы должны иметь

if (ignoreEvents == true) 
    return; 

в верхней части вашего обработчика. Кроме того, в вашем

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

вы не установили ignoreEvents обратно в ложь. Вы можете использовать try/finally, чтобы убедиться, что ignoreEvents всегда возвращается к false при возврате из метода.

+0

да, эти два варианта являются действительными, спасибо. Но разве нет способа узнать, что вызвало эти события? Я ожидал чего-то подобного. – sasidhar

+0

Вы не найдете ни одного флага, содержащего какое-либо значение «CAUSED_BY_REMOVE_ALL» или что-нибудь еще. Помимо констант в классе 'ItemEvent' и методе' getStateChange', вам придется самому отслеживать это. – aioobe

+0

, пожалуйста, посмотрите мое обновление и помогите мне как можно скорее .... – sasidhar

1

сделал вы пытаетесь event.getSource()?

+0

Это должно привести к экземпляру combobox в любом случае, нет? – aioobe

+0

aioobe правильно, используя getSource() возвращает экземпляр combobox, но это не решит проблему ... – sasidhar

+0

, пожалуйста, посмотрите мое обновление и помогите мне как можно скорее ... – sasidhar

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

Мне кажется, вам нужно добавить remove Lister.

+0

просмотрите мое обновление и помогите мне как можно скорее ... – sasidhar

+0

@sasidhar, это приведенный выше код для removeAllItems(). У меня есть несколько предложений: 1. Убедитесь, что метод removeAllItems() генерирует событие когда он запущен.2. Если нет, переопределите метод removeAllItems() и вызовите метод removeAllItem() в JComboBox.3. Затем инициируйте событие в этом самом методе. Генерирующее событие динамически вы можете проверить эту ссылку: http: // java. sun.com/products/jfc/tsc/articles/generic-listener/index.html. – UVM

Смежные вопросы