我在java工作。我正在尝试使用ok命令和后退命令在视觉设计之间切换。我有一个可显示的表单,我在我的主类A.java中命名了formA,在另一个类B.java中命名了一个formB。我在formA中使用了一个ok命令,在选择时,应该让用户使用form。
我在我的主类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。
任何人都可以告诉我为什么会发生这种情况以及如何解决它。所有我想要实现的是backCommand将用户从formB
带回formA答案 0 :(得分:3)
如果您的A类扩展Form
或您的A类是Displayable
,那么在后退命令中,您只需告诉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将为您生成所需的代码。
如果你手动编码,那么它将如下所示:
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
的编码方式,但似乎a
是null
。也许你可以告诉我完整的代码。通常不建议在构造函数中传递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());
}
});
}
}