Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 第二类的一个回调命令_Codenameone_Back - Fatal编程技术网

Codenameone 第二类的一个回调命令

Codenameone 第二类的一个回调命令,codenameone,back,Codenameone,Back,因此,我有一个Android应用程序,有两个类,A和B。back命令的逻辑在类A中设置,并按预期工作:按钮动作显示表单B,而Escape按钮将表单A返回 现在,在B类中加载表单之后,我需要“重新加载”它。为此,我创建了一个新表单,通过一个按钮再次调用整个类 在此过程中,“后退”命令停止工作(命令按钮显示在工具栏中),因为所有组件(工具栏、窗体等)都是新创建的,并且缺少类A中的定义 我的问题是:是否可以在类B中而不是在类A中定义back命令逻辑,以便在重新加载类B后back命令仍然工作,或者以某种

因此,我有一个Android应用程序,有两个类,A和B。back命令的逻辑在类A中设置,并按预期工作:按钮动作显示表单B,而Escape按钮将表单A返回

现在,在B类中加载表单之后,我需要“重新加载”它。为此,我创建了一个新表单,通过一个按钮再次调用整个类

在此过程中,“后退”命令停止工作(命令按钮显示在工具栏中),因为所有组件(工具栏、窗体等)都是新创建的,并且缺少类A中的定义

我的问题是:是否可以在类B中而不是在类A中定义back命令逻辑,以便在重新加载类B后back命令仍然工作,或者以某种方式定义对类A的引用以使其工作

下面是我已经拥有的代码。非常感谢您的建议

public class ClassA {

    private Command back; 
    private ClassB classB;
    private Form current;
    private Resources theme;
    private  Form formA;
    private Button button = new Button("Go forward");

    public void loadA() {

        showBack();

        formA = new Form("Old Form", BoxLayout.y());            
        classB = new ClassB();

        button.addActionListener(l -> {

            classB = new ClassB();
            classB.formB.getToolbar().setBackCommand(back);
            classB.formB.setBackCommand(back);

            classB.goBack();

            Button buttonToolbar = classB.formB.getToolbar().findCommandComponent(back);

            FontImage image = FontImage.createMaterial(FontImage.MATERIAL_10K, "test", 4);
            buttonToolbar.setIcon(image);


        });

        formA.add(button);
        formA.show();
    }

    public void showBack() {

        back = new Command("Back") {
                @Override
                public void actionPerformed(ActionEvent evt) {
                        formA.showBack();
                }
        };
    }

}

public class ClassB {

    public ClassA classA = new ClassA();
    public Form formB = new Form("New Form", BoxLayout.y());
    private Button buttonReload = new Button("Reload");

    public void reload () {

        buttonReload.addActionListener(l -> {

            ClassB classB = new ClassB();
            classB.reload();

            // I want to recreate the back-command logic here in Class B. 
            // The below doesn't work. 

            formB.getToolbar().setBackCommand(new Command("back"));

        });

        formB.add(buttonReload);
        formB.show();

    }

}

我不完全遵循逻辑,但如果您动态更新表单实例,可能您应该将导航逻辑移动到一个中心类,例如导航管理器,它也可以在必要时调用表单创建的逻辑,例如:

interface DynamicForm {
    public String getFormName();
    public Form createFormInstance();
}


public class NavigationManager {
    // ...
    public void register(DynamicForm df) {
        formRegistryMap.put(df.getFormName(), df);
    }

    public void clearFormCache() {
        formCache.clear();
    }

    public Form getFormInstance(String formName) {
        Form formCache = formCache.get(formName);
        if(formCache != null) {
            return formCache;
        }
        formCache = formRegistryMap.get(formName).createFormInstance();
        formCache.put(formName, formCache);
        return formCache;
    }
    // ...
}

下面是我使用的机制。这就是你要问的吗

public class A extends Form {
    public A() {
        super("A"); // set title
        Button b = new Button("B");
        b.addActionListener((ActionListener) (ActionEvent evt) -> {
            new B(this).show();
        });
        add(b);
    }
}

public class B extends Form {
    public B(Form a) {
        super("B"); // set title
        Command back = new Command("A") {
            @Override
            public void actionPerformed(ActionEvent evt) {
                a.showBack();
            }
        };
        getToolbar().setBackCommand(back);
    }
}
假设Toolbar.setGlobalToolbar(true)。实际上,我的setBackCommand代码更为复杂:

getToolbar().setBackCommand(back,
    Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW); 
Button backButton = getToolbar().findCommandComponent(back); 
FontImage.setMaterialIcon(backButton,
    ios() ? FontImage.MATERIAL_ARROW_BACK_IOS
          : FontImage.MATERIAL_ARROW_BACK);
我假设在a.showBack()之后,表单B有资格进行垃圾收集。如果上述机制不正确,那么我非常有兴趣了解正确的机制是什么(Shai?)

编辑:或不扩展类窗体:

void showA() {
    Form a = new Form("A");
    Button b = new Button("B");
    b.addActionListener((ActionListener) (ActionEvent evt) -> {
        showB(a);
    });
    a.add(b);
    a.show();
}

void showB(Form a) {
    Form b = new Form("B");
    Command back = new Command("A") {
        @Override
        public void actionPerformed(ActionEvent evt) {
            a.showBack();
        }
    };
    b.getToolbar().setBackCommand(back);
    b.show();
}

感谢您发布这个详细的答案。我发现实现起来有点困难,只是避免了丢失back函数,而不是调用一个新类,只是再次调用表单。我不得不删除相关的组件,但编写的代码更少。但是我会把导航管理器放在手边以备将来使用。酷,这正是我想要的。。。。优雅的解决方案,只需几行代码。谢谢。还有一个疑问:是否可以在不使用构造函数的情况下添加back命令?请参阅我答案中的编辑。这就是你的意思吗?是的,就是这个。。。非常感谢你的努力。。。这给了我,除了CN1。对Java工作原理的新见解