用于在字段中输入值的 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);
}
希望对您有所帮助。
我想知道当用户在字段中设置值时是否会触发一个函数,但如果程序在字段中设置值则不会。
所以函数:
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);
}
希望对您有所帮助。