Fenêtre modale avec barre de progression pour les tâches longues

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 } });