无法在GWT应用程序中将焦点设置在TextBox上

时间:2011-05-10 02:47:09

标签: gwt textbox

这不应该让我如此痛苦,但确实如此。这是一个非常奇怪的问题。在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);

4 个答案:

答案 0 :(得分:33)

尝试使用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,这已被弃用。

答案 1 :(得分:1)

为什么使用DefferedCommand,我认为最好使用someWidget.getElement().focus()本地Javascript。我到处都在使用它,我没有看到任何问题。

答案 2 :(得分:0)

如果你的Widget扩展了Composite,你可以:

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

答案 3 :(得分:0)

GWT很容易存储“想要焦点”。处于内部状态,并在附加窗口小部件后调用焦点。多年来我们仍在等待这个功能...

但是,即使在调用attach处理程序之后,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正常工作,您将无法在多个位置更改源代码。