Vaadin Comobox не отправляет changeEvent - PullRequest
1 голос
/ 05 января 2012

У меня есть 3 комбинированных списка.Два из них работают отлично, но мой третий не отправляет события изменения моим слушателям, однако, если я выберу пустую строку (null select), я получу событие.У кого-нибудь была эта проблема раньше?В моем коде ниже ничего не работает - companyCombobox, а работает - personCombobox

Дополнительная информация о коде

Что касается кода, комбинированные списки зависят друг от другавыборы, если в combo1 выбрано одно значение, то некоторые заданные объекты загружаются в combo2 и combo3.Если вы начнете с выбора combo2, то combo1 и combo3 должны обновить там источники данных.SetPersonCompanyComboDataSource () вызывается каждый раз, когда происходит событие изменения.Я не включаю эту часть кода.

 private void initComboBoxes() {
        personCombo = getComboBox("orderwiz.orderheadstep.contactwiz.personComboBoxTitle", "orderwiz.orderheadstep.contactwiz.personComboBox");
        companyCombo = getComboBox("orderwiz.orderheadstep.contactwiz.companyComboBoxTitle", "orderwiz.orderheadstep.contactwiz.companyComboBox");
        contactInfoCombo = getComboBox("orderwiz.orderheadstep.contactwiz.contactInfoComboBoxTitle", "orderwiz.orderheadstep.contactwiz.contactInfoComboBox");
        initRolesCombo();

        setPersonCompanyComboDataSource();

    }

protected ComboBox getComboBox(String title, String inputPrompt)
{
    ComboBox dropDown = new ComboBox(DT.get(title));                
    dropDown.setFilteringMode(Filtering.FILTERINGMODE_OFF);     
    dropDown.setMultiSelect(false);
    dropDown.setNullSelectionAllowed(true);
    dropDown.setInvalidAllowed(false);
    dropDown.setNewItemsAllowed(true);
    dropDown.setInputPrompt(DT.get(inputPrompt));
    dropDown.setItemCaptionMode(ComboBox.ITEM_CAPTION_MODE_PROPERTY);
    dropDown.setItemCaptionPropertyId("myItemCaption");
    dropDown.setImmediate(true);
    dropDown.setWidth("100%");

    return dropDown;
}

private void setPersonCompanyComboDataSource() {
    if(myModel.getSelectedContactType() == TYPES.PERSON){
        setSelectedPersonComboDataSource();
    }else if(myModel.getSelectedContactType() == TYPES.COMPANY){
        setSelectedCompanyComboDataSource();
    }else{
        //we reset the comboboxes if there has been a reset or no value is selected in the search
        personCombo.setContainerDataSource(null);
        companyCombo.setContainerDataSource(null);          
    }
}


/**
 * Set the person combobox to hold the selected person and fills all related companies in the companyCombobox
 */
private void setSelectedPersonComboDataSource(){
    BeanItemContainer<PersonWrapper> personContainer = new BeanItemContainer<PersonWrapper>(PersonWrapper.class);
    personContainer.addItem(new PersonWrapper(myModel.getSelectedPerson()));
    personCombo.setContainerDataSource(personContainer);
    personCombo.setValue(personContainer.firstItemId());
    companyCombo.setContainerDataSource(new BeanItemContainer<CompanyWrapper>(CompanyWrapper.class));
    for(Company c : myModel.getCompaniesFromPerson(myModel.getSelectedPerson())){
        companyCombo.addItem(new CompanyWrapper(c));
    }
    if(myModel.getCompaniesFromPerson(myModel.getSelectedPerson()) != null && myModel.getCompaniesFromPerson(myModel.getSelectedPerson()).size() == 1){
        companyCombo.setValue(companyCombo.getItemIds().iterator().next());
    }
}

/**
 * Set the selected company to companyBox and fills all related persons to the personsCombobox
 */
private void setSelectedCompanyComboDataSource(){
    BeanItemContainer<CompanyWrapper> companyContainer = new BeanItemContainer<CompanyWrapper>(CompanyWrapper.class);
    companyContainer.addItem(new CompanyWrapper(myModel.getSelectedCompany()));
    companyCombo.setContainerDataSource(companyContainer);
    companyCombo.setValue(companyContainer.firstItemId());
    personCombo.setContainerDataSource(new BeanItemContainer<Person>(Person.class));
    for(Person p : myModel.getPersonsFromCompany(myModel.getSelectedCompany())){
        personCombo.addItem(new PersonWrapper(p));
    }
    if(myModel.getPersonsFromCompany(myModel.getSelectedCompany()) != null && myModel.getPersonsFromCompany(myModel.getSelectedCompany()).size() == 1){
        personCombo.setValue(personCombo.getItemIds().iterator().next());
    }
}

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Итак, я выяснил, в чем проблема.Мои объекты предоставили метод равенства, при котором все выборки выглядели одинаково.

В моих объектах у меня есть метод равенства, который в нормальных условиях работал бы правильно, но моя БД содержала много тестовых данных сКомпании, скопированные с точно такими же данными, за исключением их идентификатора, и этот идентификатор не включается в метод equals из-за бизнес-правил (не моих правил).Итак, когда выпадающий список загружает все мои компании, и я сделал один выбор, все работает, но когда я делаю другой выбор, и вновь выбранный объект соответствует старому объекту из-за метода equals, vaadin не вызвал событие изменения, так как это был тот же объектсогласно моим правилам равных.

0 голосов
/ 16 января 2017

В моем случае я реализовал getItemIds () и hasId () неправильно в пользовательском контейнере. ContainsId () был сгенерирован 'возврат ложь'. Это также останавливает работу слушателя выбора.

...