Codename One call Back Command from second Class
Codemane One call Back Command from second Class
所以,我有一个 Android 应用程序,其中包含两个 class es,A 和 B。后退命令的逻辑在 class A 中设置并按预期工作: 按钮操作显示表单 B,Escape 按钮返回表单 A。
现在,在 Class B 中加载表单后,我需要 "reload" 它。我通过创建一个新表单,通过一个按钮再次调用整个 class 来做到这一点。
在此过程中,后退命令停止工作(并且命令按钮出现在工具栏中),因为所有组件(工具栏,表单等)都是新创建的,并且缺少来自Class A.
我的问题:是否可以在 Class B 中而不是在 Class A 中定义后退命令逻辑,以便后退命令在重新加载后仍然有效 Class B,或者以某种方式定义对 Class 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();
}
}
我没有完全遵循逻辑,但如果您动态更新表单实例,也许您应该将导航逻辑移动到中央 class 例如导航管理器,必要时还可以调用表单创建逻辑,例如:
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(真)。实际上我的 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?)。
编辑:或不扩展 class 形式:
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();
}
所以,我有一个 Android 应用程序,其中包含两个 class es,A 和 B。后退命令的逻辑在 class A 中设置并按预期工作: 按钮操作显示表单 B,Escape 按钮返回表单 A。
现在,在 Class B 中加载表单后,我需要 "reload" 它。我通过创建一个新表单,通过一个按钮再次调用整个 class 来做到这一点。
在此过程中,后退命令停止工作(并且命令按钮出现在工具栏中),因为所有组件(工具栏,表单等)都是新创建的,并且缺少来自Class A.
我的问题:是否可以在 Class B 中而不是在 Class A 中定义后退命令逻辑,以便后退命令在重新加载后仍然有效 Class B,或者以某种方式定义对 Class 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();
}
}
我没有完全遵循逻辑,但如果您动态更新表单实例,也许您应该将导航逻辑移动到中央 class 例如导航管理器,必要时还可以调用表单创建逻辑,例如:
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(真)。实际上我的 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?)。
编辑:或不扩展 class 形式:
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();
}