这不应该让我如此痛苦,但确实如此。这是一个非常奇怪的问题。在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);
答案 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正常工作,您将无法在多个位置更改源代码。