Подтвердить что ты не робот

Не удалось установить фокус на TextBox в приложении GWT

Это не должно причинять мне столько боли, но это так. Это очень странная проблема. В приложении GWT у меня есть два файла .java, login.java и application.java. В login.java, я создаю страницу входа пользователя, где, если имя пользователя и пароль проверены, пользователь регистрируется в приложении, а приложение application.java занимает здесь.

Теперь в приложении. java onModuleLoad(), вот как я начинаю с страницы входа.

public void onModuleLoad() {
  Login login = new Login();
  login.textBoxUsername.setFocus(true);
  RootLayoutPanel.get().add(login);}

Это отлично работает, за исключением крошечной проблемы неспособности установить фокус на имя пользователя TextBox при загрузке страницы. Я пробовал все, что мог придумать. Но фокус просто не устанавливается в TextBox. Если кто-нибудь может предложить решение, сделайте это. Ваша помощь с благодарностью.

Решение: (В случае, если кто-то сталкивается с той же проблемой)

final Login login = new Login();
  Scheduler.get().scheduleDeferred(new ScheduledCommand() {
        public void execute () {
            login.textBoxUsername.setFocus(true);
        }
   });

  RootLayoutPanel.get().add(login);
4b9b3361

Ответ 1

Попробуйте использовать Scheduler.scheduleDeferred():

public void onModuleLoad() {
    Login login = new Login();
    Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand () {
        public void execute () {
            login.textBoxUsername.setFocus(true);
        }
    });
    RootLayoutPanel.get().add(login);       
}

Обновление: ответ обновлен, чтобы использовать Scheduler.get().scheduleDeferred() вместо DeferredCommand, который устарел.

Ответ 2

Зачем использовать DefferedCommand, мне лучше использовать someWidget.getElement().focus(), который является родным Javascript. Я использую его везде, я не видел никаких проблем.

Ответ 3

Если ваш виджет расширяет Composite, вы можете:

@Override
protected void onAttach() {
    super.onAttach();
    textBoxUsername.setFocus(true);
}

Ответ 4

Было бы очень легко GWT сохранить "wantFocus" во внутреннем состоянии и вызвать фокус после присоединения виджета. Мы все еще ждем после многих лет этой функции, однако...

Тем не менее, даже после вызова обработчика setFocus не всегда работает.

Итак, наша библиотека GwtUtil использовала следующий код. Это комбинация нескольких других решений и была завернута в служебную функцию:

static public void setFocus(final FocusWidget focusWidget) {
    if (focusWidget.isAttached()) {
        Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
            @Override
            public void execute() {
                focusWidget.setFocus(true);
            }
        });
    } else {
        focusWidget.addAttachHandler(new AttachEvent.Handler() {
            @Override
            public void onAttachOrDetach(AttachEvent event) {
                if (event.isAttached()) {
                    Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
                        @Override
                        public void execute() {
                            focusWidget.setFocus(true);
                        }
                    });
                }
            }
        });
    }
}

И назовите его следующим образом:

setFocus(myTextBox);

Имеет смысл использовать служебную функцию; Если и когда GWT наконец сделает работу setFocus, вам не придется менять исходный код в нескольких местах.