Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Codenameone CN1-Dialog.dispose()导致父窗体“关闭”;“后退”;_Codenameone - Fatal编程技术网

Codenameone CN1-Dialog.dispose()导致父窗体“关闭”;“后退”;

Codenameone CN1-Dialog.dispose()导致父窗体“关闭”;“后退”;,codenameone,Codenameone,我需要一些帮助来理解对话框的一些奇怪行为。dispose()。我试图创建一个“加载”对话框,在允许用户查看内容之前,在下载内容时使用该对话框。在这种情况下,它是一个声音文件 我遇到的问题是,当我dispose()打开“加载”对话框时,当前表单在模拟器上收到一个“返回”命令,并转换到导航堆栈上的上一个表单 我在程序开始initVars时使用以下命令预创建对话框: Dialog updatingDialog = new Dialog(updatingMessage); updatingDialog.

我需要一些帮助来理解
对话框的一些奇怪行为。dispose()
。我试图创建一个“加载”对话框,在允许用户查看内容之前,在下载内容时使用该对话框。在这种情况下,它是一个声音文件

我遇到的问题是,当我
dispose()
打开“加载”对话框时,当前表单在模拟器上收到一个“返回”命令,并转换到导航堆栈上的上一个表单

我在程序开始
initVars
时使用以下命令预创建对话框:

Dialog updatingDialog = new Dialog(updatingMessage);
updatingDialog.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
updatingDialog.add(progressContainer);
updatingDialog.setDialogUIID("UpdateProgressDialog");
我使用以下命令导航到带有问题对话框的(GUI Builder)表单:

showForm(formName, null)
在这种形式下,当用户单击按钮时,我会显示对话框,调用
downloardurltostorage
(如果文件尚未缓存在存储器中),然后调用
dialog.dispose()
。这些都是通过将
可运行文件
传递到另一个类中的方法来完成的,以便在不同情况下重用:

showLoading.run();
Display.getInstance().invokeAndBlock(()->{
    Util.downloadUrlToStorage(this.url, getStoredName(), false);
});
hideLoading.run();
showLoading
hideLoading
是从调用方法传递到方法中的
Runnables
。以下是它们的设置方式(加载是加载对话框):


那么,
Dialog.dispose()
是否有明显的原因导致对话框的显示形式从一个过渡到另一个,以及如何停止它???

好的,我相信我通过一些尝试和错误解决了我的问题,但我想分享一下我是如何解决的,以防其他人发现类似的问题绊倒他们

我意识到反复使用同一个对话框可能会使事情变得复杂,所以我开始为每个加载消息创建一个新的对话框,我似乎已经纠正了这种行为(是的,我用加拿大的方式拼写了它!;-D)

这让我得出这样的结论:对话框被绑定到表单上,然后当它再次被操作时,它会影响原始表单。在我的问题中,它在dispose上导航“返回”到的表单与对话框第一次显示的表单相同,这让我认为这就是原因所在


CodenameOne的任何人都可以确认我的诊断,即在不同表单上重复使用对话框可能会产生意外的导航后果,这是一种最好的避免方法?

感谢您进行了格式清理,但拼写是正确的。。。这就是我如何拼写“行为”-加拿大人,嗯!;-)很抱歉,这是由我的自动更正语法插件完成的。是的,重用
Dialog
实例一直是个问题,因为父实例存储在对话框中,因此dispose可以“转到”正确的位置。起初,我们认为这是我们可以解决的问题,但有一些非常棘手的边缘情况阻止了这一点。好消息是创建一个新实例非常便宜。我花了将近72个小时来整理它,因为在某些情况下,我还使用单独的非EDT线程来显示/删除对话框,这几乎让我发疯。通过使用
Display.getInstance().callSerialyAndWait(()->form.show())
在对话框之前显示正确的表单,修复了我的问题,否则,如果从单独的线程弹出对话框,对话框可能仍然会获得上一个表单
showLoading = new Runnable() {
    @Override
    public void run(){
    if (!load.isVisible()){
            load.showModeless();
        }
    }
};

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