gpt4 book ai didi

java-me - 使用命令切换到扩展 MIDlet 的类中的 Displayable

转载 作者:行者123 更新时间:2023-12-04 05:14:23 25 4
gpt4 key购买 nike

我在java中工作。我正在尝试使用 ok 命令和返回命令在视觉设计之间切换。我有一个可显示的表单,我在主类 A.java 中命名为 formA ,在另一个类 B.java 中命名为 formB 。我在 formA 中使用了一个 ok 命令,它在选择时应该将用户带到 formB。

我在主类 A.java 构造函数中创建了对 B.java 的引用

B b;

// A.java constructor
public A() {
b = new B(this);
}

现在我可以从 formA 中的 commandAction 调用 getFormB 方法。然后我添加了一个 backCommand,它应该带我回到 A.java 中的 formA,我尝试在 B.java 中创建一个引用,就像我在 A.java 中所做的那样,但我在运行时收到了 SecurityException MIDletManager ERROR。我被建议向我的 B 类添加一个 A 属性并将实例作为构造函数参数接收,这样我就可以调用 getFormA() 方法来切换到 A.java 中的 formA
A a;

B(A a) {
this.a = a;
}

在命令操作中,我在 backCommand 上做了 ds:
switchDisplayable ( null , a.getFormA());
这已编译,但在运行时从 formB 中按 BACK 键时,我得到 java/lang/NullPointerException。

谁能告诉我为什么会发生这种情况以及如何解决。我想要实现的只是将用户从 formB 带回 formA 的 backCommand

最佳答案

如果您的 A 类扩展 Form或者你的A类是Displayable ,然后在 Back 命令中,你可以告诉 switchDisplayable(null, a) .

如果您的 A 类不是 Form ,然后确保您的 A 类具有以下方法:

public Form getFormA() {
return ...; // return the `Form` here so you will not get NullPointerException
}

更新:

如果您使用的是 NetBeans,您可以打开 Flow 选项卡并拖动 backCommand从formB到formA。 NetBeans 将为您生成所需的代码。

enter image description here

如果您手动编码,则它将如下所示:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ExampleMidlet extends MIDlet {

private Display display;
private Form formA;
private Form formB;
private Command formA_next;
private Command formB_back;

public void startApp() {
if (display==null) {
display = Display.getDisplay(this);

formA = new Form("Form A");
formA_next = new Command("Next", Command.SCREEN, 0);
formA.addCommand(formA_next);
formA.setCommandListener(new CommandListener() {

public void commandAction(Command c, Displayable d) {
if (c==formA_next) {
display.setCurrent(formB);
}
}
});

formB = new Form("Form B");
formB_back = new Command("Back", Command.BACK, 0);
formB.addCommand(formB_back);
formB.setCommandListener(new CommandListener() {

public void commandAction(Command c, Displayable d) {
if (c==formB_back) {
display.setCurrent(formA);
}
}

});
}
display.setCurrent(formA);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}

我不知道你是如何编码的 Form ,但似乎 anull .也许你可以给我看完整的代码。路过 this一般不推荐在构造函数中使用。顺便说一句,您仍然需要一个扩展 MIDlet 的“主”类。对吗?然后会有3个类,比如:

ExampleMiddlet.java (这是您放置 MIDlet 生命周期的地方,例如 startApp()pauseApp() 等):
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ExampleMidlet extends MIDlet {

private Display display;
private Form formA, formB;

public void startApp() {
if (display==null) {
display = Display.getDisplay(this);
formA = new FormA(this);
formB = new FormB(this);
}
display.setCurrent(formA);
}

public Form getFormA() {
return formA;
}

public Form getFormB() {
return formB;
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}

FormA.java (这是您放置 Form 内容的地方):
import javax.microedition.lcdui.*;

public class FormA extends Form {

private Command cmdNext;

public FormA(final ExampleMidlet midlet) {
super("Form A");
append("This is form A.");
cmdNext = new Command("Next", Command.SCREEN, 0);
addCommand(cmdNext);
setCommandListener(new CommandListener() {

public void commandAction(Command c, Displayable d) {
Display.getDisplay(midlet).setCurrent(midlet.getFormB());
}
});
}

}

FormB.java (这是您放置 Form 内容的地方):
import javax.microedition.lcdui.*;

public class FormB extends Form {

private Command cmdBack;

public FormB(final ExampleMidlet midlet) {
super("Form B");
append("This is form B.");
cmdBack = new Command("Back", Command.SCREEN, 0);
addCommand(cmdBack);
setCommandListener(new CommandListener() {

public void commandAction(Command c, Displayable d) {
Display.getDisplay(midlet).setCurrent(midlet.getFormA());
}

});
}

}

关于java-me - 使用命令切换到扩展 MIDlet 的类中的 Displayable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14473183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com