これは私にそれほどの痛みを引き起こしてはいけませんが、そうです。それは非常に奇妙な問題です。 GWTアプリケーションには、login.Javaとapplication.Javaの2つの.Javaファイルがあります。 login.Javaで、ユーザーログインページを作成しています。このページでは、ユーザー名とパスワードが確認されると、ユーザーはアプリケーションとapplication.Javaにログインします。
現在、アプリケーションにあります。 JavaのonModuleLoad()これは私がログインページから始める方法です。
public void onModuleLoad() {
Login login = new Login();
login.textBoxUsername.setFocus(true);
RootLayoutPanel.get().add(login);}
これは、ページの読み込み時にユーザー名TextBoxにフォーカスを設定できないという小さな問題を除いて、うまく機能します。私は私が考えることができるevrythingを試みました。しかし、フォーカスはTextBoxに設定されません。誰かが解決策を提案できるなら、してください。あなたの助けは大歓迎です。
解決策 :(同じ問題に直面している人を助ける場合)
final Login login = new Login();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute () {
login.textBoxUsername.setFocus(true);
}
});
RootLayoutPanel.get().add(login);
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);
}
_
Update:回答が更新され、非推奨の DeferredCommand
の代わりにScheduler.get().scheduleDeferred()
が使用されるようになりました。
なぜDefferedCommand
を使用するのか、ネイティブJavascriptであるsomeWidget.getElement().focus()
を使用する方が良いと思います。どこでも使っていますが、問題はありません。
ウィジェットがCompositeを拡張する場合、次のことができます。
@Override
protected void onAttach() {
super.onAttach();
textBoxUsername.setFocus(true);
}
GWTが「wantsFocus」を内部状態に格納し、ウィジェットがアタッチされた後にフォーカスを呼び出すのは非常に簡単です。しかし、私たちはまだその機能を何年も待っています...
それでも、アタッチハンドラーが呼び出された後でも、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を機能させる場合、複数の場所でソースコードを変更する必要はありません。