2012-05-03 3 views
2


Я застреваю, пытаясь понять, как создать обратную команду на предыдущем экране.
Страница, на которую я пытаюсь вернуться, не имеет формы, но есть список, но когда я установил прослушиватель команд «back»
«назад», это просто похоже на исключение нулевого указателя.J2ME Обратная команда - возврат к предыдущему экрану

Вот мой основной класс

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

ответ

-1

ошибка в том, что нет ни одной переменной называется список, то решение состоит в том, чтобы просто изменить код под вашей задней кнопкой от

display.setCurrent (list)

в

display.setCurrent (CalFrontEnd.list)

0

нерациональное использование наследования привел вас в неприятности. Посмотрите, есть поле list в классе SelectDate, но оно не видно в коде, потому что оно унаследовано от суперкласса (extends CalFrontEnd и protected List list - вот где все твоя проблема действительно начинается).

При создании экземпляра SelectDate (new SelectDate(display)) это поле инициализируется с помощью null - и вы никогда не меняете его после этого. Вам трудно заметить, что само декларация list похоронена в другом файле в суперклассе. И, что делает вещи еще сложнее, компилятор не может помочь вам здесь, потому что поле видимо для него, и он считает, что все в порядке.

  • Вы знаете, это только начало ваших проблем, связанных с чрезмерным использованием наследства. Далее по дороге оживают новые головные боли. Подумайте, например, о том, что произойдет, если вы случайно удалите или переименуете commandAction в SelectDate? Компилятор будет думать, что все в порядке - просто потому, что у суперкласса тоже есть этот метод. Вы заметите, что что-то пошло не так, когда вы запускаете код и узнаете, что команды на выбранном экране даты перестают отвечать или начинают делать странные вещи. На самом деле было бы безопаснее скрыть CommandListener для обоих классов, чтобы избежать подобных ошибок, но это was discussed in another question.

Я настоятельно рекомендую уничтожить extends CalFrontEnd от SelectDate. Это поможет компилятору помочь вам найти различные логические проблемы в вашем коде.

Что касается списка, чтобы показать по команде Назад, вы можете, например, передать его в качестве дополнительного параметра конструктора, вроде как ниже:

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 
} 
0

Есть целый ряд проблем, касающихся вашего кода.

Один комара уже упоминался (Удалить extends CalFrontEnd в классе SelectData).

Во-вторых вы не вызывая select команды в commandAction вашего кода (команда, которую вы звоните, List.SELECT_COMMAND, который не является select). Так что измените if (command == List.SELECT_COMMAND) на if (command == select).

В-третьих документация commandAction в CommandListener объявляет свой второй параметр, чтобы быть Displayable в то время как вы объявляете его Display.

Смежные вопросы