J2ME El manejo de los MIDlets.

Otros articulos de J2ME:
RMS: persistencia en J2ME.
RMS: persistencia en J2ME implementacion.

En estas lineas se describira la interaccion entre varias Forms (UI de J2ME) usando el MIDlet como controller (en alguna parte, alguna vez, lei que este fue el proposito de crear el MIDlet tal como lo conocemos).

Basicamente se usaran para este documento 3 elementos de J2ME:

  • MIDlet
  • Form
  • CommandListener

En un caracter practico, la clase MIDlet es el "public static void main(String[] args)" de J2ME, y como tal, consideralo el iniciador de la aplicación.

La Clase Form hereda de javax.microedition.lcdui.Screen y es el contenedor de items tales como: ChoiceGroup, CustomItem, DateField, Gauge, ImageItem, Spacer, StringItem, TextField, que son subclases de javax.microedition.lcdui.Item.

La interface CommandListener gestiona ciertos eventos, exactamente las opciones de la aplicacion.

El codigo siguiente es un ejemplo de una clase MIDlet y dos forms, en su forma basica:

public class Example extends MIDlet {

    public void startApp() {}
   
    public void pauseApp() {}
   
    public void destroyApp(boolean unconditional) {}
}

public class Uia extends Form implements CommandListener{

    public Uia(){
        super("UI A");
    }

    public void commandAction(Command c, Displayable d) {}
}

public class Uib extends Form implements CommandListener{

    public Uib(){
        super("UI B");
    }

    public void commandAction(Command c, Displayable d) {}
}

¿Entonces como lanzamos los objetos Form?

Primero debemos obtener la instancia de la clase Display, se obtiene ejecutando:

Display display = Display.getDisplay(this);

Despues de obtener la instancia, ejecutamos:

display.setCurrent(new Uia());

Ejecutando la linea anterior, se mostrara en la pantalla del dispositivo el titulo "UI A".

Ademas hay que agregar codigo en el metodo "destroyApp(boolean unconditional)" para que se pueda salis de la aplicacion.

El codigo quedaria asi:

public class Controller extends MIDlet {

   
    private Display display = null;
   
    public void startApp() {
        display = Display.getDisplay(this);
        showUIB();
    }
   
    public void pauseApp() {}
   
    public void destroyApp(boolean unconditional) {
        if (unconditional){
            if (display != null){
                display.setCurrent(null);
                notifyDestroyed();
            }
        }
    }

    public void showUIA(){
        display.setCurrent(new Uia(this));
    }
   
    public void showUIB(){
        display.setCurrent(new Uib(this));
    }
}

public class Uib extends Form implements CommandListener{

    private Command _UIA  = null;
    private Command _exit = null;

    private Controller controller    = null;
   
    public Uib(Controller controller){
        super("UI B");
       
        /*
            Se asigna el controller a esta clase, con el fin
            de poder tener acceso a los metodos para que el
            dispositivo muestre otro Form y se pueda salir de
            la aplicacion.
        */

        this.controller = controller;

        /*
            Se crean los comandos, es el menu que mostrara
            el dispositivo y se agregan al Form.
        */

        _UIA   = new Command("Ir a UIA" , Command.OK,   0);
        _exit  = new Command("Salir"    , Command.EXIT, 1);
       
        this.addCommand(_UIA);
        this.addCommand(_exit);
       

        /*
            Se le dice al Form que la clase Uib (ella misma)
            es la que va a manejar las opciones
        */

        this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable d) {
       
        /*
            Aqui se manejan las opciones o command.
        */

        if (c == _UIA){
            controller.showUIA();
        } else if (c == _exit){
            controller.destroyApp(true);
        }
    }
}

public class Uia extends Form implements CommandListener{

    public Uia(Controller controller){
        super("UI A");
    }

    public void commandAction(Command c, Displayable d) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

<code>