2


我一直在试图弄清楚如何创建一个返回到前一个屏幕的命令。
我试图返回的页面没有表单,而是一个列表,但是当我将
“返回”命令侦听器设置为列表时,它似乎只是抛出了一个空指针异常。

这是我的主要课程

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 会更安全,但这已在另一个问题中讨论过

强烈建议extends CalFrontEndSelectDate 中删除。这将帮助编译器帮助您找到代码中的各种逻辑问题。

至于通过 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

您的代码存在许多问题。

一只蚊子已经提到过(extends CalFrontEndSelectData课堂上移除)。

其次,您没有select在代码中调用命令commandAction(您调用的命令是List.SELECT_COMMANDwhich is not select)。所以if (command == List.SELECT_COMMAND) 改为if (command == select).

第三个commandActionin的文档CommandListener声明它的第二个参数是Displayable当你用 . 声明它时Display

于 2012-05-07T09:23:18.683 回答
-1

错误是没有称为列表的变量,但是解决方案是简单地更改后退按钮下的代码

display.setCurrent(列表)

display.setCurrent(CalFrontEnd.list)

于 2012-05-04T09:49:30.937 回答