将eventhandler添加到自定义文本框字段

时间:2012-06-14 08:33:31

标签: java gwt uibinder

美好的一天

我有一个自定义TextBox,它有一个IndicatorTextBox.ui.xml文件以及IndicatorTextBox.java文件。 通常在文本框中添加均衡器很简单。

这是我的主要.java文件

@UiHandler("txtFirstName")
void onTxtFirstNameKeyUp(KeyUpEvent event){ 
validateFields();
}

如果txtFirstName是带有我要添加到此页面的标签的自定义文本框,我将如何添加处理程序。 因此,换句话说,txtFirstnName不是 @UiField TextBox txtFirstName ,而是 IndicatorTextField txtFirstName

IndicatorTextBox.java文件如下所示

import com.google.gwt.core.client.GWT;

public class IndicatorTextField extends Composite implements HasText {

public interface Binder extends UiBinder<Widget, IndicatorTextField> {
}

private static final Binder binder = GWT.create(Binder.class);

public interface Style extends CssResource{
    String textStyling();
    String requiredInputLabel();
    String colorNotValidated();


}

@UiField Style style;
@UiField Label label;
@UiField TextBox textBox;


public IndicatorTextField()
{

    initWidget(binder.createAndBindUi(this));
}

public void setBackgroundValidateTextbox(boolean validated)
{
    if(validated)
    {
        textBox.getElement().addClassName(style.colorNotValidated());
    }
    else
    {
        textBox.getElement().removeClassName(style.colorNotValidated());

    }

}

@Override
public String getText() {

    return label.getText();
}

@Override
public void setText(String text) {
    label.setText(text);

}

2 个答案:

答案 0 :(得分:1)

你的IndicatorTextField首先要实现HasKeyUpHandlers接口,从textBox中捕获KeyUpEvents并将它们激活给它的处理程序。

public class IndicatorTextField extends Composite implements HasText, HasKeyUpHandlers {
    ...

    @Override
    public HandlerRegistration addKeyUpHandler(KeyUpHandler handler)  {
        return addHandler(handler, KeyUpEvent.getType());
    }

    ...

    @UiHandler("textBox")
    public void onKeyUp(KeyUpEvent event) {
        DomEvent.fireNativeEvent(event.getNativeEvent(), this);
    }

}

然后在你的主java类中,如果你用uiBinder创建这个IndicatorTextField,那么你可以按常规方式添加一个UiHandler

@UiField
IndicatorTextField myIndicatorTextField;

@UiHandler("myIndicatorTextField)
public void onKeyUp(KeyUpEvent event) {
    validateFields();
}

如果您通过调用构造函数来创建,则在其上调用addKeyUpHandler

IndicatorTextField myIndicatorTextField = new IndicatorTextField();
myIndicatorTextField.addKeyUpHandler(new KeyUpHandler() {
    public void onKeyUp(KeyUpEvent event) {
        validateFields();
    }
});

答案 1 :(得分:0)

UiBinder,据我了解这种机制,根据方法签名中的事件类型创建调用,因此 IndicatorTextField 必须实现 HasAllKeyHandlers 或者只是扩展 FocusWidget