我想知道如何监听TextField
的丢弃事件。我需要拦截那些事件才能进行价值检查。
我写了一个扩展的TextBox
,它会触发TextChangeEvents
。但是当我将文本放入文本字段时,我没有接到onBrowserEvent(Event event)
方法的调用。
任何提示?
public class ExtendedTextBox extends TextBox {
/**
* Creates an empty extended text box.
*/
public ExtendedTextBox() {
super();
// Catch the browser events.
sinkEvents(Event.ONKEYUP);
sinkEvents(Event.ONPASTE);
}
@Override
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
System.out.println(event.getTypeInt());
switch (event.getTypeInt()) {
case Event.ONKEYUP:
case Event.ONPASTE: {
// Fire the event after the text box shows the new data.
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
fireEvent(new TextChangeEvent(ExtendedTextBox.this.getText()));
}
});
break;
}
default:
}
}
/**
* Add a given {@link TextChangeEventHandler} to the widget.
*
* @param handler
* the handler
* @return {@link HandlerRegistration} used to remove the handler
*/
public HandlerRegistration addTextChangeEventHandler(TextChangeEventHandler handler) {
return addHandler(handler, TextChangeEvent.TYPE);
}
}
答案 0 :(得分:0)
TextBox应该触发ChangeEvent
(或ValueChangeEvent
- 目前不知道)。所以你可以在构造函数中轻松地做这样的事情:
this.addChangeHandler(new ChangeHandler ...
如果这还不够,您还可以收听Focus
事件。
答案 1 :(得分:0)
感谢您的帮助。我今天自己想出来,它很安静。我没有注意到,已经有DropHandler
。
您可以在构造函数中执行此操作:
addDropHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
if(!event.getDataTransfer().getData("text/plain").isEmpty()) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
fireEvent(new TextChangeEvent(ExtendedTextBox.this.getText()));
}
});
}
}
});
要阻止TextField
的默认行为,只需添加event.preventDefault();
即可。现在,您可以通过调用event.getDataTransfer().getData("text/plain")
获取输入并进行输入验证等。
作为副作用,现在通过将某些内容放入文本字段来调用onBrowserEvent(Event event)
方法。但是类型int是-1
,所以它在这个地方并没有真正的帮助。