带有进度条的模态窗口,用于长任务

时间:2013-10-05 18:30:04

标签: java javascript gwt2

在某些情况下,我希望在长时间运行的查询时向用户显示带有进度条的模态窗口。 (对于单个UI项目,我使用方法setEnabled (true/ false),但我想要更优雅的解决方案。)

例如,在入口点,直到所有元素都未初始化 -

public void onModuleLoad() {
   // initialization of the interface here
}

并且,例如,当完成从属列表框(关系一对多)时

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

Vaadin个应用程序中,我可以向侦听器添加以下代码,例如 -

...
Thread thread = new Thread() {
    @Override
    public void run() {                 
       // some initialization here 
       window.removeWindow(blockerWindow);
    }
};  

thread.start();             
blockerWindow = new BlockerWindow();
window.addWindow(blockerWindow);
...

在我的情况下,我可以使用以下方法显示带有进度条的窗口 -

private void freezeInterface() {
   blockerWindow = new BlockerWindow()
   blockerWindow.setGlassEnabled(true);
   blockerWindow.setAnimationEnabled(true);
   blockerWindow.setModal(true);
   blockerWindow.center();
   blockerWindow.show();
}

隐藏窗口的方法 -

private void unfreezeInterface() {
   blockerWindow.hide();
}

问题是,何时隐藏窗口。

例如,在入口点有一系列查询 -

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

等等。

答案以一个先前未知的顺序出现,并用我不能的onSuccess方法之一隐藏窗口。

我可以使用timer,但我事先并不知道schedule传递的时间。

...
blockerWindow.show();   
private void unfreezeInterface() {
   timer = new Timer() {
      public void run() {
         blockerWindow.hide();
      }
   };
   timer.schedule(15000);
}
...

如何在GWT

中正确实现这一点

1 个答案:

答案 0 :(得分:1)

如果你知道要获得的回复数量,你可以使用这样的方法:

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

在显示模态窗口之前创建此类的实例,然后在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
   }
});