2017-10-21 1 views
0

Ich habe eine Enum:Binding Liste <Enum> zu CheckBoxGroup in Vaadin

public enum Roles { 
    USER,ADMIN; 
} 

Und einen CheckBoxGroup auf meiner Form:

private CheckBoxGroup<String> rolesCheckbox = new CheckBoxGroup<>("User roles"); 

Instanz eines dieser Form binded User-Klasse hat ein Feld:

private List<Roles> roles; 

Und was ich jetzt tun möchte, ist nur die richtigen Kontrollkästchen beim Öffnen des Formulars für einen bestimmten Benutzer zu überprüfen nstance. Ich muss wohl etwas insinde binder.forField tun, aber ich weiß wirklich nicht, wie:

binder.forField(rolesCheckbox).bind(... 

Antwort

3

Die example from the Vaadin docs verwendet String der Kürze halber, aber Sie können leicht Objekte verwenden. Angenommen, Sie haben einen Role Enum und eine User wie unten:

// possible roles 
public enum Role { 
    ADMIN, USER, GUEST 
} 

// bean for binding 
public class User { 
    private Set<Role> roles; 
    private String name; 

    public User(String name, Set<Role> roles) { 
     this.roles = roles; 
     this.name = name; 
    } 

    public Set<Role> getRoles() { 
     return roles; 
    } 

    public void setRoles(Set<Role> roles) { 
     this.roles = roles; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "User{" + 
       "roles=" + roles + 
       ", name='" + name + '\'' + 
       '}'; 
    } 
} 

... Sie Ihr Formular auf ähnliche schaffen könnte:

public class CheckboxEnumBinding extends VerticalLayout { 

    public CheckboxEnumBinding() { 
     // form components 
     TextField nameTextField = new TextField("Name"); 
     CheckBoxGroup<Role> roleCheckBoxGroup = new CheckBoxGroup<>("Roles", DataProvider.ofItems(Role.values())); 

     // binder setup 
     Binder<User> userBinder = new Binder<>(); 

     // name binding 
     userBinder.forField(nameTextField) 
       .asRequired("Please provide a user name") 
       .bind(User::getName, User::setName); 

     // role binding 
     userBinder.forField(roleCheckBoxGroup) 
       .asRequired("Please select at least one role") 
       .bind(User::getRoles, User::setRoles); 

     // bind to bean 
     userBinder.setBean(new User("Morfic", EnumSet.of(Role.ADMIN, Role.GUEST))); 

     // simulate a save action 
     Button saveButton = new Button("Save", event -> Notification.show("Saved new user info: " + userBinder.getBean())); 

     // add fields to the UI 
     addComponents(nameTextField, roleCheckBoxGroup, saveButton); 
    } 
} 

Ergebnis:

vaadin chekbox group binding


Bonus: Standardmäßig verwendet Vaadin den enum-Namen, um die Werte anzuzeigen.

// spring boot app, don't reinvent the wheel 
import org.springframework.util.StringUtils; 
... 
roleCheckBoxGroup.setItemCaptionGenerator(role -> StringUtils.capitalize(role.name().toLowerCase())); 

Vaadin item caption generator

: Wenn Sie etwas anderes wollen, wie es nur den ersten Buchstaben kapitalisieren können Sie eine ItemCaptionGenerator verwenden
Verwandte Themen