Dans certains cas, je souhaite montrer à l'utilisateur une fenêtre modale avec une barre de progression lors de la requête longue durée. (Pour les articles UI individuels, j'utilise la méthode setEnabled (true/ false)
mais je souhaite une solution plus élégante.)
Par exemple, dans le point d'entrée, jusqu'à ce que tous les éléments ne soient pas initialisés –
public void onModuleLoad() { // initialization of the interface here }
Et aussi, par exemple, lorsque vous complétez la liste de liste dépendante (relation un à plusieurs)
@UiHandler("listBox") public void onListBoxChange(ChangeEvent event) { someService.findDependencies(id, new AsyncCallback<List<DependencyDTO>>() { public void onFailure(Throwable caught) { // exception handling here } public void onSuccess(List<DependencyDTO> data) { // listBox filling here } }); }
Dans les applications Vaadin , je peux ajouter à l'auditeur le code suivant, par exemple –
... Thread thread = new Thread() { @Override public void run() { // some initialization here window.removeWindow(blockerWindow); } }; thread.start(); blockerWindow = new BlockerWindow(); window.addWindow(blockerWindow); ...
Dans mon cas, je peux utiliser la méthode suivante pour afficher une fenêtre avec une barre de progression –
private void freezeInterface() { blockerWindow = new BlockerWindow() blockerWindow.setGlassEnabled(true); blockerWindow.setAnimationEnabled(true); blockerWindow.setModal(true); blockerWindow.center(); blockerWindow.show(); }
Et la méthode de masquer la fenêtre –
private void unfreezeInterface() { blockerWindow.hide(); }
La question est, lorsque vous cachez la fenêtre.
Par exemple, au point d'entrée, il existe une série de requêtes –
... service1.findDependenciesForListBox1(id1, new AsyncCallback<List<Dependency1DTO>>() { public void onFailure(Throwable caught) { // exception handling here } public void onSuccess(List<Dependency1DTO> data) { // listBox1 filling here } }); service2.findDependenciesForListBox2(id2, new AsyncCallback<List<Dependency2DTO>>() { public void onFailure(Throwable caught) { // exception handling here } public void onSuccess(List<Dependency2DTO> data) { // listBox2 filling here } }); serviceN.findDependenciesForListBoxN(idN, new AsyncCallback<List<DependencyNDTO>>() { public void onFailure(Throwable caught) { // exception handling here } public void onSuccess(List<DependencyNDTO> data) { // listBoxN filling here } });
Etc.
Les réponses viennent dans une séquence précédemment inconnue et cachent la fenêtre dans l'une des méthodes onSuccess
je ne peux pas.
Je peux utiliser une timer
, mais je ne sais pas à l'avance le moment de passer l' schedule
.
... blockerWindow.show(); private void unfreezeInterface() { timer = new Timer() { public void run() { blockerWindow.hide(); } }; timer.schedule(15000); } ...
Comment appliquer correctement cela dans GWT
?
Si vous connaissez le nombre de réponses à obtenir, vous pouvez utiliser cette approche:
class TaskCompletedHandler{ // inner class private static final int NUMBER_OF_RESPONSES = 4;//just example private int tasksCompleted; public void notifyOfCompletedTask(){ tasksCompleted++; if (tasksCompleted == NUMBER_OF_RESPONSES){ blockerWindow.hide(); } } }
Créez une instance de cette classe avant d'afficher la fenêtre modale, puis informez ce gestionnaire dans AsyncCallback
service1.findDependenciesForListBox1(id1, new AsyncCallback<List<Dependency1DTO>>() { public void onFailure(Throwable caught) { taskCompletedHandler.notifyOfCompletedTask(); // exception handling here } public void onSuccess(List<Dependency1DTO> data) { taskCompletedHandler.notifyOfCompletedTask(); // listBox1 filling here } });