2014-04-15 2 views
5

Ich versuche, eine ComboBox-Komponente mit BeanFieldGroup in meiner Anwendung erstellen, aber immer noch nicht funktioniert dies. Ich habe versucht, zuerst eine Combobox zu erstellen und diese Combobox in buildAndBind hinzuzufügen, funktioniert aber auch nicht.BeanFieldGroup mit ComboBox?

Ich versuche dies:

/** person's bean */ 
@Entity 
public class Person{ 

@Id 
@GeneratedValue 
private Integer id; 

@NotNull 
@NotEmpty 
@Size(min=5, max=50, message="insert first name") 
private String firstName; 

@NotNull 
@NotEmpty 
@Email private String email; 

//female or male 
private String gender; 

//get and set 
} 

/** app */ 
public class PersonView extends CustomComponent{ 
private final BeanFieldGroup<Person> binder = new BeanFieldGroup<Person>(Person.class); 
private Person bean = new Person(); 

    private ComboBox gender; 

    public PersonView(){ 
     VerticalLayout vLayout = new VerticalLayout(); 
     Field<?> field = null; 
     field = binder.buildAndBind("Gender", "gender", ComboBox.class); 
     gender = (ComboBox)binder.getField("gender"); 
     gender.addItem("Male"); 
     gender.addItem("Female"); 
     vLayout.addComponent(gender); 
    } 
} 

Ausnahme:

/** exception /* 
Caused by: com.vaadin.data.fieldgroup.FieldGroup$BindException: Unable to build a field of type com.vaadin.ui.ComboBox for editing java.lang.String 
    at com.vaadin.data.fieldgroup.FieldGroup.build(FieldGroup.java:1067) 
    at com.vaadin.data.fieldgroup.FieldGroup.buildAndBind(FieldGroup.java:1039) 
    at br.ind.ibg.views.CurriculumView.buildLayout(CurriculumView.java:50) 
    at br.ind.ibg.views.CurriculumView.<init>(CurriculumView.java:32) 
    at br.ind.ibg.views.LoginView.buttonClick(LoginView.java:84) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508) 
    ... 37 more 

Wie ich das tun?

+0

in Ordnung, ich bearbeitet und fügte die Ausnahme in Frage. – FernandoPaiva

Antwort

6

Das ist eine gute Frage! Nach einigen Untersuchungen fand ich die folgende Lösung:

Sie haben Ihre benutzerdefinierte FieldGroupFieldFactory erstellen (warum siehe unten):

binder.setFieldFactory(new DefaultFieldGroupFieldFactory() { 

    @Override 
    public <T extends Field> T createField(Class<?> type, Class<T> fieldType) { 

     if (type.isAssignableFrom(String.class) && fieldType.isAssignableFrom(ComboBox.class)) { 
      return (T) new ComboBox(); 
     } 

     return super.createField(type, fieldType); 
    } 

}); 

Der Grund, warum:

Wenn Sie einen Blick auf die Vaadin Quelle haben Code von DefaultFieldGroupFieldFactory.java Sie werden sehen, dass am Ende eine ComboBox wird nur erstellt, wenn Sie eine Enum als "Eigenschaft Datenquelle" bereitstellen. Sie stellen eine Zeichenfolge bereit, sodass die DefaultFieldGroupFieldFactory eine TextField erstellen möchte. Aber Sie haben eine ComboBox zur Verfügung gestellt. Am Ende wird eine Ausnahme ausgelöst.

Mit Ihrer eigenen Fabrik wird es funktionieren. Vergessen Sie nicht setItemDataSource(bean) und commit() Ihre Mappe, um tatsächlich das Geschlecht in die Bohne zu schreiben.

+0

Ich habe eine Frage. Mit Beziehung jpa, wie erstelle ich die ComboBox mit Werten von Relationen? Beispielbeziehung: ManyToOne ... mit JPAContainer – FernandoPaiva

+0

Die Antwort auf diese Frage finden Sie hier: http://stackoverflow.com/questions/23117547/jpa-relationship-jpacontainer-with-combobox/23121851#23121851 – nexus