Мгновенный обработчик изменения значения в текстовом поле GWT
Я хотел бы обновить текстовое поле сразу при вводе текстового поля GWT. Моя проблема в том, что обработчики ValueChangeEvent и ChangeEvent запускаются только тогда, когда TextBox теряет фокус. Я думал об использовании KeyPressEvent, но тогда ничего не получилось при выполнении скопирования с помощью мыши.
Какой самый простой способ сделать это?
Ответы
Ответ 1
Вы можете поймать событие ONPASTE
и вручную запустить a 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.
Ответ 2
Это было серьезной проблемой для меня в прошлом. KeyupHandler не будет работать, потому что для вставки копии требуется второй ключ, нажимающий на параметр вставки, который не запускает событие. лучшее, что я смог сделать, это использовать старый changelistener не идеально, но он действительно работает.
Ответ 3
Как общее решение, что работает для меня (спасибо to gal-bracha comment):
Как правило, 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);
}
}
Использование:
box.addDomHandler(new InputHandler() {
@Override
public void onInput(InputEvent event) {
text.setText(box.getText());
}
},InputEvent.getType());
Он работает с каждым изменением значения TextBox, включая вставку с использованием контекстного меню. Он не реагирует на стрелки, ctrl, shift и т.д.
Ответ 4
Почему бы не использовать комбинацию как KeyUpHandler, так и ChangeHandler в TextBox?
Следует позаботиться о немедленной обратной связи по каждому нажатию клавиши, а также к случаю с копированием.
Ответ 5
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`
}
}