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

Events GWT文本框上的即时值更改处理程序,events,gwt,textbox,Events,Gwt,Textbox,我想在GWT文本框中键入时立即更新文本字段。我的问题是ValueChangeEvent和ChangeEvent处理程序只有在文本框失去焦点时才会启动。我曾考虑过使用KeyPressEvent,但在用鼠标执行复制粘贴时什么也不会发生 最简单的方法是什么 为什么不在文本框上同时使用KeyUpHandler和ChangeHandler呢? 在每次击键以及复制粘贴的情况下,都应该注意即时反馈。这在过去一直是我的一个主要问题。keyupHandler无法工作,因为复制粘贴需要在粘贴选项上再按一次键,这不会

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


最简单的方法是什么

为什么不在文本框上同时使用KeyUpHandler和ChangeHandler呢?
在每次击键以及复制粘贴的情况下,都应该注意即时反馈。

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

您可以捕获
ONPASTE
事件并手动触发
valuechangeent
。大概是这样的:

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;
        }
    }
}
模块加载()上的公共void{
最终标签文本=新标签();
final ExtendedTextBox=新的ExtendedTextBox();
addValueChangeHandler(新的ValueChangeHandler(){
@凌驾
ValueChange上的公共作废(ValueChangeEvent事件){
text.setText(event.getValue());
}
});
addKeyUpHandler(新的KeyUpHandler(){
@凌驾
公共无效onKeyUp(KeyUpEvent事件){
text.setText(box.getText());
}
});
RootPanel.get().add(box);
RootPanel.get().add(文本);
}
私有类ExtendedTextBox扩展TextBox{
公共扩展文本框(){
超级();
sinkEvents(Event.ONPASTE);
}
@凌驾
公共无效onBrowserEvent(事件){
超级浏览器事件(事件);
开关(DOM.eventGetType(事件)){
case Event.ONPASTE:
Scheduler.get().ScheduledDeferred(新的ScheduledCommand(){
@凌驾
public void execute(){
ValueChangeEvent.fire(ExtendedTextBox.this,getText());
}
});
打破
}
}
}
在firefox 3.6.1上测试

Just saw this question. Because I was facing the similar problem. 
做了一些黑客,它为我工作。 您可以使用KeyUpHandler,但将其与检查的附加if块一起使用 用于文本框的长度。如果文本框的长度>0,则执行您的操作。 例:


作为一般解决方案,什么对我有效(thx回复):

通常,GWT没有处理输入事件的类(如下所述) 及)。因此,我们需要自己实施:

处理程序类:

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);
    }

}

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

我更喜欢使用
元素
,而不是
小部件
,所以这是我的处理方法

    Element input = Document.get().getElementById("my-input");
    DOM.sinkBitlessEvent(input, "input");
    DOM.setEventListener(input, event -> GWT.log("Event!"));

正如我所说,ChangeHandler只在文本框失去焦点时触发,但我想立即更新我的字段(当用户键入时)。。。你找到办法了吗?当你这样做的时候,请分享解决方案:)感谢我正在开发的应用程序接受了失去焦点时的行为改变。所以我从来没有找到解决办法,暂时把它放在一边。但如果我找到了,我会更新这个问题。最好是使用输入事件,但我不确定如何从gwt访问它。它处理粘贴和键盘,因为当值实际更改时,它会升高。谢谢这对我有用。其他人需要注意的一点是,需要使用deferred命令,因为在处理粘贴事件时,TextBox尚未包含感兴趣的文本。如果您试图过滤文本框的内容(在我的例子中,是有效字符),请注意,用户将立即看到粘贴的文本。有人知道这件事吗?据我所知,FF不允许剪贴板检查,但IE和Webkit都允许?您可以做的是隐藏
文本框的内容,直到验证完成。这确实是一个黑客行为,但是
color:transparent
可以做到这一点…@z00bs不需要扩展TextArea和使用UiBinder就可以做到吗?我怀疑这一点,因为您需要在
onbrowservevent()
中扩展行为。答案很好,但在GWT的最新版本中,DeferredCommand被弃用,取而代之的是Scheduler.get()推迟的日程安排(…)最好使用输入事件,但我不确定如何从gwt访问它。它处理粘贴和键盘,因为当值实际更改时它会上升。这不包括将值拖到框中,也会在左/右键释放时触发,ctrl-keyreleasetrue,这将适用于包含文本的键入。我想这会为这个问题服务。它只是一个hack;)Missing”(“在新类型之后。我在创建过程中遇到了这个错误:异常2(字符串):尝试接收未知事件类型input非常好的答案!谢谢
box.addDomHandler(new InputHandler() {

    @Override
    public void onInput(InputEvent event) {
        text.setText(box.getText());
    }
},InputEvent.getType());
    Element input = Document.get().getElementById("my-input");
    DOM.sinkBitlessEvent(input, "input");
    DOM.setEventListener(input, event -> GWT.log("Event!"));