4

在某些情况下,我想在长时间运行的查询时向用户显示一个带有进度条的模式窗口。(对于单个 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我无法做到的方法隐藏窗口。

我可以使用 a timer,但我事先不知道要传入哪个时间schedule

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

如何正确实现这一点GWT

4

1 回答 1

0

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

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
   }
});
于 2013-10-06T22:26:00.567 回答