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

标签 java codenameone

我正在 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 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,还适用于所有表单。

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

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

谢谢。

最佳答案

旧的 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
 }

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

关于java - 从每个表单导航中代号一个新的 gui builder-back 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51240465/

相关文章:

java - 在 GAE 的本地环境中发送电子邮件

java - Firebase 全局保存 query.addValueEventListener 数据

java - 代号一日历 UpdateButtonDayDate() 问题

java - 每次服务器关闭时连接都会关闭。已添加超时 10000000。

java - 检查流中的instanceof

java - 在代号一中加载联系人的最快、最可靠的方法

ios - 代号一推送通知未在 iOS 10 上注册

ios - Codename One 中使用 native code 时参数可以随意命名吗?

java - 调用 Web 服务的线程 - 如何控制线程状态?

java - 如何从代号为 ConnectionRequest 的 http 和不安全的 https 站点获取响应? Android 10 中的 http 和 https 问题(在 Google Pixel 中)