表单第二次调用时不显示

3

我为一款应用程序制作了一个简单的侧边菜单。第一次调用菜单时,它显示正常。

当我第二次调用菜单时,我看到一个空白屏幕。

这是我构建菜单的方式:

package com.mainsys.zappeion;


import static com.codename1.ui.CN.*;
import com.codename1.ui.Form;
import com.codename1.ui.Dialog;
import com.codename1.ui.plaf.UIManager;
import com.codename1.ui.util.Resources;
import com.codename1.io.Log;
import com.codename1.ui.Toolbar;
import com.codename1.ui.FontImage;

/**
 * This file was generated by <a href="https://www.codenameone.com/">Codename One</a> for the purpose 
 * of building native mobile applications using Java.
 */
public class Zappeion {

    private Form current;
    private Resources theme;

    public void init(Object context) {
        // use two network threads instead of one
        updateNetworkThreadCount(2);

        theme = UIManager.initFirstTheme("/theme");

        // Enable Toolbar on all Forms by default
        Toolbar.setGlobalToolbar(true);

        // Pro only feature
        Log.bindCrashProtection(true);

        addNetworkErrorListener(err -> {
            // prevent the event from propagating
            err.consume();
            if(err.getError() != null) {
                Log.e(err.getError());
            }
            Log.sendLogAsync();
            Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null);
        });        
    }

    public void start() {

        if(current != null){
            current.show();
            return;
        }

        Toolbar tb =    new Toolbar();

        Statues statues = new Statues();
        statues.setToolbar(tb);
        tb.addMaterialCommandToSideMenu("Αγάλματα", FontImage.MATERIAL_ALBUM, e -> { 
            statues.show();              
        });
        Sights sights = new Sights();
        sights.setToolbar(tb);
        tb.addMaterialCommandToSideMenu("Αξιοθέατα", FontImage.MATERIAL_ALBUM, e -> { 
            sights.show();              
        });
       Map map  = new Map();
       map.setToolbar(tb);
       tb.addMaterialCommandToSideMenu("Χάρτης ", FontImage.MATERIAL_ALBUM, e -> { 
            map.show();              
        });

        MainSys mns = new MainSys();
        mns.setToolbar(tb);
        SplashScreen sc = new SplashScreen(); //(sights, mns);
        sc.setToolbar(tb);
        sc.show();
    }

    public void stop() {
        current = getCurrentForm();
        if(current instanceof Dialog) {
            ((Dialog)current).dispose();
            current = getCurrentForm();
        }
    }

    public void destroy() {
    }

}

在上面的代码中,例如如果我点击菜单中的“景点表格”,它会正常显示。但是,如果我再次点击此菜单,则会得到一个空白屏幕,没有菜单工具栏和任何内容。
感谢您的帮助。
2个回答

0

Toolbar 是一种组件,它只能有一个父级,但您将其添加到了 3 个父级上。我猜测在控制台中会抛出一个异常来指示这一点。由于 Toolbar 的独特性质,可能不会引发异常。

我建议您不要创建工具栏,而是使用 form.getToolbar();,特别是因为您的代码已经声明了 Toolbar.setGlobalToolbar(true);


因此,由于setGlobalToolbar,如果我为三个表单中的一个设置工具栏,它将适用于所有表单。我不需要在每个添加的表单上添加命令。我会检查一下。如果不是这种情况,有没有一种适当的方法为所有的表单设置相同的工具栏? - Christoforos
不行。每个表单已经有自己的工具栏了。你不能使用一个工具栏实例在三个表单中。所有组件(包括工具栏)都有一个父级(getParent()),如果你将一个组件添加到多个表单中,它是行不通的。 - Shai Almog

0
实际上有效的代码如下所示。我不知道为什么它能够工作,因为从我的角度来看,它只是对代码进行了重新排序。我还做了一件事情,就是下载了新的皮肤(Galaxy S8、iPhone 8 Plus)并在它们上面进行了测试。但之后它也在我的旧皮肤(三星S7、iPhone 6)上工作了。这很奇怪,我不知道是否有人发现了更多的问题。
package com.mainsys.zappeion;


import static com.codename1.ui.CN.*;
import com.codename1.ui.Form;
import com.codename1.ui.Dialog;
import com.codename1.ui.plaf.UIManager;
import com.codename1.ui.util.Resources;
import com.codename1.io.Log;
import com.codename1.ui.Toolbar;
import com.codename1.ui.FontImage;

/**
 * This file was generated by <a href="https://www.codenameone.com/">Codename One</a> for the purpose 
 * of building native mobile applications using Java.
 */
public class Zappeion {

    private Form current;
    private Resources theme;

    public void init(Object context) {
        // use two network threads instead of one
        updateNetworkThreadCount(2);

        theme = UIManager.initFirstTheme("/theme");

        // Enable Toolbar on all Forms by default
        Toolbar.setGlobalToolbar(true);

        // Pro only feature
        Log.bindCrashProtection(true);

        addNetworkErrorListener(err -> {
            // prevent the event from propagating
            err.consume();
            if(err.getError() != null) {
                Log.e(err.getError());
            }
            Log.sendLogAsync();
            Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null);
        });        
    }

    public void start() {

        if(current != null){
            current.show();
            return;
        }        

        Statues statues = new Statues();
        Sights sights = new Sights();
        Map map  = new Map();
        MainSys mns = new MainSys();
        SplashScreen sc = new SplashScreen(sights, mns);
        BrowserForm browser = new BrowserForm();

        Toolbar tb = statues.getToolbar();

        tb.addMaterialCommandToSideMenu("Αρχική", FontImage.MATERIAL_ALBUM, e -> { 
           sc.setTitle("Αρχική");
           sc.show();              
        });
        tb.addMaterialCommandToSideMenu("Αγάλματα", FontImage.MATERIAL_ALBUM, e -> { 
             statues.setTitle("Αγάλματα");
             statues.setUrl("https://www.zappeion.gr/el/statues");
             statues.show();              
        });

        tb.addMaterialCommandToSideMenu("Αξιοθέατα", FontImage.MATERIAL_ALBUM, e -> { 
            sights.show();              
        });


       tb.addMaterialCommandToSideMenu("Χάρτης ", FontImage.MATERIAL_ALBUM, e -> { 
            map.show();              
        });

        statues.setToolbar(tb);
        sights.setToolbar(tb);
        map.setToolbar(tb);
        mns.setToolbar(tb);
        sc.setToolbar(tb);
        sc.show();
    }

    public void stop() {
        current = getCurrentForm();
        if(current instanceof Dialog) {
            ((Dialog)current).dispose();
            current = getCurrentForm();
        }
    }

    public void destroy() {
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接