首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT文本框上的即时值更改处理程序

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

Stack Overflow用户
提问于 2010-07-06 16:30:27
回答 6查看 35.8K关注 0票数 26

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

最简单的方法是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-03 16:51:51

您可以捕获ONPASTE事件并手动触发ValueChangeEvent。如下所示:

代码语言:javascript
复制
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上测试过。

票数 36
EN

Stack Overflow用户

发布于 2017-03-29 17:34:06

作为一个通用的解决方案,什么对我有效(thx to gal-bracha评论):

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

处理程序类:

代码语言:javascript
复制
import com.google.gwt.event.shared.EventHandler;

public interface InputHandler extends EventHandler {

  void onInput(InputEvent event);

}

事件类:

代码语言:javascript
复制
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);
    }

}

用法:

代码语言:javascript
复制
box.addDomHandler(new InputHandler() {

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

它适用于每个TextBox值的更改,包括使用上下文菜单粘贴。它不会对箭头、ctrl、shift等做出反应。

票数 4
EN

Stack Overflow用户

发布于 2010-11-02 21:07:41

这在过去一直是我的一个主要问题。keyupHandler不起作用,因为复制粘贴需要在粘贴选项上再按一次键,这不会触发事件。我所能做的最好的事情就是使用旧的changelistener,虽然不是很理想,但它确实可以工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3184648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档