2

私はJava meで働いています。ok コマンドと back コマンドを使用してビジュアル デザインを切り替えようとしています。メインクラス A.java に formA という名前の表示可能なフォームがあり、別のクラス B.java に formB があります。私はフォームAでokコマンドを使用しましたが、これは選択時にユーザーをフォームBに連れて行くはずです。

メインクラスの A.java コンストラクターで B.java への参照を作成しました

B b;

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

これで、formA の commandAction から getFormB メソッドを呼び出すことができます。次に、A.java の formA に戻るはずの backCommand を追加し、A.java で行ったのと同じ方法で B.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である場合、[戻る]コマンドで、と言うことができますswitchDisplayable(null, a)

Aクラスがではない場合は、FormAクラスに次のメソッドがあることを確認してください。

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

アップデート:

NetBeansを使用している場合は、「フロー」タブを開き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.javastartApp() (これは、、などのMIDletライフサイクルを配置する場所です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 に答える