Как определить источник события ..? - PullRequest
2 голосов
/ 12 января 2011

В свою очередь, метод 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)

и т. Д. ...........

Ответы [ 3 ]

1 голос
/ 12 января 2011

Я считаю, что ваш лучший вариант - либо

  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 обратно в false.Вы можете использовать try / finally, чтобы при возвращении из метода ignoreEvents всегда возвращалось значение false.

1 голос
/ 12 января 2011

ты пробовал event.getSource()?

0 голосов
/ 12 января 2011

Это код для 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.

...