Я реализовал свое собственное поле формы как IsEditor<LeafValueEditor<String>>
, которое я хотел бы использовать в формах моего приложения.
public class FormField extends Composite implements IsEditor<LeafValueEditor<String>> {
interface FormFieldUiBinder extends UiBinder<Widget, FormField> {
}
private static FormFieldUiBinder uiBinder = GWT.create(FormFieldUiBinder.class);
interface FormFieldStyle extends CssResource {
String error();
}
@UiField
TextBox wrapped;
private String placeholder;
public FormField() {
initWidget(uiBinder.createAndBindUi(this));
wrapped.setTitle("");
}
@UiHandler("wrapped")
public void onFocus(FocusEvent event) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
wrapped.selectAll();
}
});
}
public String getText() {
return wrapped.getText();
}
public void setText(String text) {
wrapped.setText(text);
}
/**
* Gets the current placeholder text for the text box.
*
* @return the current placeholder text
*/
public String getPlaceholder() {
return placeholder;
}
/**
* Sets the placeholder text displayed in the text box.
*
* @param placeholder
* the placeholder text
*/
public void setPlaceholder(String text) {
placeholder = (text != null ? text : "");
wrapped.getElement().setPropertyString("placeholder", placeholder);
}
public String getTitle() {
return wrapped.getTitle();
}
public void setTitle(String title) {
wrapped.setTitle(title);
}
@Override
public LeafValueEditor<String> asEditor() {
return wrapped.asEditor();
}
public int getVisibleLength() {
return wrapped.getVisibleLength();
}
public void setVisibleLength(int length) {
wrapped.setVisibleLength(length);
}
public boolean isReadOnly() {
return wrapped.isReadOnly();
}
public void setReadOnly(boolean readOnly) {
wrapped.setReadOnly(readOnly);
}
public boolean isEnabled() {
return wrapped.isEnabled();
}
public void setEnabled(boolean enabled) {
wrapped.setEnabled(enabled);
}
public void setWidth(String width) {
wrapped.setWidth(width);
}
}
Соответствующий файл UIBinder прост:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'>
<g:HTMLPanel>
<g:TextBox ui:field="wrapped" />
</g:HTMLPanel>
</ui:UiBinder>
Это работает плавно в формах, которые я создаю, как это:
<g:AbsolutePanel width="350px" height="225px"
styleName="{res.css.inputArea}">
<g:at left='10' top='0'>
<g:HTMLPanel width="350px">
<h1>Personalia</h1>
</g:HTMLPanel>
</g:at>
<g:at left='10' top='65'>
<f:FormLabel text="voornaam" />
</g:at>
<g:at left='10' top='80'>
<f:FormField ui:field="firstName" placeholder="voornaam" />
</g:at>
<g:at left='10' top='115'>
<f:FormLabel text="achternaam" />
</g:at>
<g:at left='10' top='130'>
<f:FormField ui:field="lastName" placeholder="achternaam"/>
</g:at>
</g:AbsolutePanel>
По моему мнению, я могу использовать EditorDriver следующим образом:
interface EditorDriver extends SimpleBeanEditorDriver<Account, AccountPersonaliaEditor> {
}
private final EditorDriver editorDriver = GWT.create(EditorDriver.class);
И заполнение формы тоже отлично работает
editorDriver.initialize(editor);
editorDriver.edit(presenter.getAccount());
А также получение значений после редактирования:
Account account = editorDriver.flush();
Теперь я бы хотел оставить отзыв об ошибках. У меня GWT Bean validation framework тоже работает нормально. Мне просто нужно показать ошибки.
Итак, я пытаюсь сделать так, чтобы FormField реализовал HasEditorErrors . Вот моя проблема / вопрос.
public class FormField extends Composite implements IsEditor<LeafValueEditor<String>>, HasEditorErrors<String>
Как только я реализую этот интерфейс (даже с пустой реализацией), я сталкиваюсь со следующей ошибкой времени компиляции:
[DEBUG] [klawtapp] - Rebinding com.example.screen.ui.center.AccountPersonaliaImpl.EditorDriver
[DEBUG] [klawtapp] - Invoking generator com.google.gwt.editor.rebind.SimpleBeanEditorDriverGenerator
[DEBUG] [klawtapp] - Creating Editor model for com.example.screen.ui.center.AccountPersonaliaImpl.EditorDriver
[DEBUG] [klawtapp] - Descending into firstName
[ERROR] [klawtapp] - Could not find a getter for path wrapped in proxy type java.lang.String
[DEBUG] [klawtapp] - Descending into lastName
[ERROR] [klawtapp] - Could not find a getter for path wrapped in proxy type java.lang.String
[ERROR] [klawtapp] - Unable to create Editor model due to previous errors
[ERROR] [klawtapp] - Deferred binding failed for 'com.example.screen.ui.center.AccountPersonaliaImpl.EditorDriver'; expect subsequent failures
Это казалось таким тривиальным. Я пытался добавить getter / setter для упакованного, но это не очень помогает.
РЕДАКТИРОВАТЬ: на мгновение, я думал, что решение будет заключаться в реализации HasEditorErrors<LeafValueEditor<String>>
вместо HasEditorErrors<String>
, чтобы предотвратить спуск иерархии к упакованному TextBox, но результаты похожи:
[ERROR] [klawtapp] - Could not find a getter for path wrapped in proxy type com.google.gwt.editor.client.LeafValueEditor