我一直试图找出如何在前一个屏幕上创建一个后退命令。
我试图返回的页面没有表单而是列表但是当我将“后退”命令监听器设置为它似乎抛出空指针异常的列表。
这是我的主要课程
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);
}
}
}
答案 0 :(得分:0)
不恰当地使用继承会给你带来麻烦。看,list
类中有一个SelectDate
字段,但在代码中不可见,因为它是从超类继承而来的(extends CalFrontEnd
和protected List list
是你所有麻烦的地方开始)。
当您创建SelectDate实例(new SelectDate(display)
)时,此字段将使用null
初始化 - 之后您永远不会更改它。你很难注意到因为list
的声明被隐藏在超类中的其他文件中。并且,这使得事情变得更加困难,编译器无法帮助您,因为该字段对于它是可见的并且它认为事情是正常的。
我强烈建议从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)
。
第三,commandAction
中CommandListener
的文档声明其第二个参数为Displayable
,而您使用Display
声明它。
答案 2 :(得分:-1)
错误是没有名为list的变量,但解决方法是简单地更改后退按钮下的代码
display.setCurrent(列表)
到
display.setCurrent(CalFrontEnd.list)