Вложенные объекты (и FormFieldFactory) в Vaadin - PullRequest
2 голосов
/ 07 февраля 2011

У меня есть установка, в которой я не хочу использовать FormFieldFactory, которая возвращает форму, которая также имеет форму с FormFieldFactory.

Моими объектами являются подписка, в которой есть имя и коллекция цен.Цена имеет страну и цену.У меня есть форма для представления подписки, и прикрепленная к ней FormFieldFactory возвращает TextField для имени и другую форму для сущностей цены.Форма сущности Price возвращает таблицу, в которой каждая цена должна быть показана как элемент.

Моя проблема в том, что я не могу заставить это работать.Результатом является просто страница с подпиской и больше ничего.Вызываются обе FormFieldFactories, и в последнем возвращается таблица, поэтому ожидаемые вызовы сделаны.

Одна вещь, которая меня озадачивает, заключается в том, что PriceFormFieldFactory.createField () вызывается дважды, сначала со свойством «цена»который содержит мою коллекцию, а второй со свойством «empty», который содержит значение «false».Я ожидаю, что это будет только один звонок, так как у меня есть только одна подписка с одной коллекцией.

Может ли кто-нибудь просветить меня об этом?

Томас

Код:

import com.vaadin.data.Item;
import com.vaadin.data.util.BeanItem;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.*;

import java.util.ArrayList;
import java.util.Collection;

public class SubscriptionComponent extends CustomComponent {
    private HorizontalLayout mainLayout;

    public SubscriptionComponent() {
        buildMainLayout();
    }

    private void buildMainLayout() {
        mainLayout = new HorizontalLayout();
        mainLayout.setSizeFull();
        mainLayout.setSpacing(true);

        Subscription subscription = createSubscription();

        mainLayout.addComponent(new SubscriptionForm(subscription));
        setCompositionRoot(mainLayout);
    }

    private Subscription createSubscription() {
        Collection<Price> prices = new ArrayList<Price>();
        prices.add(new Price("Elbonia", 1));
        prices.add(new Price("El Honduragua", 2));
        return new Subscription("First subscription", prices);
    }

    public class Subscription {
        private String name;
        private Collection<Price> prices;

        public Subscription(String name, Collection<Price> prices) {
            this.name = name;
            this.prices = prices;
        }

        public String getName() {
            return name;
        }

        public Collection<Price> getPrices() {
            return prices;
        }
    }

    public class SubscriptionForm extends Form {

        public SubscriptionForm(Subscription subscription) {
            setFormFieldFactory(new SubscriptionFormFieldFactory());
            setItemDataSource(new BeanItem<Subscription>(subscription));
        }
    }

    public class SubscriptionFormFieldFactory implements FormFieldFactory {
        @Override
        public Field createField(Item item, Object propertyId, Component uiContext) {
            String pid = (String) propertyId;
            if (pid.equals("name")) {
                return new TextField();
            } else if (pid.equals("prices")) {
                Collection<Price> prices = (Collection<Price>) item.getItemProperty("prices").getValue();
                return new PriceForm(prices);
            }

            return null;
        }
    }

    public class PriceForm extends Form {
        public PriceForm(Collection<Price> prices) {
            setFormFieldFactory(new PriceFormFieldFactory());
            setItemDataSource(new BeanItem<PriceFormItem>(new PriceFormItem(prices)));
        }
    }

    public class PriceFormFieldFactory implements FormFieldFactory {
        @Override
        public Field createField(Item item, Object propertyId, Component uiContext) {
            String pid = (String) propertyId;
            if (pid.equals("prices")) {
                return new PriceTable(new PriceContainer((Collection<Price>) item.getItemProperty("prices").getValue()));
            }
            return null;
        }
    }

    public class PriceFormItem {
        private Collection<Price> prices;

        public PriceFormItem(Collection<Price> prices) {
            this.prices = prices;
        }

        public Collection<Price> getPrices() {
            return prices;
        }
    }

    public enum PriceColumns {
        name("Name"), price("Price");

        private String value;

        PriceColumns(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    public class PriceContainer extends BeanItemContainer<Price> {
        public PriceContainer(Collection<Price> prices) {
            super(Price.class);
            for (Price price : prices) {
                addItem(price);
            }
        }
    }

    public class Price {
        private String country;
        private double price;

        public Price(String name, double price) {
            this.country = name;
            this.price = price;
        }

        public String getCountry() {
            return country;
        }

        public double getPrice() {
            return price;
        }
    }

    public class PriceTable extends Table {
        public PriceTable(PriceContainer countryRatesContainer) {
            setContainerDataSource(countryRatesContainer);

            setColumnCollapsingAllowed(true);
            setColumnReorderingAllowed(true);

            setColumnExpandRatio(PriceColumns.name.name(), .7f);
            setColumnAlignment(PriceColumns.price.name(), ALIGN_CENTER);
        }
    }
}

Это сообщение было добавлено: http://vaadin.com/forum/-/message_boards/message/302906

1 Ответ

1 голос
/ 23 февраля 2011

Я нашел ответ на свою проблему - не то, что мне это нравится, но, по крайней мере, теперь я могу сосредоточиться на поиске другого решения. Похоже, что другие пытались сделать то, что я хочу сделать, и обнаружили, что на данный момент Ваадин не делает этого:

Вложенные формы: вложенная форма не видна

Так что сейчас я поменяю план макета и найду другой способ сделать то, что я хочу.

Thomas

...