当前位置: 首页 > 知识库问答 >
问题:

Vaadin 8:绑定复选框组选择侦听器在取消选择时未触发

穆丁雨
2023-03-14

我正在努力检测绑定到 Bean 的 CheckBoxGroup 中项目的取消选择。下面是一个简化的示例

我有一个班级人:

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”的对象可以有许多标签。类 Tag 如下所示:

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

结果如下所示:

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

如何处理绑定到 Bean 的复选框组中预选复选框的取消?

提前谢谢。

共有1个答案

薄伟彦
2023-03-14

Tag 类中的 equals 方法看起来不正常。您也可以从哈希代码中受益。

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

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

}
 类似资料:
  • 我的JavaFx FXML应用程序有问题。 当我在表单上选中复选框时,我想根据单击的复选框执行一个方法。是否有任何方法可以将复选框的名称传递给该方法,以便对其执行一些有条件的工作? 我有两个复选框,只能选择一个。当我单击其中一个时,应取消选择另一个,反之亦然。显然,下面的代码将无法工作,因此我希望传递被单击对象的名称。 任何帮助都将不胜感激,非常感谢。

  • 问题内容: 每当尝试从中进行选择时,我都试图触发一个事件。 我遇到的问题是没有明显的方法。 我尝试使用,但从未触发。 没有覆盖的模型,我没有想法。 如何通知有关 选择更改的通知? 编辑:我要道歉。事实证明,我使用的是行为不佳的子类,但由于你的回答是好的,因此我将保留该问题。 问题答案: 它应该响应,如下所示: 正确地指出了也可以。但是,你可能会得到 ,一个用于取消选择先前选择的项目,另一个用于选择

  • 如问题所述,当选中标题中的“全选”复选框时,我已经可以选中gridview行中的复选框,当取消选中标题中的“全选”复选框时,取消选中gridview行中的复选框。我想做的是,当没有选中行中的所有复选框时,则不选中标题中的“全选”复选框,反之亦然(当选中行中的所有复选框时,则选中标题中的“全选”复选框)。 我该怎么做? 我已经做了我想要实现的,但是标题中的复选框开始影响(选中或取消选中),即使我只选

  • 除了使用之外,是否有其他方法可以侦听已选择的单元格(即使是带有)的单元格)? 我有一个带有行和列侦听器的JTable。当选择已经选择的单元格时,两个侦听器都不会触发: 我的目标是打开/关闭电池。它是有效的,除了监听器在选择一个已经选择的单元格时不会触发之外,这是通过上面的SSCCE表示的。 似乎没有任何监听器可以连接到(或者它的模型/选择模型)来处理这个问题,除非我使用并手动管理Cooridate

  • 问题内容: 目前,我正在使用此: 它将我重定向到选项值内的位置。但这不能按预期工作。..这意味着如果我单击select的第一个选项,则onChange操作不会运行。我正在考虑使用javascript,但我想您会收到一些更好的建议。因此,如果我单击每个选项将其重定向到它的值,该如何使其起作用? 问题答案: 因为已经选择了第一个选项,所以永远不会触发change事件。添加一个空值作为第一个值,并检查位

  • 我有一个片段,其中有一个旋转器和复选框。 布局文件need_help_fragment_layout.xml: 代码片段: 颜色代码: 如果未选择任何内容,则可以: 从微调器中选择项目时,复选框将消失: 布局文件中没有其他内容。只有约束布局以及复选框和微调器的指南。微调器和复选框在片段的onCreateView中初始化。当我从微调器中选择任何项目时,复选框将消失。请帮助。

  • 我有一个带有方法的model类,它用@preupdate进行了注释。此方法调用我的方法: 我的实现:

  • 问题内容: 大约一个月前,米特的问题没有得到解答。可悲的是,我现在遇到了同样的情况。 情况如下:我正在使用jQuery捕获单选按钮中的更改。选择单选按钮后,我将启用一个编辑框。当取消选择单选按钮时,我希望禁用编辑框。 使能的作品。当我在组中选择其他单选按钮时, 不会 触发该事件。有谁知道如何解决这一问题? __ 问题答案: 看起来该函数仅在您选中单选按钮时才调用,而不是在取消选中它时才调用。我使用