我正在努力检测绑定到 bean 的 CheckBoxGroup 中项目的取消选择。这是一个简化的示例:
我有一个班级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;
}
}
“Person”类的一个对象可以有很多标签。类标签如下所示:
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);
}
}
我用 TextField、CheckBoxGroup 和 Binder 创建了一个简单的 UI:
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);
}
}
结果如下所示:
当我选择和/或取消选择 CheckBox“测试”时,CheckBoxGroup 的 SelectionListener 被触发,我可以处理更改的选择。但是,如果我取消选择和/或(重新)选择复选框“Bar”或“Foo”之一,则不会触发 SelectionListener。
如何处理绑定到 Bean 的 CheckBoxGroup 中预选复选框的取消选择?
提前致谢。