Вложенный бин: коллекция внутри объекта - PullRequest
1 голос
/ 16 марта 2012

У меня есть простой класс POJO, который я хочу отобразить / обновить в форме
Используя класс BeanItem и привязку данных компонента, я смог быстро отобразить первые атрибуты класса данных «май». Однако я ударил стену для атрибутов, связанных с буксировкой:

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

Я хотел бы отобразить список в форме в виде выпадающего списка с выбранным текущим статусом.

Мне удалось связать атрибут 'available' с комбинированным списком, но я не могу заполнить этот комбинированный список при настройке источника данных (метод setItemDataSource). Как я могу получить список доступных статусов и текущий статус из моего Предмета?

Я всегда мог бы использовать обходной путь и добавить параметр к методу, чтобы получить исходный объект в дополнение к BeanItem, но я бы предпочел этого избежать, если свойства Item могут дать мне мой атрибут.

Привет

Редактировать: сокращенный пример с кодом Эрика Р.

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

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

в расширении формы, в createField поляfactory я добавил следующие строки

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");

результат немного лучше, так как у меня есть доступные значения в выпадающем списке. только текущее значение не выбрано ...

Я также пытался использовать свойство nestedbean для получения идентификатора currenttstatus, но результат все еще недействителен ... я получаю комбинированный список с выбранным правильным значением, но я больше не могу видеть другие значения, так как поле со списком доступно только для чтения? (даже с setReadOnly (false);)

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Я предлагаю свой способ решить эту проблему. Я не думаю, что это самый хороший способ, но он работает.

Класс 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 голосов
/ 16 марта 2012

На демонстрационном сайте vaadin вы можете получить этот образец, который показывает, как заполнить комбинированный список странами.Вы могли бы сделать то же самое, я бы предположил (не уверен, что понимаю вашу проблему на 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;
        }
}
...