Vaadin ValueChangeListener для выбранного компонента не работает нормально

У меня проблема с ValueChangeListener. У меня есть этот код:

private void caricaSelectMainUser(){
    Object[] a = socFilName.get(0);
    List<String> elencosoc = societaDao.getSocieta();
    List<String> socUtente = app.getUserDao().getSocietaByUname(app.getCod_utente());   

    for (int i = 0; i < elencosoc.size(); i++) {            
        societa.addItem(elencosoc.get(i));
    }            
    caricaMenuFiliale();
    caricaMenuRisorsa();
    societa.select(socUtente.get(0));   
    filiale.select(a[1]);
    nome.select(a[2]);

    societa.addListener(new Property.ValueChangeListener() {

        @Override
        public void valueChange(ValueChangeEvent event) {
            filiale.removeAllItems();
            caricaMenuFiliale();
            nome.removeAllItems();
        }   
    });   

    filiale.addListener(new Property.ValueChangeListener() {

        @Override
        public void valueChange(ValueChangeEvent event) {
            System.out.println("entro nel listener filiale");
            nome.removeAllItems();
            caricaMenuRisorsa();
        }   
    });       

    nome.addListener(new ValueChangeListener() {

        @Override
        public void valueChange(ValueChangeEvent event) {
            getValuesFromDropDown();
        }   
    });       

    getValuesFromDropDown();}

Эта часть кода управляет слушателями для "società", "filiale" и "name".

private void caricaMenuFiliale() {
    List<Object[]> elencofilNew = app.getUserDao().getDescFilialeSoc(societa.getValue().toString());
    mapFiliale = new HashMap<String,Object>();
    for (int i = 0; i < elencofilNew.size(); i++) {
        Object[] a = elencofilNew.get(i);
        for (int j = 0; j < a.length; j++) {
            mapFiliale.put(a[1].toString(), a[0]);
            filiale.addItem(a[1]);
        }
    }
}

private void caricaMenuRisorsa() {
    List<Object[]> elencoNominativiNew = app.getUserDao().getNominativiFromSoc(societa.getValue().toString());
    map = new HashMap<String,Object>();
    for (int i = 0; i < elencoNominativiNew.size(); i++) {
        Object[] a = elencoNominativiNew.get(i);
        map.put((String) a[0],a[1]);                        
        nome.addItem((String) a[0].toString());

    }
}

private void getValuesFromDropDown() {
    String codsoc = societa.getValue().toString();
    String codfil = mapFiliale.get(filiale.getValue().toString()).toString();
    String codper = map.get(nome.getValue()).toString();
    String mm = (mese.getValue().toString().length()==1?("0"+mese.getValue().toString())emoticonmese.getValue().toString()));
    String aaaamm = anno.getValue().toString() + mm;
}

поток последовательности должен быть таким, чтобы при изменении «общества» выберите «filiale» загрузиться с привязкой данных к выбранному «обществу», а когда «filiale» изменить «имя», загрузиться с привязкой данных с выбранными «обществом» и «filiale» . Но когда я выбираю новое «общество», код ниже запускается

nome.addListener(new ValueChangeListener() {

    @Override
    public void valueChange(ValueChangeEvent event) {
        getValuesFromDropDown();
    }   
});    

и я ловлю NullPointerException на

String codfil = mapFiliale.get(filiale.getValue().toString()).toString();

в методе getValuesFromDropDown(). Если я отменяю вызов этого метода из valueChangeListener из выбора «nome», все работает нормально. Я знаю, что у моей логики могут быть некоторые проблемы, но я не знаю, почему такое поведение. Кто-нибудь может мне помочь?

Спасибо.


person Mario    schedule 29.10.2012    source источник
comment
в этой части кода: String codfil = mapFiliale.get(filiale.getValue().toString()).toString(); поле нулевого значения - filiale.getValue().toString()   -  person Mario    schedule 31.10.2012
comment
Нет, я имею в виду... Что конкретно равно null. Используйте свой отладчик, выясните, что такое null. Разместите это здесь.   -  person Dusty J    schedule 01.11.2012
comment
Филиал имеет значение null. Однако на данный момент я заморозил проблему с помощью кнопки. Таким образом, я могу обрабатывать различные выбранные компоненты, избегая сумасшедших слушателей, но мне нужно решить эту проблему для моих личных знаний !!!   -  person Mario    schedule 06.11.2012
comment
Итак, если filiale имеет значение null, это означает, что это не проблема vaadin. Я предполагаю, что это проблема масштаба. Без всего файла невозможно точно определить, что не так, но это базовая отладка Java, ничего специфичного для vaadin.   -  person Dusty J    schedule 08.11.2012
comment
Я не знаю, как объяснить, не написав много: если вы видите, есть три слушателя (societa, filiale и nome). Когда выбрано общество, загружается filiale, а когда выбрано filiale, загружается имя. Я думаю, что проблема не в компоненте vaadin, а при запуске приложения автоматически запускается ном прослушивателя (это причина моего NullPointerException (потому что filiale еще не загружен). Если я не пишу nome.addListener (в этом кстати нет слушателя на компоненте номе) работает все нормально!!Я уверен, что проблема более глупая, чем кажется, но я еще не решил проблему...   -  person Mario    schedule 09.11.2012


Ответы (1)


В прослушивателе сообщества вы вызываете nome.removeAllItems(). Это вызовет событие Property.ValueChangeEvent в номе AbstractSelect.

societa.addListener(new Property.ValueChangeListener() {
    @Override
    public void valueChange(ValueChangeEvent event) {
        filiale.removeAllItems();
        caricaMenuFiliale();
        nome.removeAllItems();
    }   
});
person vivid_voidgroup    schedule 23.11.2012