2017-10-21 49 views
0

J'ai un ENUM:Liste de reliure <Enum> à CheckBoxGroup dans Vaadin

public enum Roles { 
    USER,ADMIN; 
} 

Et CheckBoxGroup sur ma forme:

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

instance d'une classe utilisateur binded à cette forme a un champ:

private List<Roles> roles; 

Et ce que je veux faire maintenant est de simplement cocher les cases correctes lors de l'ouverture du formulaire pour un utilisateur spécifique i nstance. I a sans doute faire quelque chose insinde binder.forField mais je ne sais pas vraiment comment:

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

Répondre

3

Le example from the Vaadin docs utilise String par souci de concision, mais vous pouvez facilement utiliser des objets. Supposons que vous ayez un Role ENUM et User comme ci-dessous:

// 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 + '\'' + 
       '}'; 
    } 
} 

... vous pouvez créer votre formulaire semblable à:

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

Résultat:

vaadin chekbox group binding


Bonus: Par défaut, Vaadin utilisera le nom enum pour afficher les valeurs. Si vous voulez quelque chose de différent, comme en capitalisant la première lettre que vous pouvez utiliser un ItemCaptionGenerator:

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