gpt4 book ai didi

java - 瓦丁 8 : Binded CheckBoxGroup SelectionListener not fired on deselection

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:26 24 4
gpt4 key购买 nike

我正在努力检测绑定(bind)到 bean 的 CheckBoxGroup 中项目的取消选择。这是一个简化的示例:

我有一个类(class):

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

结果如下所示:

enter image description here

当我选择和/或取消选择复选框“测试”时,CheckBoxGroup 的 SelectionListener 会被触发,我可以处理更改后的选择。但是,如果我取消选择和/或(重新)选择复选框“Bar”或“Foo”之一,则不会触发 SelectionListener。

如何处理绑定(bind)到 Bean 的 CheckBoxGroup 中预选 CheckBox 的取消选择?

提前致谢。

最佳答案

Tag 类中的 equals 方法看起来不对。您也可以从 hashCode 中受益。

完成这些编辑后,您的选择监听器将正确触发:

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 o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Tag tag = (Tag) o;

return name.equals(tag.name);
}

@Override
public int hashCode() {
return name.hashCode();
}

}

关于java - 瓦丁 8 : Binded CheckBoxGroup SelectionListener not fired on deselection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com