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

时间:2013-01-23 05:40:58

标签: java-me

我在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

1 个答案:

答案 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将为您生成所需的代码。

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());
            }

        });
    }

}