首页 文章

从每个表单导航中代理一个新的gui builder-back命令

提问于
浏览
3

我在NEW GUI构建器中的表单之间导航 . 旧版本默认情况下在每个表单上都有一个 back 按钮 .

每次在新表单中导航时,如何在每个表单中启用新gui构建器上的 back 按钮?尝试通过theme.res中的常量 . 默认情况下仍未启用 .

此外,方法“new form1.show”是在表单之间导航的最佳方式吗? (见代码)

假设名称文件:

Main.java, myapplication.java, Form1 ,Form2 ,Form3

导航代码,假设名称为 button1Form3

public void onbutton1ActionEvent(com.codename1.ui.events.ActionEvent ev) {
        new Form3().show();   
    }

Back 来自老gui建设者的命令,不在这里工作:

public Form showForm(String resourceName, Command sourceCommand) {
        try {
            Form f = (Form)formNameToClassHashMap.get(resourceName).newInstance();
            Form current = Display.getInstance().getCurrent();
            if(current != null && isBackCommandEnabled() && allowBackTo(resourceName)) {
                f.putClientProperty("previousForm", current);
                setBackCommand(f, new Command(getBackCommandText(current.getTitle())) {
                    public void actionPerformed(ActionEvent evt) {
                          back(null);
                    }
                });
            }
            if(sourceCommand != null && current != null && current.getBackCommand() == sourceCommand) {
                f.showBack();
            } else {
                f.show();
            }
            return f;
        } catch(Exception err) {
            err.printStackTrace();
            throw new RuntimeException("Form not found: " + resourceName);
        }
    }

我试过了:

form.setBackCommand(cmd);

public Command setBackCommand(String title, ActionListener<ActionEvent> listener)
public void setBackCommand(Command cmd)
public Command setBackCommand(String title, BackCommandPolicy policy, ActionListener<ActionEvent> listener)
public void setBackCommand(Command cmd, BackCommandPolicy policy)
    boolean onBack() {
            return true;
        }

https://www.codenameone.com/blog/toolbar-back-easier-material-icons.html main.javamyapplication.java 不接受命令 .

Form3.getToolbar().setBackCommand("", e -> Form3.showBack());

althouth不应仅适用于form3,而应适用于每种形式 .

也没用 . 将“后退命令”放在每个侧面菜单上都不是理想的解决方案,因为我们可能会从不同的形式导航到每个表单 .

EXTRA:有没有办法为所有表单启用全局工具栏和全局命令,所以我不复制粘贴每个新表单的工具栏代码?如果没有在这里回答,我可能会创建一个新的主题 .

谢谢 .

1 回答

  • 2

    旧的GUI构建器处理导航,因为它是在诺基亚成为移动电话行业的全球领导者时设计的,并且4英寸设备被认为是大型的 . 那时候我们假设每个表单的UI都比较简单,导航很难 .

    这改变了 . 但对于大多数开发人员来说,更大的问题是无状态导航的概念,这在设计和功能方面引发了很多问题 .

    新的GUI构建器不包含任何导航代码或任何全局代码 . 每种形式都独立存在 .

    说过你可以通过保留表单实例并显示你要导航到的表单来实现自己的状态机,例如:

    public static class Controller { 
        private static Form1 f1;
        private static Form2 f2;
    
    
        public static void showF1() {
             if(f1 == null) f1 = new Form1();
             f1.show();
        }
    
        // etc...
    }
    

    为简单起见,我使用静态上下文,但您可以实现自己的策略 . 请注意,您也可以在此处插入全局逻辑,例如将工具栏添加为以下函数:

    private static void initForm(Form f) {
        // add global commands to the toolbar
     }
    

    或者,您可以从公共基类派生所有表单,因为新的GUI构建器不会限制您的继承 .

相关问题