2017-04-21 4 views
1

Ich versuche, die Abwahl von Elementen in einer CheckBoxGroup zu erkennen, die an eine Bean gebunden ist. Hier ist ein vereinfachtes Beispiel:Vaadin 8: Binded CheckBoxGroup SelectionListener bei Abwahl nicht ausgelöst

Ich habe eine Klasse Person:

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

Ein Objekt der Klasse "Person" kann viele haben Stichworte. Die Klasse-Tag sieht wie folgt aus:

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

ich eine einfache Benutzeroberfläche mit einem TextField- erstellt, ein CheckBoxGroup und ein Binder:

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

Das Ergebnis sieht wie folgt aus:

enter image description here

Wenn ich die CheckBox "Test" anwähle und/oder deaktiviere, wird der SelectionListener der CheckBoxGroup ausgelöst und ich kann mit der geänderten Auswahl umgehen. Wenn ich jedoch einen der CheckBoxen "Bar" oder "Foo" abwählen und/oder (neu) wähle, wird der SelectionListener nicht ausgelöst.

Wie kann ich mit der Auswahl vorgewählter CheckBoxen in einer CheckBoxGroup umgehen, die an eine Bean gebunden ist?

Vielen Dank im Voraus.

Antwort

0

Die equals Methode in Ihrer Tag Klasse sieht aus. Sie könnten auch von einer profitieren.

Nach diesen Änderungen werden Ihre Auswahl Hörer richtig Feuer:

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

Danke @petey, Ihr Vorschlag die Lösung für mein Problem. –

Verwandte Themen