GWT文本框上的即时值更改处理程序

时间:2010-07-06 08:30:27

标签: events gwt textbox

我想在键入GWT TextBox时立即更新文本字段。我的问题是ValueChangeEvent和ChangeEvent处理程序仅在TextBox失去焦点时触发。我想过使用KeyPressEvent但是用鼠标执行复制粘贴时什么都不会发生。

最简单的方法是什么?

6 个答案:

答案 0 :(得分:33)

您可以捕获ONPASTE事件并手动触发ValueChangeEvent。像这样:

public void onModuleLoad() {
    final Label text = new Label();
    final ExtendedTextBox box = new ExtendedTextBox();
    box.addValueChangeHandler(new ValueChangeHandler<String>() {

        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            text.setText(event.getValue());
        }

    });
    box.addKeyUpHandler(new KeyUpHandler() {

        @Override
        public void onKeyUp(KeyUpEvent event) {
            text.setText(box.getText());
        }
    });

    RootPanel.get().add(box);
    RootPanel.get().add(text);
}

private class ExtendedTextBox extends TextBox {

    public ExtendedTextBox() {
        super();
        sinkEvents(Event.ONPASTE);
    }

    @Override
    public void onBrowserEvent(Event event) {
        super.onBrowserEvent(event);
        switch (DOM.eventGetType(event)) {
            case Event.ONPASTE:
                Scheduler.get().scheduleDeferred(new ScheduledCommand() {

                    @Override
                    public void execute() {
                        ValueChangeEvent.fire(ExtendedTextBox.this, getText());
                    }

                });
                break;
        }
    }
}

在firefox 3.6.1上测试。

答案 1 :(得分:2)

作为一般解决方案,对我有用(对于gal-bracha评论):

通常,GWT没有处理输入事件的类(描述为here  和here)。所以我们需要自己实现它:

处理程序类:

import com.google.gwt.event.shared.EventHandler;

public interface InputHandler extends EventHandler {

  void onInput(InputEvent event);

}

活动类:

import com.google.gwt.event.dom.client.DomEvent;

public class InputEvent extends DomEvent<InputHandler> {

    private static final Type<InputHandler> TYPE = new Type<InputHandler>("input", new InputEvent());

    public static Type<InputHandler> getType() {
        return TYPE;
    }

    protected InputEvent() {
    }

    @Override
    public final Type<InputHandler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(InputHandler handler) {
        handler.onInput(this);
    }

}

用法:

box.addDomHandler(new InputHandler() {

    @Override
    public void onInput(InputEvent event) {
        text.setText(box.getText());
    }
},InputEvent.getType());

它适用于每个TextBox值更改,包括使用上下文菜单粘贴。它对箭头,ctrl,shift等没有反应......

答案 2 :(得分:1)

过去这对我来说是个主要问题。 keyupHandler无法工作,因为复制粘贴需要在粘贴选项上按第二次按键,而不会触发事件。我能做的最好的是使用旧的changelistener并不理想,但确实有效。

答案 3 :(得分:0)

为什么不在TextBox上使用KeyUpHandler和ChangeHandler的组合? 应该关注每次击键的立即反馈以及复制粘贴案例。

答案 4 :(得分:0)

Just saw this question. Because I was facing the similar problem. 

做了一些黑客攻击,它对我有用。 您可以使用KeyUpHandler,但将其与检查的其他if块一起使用  对于文本框的长度。如果文本框的长度是> 0,做你的事。     例如:

textBox.addKeyUpHandler(new KeyUpHandler() {
    @Override
    public void onKeyUp(KeyUpEvent keyUpEvent) {
    if (textBox.getText().length() > 0) {
    //do your stuff`enter code here`

    }
    }

答案 5 :(得分:0)

我更喜欢使用isEmpty而不是Elements,所以这是我的处理方式。

Widgets