1
我很努力地检测绑定到bean的CheckBoxGroup中的项目取消选择。下面是一个简单的例子:Vaadin 8:绑定的CheckBoxGroup SelectionListener在取消选择时未触发
我有一个类人:
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;
}
}
类“人”的目的可以有很多标签。 class标签看起来是这样的:
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);
}
}
我创建了一个简单的用户界面有一个文本字段,一个CheckBoxGroup和粘合剂:
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“Test”时,CheckBoxGroup的SelectionListener被触发,我可以处理更改后的选择。但是,如果我取消选择和/或(重新)选中CheckBoxes“Bar”或“Foo”之一,SelectionListener不会被触发。
如何处理绑定到Bean的CheckBoxGroup中的预选CheckBoxes的拆分?
在此先感谢。
谢谢@petey,你的建议是我的问题的解决方案。 –