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

Vaadin: how to avoid cascade valuechange events between fields

我在一个屏幕上有几个字段,它们通过验证规则部分地相互依赖。
如果用户更改了一个字段,那么我可以使用 setValue() 影响另一个字段。但是我正在解决这个问题,就像从用户 activity.

一样,从 setValue() 触发了 valueChange 事件 我的示例:我有四个字段 "activity_status"、"schedule_date"、"start_date"、"end_date"。通过编辑任何一个字段,我想影响另外三个字段(更改状态、设置或移动日期)。如何避免递归调用valueChange方法?

我可以想象一个可以用作锁的变量 justProcessedField,但是有没有人有更好的实践解决方案?

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

复选框字段示例:

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

通常我们会在触发第一个 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;
            }
        }
    }
);

使用不同的布尔值,您还可以将字段分组 "sensisble/insensible" 以更改其他字段。