Обработчик мгновенного изменения значения в текстовом поле GWT - PullRequest
25 голосов
/ 06 июля 2010

Я хотел бы мгновенно обновить текстовое поле при наборе текста в текстовом поле GWT. Моя проблема в том, что обработчики ValueChangeEvent и ChangeEvent запускаются только тогда, когда TextBox теряет фокус. Я думал об использовании KeyPressEvent, но тогда ничего не произойдет при выполнении копирования с помощью мыши.

Какой самый простой способ сделать это?

Ответы [ 6 ]

33 голосов
/ 03 ноября 2010

Вы можете перехватить событие 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.

2 голосов
/ 29 марта 2017

Как общее решение, что работает для меня (thx 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 и т. Д.

1 голос
/ 02 ноября 2010

В прошлом это было серьезной проблемой для меня.KeyupHandler не будет работать, потому что копирование вставки требует второго нажатия клавиши на опцию вставки, которая не вызывает событие.лучшее, что я смог сделать, это использовать старый список изменений не идеальный, но он работает.

0 голосов
/ 07 ноября 2018

Я предпочитаю использовать Elements, чем Widgets, так что мой путь к обработчику.

    Element input = Document.get().getElementById("my-input");
    DOM.sinkBitlessEvent(input, "input");
    DOM.setEventListener(input, event -> GWT.log("Event!"));
0 голосов
/ 30 мая 2016
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`

    }
    }
0 голосов
/ 06 июля 2010

Почему бы не использовать комбинацию KeyUpHandler и ChangeHandler в TextBox?Следует позаботиться о немедленной обратной связи при каждом нажатии клавиши, а также о копировании и вставке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...