【问题标题】:Codename one new gui builder-back command from EVERY form navigation来自每个表单导航的代号一个新的 gui builder-back 命令
【发布时间】:2018-12-16 20:06:19
【问题描述】:

我正在新 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 builder 的命令,在这里不起作用:

 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.htmlmain.javamyapplication.java 上没有接受命令。

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

尽管如此,不应该只适用于 form3,而是每个表单。

也没有用。在每个侧面菜单上放置“返回命令”并不是理想的解决方案,因为我们可能会从不同的表单导航到每个表单。

额外: 有没有办法为所有表单启用全局工具栏和全局命令,所以我不会为每个新表单复制粘贴工具栏代码?如果这里没有回答,我可能会做一个新的线程。

谢谢。

【问题讨论】:

    标签: java codenameone


    【解决方案1】:

    旧的 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 构建器不会限制您的继承。

    【讨论】:

    • private void initForm(Form f) { // 向工具栏添加全局命令 } 这应该在主文件 myapplication.java 中吗?
    • 我将其固定为静态。这是您可以在控制器类中执行的操作的示例。您可以在那里为所有表单提供通用代码。
    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多