Java 用于长任务的带有progressbar的模式窗口

Java 用于长任务的带有progressbar的模式窗口,java,javascript,gwt2,Java,Javascript,Gwt2,在某些情况下,我希望在长时间运行查询时向用户显示一个带有进度条的模式窗口。(对于单个UI项,我使用方法setEnabled(true/false),但我想要更优雅的解决方案。) 例如,在入口点中,直到所有元素未初始化为止- public void onModuleLoad() { // initialization of the interface here } 此外,例如,在完成依赖列表框时(一对多关系) 在我的例子中,我可以使用以下方法来显示带有进度条的窗口- private voi

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

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

public void onModuleLoad() {
   // initialization of the interface here
}
此外,例如,在完成依赖列表框时(一对多关系)

在我的例子中,我可以使用以下方法来显示带有进度条的窗口-

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

如何在GWT中正确实现这一点?

如果您知道要获得的响应数量,可以使用以下方法:

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
   }
});
service1.FindDependencesforListBox1(id1,新的AsyncCallback()){
失败时的公共无效(可丢弃){
taskCompletedHandler.notifyOfCompletedTask();
//这里的异常处理
}
成功时公开作废(列表数据){
taskCompletedHandler.notifyOfCompletedTask();
//列表框1在此填充
}
});
...
blockerWindow.show();   
private void unfreezeInterface() {
   timer = new Timer() {
      public void run() {
         blockerWindow.hide();
      }
   };
   timer.schedule(15000);
}
...
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(); 
        }
    }
}
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
   }
});