Codename One:继承 BaseForm 后为何没有侧边菜单和背景样式?
可以在继承 Form 的基类中统一配置侧边菜单和公共样式,供页面复用。目前的问题出在构造方法:它新建了一个 Form bForm,把菜单和样式配置在该对象上,但 Games 使用的是 taForm 实例。
为什么创建出的表单没有菜单和样式?
这段代码创建了两个独立的对象。首先创建一个 taForm 实例:
taForm contactsForm = new taForm();
它的构造方法又创建了一个 Form 对象:
Form bForm = new Form();
之后的 bForm.setUIID(...) 和 bForm.getToolbar() 只作用于后创建的 Form 对象。
taForm extends Form 表示 taForm 实例本身就是一个表单。构造方法中另建的对象,其配置不会因为继承关系而复制到当前实例。因此,应将公共配置直接应用于 this,并把菜单添加到当前实例的 Toolbar 上。
如何修改基类?
删除构造方法中的 new Form(),将原来对 bForm 的操作改为对当前实例的操作:
package com.tlassist.myapp;
import com.codename1.ui.Form;
import com.codename1.ui.Toolbar;
public class taForm extends Form {
public taForm() {
super();
this.setUIID("myStyledBackground");
this.setScrollable(true);
Toolbar tb = this.getToolbar();
tb.setUIID("ToolBar");
tb.getTitleComponent().setUIID("Title");
// 将原有侧边菜单创建代码放在这里。
// 菜单项应添加到上面的 tb。
// 原代码中引用 bForm 的位置,应按用途改为 this。
}
}
示例省略了原文未提供的菜单项实现。把现有菜单代码移到注释位置后,检查其中是否仍引用 bForm,或者是否又创建了其他 Form。如果只复制样式设置而没有迁移菜单创建代码,页面仍然不会出现菜单。
如果菜单回调需要操作所属页面,也应让它引用当前 taForm 实例,或明确传入需要操作的页面对象。
Games 中如何使用?
可以保留更新后的调用方式:
taForm contactsForm = new taForm();
contactsForm.setTitle("Games");
contactsForm.setLayout(hg);
这里假设 hg 已经初始化,并且是 setLayout(...) 接受的布局对象。后续添加内容和显示页面时,也应继续使用同一个 contactsForm 实例。
如果 6 种表单都需要相同菜单,可以分别创建 taForm 实例,再设置各自的标题、布局和内容。公共菜单的创建逻辑只需在基类中维护一份。
最初的报错还需要注意什么?
最初的代码还存在几处独立问题:
- 构造方法必须带括号,正确写法是
public taForm() { ... }。 - Java 构造方法不会被子类继承。如果只定义了无参构造方法,就不能使用
new taForm("Games", hg);可以采用更新后的无参构造加 setter 的写法,或自行增加匹配的构造方法。 - 类需要位于正确的源码目录和包路径中;跨包使用时,需要正确导入。
- 如果实际文件名确实是更新文字中的
taDorm.java,应改成与公开类名一致的taForm.java。
你已经通过调整类的位置解决了名称解析错误。菜单和背景仍然缺失,应先修正配置所用的对象。
修改后仍未生效时检查什么?
先确认实际显示的是配置过的 contactsForm,并检查后续代码是否替换了 Toolbar、清空了菜单,或重新设置了 UIID。
背景样式还依赖主题中存在对应的 UIID。代码使用的是 myStyledBackground,应与主题中的名称保持一致;问题末尾出现的 mystyledbackground 与它大小写不同。仅凭现有代码,无法确认主题资源是否配置正确。
Toolbar.setGlobalToolbar(true) 不能把 bForm 的菜单或样式转移到另一个实例上。如果应用初始化需要这项设置,应在创建相关表单之前按项目现有的初始化方式处理。当前故障仍应通过直接配置 this 及其 Toolbar 来修复。
备注:内容仅供参考。
