嵌套bean:对象内的集合

时间:2012-03-16 12:07:48

标签: vaadin

我有一个简单的POJO课程,希望以表格形式显示/更新 使用BeanItem类和组件数据的绑定,我能够快速显示may数据类的第一个属性。然而,我已经找到了拖延相关属性的墙:

我的班级拥有一组可用状态,作为对象'AppStatus'的列表。它还具有当前状态,即“可用”列表中的状态之一。

我想将表单中的列表显示为组合框,并选择当前状态。

我设法将'available'属性与组合框相关联,但在设置数据源(方法setItemDataSource)时,我似乎无法填充此组合框。如何从我的项目中获取可用状态列表和当前状态?

除了BeanItem之外,我总是可以使用变通方法并在方法中添加一个参数来获取源对象,但如果Item属性可以为我提供属性,我宁愿避免这种情况。

此致

编辑:缩短的例子,使用Eric 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...

这不起作用,我确实得到了一个组合框,线条数量正确,但是所有的空洞。

我尝试使用beanContainer而不是IndexedContainer

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

结果稍好一些,因为我在组合框中有可用的值。 只选择了currentValue ...

我还尝试使用nestedbean属性来获取currentstatus的id,但结果仍然无效...我得到一个组合框,选择了正确的值,但我再也看不到其他值了,因为组合框是只读的吗?(即使使用setReadOnly(false);)

2 个答案:

答案 0 :(得分: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"));

希望它有效。

关心Éric

答案 1 :(得分: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;
        }
}