Я пытаюсь создать виджет, который будет отображать его связанное значение в формате, который не совпадает с собственным значением. Например, если значение (в базе данных) «abcde», я хочу показать «ab.cd.e» на экране, и если пользователь набирает «abcde», я также хочу показать «ab.cd.e ». Если пользователь набирает «ab.cd.e», тогда я хочу сохранить только «abcde» в базе данных. Я делаю это в GWT editor framework
. Я попытался использовать совет из этого ответа: Converting String to BigDecimal in GWT, но я не могу заставить его работать. Вот что у меня есть в файле UiBinder:Пользовательский рендеринг в GWT
<g:TextBox ui:field='myTextBox' width='300px'/>
И в ассоциированном Java блока:
@UiField
TextBox myTextBox;
...
initWidget(binder.createAndBindUi(this));
new MyValueBox(myTextBox);
А вот определение MyValueBox виджета:
public class MyValueBox extends ValueBox<String> {
//=========================================================================
public static class MyRenderer extends AbstractRenderer<String> {
private static MyRenderer _instance;
private static MyRenderer instance() {
if (_instance == null) {
_instance = new MyRenderer();
}
return _instance;
}
@Override
public String render(final String text) {
// validation is required before doing this!
return text.substring(0, 2) + "." + text.substring(2, 4) + "."
+ text.substring(4);
}
}
//=========================================================================
public static class MyParser implements Parser<String> {
private static MyParser _instance;
private static MyParser instance() {
if (_instance == null) {
_instance = new MyParser();
}
return _instance;
}
@Override
public String parse(final CharSequence text) throws ParseException {
return "parsed string";
}
}
//=========================================================================
public MyValueBox(final TextBox valueBox) {
super(valueBox.getElement(), MyRenderer.instance(), MyParser.instance());
}
}
Как вы можете видеть , Я пытаюсь обернуть TextBox
, который был создан с помощью UiBinder
, но я не вижу никакого эффекта от этого. Я знаю, что у меня что-то очень простое, и что есть намного более простой способ сделать это, но я в тупике. Спасибо за любые предложения!
--Edit--
В конце концов я решил использовать CellWidget
, который имел дополнительное преимущество, что я могу использовать этот код в ячейке виджета (например, DataGrid), в дополнение к его использованию на панели. Я зарегистрировал свое решение здесь: GWT: A Custom Cell Example
Я не ясно, о том, как создать экземпляр MyValueBox - класс MyValueBox имеет конструктор, который принимает один аргумент, который я могу, конечно, удалить, но потом мне еще нужно вызвать унаследованный конструктор, который принимает «Элемент» в качестве первого аргумента ... как мне это сделать? –
Почему вы отправляете TextBox в свой конструктор? Можно ли увидеть конструктор для MyValueBox? Однако вы можете взглянуть на http://www.gwtproject.org/doc/latest/DevGuideUiBinder.html#Using_a_widget, чтобы узнать о передаче параметров через конструктор. – amaurs
Я отправляю 'TextBox' в конструктор, чтобы обернуть' TextBox' в виджет с рендерером. Я не вижу способа переопределить рендеринг на 'TextBox'. –