2012-03-16 208 views
1

我得到了一個簡單的POJO類,我希望在表單中顯示/更新
使用BeanItem類和組件數據綁定,我能夠快速顯示第一個屬性可能數據類。不過,我已經打了一個牆相關的屬性:嵌套bean:對象內的集合

我的課擁有一組可用的狀態,作爲對象'AppStatus'的列表。它也具有當前狀態,這是「可用」列表中的狀態之一。

我想在窗體中顯示列表作爲組合框,並選擇當前狀態。

我設法將'可用'屬性與一個組合框相關聯,但是當設置數據源(方法setItemDataSource)時,我似乎無法填充此組合框。我如何從我的項目中獲得可用狀態列表和當前狀態?

我總是可以使用一個解決方法,並添加一個參數到方法來獲得除了BeanItem之外的源對象,但如果Item屬性可以給我我的屬性,我寧願避免這一點。

問候

編輯:從埃裏克R.

class Status { 
    String id; 
    Sting label 
+ setter /getter 
} 

class App { 
    String AppId; 
    String AppLabel 
    ArrayList<Status> availablestatus; 
    Status currentStatus 
+setter/getter 
} 
形式延伸

縮短爲例,用代碼,在fieldfactory的createField我添加下列行

if ("status".equals(propertyId)) { 
// create the combobox 
    ComboBox status = new ComboBox(
     texts.getString("application.label.status")); 
    status.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); 
    status.setItemCaptionPropertyId("label"); 
    status.setImmediate(true); 
    status.setNullSelectionAllowed(false); 

    IndexedContainer container = new IndexedContainer(
     (Collection<ApplicationStatus>) item.getItemProperty(
     "availableStatus").getValue()); 

    status.setContainerDataSource(container); 
    status.setPropertyDataSource(item.getItemProperty("currentStatus")); 

    return status; 
} else... 

這不起作用,我得到一個組合框,正確的行數,但所有的空。

我試圖用IndexedContainer

BeanContainer<String, ApplicationStatus> container = 
     new BeanContainer<String, ApplicationStatus>(ApplicationStatus.class); 
    container.addAll((Collection<ApplicationStatus>) item 
      .getItemProperty("availableStatus"). 
    container.setBeanIdProperty("id"); 

的beanContainer而不是結果稍微好一點,因爲我確實有ComboBox中可用的值。 只有currentValue沒有被選中...

我也嘗試使用nestedbean屬性來獲取當前狀態的id,但結果仍然無效......我得到一個組合框,並選擇了正確的值,但我不能再看到其他值,因爲組合框是隻讀的(即使使用setReadOnly(false);)

回答

1

我建議我的方式來解決這個問題。我不認爲這是最好的方式,但它是有效的。

beanItem類包含了你所需要的全部。

我做了一個簡單的項目下面,它的工作檸好:

  ComboBox status = new ComboBox("ComboBox"); 
    status.setImmediate(true); 
    status.setNullSelectionAllowed(false); 

    for(Status st : (Collection<Status>)item.getItemProperty("availableStatus").getValue()) { 
     status.addItem(st); 
     status.setItemCaption(st, st.getLabel()); 
    } 
    status.setPropertyDataSource(item.getItemProperty("currentStatus")); 

希望它的作品。

問候埃裏克

+0

幫助我得到(至少)在組合框中的值,但我似乎無法得到所選的currentValue(如我的編輯所示) – 2012-03-17 00:59:33

+0

@PATRY我剛剛更新了我的代碼。 – 2012-03-17 01:56:48

+0

非常感謝。這讓我困惑了很長一段時間!有關信息,如果在此屬性的FieldFactory的createField中創建組合框,則不需要「status.setpropetyDataSource ...」。這似乎是自動完成的 – 2012-03-17 10:42:03

0

vaadin demo site您可以得到這個示例,顯示如何填充組合框與國家。你可以做同樣的我猜(不知道我理解你的問題100%):

myForm.setFormFieldFactory(new MyFormFieldFactory()); 

private class MyFormFieldFactory extends DefaultFieldFactory { 

     final ComboBox countries = new ComboBox("Country"); 

     public MyFormFieldFactory() { 
      countries.setWidth(COMMON_FIELD_WIDTH); 
      countries.setContainerDataSource(ExampleUtil.getISO3166Container()); 
      countries 
        .setItemCaptionPropertyId(ExampleUtil.iso3166_PROPERTY_NAME); 
      countries.setItemIconPropertyId(ExampleUtil.iso3166_PROPERTY_FLAG); 
      countries.setFilteringMode(ComboBox.FILTERINGMODE_STARTSWITH); 
     } 

     @Override 
     public Field createField(Item item, Object propertyId, 
       Component uiContext) { 
      Field f = (Field)item; 
      if ("countryCode".equals(propertyId)) { 
       // filtering ComboBox w/ country names 
       return countries; 
      } 
      return f; 
     } 
} 
+0

我已經看到了這一點爲例,但我的問題是,組合框的內容就不會事先定義。當我得到beanItem(即新形式的DataSource)時,我也得到了combox的可能值。 – 2012-03-16 14:20:39

+0

你使用MVC模式嗎?如果是這樣的話,你應該從模型中得到這個,並告訴視圖更新,一旦它得到一個事件,將項目添加到組合框 – Marthin 2012-03-16 15:13:15