2012-01-05 24 views
1

我有3個組合框。其中兩個很好,但我的第三個不發送更改事件給我的聽衆,但是,如果我選擇空行(空選擇),然後我得到的事件。有沒有人有過這個問題?在沒有工作我下面的代碼是companyCombobox和工作是personComboboxVaadin Comobox不發送changeEvent

有關代碼

關於代碼一些進一步的信息,在組合框取決於每個人的選擇,如果一個值被選中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()); 
    } 
} 
+0

我沒有看到任何worng,但錯過了很多相關的代碼。它可能在你發佈的地方。您是否嘗試過調試並查看執行流程? – fmucar 2012-01-05 13:40:17

+0

我已經運行了一個調試器。但是,除非我做空選擇,否則不存在事件。 – Marthin 2012-01-06 11:42:32

+0

您可能會嘗試更改vaadin jar的版本以查看是否發生了相同的事情,如果是,可能是bug – fmucar 2012-01-06 14:47:48

回答

3

因此,我發現問題是什麼。我的實體提供了一個equals方法,使所有選擇顯示相同。

在我的實體中,我有一個equals方法,在正常情況下會正常工作,但是,我的數據庫包含大量的測試數據,複製的公司具有與ID完全相同的數據,並且不包含ID在等於方法,因爲業務規則(而不是我的規則)。所以,當組合框加載我所有的公司時,我做了一個單選,一切正常,但是當我做另一個選擇時,由於equals方法,新選擇的實體與舊實體相匹配,因爲它是同一個對象,所以vaadin沒有觸發更改事件根據我的平等規則。

+2

+1很高興聽到您發現問題並回來發佈解決方案。 – fmucar 2012-01-09 17:21:31

0

在我的情況下,我在自定義容器中實現了getItemIds()和containsId()錯誤。 containsId()是一個生成的「返回false」。這也阻止了選擇監聽器的工作。