2017-04-21 38 views
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); 
    } 
} 

结果看起来是这样的:

enter image description here

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

如何处理绑定到Bean的CheckBoxGroup中的预选CheckBoxes的拆分?

在此先感谢。

回答

0

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

} 
+0

谢谢@petey,你的建议是我的问题的解决方案。 –

相关问题