web-dev-qa-db-ja.com

GWTアプリでTextBoxにフォーカスを設定できません

これは私にそれほどの痛みを引き起こしてはいけませんが、そうです。それは非常に奇妙な問題です。 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);
22
sherry

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()が使用されるようになりました。

33
Peter Knego

なぜDefferedCommandを使用するのか、ネイティブJavascriptであるsomeWidget.getElement().focus()を使用する方が良いと思います。どこでも使っていますが、問題はありません。

1
Õzbek

ウィジェットがCompositeを拡張する場合、次のことができます。

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

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を機能させる場合、複数の場所でソースコードを変更する必要はありません。

0
Steven Spungin