如何在GWT中为BlurEvent正确添加UiHandler?

时间:2014-10-21 06:26:29

标签: java gwt uibinder

通常如果我们在GWT中有一些 textField ,我们可以通过以下代码添加BlurHandler:

textField.addBlurHandler(new BlurHandler() {
        @Override
        public void onBlur(BlurEvent event) {
             //what we need    
        }
    });

但是如果我们使用UiBinder并且我们的 textField 由@UiField注释并且在我们的ui.xml文件中提到它,我们也可以通过此代码添加BlurHandler:

@UiHandler("textField")
protected void createBlurHandler(BlurEvent event) {

}

我想我就在这里,因为它的作用就像这样。那么,问题是, 我们可以在ui.xml文件中实际定义BlurHandler吗?

例如,可以在那里添加 inputMaxLength 和其他一些属性,GWT有可能像 onChange 方法一样,或者这些方式我描述了唯一的可能性?

我想有这样的事情:

<g:TextBox ui:field="textField" onBlur="methodName" />

有可能吗?

1 个答案:

答案 0 :(得分:1)

我很确定你的要求是不可能的。问题是您无法使用反射来确定要调用的方法。但是,您可以扩展TextBox类并在模板中使用它。扩展类可以拥有可以在模板中设置的自己的属性。一个例子如下,我在我自己的DefaultTextBox上设置了默认测试。

public class DefaultTextBox extends TextBox {

    /**
     * The text color used when the box is disabled and empty.
     */
    private static final String TEXTBOX_DISABLED_COLOR = "#AAAAAA";

    private final String defaultText;

    public @UiConstructor
    DefaultTextBox(final String defaultText) {
        this.defaultText = defaultText;
        resetDefaultText();

        // Add focus and blur handlers.
        addFocusHandler(new FocusHandler() {
            @Override
            public void onFocus(FocusEvent event) {
                getElement().getStyle().clearColor();
                getElement().getStyle().clearFontStyle();
                if (defaultText.equals(getText())) {
                    setText("");
                }
            }
        });

        addBlurHandler(new BlurHandler() {
            @Override
            public void onBlur(BlurEvent event) {
                if ("".equals(getText())) {
                    resetDefaultText();
                }
            }
        });
    }

    public String getDefaultText() {
        return defaultText;
    }

    @Override
    public void setText(String text) {
        if (text == null) {
            super.setText(getDefaultText());
        } else {
            getElement().getStyle().clearColor();
            getElement().getStyle().clearFontStyle();
            super.setText(text);
        }
    }

    public String getText() {

        return super.getText();
    }

    /**
     * This is override so that the editor framework will not get the default
     * value but the actual null value when the default text is in the box.
     */
    @Override
    public String getValue() {
        try {
            return getValueOrThrow();
        } catch (ParseException e) {
            return null;
        }

    }

    @Override
    public void setValue(String value) {
        setText(value);
    }

    /**
     * This is overridden from the parent class because this is 
     * how the editor gets the value.
     */
    public String getValueOrThrow() throws ParseException {
        if (defaultText.equals(super.getValueOrThrow())) {
            return null;
        }
        return super.getValueOrThrow();
    }


    /**
     * Reset the text box to the default text.
     */
    public void resetDefaultText() {
        setText(defaultText);
        getElement().getStyle().setColor(TEXTBOX_DISABLED_COLOR);
        getElement().getStyle().setFontStyle(FontStyle.ITALIC);
    }
}

然后在模板中,您可以设置这样的属性。

<w:DefaultTextBox defaultText="name" ui:field="nameTextBox" />

这也适用于setter,你可以设置属性而不必使用@UiConstructor但在我的情况下我想确保这个类没有空的构造函数。