GWT Editor Framework: пользовательский LeafValueEditor, реализующий HasEditorErrors - PullRequest
1 голос
/ 22 января 2012

Я реализовал свое собственное поле формы как 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

1 Ответ

1 голос
/ 22 января 2012

Просто аннотируйте свое wrapped текстовое поле с помощью @Editor.Ignore.

В качестве альтернативы, вы можете удалить implements IsEditor<LeafValueEditor<String>> и вместо этого аннотировать поле wrapped с помощью @Path("") (вам придется проверитьс null значениями, хотя, если вы можете столкнуться с ними, так как я не уверен, что это будет работать как есть).

Или вы можете выбрать реализацию собственного LeafValueEditor<String> вместо того, чтобы полагаться наодин из TextBox.

...