У меня есть установка, в которой я не хочу использовать 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