Vaadin:如何避免字段之间的级联值更改事件

时间:2015-03-10 15:44:20

标签: events recursion field vaadin onchange

我在屏幕上有几个字段,它们通过验证规则部分依赖于其他字段。
如果用户更改了一个字段,那么我可以使用setValue()影响另一个字段。但我正在解决这个问题,valueChange事件是从setValue()触发的,就像用户活动一样。

我的例子:我有四个字段“activity_status”,“schedule_date”,“start_date”,“end_date”。通过编辑任何一个字段,我想影响另外三个字段(更改状态,设置或更改日期)。如何避免递归调用valueChange方法?

我可以想象一个变量justProcessedField可以作为一个锁,但是有没有更好的动手解决方案?

2 个答案:

答案 0 :(得分:1)

通常我们在触发第一个valueChangeEvent()时设置一个标志,然后忽略所有其他标志,直到第一个触发器完成处理。

伪代码如下所示:

private boolean _ignoreTriggers= false; // Set ignore triggers when we do manual setValue stuff

field1.addListener(new ValueChangeListener()  {
        @Override
        public void valueChange(ValueChangeEvent event) {
            if (!_ignoreTriggers) {
                _ignoreTriggers= true;
                // Do the processing and setValues(...) in the other fields
                _ignoreTriggers= false;
            }
        }
    }
);

使用不同的布尔值,您还可以对其他字段中的更改进行“敏感/不敏感”字段组。

答案 1 :(得分:0)

要避免使用ValueChangeEvents,您可以创建自定义字段,这些字段是您要修改的字段的扩展名。此自定义字段应具有调用setInternalValue方法的公共方法。

Checkbox-Field示例:

public class CheckBoxSilent extends CheckBox {

    /**
     * Set the new value without calling a {@link ValueChangeListener}
     * 
     * @param newValue the new value to be set.
     */
    public void setValueSecretly(boolean newValue) {
        setInternalValue(newValue);
        markAsDirty();
    }
}