2

我在java中工作。我正在尝试使用 ok 命令和 back 命令在视觉设计之间切换。我有一个可显示的表单,我在主类 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

4

1 回答 1

3

如果您的 A 类扩展Form或您的 A 类是Displayable,那么在 Back 命令中,您可以告诉switchDisplayable(null, a)

如果您的 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,但它似乎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());
            }

        });
    }

}
于 2013-01-23T06:31:05.310 回答