2013-10-05 69 views
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中。

我可以使用一個timer,但我不知道在schedule通過的時間。如何在GWT中正確實施?

回答

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

謝謝你爲你的答案! –

相關問題