我有一個安裝程序,我不想使用FormFieldFactory返回也有FormField的Form的Form。在Vaadin嵌套對象(和FormFieldFactory)
我的實體是具有名稱和價格集合的訂閱。價格有一個國家和一個價格。 我有一個窗體來呈現訂閱,並且附加的FormFieldFactory返回名稱的TextField,以及價格實體的另一個窗體。 價格實體窗體返回一個表格,其中每個價格應顯示爲一個項目。
我的問題是,我無法得到這個工作。結果只是使用Subscription的一個頁面,沒有別的。這兩個FormFieldFactories都被調用,並且最後返回一個Table,所以預期的調用被做出。
讓我困惑的一件事是,PriceFormFieldFactory.createField()被調用兩次,第一次使用包含我的集合的屬性「prices」,第二次使用包含值「false」的屬性「empty」。我希望這只是一個電話,因爲我只有一個訂閱與一個集合。
難道有人能夠啓發我嗎?
托馬斯
代碼:
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