在某些情况下,我希望在长时间运行的查询时向用户显示带有进度条的模态窗口。 (对于单个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
?
答案 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
}
});