删除值更改侦听器

时间:2015-08-06 05:58:52

标签: vaadin vaadin7

我在价值变化倾听者面临问题。

我在vaadin选项组中添加了值更改侦听器,它有六个复选框。

optionGroup.addValueChangeListener(this :: optionGroupValueChanged);
//..
private void optionGroupValueChanged(ValueChangeEvent valueChangeEvent) {
 //...
}

现在我有另一个复选框,选中选项组的所有复选框(因为它是多选)。我想避免为单个复选框调用值更改侦听器,以便我首先删除值更改侦听器,并在选择all之后添加,如下所述。

selectAllCheckBox.addValueChangeListener(this :: selectAllChecked);
//...
private void selectAllChecked(ValueChangeEvent valueChangeEvent) {
    final boolean isChecked = (boolean) valueChangeEvent.getProperty().getValue();
    //Following line does not remove the value change listener
    optionGroup.removeValueChangeListener(this :: optionGroupValueChanged);
    if(isChecked) {
        //So here it will call value change of option group six time
        optionGroup.getItemIds().stream().forEach( itemId -> optionGroup.select(itemId));
    } else {
        optionGroup.setValue(null);
    }
    optionGroup.addValueChangeListener(this :: optionGroupValueChanged);
}

我检查了包含removeValueChangeListener方法的vaadin markAsDirty();方法的代码。这种行为的原因是什么?我的问题还有其他替代解决方案吗?

注意:vaadin的版本是7.5.0

1 个答案:

答案 0 :(得分:1)

这是因为this :: optionGroupValueChanged每次都会创建ValueChangeListener的新实例。您不希望这样,您想删除ValueChangeListener的非常具体的实例。解决方案是记住(在示例中的私有字段中)对侦听器的引用,并在添加和删除ValueChangeListener调用中传递它。

optionGroupListener = this :: optionGroupValueChanged;
optionGroup.addValueChangeListener(optionGroupListener);

private void selectAllChecked(ValueChangeEvent valueChangeEvent) {
    final boolean isChecked = (boolean) valueChangeEvent.getProperty().getValue();
    //change here
    optionGroup.removeValueChangeListener(optionGroupListener );
    if(isChecked) {
        optionGroup.getItemIds().stream().forEach( itemId -> optionGroup.select(itemId));
    } else {
        optionGroup.setValue(null);
    }
//and here
    optionGroup.addValueChangeListener(optionGroupListener );
}