J2ME后退命令 - 返回上一屏幕

时间:2012-05-03 21:03:48

标签: java-me command nullpointerexception midp lcdui

我一直试图找出如何在前一个屏幕上创建一个后退命令。
我试图返回的页面没有表单而是列表但是当我将“后退”命令监听器设置为它似乎抛出空指针异常的列表。

这是我的主要课程

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

3 个答案:

答案 0 :(得分:0)

不恰当地使用继承会给你带来麻烦。看,list类中有一个SelectDate字段,但在代码中不可见,因为它是从超类继承而来的(extends CalFrontEndprotected List list是你所有麻烦的地方开始)。

当您创建SelectDate实例(new SelectDate(display))时,此字段将使用null初始化 - 之后您永远不会更改它。你很难注意到因为list的声明被隐藏在超类中的其他文件中。并且,这使得事情变得更加困难,编译器无法帮助您,因为该字段对于它是可见的并且它认为事情是正常的。

  • 你知道,这只是你过度使用遗产的麻烦的开始。更进一步,更多的头痛等待发生。想一想如果您在SelectDate中意外删除或重命名commandAction会发生什么?编译器会认为它是正确的 - 只是因为超类也有这种方法。当您运行代码并发现选择日期屏幕上的命令停止响应或开始做奇怪的事情时,您只会注意到某些神秘方式出现问题。实际上为两个类隐藏CommandListener会更安全,只是为了避免这种错误,但是was discussed in another question

强烈建议从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
}

答案 1 :(得分:0)

您的代码存在许多问题。

一个gnat已经提到过(在extends CalFrontEnd课程中删除SelectData)。

其次,您没有在代码的select中调用commandAction命令(您调用的命令是List.SELECT_COMMAND,而不是select)。因此,将if (command == List.SELECT_COMMAND) 更改为if (command == select)

第三,commandActionCommandListener的文档声明其第二个参数为Displayable,而您使用Display声明它。

答案 2 :(得分:-1)

错误是没有名为list的变量,但解决方法是简单地更改后退按钮下的代码

  

display.setCurrent(列表)

  

display.setCurrent(CalFrontEnd.list)