2012-01-12 58 views
0

我有一顆豆,看起來像這樣Vaadin如何處理JavaBeans的非原始屬性

Class Person{ 
private String name; 
private int age 
private Properties attributes 
public String getName() { return name; } 
public int getAge() { return age; } 
public Properties getAttributes() { return attributes; } 
public void setName(String name) { this.name=name; } 
public void setAge(int age) { this.age=age; } 
public void setAttributes (Properties attributes) { this.attributes = attributes; } 
} 

嘗試使用Vaadin形式,讓豆的編輯,我給你這個Bean使用

形式
form.setItemDataSource(new BeanItem<Person>(person)); 

的形式顯示與屬性表示正確的「{eye.colour =綠色,hair.colour =棕色}」 但是,試圖提交任何修改的情況下,一個轉換誤差爲問候拋向屬性。 < Init>沒有字符串構造函數

Vaadin Forms如何處理具有非原始類型屬性的Beans?

+0

你有什麼期望?應該如何處理非原始類型? – 2012-01-12 16:37:47

+0

我希望能夠爲非基元類型添加轉換處理程序,所以我可以返回基元類型。在java.utils.Properties的情況下,我希望返回一個String並接受一個返回的字符串(通過轉換)來創建Properties。 – Ben 2012-01-17 16:56:44

回答

2

您必須通過擴展DefaultFieldFactory來爲表單創建一個自定義fieldfactory。

請參閱https://vaadin.com/book/-/page/components.form.html(如何做到這一點的一半通過網頁)。這將允許您覆蓋生成表單字段的默認方式。然而,這並沒有提供一種簡單的方式來處理自定義字段和轉換,就像你想要的。

幸運的是,雖然我使用了一個很好的擴展,可以輕鬆創建名爲自定義字段插件的自定義字段和屬性轉換。

https://vaadin.com/directory#addon/customfield

有了這個組件,您可以輕鬆地擴展現有油田和添加自定義的轉換。

由於沒有太多關於如何做到這一點的例子,下面是一個自定義字段的自定義FieldFactory的各個部分如何協同工作的示例。

公共類CustomFieldFactory擴展DefaultFieldFactory {

public DefaultProfileTableFieldFactory() { 
} 

@Override 
public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) { 

    if (propertyId.equals(YOURCUSTOMPROP)) { 
     Select select = new Select(); 
     select.addItem(ITEM1); 
     select.addItem(ITEM2); 
     select.addItem(ITEM3); 

     return new SelectCustomField(select, String.class); 
    } else { 
     return super.createField(container, itemId, propertyId, uiContext); 
    } 
} 


private static class SelectCustomField extends FieldWrapper<String> { 

    protected SelectCustomField(Field wrappedField, Class<? extends String> propertyType) { 
     super(wrappedField, propertyType); 
     VerticalLayout l = new VerticalLayout(); 
     l.addComponent(wrappedField); 
     setCompositionRoot(l); 
     l.setSizeUndefined(); 
     this.setSizeUndefined(); 
     wrappedField.setSizeUndefined(); 
    } 

    @Override 
    protected String parse(Object value) throws ConversionException { 
     // parse value from select to your model 
    } 

    @Override 
    protected Object format(String value) { 
     // format model from your model to value to be shown   
    } 

} 

}

+0

非常感謝!一個小小的tweeking與佈局,但它的作品不少! – Ben 2012-01-24 17:20:02