2017-04-21 68 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,你的建議是我的問題的解決方案。 –

相關問題