通常如果我们在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" />
有可能吗?
答案 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但在我的情况下我想确保这个类没有空的构造函数。