Поиск по этому блогу

вторник, 1 июля 2014 г.

GWT. Programatically selecting text in a TextBox

Для того, чтобы по нажатию на компонент выделить текст, который в нем находится, необходимо написать следующий нативный метод. В качестве параметра передаем в метод тот элемент, в котором будем выделять текст.
private native void selectAll(Element element) /*-{
     element.setSelectionRange(0, element.value.length);
}-*/;

И использовать этот метод в обработчике события получения фокуса компонентом.
Event.sinkEvents(selector.getInputElement(), Event.ONFOCUS);
Event.setEventListener(selector.getInputElement(), 
  new EventListener() {
 
    @Override
    public void onBrowserEvent(Event event) {
      selectAll(selector.getInputElement());
    }
});

Но часто может происходить следующая ситуация - текст в компоненте будет выделяться после того как пользователь поставит курсор внутри компонента, однако после этого выделение будет слетать. Это происходит потому что выделение может быть установлено еще до того как выполнятся все события связанные с отрисовкой интерфейса. Поэтому необходимо использовать очередь событий и вызывать метод, который будет выделять текст только после того как все события интерфейса будут выполнены. Для этого нам понадобится метод
Scheduler.get().scheduleDeferred() 

Добавим в очередь событий вызов метода выделения текста в компоненте.
Scheduler.get().scheduleDeferred(
  new Scheduler.ScheduledCommand() {
    public void execute() {
      selectAll(selector.getInputElement());
    }
});

Полностью код будет выглядеть так
Event.sinkEvents(selector.getInputElement(), Event.ONFOCUS);
Event.setEventListener(selector.getInputElement(), 
  new EventListener() {
    @Override
    public void onBrowserEvent(Event event) {
      openDropdown(true);
      currentValue = selector.getText();
      Scheduler.get().scheduleDeferred(
        new Scheduler.ScheduledCommand() {
          public void execute() {
            selectAll(selector.getInputElement());
          }
        });
      }
  });

Комментариев нет:

Отправить комментарий