当输入GWT文本框时,我希望能即时更新一个文本字段。我的问题是ValueChangeEvent和ChangeEvent处理程序只有在文本框失去焦点时才会触发。我考虑使用KeyPressEvent,但当使用鼠标进行复制粘贴操作时,什么也不会发生。
那最简单的方法是什么?
您可以捕获 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 上进行了测试。
作为一种通用解决方案,对我有用的是(感谢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());
它适用于每次文本框值的更改,包括使用上下文菜单粘贴。它不会对箭头、Ctrl、Shift等做出反应...
我更喜欢使用元素
而不是小部件
,所以这是我的处理方式。
Element input = Document.get().getElementById("my-input");
DOM.sinkBitlessEvent(input, "input");
DOM.setEventListener(input, event -> GWT.log("Event!"));
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`
}
}
TextBox
的内容。这确实是一种hack方法,但是color: transparent
可以解决问题... - z00bsonBrowserEvent()
中扩展行为。 - z00bs