我想在输入GWT TextBox时立即更新文本字段。我的问题是,ValueChangeEvent和ChangeEvent处理程序只有在TextBox失去焦点时才会触发。我想过使用KeyPressEvent,但当使用鼠标执行复制粘贴时,什么也不会发生。
最简单的方法是什么?
发布于 2010-11-03 16:51:51
您可以捕获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上测试过。
发布于 2017-03-29 17:34:06
作为一个通用的解决方案,什么对我有效(thx to 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等做出反应。
发布于 2010-11-02 21:07:41
这在过去一直是我的一个主要问题。keyupHandler不起作用,因为复制粘贴需要在粘贴选项上再按一次键,这不会触发事件。我所能做的最好的事情就是使用旧的changelistener,虽然不是很理想,但它确实可以工作。
https://stackoverflow.com/questions/3184648
复制相似问题