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

Eclipse Scout callback for entering value in fields

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

所以函数:

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

环路检测有问题。如果您的逻辑是您有 4 个字段并尝试检测这些字段中的任何一个是否已更改,然后触发方法以更改这些字段中的某些值:

@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() 不是我要找的。是否有类似的方法来解释行为?

马尔科

让我们开始说环路检测在 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 Form 上提出了一种新方法: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);
}

希望对您有所帮助。