2


前の画面に戻るコマンドを作成する方法を見つけようとして立ち往生しています。
戻ろうとしているページにはフォームではなくリストがありますが、
「戻る」コマンドリスナーをリストに設定すると、null ポインター例外がスローされるようです。

これが私のメインクラスです

import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;

/**
 * 
 */
public class CalFrontEnd extends MIDlet implements CommandListener 
{
    private Display display;
    protected List list = new List("Please Select a Option", List.IMPLICIT);
    private Command select = new Command("Select", Command.SCREEN, 1);
    private Command exit = new Command("Exit", Command.EXIT, 2);
    private Command save = new Command("Save,", Command.SCREEN, 2);
    private DateField calendar;


    /**
     * 
     */
    public CalFrontEnd() 
    {
        display = Display.getDisplay(this);   
        list.append("Select Date", null);
        list.append("Add Events", null);
        list.append("Remove Events", null);
        list.append("Browse Events", null);
        list.addCommand(select);
        list.addCommand(exit);
        list.setCommandListener(this);
    }


    /**
     * Start Application
     */
    public void startApp() 
    {
        display.setCurrent(list);
    }


    /**
     * Pause Application Method
     */
    public void pauseApp() 
    {}


    /**
     * Destroy Application Method
     */
    public void destroyApp(boolean unconditional)
    {}


    /**
     * 
     * @param command
     * @param displayable 
     */
    public void commandAction(Command command, Displayable displayable) 
    {
        if (displayable == list) {
            if (command == List.SELECT_COMMAND) {
                switch (list.getSelectedIndex()) {
                    case 0: // select Date
                        SelectDate myDate = new SelectDate(display);
                        myDate.BuildCalendar();
                        break;
                    case 1: //add Events
                        AddEvents myAEvents = new AddEvents(display);
                        myAEvents.BuildAddEvents();
                        break;
                    case 2: //Remove Events
                        RemoveEvents myREvents = new RemoveEvents(display);
                        myREvents.BuildRemoveEvents();
                        break;
                    case 3: //Browse Events
                        BrowseEvents myBEvents = new BrowseEvents(display);
                        myBEvents.BuildBrowseEvents();
                        break;
                }
            } else if (command == exit) {
                destroyApp(false);
                notifyDestroyed();
            }
        }         
    } 
}

そして、これは私が戻るボタンを使用しようとしているクラスです

import java.util.*;
import javax.microedition.lcdui.*;


/**
 * 
 */
public class SelectDate extends CalFrontEnd implements CommandListener 
{
    private DateField calendar;
    private Form form = new Form("Please Select a Date");
    private Command select = new Command("Select", Command.SCREEN, 1);
    private Command back = new Command("Back", Command.BACK, 2);
    private Command save = new Command("Save,", Command.SCREEN, 2);
    private Display display;


    /**
     * 
     */
    public SelectDate(Display display)
    {
        this.display = display;
    }


    /**
     * 
     */
    public void BuildCalendar()
    {
        calendar = new DateField("Date In :", DateField.DATE, TimeZone.getTimeZone("GMT"));
        form.append(calendar);
        form.addCommand(back);
        form.setCommandListener(this);
        display.setCurrent(form);
    }  


    /**
     * 
     * @param command
     * @param displayable 
     */
    public void commandAction(Command command, Display display)
    {
        if (command == back)
        {
            display.setCurrent(list);
        }
    }
}
4

3 に答える 3

0

継承の不適切な使用により、ここで問題が発生しました。ほら、クラスにlistフィールドSelectDateがありますが、スーパークラスから継承されているため、コードには表示されません(extends CalFrontEndそしてprotected List list、すべての問題が実際に始まる場所です)。

SelectDate ( new SelectDate(display)) のインスタンスを作成すると、このフィールドはnull- で初期化され、その後変更することはありません。listの宣言自体がスーパークラスの他のファイルに埋もれているため、それに気づきにくいです。そして、これは事態をさらに困難にします。コンパイラは、フィールドが可視であり、問​​題がないと信じているため、ここであなたを助けることはできません.

  • ご存知のように、これは継承の使いすぎに関連する問題の始まりにすぎません。さらに進むと、さらに多くの頭痛が起こるのを待っています。たとえば、SelectDate の commandAction を誤って削除したり、名前を変更したりした場合はどうなるでしょうか。スーパークラスにもこのメソッドがあるという理由だけで、コンパイラはそれで問題ないと判断します。コードを実行して、日付選択画面のコマンドが応答を停止したり、奇妙な動作を開始したりしたときに、奇妙な方法で問題が発生したことに気付くだけです。実際には、この種の間違いを避けるために、両方のクラスの CommandListener を非表示にする方が安全ですが、それについては別の質問で説明しました

SelectDateから一掃することを強くお勧めします。extends CalFrontEndこれは、コンパイラがコード内のさまざまな論理的な問題を見つけるのに役立ちます。

Back コマンドで表示するリストについては、たとえば次のように追加のコンストラクタ パラメータとして渡すことができます。

public class SelectDate implements CommandListener // drop "extends CalFrontEnd"
{
    // ...
    private Display display;
    private List list; // add the field for the list


    public SelectDate(Display display, List list) // add list as parameter
    {
        this.display = display;
        this.list = list; // initialize field
    }
    // ... commandAction code will get the right "list" now
}
于 2012-05-04T14:22:55.253 に答える
0

コードに関する多くの問題があります。

1 匹のブヨがすでに言及しています (クラス extends CalFrontEndで削除)。 次に、コード内でコマンドを呼び出していません (呼び出しているコマンドは、そうではありません)。に変更します。 3 番目に、 in のドキュメントでは、2 番目のパラメーターが であると宣言されています。SelectData

selectcommandActionList.SELECT_COMMANDselectif (command == List.SELECT_COMMAND) if (command == select)

commandActionCommandListenerDisplayableDisplay

于 2012-05-07T09:23:18.683 に答える
-1

エラーは list と呼ばれる変数がないことですが、解決策は単に戻るボタンの下のコードを

display.setCurrent(リスト)

display.setCurrent(CalFrontEnd.list)

于 2012-05-04T09:49:30.937 に答える