Нам необходимо поддерживать высокую точность для определенных чисел (процентных ставок) в приложении, но мы все равно хотели бы показать их округленными до 4 десятичных знаков по умолчанию.
Таким образом, в таблице некоторые ячейки содержат значения в TextField<BigDecimal>
, где пользователь может ввести значение с любой точностью, но в котором отображается значение с 4 десятичными знаками.Это делается с помощью пользовательского конвертера BigDecimal (, как описано в этом ответе ).
У нас также есть простая подсказка (атрибут title), показывающая точное значение (когда я говорю "точный ", есть, конечно, некоторый верхний предел шкалы, в настоящее время 16):
![enter image description here](https://i.stack.imgur.com/TyNmk.png)
Эти поля имеют" onblur "AjaxFormComponentUpdatingBehavior, что приводит к немедленному сохранению измененного значения иОстальная часть таблицы обновлена.
Теперь есть две проблемы:
- Если пользователь щелкает поле, а затем щелкает где-то еще, округленное (4 десятичное) значение обновляется в доменеобъект & сохранялся без пользователя, даже понимая, что она что-то изменила.Т.е. точное значение теряется.
- Несколько хитрее: я бы хотел упростить редактирование точного значения.Т.е., когда текстовое поле щелкается (фокусируется), оно должно измениться, чтобы показать точное значение, чтобы пользователь мог легко редактировать это (а не округленное значение).
КакКак исправить # 1 Я изменил установщик базового DTO, чтобы он фактически не менял значение, если входящее новое значение такое же, но с меньшим масштабом.Но я ищу что-то, что решает # 2 (который также автоматически позаботится о # 1).
final TextField<BigDecimal> field;
BigDecimal interestRate = ...; // current exact value from the model object
field.add(new AjaxFormComponentUpdatingBehavior("onfocus") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
// something I could do here? using e.g.
// field.setModelObject(), field.setConvertedInput()
// or field.getConverter(BigDecimal.class);
}
}
Имея поле, объект домена и точное значение BigDecimal под рукой, как в приведенном выше коде(выполняется при каждом обновлении таблицы), что я могу сделать, чтобы заменить видимое (редактируемое) значение в пользовательском интерфейсе ?
Могу ли я каким-то образом поменять местами преобразователь, когда полевнимание ?Установщика для конвертера не существует, но, возможно, создайте пользовательский подкласс TextField, который позволит вам изменить конвертер на лету ...?
В качестве крайней меры мы могли бы изменить конвертер (увеличить setMaximumFractionDigits), чтобыточные значения всегда будут отображаться (но это не решение этой конкретной проблемы, это просто обход ее стороной).