Ich versuche, die Abwahl von Elementen in einer CheckBoxGroup zu erkennen, die an eine Bean gebunden ist. Hier ist ein vereinfachtes Beispiel:Vaadin 8: Binded CheckBoxGroup SelectionListener bei Abwahl nicht ausgelöst
Ich habe eine Klasse Person:
package com.vaadin.test;
import java.util.Date;
import java.util.Set;
public class Person {
private String name;
private Set<Tag> tags;
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Set<Tag> getTags() {
return tags;
}
public void setTags(Set<Tag> tags) {
this.tags = tags;
}
}
Ein Objekt der Klasse "Person" kann viele haben Stichworte. Die Klasse-Tag sieht wie folgt aus:
package com.vaadin.test;
public class Tag {
private String name;
public Tag(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(Tag.class)) {
return ((Tag) obj).getName().equals(this.getName());
}
return super.equals(obj);
}
}
ich eine einfache Benutzeroberfläche mit einem TextField- erstellt, ein CheckBoxGroup und ein Binder:
import com.vaadin.ui.CheckBoxGroup;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@Theme("valo")
public class TestUI
extends UI {
private static final long serialVersionUID = 1L;
@Override
protected void init(VaadinRequest request) {
Person person = new Person("Marcus");
person.setTags(new HashSet<Tag>() {{ add(new Tag("Foo")); add(new Tag("Bar")); }});
Binder<Person> binder = new Binder<>(Person.class);
TextField name = new TextField();
binder.bind(name, Person::getName, Person::setName);
CheckBoxGroup<Tag> tags = new CheckBoxGroup<>();
tags.setItems(new HashSet<Tag>() {{ add(new Tag("Foo")); add(new Tag("Bar")); add(new Tag("Test")); }});
tags.addSelectionListener(e -> {
Set<Tag> selectedTags = e.getAllSelectedItems();
Set<Tag> addedTags = e.getAddedSelection();
Set<Tag> newTags = e.getNewSelection();
Set<Tag> oldTags = e.getOldSelection();
Set<Tag> removedTags = e.getRemovedSelection();
});
binder.bind(tags, Person::getTags, Person::setTags);
this.setContent(new VerticalLayout(new Label("Hello Vaadin!"), name, tags));
binder.setBean(person);
}
}
Das Ergebnis sieht wie folgt aus:
Wenn ich die CheckBox "Test" anwähle und/oder deaktiviere, wird der SelectionListener der CheckBoxGroup ausgelöst und ich kann mit der geänderten Auswahl umgehen. Wenn ich jedoch einen der CheckBoxen "Bar" oder "Foo" abwählen und/oder (neu) wähle, wird der SelectionListener nicht ausgelöst.
Wie kann ich mit der Auswahl vorgewählter CheckBoxen in einer CheckBoxGroup umgehen, die an eine Bean gebunden ist?
Vielen Dank im Voraus.
Danke @petey, Ihr Vorschlag die Lösung für mein Problem. –