2014-04-15 14 views
5

Próbuję utworzyć składnik ComboBox przy użyciu BeanFieldGroup w mojej aplikacji, ale nadal nie może to zrobić. Próbowałem najpierw utworzyć combobox i po dodaniu tego combobox w buildAndBind, ale też nie działa.BeanFieldGroup z ComboBox?

Próbuję to:

/** 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); 
    } 
} 

Wyjątek:

/** 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 

Jak to zrobić?

+0

W porządku, zredagowałem i dodałem wyjątek. – FernandoPaiva

Odpowiedz

6

To dobre pytanie! Po jakimś dochodzeniu Znalazłem następujące rozwiązanie:

Trzeba stworzyć swój własny FieldGroupFieldFactory (dlaczego patrz poniżej):

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); 
    } 

}); 

Powodem:

Jeśli spojrzeć na źródła Vaadin kod DefaultFieldGroupFieldFactory.java zobaczysz, że na końcu zostanie utworzone tylko ComboBox, jeśli podasz Enum jako "źródło danych właściwości". Podajesz ciąg, aby DefaultFieldGroupFieldFactory chciał utworzyć TextField. Ale podałeś ComboBox. Na końcu pojawia się wyjątek.

Z własną fabryką będzie działać. Nie zapomnij o setItemDataSource(bean) i commit() twoim segregatorze, aby faktycznie wpisać płeć do fasoli.

+0

Mam pytanie. Z relacją jpa, jak utworzyć ComboBox z wartościami relacji? Przykładowa relacja: ManyToOne ... Using JPAContainer – FernandoPaiva

+0

Odpowiedź na to pytanie można znaleźć tutaj: http://stackoverflow.com/questions/23117547/jpa-relationship-jpacontainer-with-combobox/23121851#23121851 – nexus