Comando J2ME Atrás: volver a la pantalla anterior


Estoy atascado tratando de descubrir cómo crear un comando de regreso a la pantalla anterior.
La página a la que estoy tratando de regresar no tiene un formulario sino una Lista, pero cuando configuro el
El oyente del comando 'atrás' a la lista parece arrojar una excepción de puntero nulo.

Aquí está mi clase principal

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

Y esta es la clase en la que estoy tratando de usar el botón Atrás

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

preguntado el 03 de mayo de 12 a las 22:05

3 Respuestas

El uso inapropiado de la herencia te ha traído problemas aquí. Mira, hay un list campo en SelectDate clase pero no es visible en el código, porque se hereda de la superclase (extends CalFrontEnd y protected List list es donde todos sus problemas realmente comienzan).

Cuando crea una instancia de SelectDate (new SelectDate(display)) este campo se inicializa con null - y nunca lo cambias después de eso. Es difícil para ti notar que debido a que la misma declaración de list está enterrado en otro archivo en la superclase. Y, lo que complica aún más las cosas, el compilador no puede ayudarlo aquí porque el campo es visible para él y cree que todo está bien.

  • Sabes, esto es solo el comienzo de tus problemas relacionados con el uso excesivo de la herencia. Más adelante, le esperan más dolores de cabeza. Piense, por ejemplo, en lo que sucedería si accidentalmente elimina o cambia el nombre de commandAction en SelectDate. El compilador pensará que está bien, solo porque la superclase también tiene este método. Solo notará que las cosas salieron mal de alguna manera misteriosa cuando ejecute el código y descubra que los comandos en la pantalla de selección de fecha dejan de responder o comienzan a hacer cosas extrañas. En realidad, sería más seguro ocultar CommandListener para ambas clases solo para evitar este tipo de errores, pero eso fue discutido en otra pregunta.

I fuertemente recomendado para acabar con extends CalFrontEnd de Seleccionar fecha. Eso ayudará al compilador a ayudarlo a encontrar varios problemas lógicos en su código.

En cuanto a la lista que se muestra con el comando Atrás, puede, por ejemplo, pasarla como parámetro de construcción adicional, como se muestra a continuación:

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
}

contestado el 23 de mayo de 17 a las 11:05

Hay una serie de problemas con respecto a su código.

Un mosquito ya ha mencionado (Quitar extends CalFrontEnd in SelectData clase).

En segundo lugar, no estás llamando. select comando en commandAction de su código (el comando que está llamando es List.SELECT_COMMAND lo cual no es select). Así que cambia if (command == List.SELECT_COMMAND) a if (command == select).

En tercer lugar documentación de commandAction in CommandListener declara que su segundo parámetro es Displayable mientras lo declaras con Display.

contestado el 07 de mayo de 12 a las 10:05

el error es que no hay una variable llamada lista, sin embargo, la solución es simplemente cambiar el código debajo de su botón Atrás de

display.setCurrent(lista)

a

pantalla.setCurrent(CalFrontEnd.list)

contestado el 04 de mayo de 12 a las 10:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.