gpt4 book ai didi

java - JFace 数据绑定(bind) MultiValidator 不重新评估

转载 作者:太空宇宙 更新时间:2023-11-04 09:27:44 25 4
gpt4 key购买 nike

我设置了一个 MultiValidator 来检查 2 个文本字段的总和是否等于另一个字段的值。然而,由于某种原因, validator 仅在初始化时验证一次。初始化后,它总是会成功。失败条件仅在向导中的稍后时间点触发(条件在第一个向导页面上失败,而 validator 在第三个页面上失败)。

以下是数据绑定(bind)本身以及MultiValidator 的代码。 dbFactory 是一个方便的类,用于自行设置绑定(bind),并且该部分工作得很好。

fixedFeeAmountBinding = dbFactory.addBinding(fixedFeeAmountTxt, "fixedAmount", null,
new UpdateValueStrategy().setConverter(NumberToStringConverter
.fromBigDecimal(new com.ibm.icu.text.DecimalFormat(Formats.AMOUNT_FORMAT))));
variableFeeAmountBinding = dbFactory.addBinding(variableFeeAmountTxt, "variableAmount", null,
new UpdateValueStrategy().setConverter(NumberToStringConverter
.fromBigDecimal(new com.ibm.icu.text.DecimalFormat(Formats.AMOUNT_FORMAT))));

MultiValidator feeAmountValidaotr = new MultiValidator() {

@Override
protected IStatus validate() {
if (model.getVal().getClientChequePaymentRecordType().equals(ClientChequePaymentRecordType.INVOICE)
&& model.getVal().getInvoiceType() != null
&& !model.getVal().getInvoiceType().equals(InvoiceType.OTHER)) {
BigDecimal fixedAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) fixedFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal variableAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) variableFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
if (fixedAmountValue.add(variableAmountValue).compareTo(model.getVal().getInvoiceAmount()) == 0) {
return ValidationStatus.OK_STATUS;
}
return ValidationStatus.error("Fee Amounts don't add up to Invoice Amount");
}
return ValidationStatus.OK_STATUS; // <-- Doesn't update after returning this
}
};

dbFactory.addValidationStatusProvider(feeAmountValidaotr);

我也曾经从我的其他 question 那里得到小费。 ,但这一次并没有解决我的问题。

让我更难理解这个问题的原因是,完全相同的代码在我的代码中的另一个地方运行得很好。

为什么绑定(bind)更新时 MultiValidator 没有更新?以及如何修复它?

<小时/>

如果您需要更多信息,请随时询问。

编辑:

经过更多测试,我发现 ValidationStatusProvider 状态似乎没有随着 validate() 的新结果更新。另外,我刚刚发现此代码在其他地方无法正常工作,尽管影响并不那么大,因为用户无法更改值来使第一个 IF 失败/成功。

基本上, validator 的问题在于,它在所有 IF 之外返回 ValidationStatus.OK_STATUS 后不会立即更新。

最佳答案

看来我找到了问题的解决方案...我用金额字段的绑定(bind)值替换了 model.getVal().getInvoiceAmount() 调用,然后将 BigDecimals 的创建移到了 IF 之前。整个代码现在看起来像这样:

MultiValidator feeAmountValidaotr = new MultiValidator() {

@Override
protected IStatus validate() {
// Only validate Fee Amounts if cheque can have fees
BigDecimal fixedAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) fixedFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal variableAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) variableFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal totalAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) amountBinding.getTarget()).getValue()).replaceAll(",", ""));
if (getModelObject().getClientChequePaymentRecordType().equals(ClientChequePaymentRecordType.INVOICE)
&& getModelObject().getInvoiceType() != null
&& !getModelObject().getInvoiceType().equals(InvoiceType.OTHER)) {
if (fixedAmountValue.add(variableAmountValue).compareTo(totalAmountValue) == 0) {
return ValidationStatus.OK_STATUS;
}
return ValidationStatus.error("Fee Amounts don't add up to Invoice Amount");
}
return ValidationStatus.OK_STATUS;
}
};

dbf.addValidationStatusProvider(feeAmountValidaotr);

关于java - JFace 数据绑定(bind) MultiValidator 不重新评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57473650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com