2011-02-07 47 views
2

我有一個安裝程序,我不想使用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

回答

1

我已經找到了答案,我的問題 - 不,我喜歡它,但至少現在我可以專注於尋找另一種解決方案。 看來,其他人試圖做我想要完成的任務,結果發現,在目前Vaadin沒有做到這一點:

Nested forms: nested form is not visible

所以現在我會改變計劃,佈局和另謀出路做我想做的事。

Thomas