pas en mesure de définir le focus sur la zone de texte dans une application GWT
Cela ne devrait pas causer beaucoup de douleur, mais il est. C'est un très étrange problème. Dans une application GWT, j'en ai deux .fichiers java, login.java et application.java.
Dans login.java je suis la création d'un utilisateur de la page de login où, si le nom d'utilisateur et le mot de passe est vérifié, l'utilisateur est enregistré dans l'application et application.java faut partir d'ici.
Maintenant en application. java est onModuleLoad (), c'est la façon dont je commence avec une page de connexion.
public void onModuleLoad() {
Login login = new Login();
login.textBoxUsername.setFocus(true);
RootLayoutPanel.get().add(login);}
Cela fonctionne très bien, sauf pour le petit problème de ne pas être en mesure de définir le focus sur la zone de texte nom d'utilisateur lors du chargement de la page. J'ai essayé evrything je pense. Mais l'accent n'est pas mis sur la zone de texte. Si quelqu'un peut proposer une solution, s'il vous plaît. Votre aide est grandement appréciée.
Solution: (Dans le cas où il aide à toute personne confrontée à la même question)
final Login login = new Login();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute () {
login.textBoxUsername.setFocus(true);
}
});
RootLayoutPanel.get().add(login);
- Vous pouvez avoir besoin d'appeler
setFocus()
après la connexion, widget a été ajouté à laRootLayoutPanel
-- avez-vous essayé? - oui, quand je l'appelle setFocus() après RootLayoutPanel.get().ajouter(login); l'écran de connexion ne prend pas en charge.
- Êtes-vous d'obtenir l'erreur de script si vous appelez setFocus() après RootLayoutPanel.get().ajouter(connexion); ? Je pense que le navigateur prend un certain temps pour charger votre login widget. Pouvez-vous s'il vous plaît essayer la setFocus appeler à l'intérieur de l'gwt minuterie bloc avec 5 secondes d'intervalle? Alors on peut comprendre où est le problème exactement.
- Si il faut un certain temps pour créer une Connexion widget, ou de l'ajouter à la RootLayoutPanel, l'appel suivant ne se produira pas jusqu'à ce que l'opération terminée. @sherry Êtes-vous en cours d'exécution dans le Dev Mode de sorte que vous pouvez voir toutes les GWT erreurs?
- Vous avez raison,le navigateur prend du temps pour charger la connexion widget bien que ce délai n'est pas visible pour l'utilisateur. Je n'étais pas en mesure de comprendre quand la charge de la connexion widget est en cours d'achèvement. Avec ce concept, j'ai utilisé @Pierre suggestion ci-dessous. À l'aide de DeferredCommand fonctionne! Il attend jusqu'à la connexion widget est chargé appelle ensuite setFocus(). Bien que DeferredCommand est obsolète et que je vais devoir trouver ce qui peut être utilisé à sa place. Mais au moins je vais quelque part maintenant.. je vous Remercie pour votre réponse!
- vous êtes de droite. Je pense avoir trouvé la solution. Je vous remercie pour votre réponse.
- Bien que vous avez résolu ce problème. 🙂
- Hall: C'est purement la question du moment. Dans gwt création de widget est différent et le chargement et le rendu widget est différent. Comme je l'ai mentionné dans mon premier commentaire, il faut un certain temps à charger(render) pas pour la création. Merci pour votre suggestion.
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser Le planificateur.scheduleDeferred():
Mise à jour: réponse mis à jour pour utiliser
Scheduler.get().scheduleDeferred()
au lieu deDeferredCommand
, qui est obsolète.Scheduler.scheduleDeferred()
Scheduler.get().scheduleDeferred()
?onModuleLoaded
fonction, non? Semblable à du jQuerydocument.ready()
. Afin de ne pas traiter la question de réglage, l'accent seulement après que le widget a été chargé, en premier lieu? Pourquoi devons-nous prendre soin de ce que séparément par le biais de ce hack?onModuleLoad()
peut être appelée avant que le DOM est prêt etbody.onload()
est appelé: developers.google.com/web-toolkit/doc/latest/...onModuleLoad
ne garantit pas que les méthodes agir sur les éléments seulement après, ils sont chargés, faire pipi besoin d'envelopper tous les gestionnaires d'événements attachés à des éléments, commekeyup
,click
, etc également dansscheduler
?onModuleLoaded
fonction et ajouté qu'ilDOM
. Devons-nous fixer des gestionnaires d'événements dans ces deux sortes d'éléments au sein descheduler
?Pourquoi à l'aide de
DefferedCommand
, je pense qu'il est préférable d'utilisersomeWidget.getElement().focus()
qui est un Javascript natif. Je l'utilise partout, je n'ai pas vu de problème.someWidget.getElement().focus()
. nous avons donc besoin d'utiliserDeferedCommand
ouscheduleDeferred
pour atteindre cet objectif.deferredCommand
est exécuté après l'événement du navigateur de la boucle de retour.Si votre Widget s'étend Composite, vous pouvez:
Il serait tellement facile pour GWT pour stocker un "wantsFocus" dans l'état interne, et appeler focus après le widget est attaché. Nous sommes toujours en attente après de nombreuses années pour que la fonctionnalité cependant...
Toujours, même après la joindre gestionnaire est appelé, setFocus ne fonctionne pas toujours.
Donc, dans l'intervalle, notre GwtUtil bibliothèque a utilisé le code suivant. C'est une combinaison de plusieurs autres solutions, et a été enveloppé dans une fonction d'utilité:
Et de l'appeler comme ceci:
Il est logique d'utiliser une fonction d'utilité; Si et quand GWT fait enfin setFocus de travail, vous n'aurez pas à changer votre code source dans de multiples endroits.