我想在键入GWT TextBox时立即更新文本字段。我的问题是ValueChangeEvent和ChangeEvent处理程序仅在TextBox失去焦点时触发。我想过使用KeyPressEvent但是用鼠标执行复制粘贴时什么都不会发生。
最简单的方法是什么?
答案 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