用于在字段中输入值的Eclipse Scout回调

时间:2015-01-23 07:34:12

标签: infinite-loop eclipse-scout

我想知道当用户在字段中设置值时是否有一个函数触发,但是如果字段中的程序设置值则没有。

所以功能:

user click on field 'myField and change value -> method fires up
in program : myField.setValue = SomeValue; -> method doesn't fires up.

问题在于循环检测。如果您的逻辑是您有4个字段并尝试检测是否有任何这些字段被更改,然后使用fire方法更改这些字段中的某些值:

@Override
protected void execChangedValue() throws ProcessingException {
  super.execChangedValue();
  valueFieldsChange(this);
}

protected void valueInPriceBoxFieldsChange(AbstractValueField field) {
    ... calculate some values in those fields....
}

我得到了:

!MESSAGE org.eclipse.scout.rt.client.ui.form.fields.AbstractValueField.setValue(AbstractValueField.java:338) Loop detection in...

所以我知道方法execChangedValue()不是我想要的。有解释行为的类似方法吗?

Marko

1 个答案:

答案 0 :(得分:1)

让我们开始说环路检测在90%的情况下都很有用。 当你在execChangedValue()中并且你试图更新同一个字段的值时会显示警告。

如果我理解你的例子,你就在你的领域内:

public class FirstField extends AbstractStringField {

  @Override
  protected void execChangedValue() throws ProcessingException {
    calculateNewValues();
  }
}

方法:

public void calculateNewValues() {
  //some logic to compute the new values: value1, value2, value3

  getFirstField().setValue(value1);
  getSecondField().setValue(value2);
  getThirdField().setValue(value3);
}

此时,您确实需要确保当用户将FirstField中的值设置为某个内容时,您可能希望将其实际更改为其他内容。这可能会让用户感到困惑。


如果您确定需要更新该值,则可以设置值而不在字段上触发execChangedValue()。我在Eclipse Scout表单上提出了一个新方法:setValueWithoutChangedValueTrigger(T value):Controlling if execChangedValue() is called or not

在论坛上,您会找到一个可以添加到字段中的代码段(或通用模板:AbstractMyAppStringField)。

public class FirstField extends AbstractStringField {

  @Override
  protected void execChangedValue() throws ProcessingException {
    calculateNewValues();
  }

  public void setValueWithoutValueChangeTrigger(String value) {
    try {
      setValueChangeTriggerEnabled(false);
      setValue(value);
    }
    finally {
      setValueChangeTriggerEnabled(true);
    }
  }
}

你将能够使用它:

public void calculateNewValues() {
  //some logic to compute the new values: value1, value2, value3

  getFirstField().setValueWithoutChangedValueTrigger(value1);
  getSecondField().setValueWithoutChangedValueTrigger(value2);
  getThirdField().setValueWithoutChangedValueTrigger(value3);
}

我希望这会有所帮助。