2017-02-27 44 views
2

我需要一些幫助來理解Dialog.dispose()的一些奇怪行爲。我正在嘗試創建一個「加載」對話框,以便在用戶查看內容之前下載內容。在這種情況下,這是一個聲音文件。CN1 - Dialog.dispose()導致父窗體「返回」

我遇到的問題是,當我在dispose()「加載」對話框中,當前表單在模擬器上接收到「返回」命令並轉換到導航堆棧上的前一個表單。

我預先創建在程序中的對話框啓動initVars具有以下:

Dialog updatingDialog = new Dialog(updatingMessage); 
updatingDialog.setLayout(new BoxLayout(BoxLayout.Y_AXIS)); 
updatingDialog.add(progressContainer); 
updatingDialog.setDialogUIID("UpdateProgressDialog"); 

我使用導航到(GUI生成器)形式與有問題的對話框:

showForm(formName, null) 

在這種形式,當用戶點擊一個按鈕時,我顯示對話框,請撥打downloadUrlToStorage(如果文件尚未緩存在存儲器中),然後撥打dialog.dispose()。這些是使用Runnables在不同的情況下傳遞給方法在另一個類的可重用性做:

showLoading.run(); 
Display.getInstance().invokeAndBlock(()->{ 
    Util.downloadUrlToStorage(this.url, getStoredName(), false); 
}); 
hideLoading.run(); 

showLoadinghideLoadingRunnables傳遞到從調用方法的方法。下面是他們是如何設置的(負載加載對話框):

showLoading = new Runnable() { 
    @Override 
    public void run(){ 
    if (!load.isVisible()){ 
      load.showModeless(); 
     } 
    } 
}; 

hideLoading = new Runnable() { 
    @Override 
    public void run(){ 
     if (load.isVisible()){ 
      load.dispose(); 
     } 
    } 
}; 

那麼,有一個明顯的原因Dialog.dispose()可能會導致從顯示轉換對話框後面的形式,我怎麼能阻止它?

+1

感謝格式化清理,但拼寫是正確的......這就是我拼寫「行爲」 - 加拿大呃! ;-) –

+0

對不起,這是由我的自動更正語法插件完成的。 – Diamond

回答

2

好的,我相信我通過一些試驗和錯誤來解決我的問題,但我想分享我是如何解決它的,以防其他人發現類似的事情發生。

我意識到反覆使用同一個對話框可能會使事情複雜化,所以我開始爲每個加載消息創建一個新的對話框,而我似乎已經糾正了行爲(是的,我拼寫了加拿大的方式! )。

這使我得出結論,一個對話框綁定到一個窗體,然後當它再次操作時,它可以影響原始窗體。它在我的問題中處理的「返回」形式與對話框首次顯示的形式相同,這導致我認爲這是原因。

CodenameOne的任何人都可以證實我的診斷:在不同的窗體上重新使用對話框會導致意想不到的導航效果,並且是避免的最佳做法嗎?

+0

是的,重複使用'Dialog'實例一直存在問題,因爲父對象存儲在對話框中,所以dispose可以「去」到正確的位置。最初我們認爲這是我們可以解決的問題,但是有一些非常棘手的邊緣案例阻止了這一點。好消息是創建一個新實例**非常便宜**。 –