Estructura básica de un MIDlet Paquetes necesarias para la construcción de un MIDlet: - import javax.microedition.midlet.*; Paquete para usar el perfil MIDlet. - import javax.microedition.lcdui.*; Proporciona un conjunto de métodos y clases para la implementación de interfaces de usuario. Declaración de la clase principal: Cada MIDlet debe extender de javax.microedition.midlet.midlet. El constructor no tiene argumentos. Conceptualmente los MIDlets son similares a los applets. Pueden ser descargados. Ejecutan en el entorno del dispositivo. La siguiente es la sintaxis para la declaración de la clase principal public class NombreClase extends MIDlet implements CommandListener Como se puede notar, la clase debe heredar de la clase MIDlet, e implementar la clase CommandListener para lograr interactividad con el usuario. Métodos de un MIDlet: La clase MIDlet posee los siguientes métodos que representan cada uno de los estados de un MIDlet: startapp(). pauseapp(). destroyapp(). Para manejar las acciones de los diferentes comandos se utiliza el método commandaction().
Creación de un MIDlet: Crear un nuevo proyecto en KToolbar de J2ME Wireless Toolkit: - Clic File - Clic New Project - Poner un nombre al proyecto - Poner un nombre a la clase (debe ser el mismo nombre del proyecto) - Clic Create Project - Clic ok Escribir código en J2ME: El código J2ME, se debe escribir en cualquier editor de texto, luego se debe guardar en la carpeta: C:\WTK20\apps\NombreProyecto\src La clase principal se debe guardar con el mismo nombre del proyecto, y todas las clases deben tener la extensión.java Navegación en la pantalla de un MIDlet: Una aplicación MIDP, a excepción de las demasiado sencillas, siempre utilizará más de una pantalla, por lo que resulta necesario una herramienta que permita a los usuarios desplazarse de una pantalla a otra según lo requiera la propia MIDlet. El paquete javax.microedition.lcdui proporciona la clase Command, la cual captura la información de un evento. Un comando creado con la clase Command solamente contiene información sobre él mismo, no de la acción que realiza cuando está activado, la acción está definida en un objeto de la interfaz CommandListener asociado con la pantalla. A continuación se muestra como declarar un comando: Command micomando=new Command("Mio", Command.SCREEN,2); Los tres parámetros que el constructor de la clase Command debe incluir son los siguientes: -Etiqueta: Una cadena de caracteres usada para la presentación visual del comando. -Tipo: Especifica su intención, es decir, la acción que realizará el comando. Algunos tipos pueden ser: -Command.SCREEN. -Command.EXIT.
-Command.BACK. -Command.ITEM -Prioridad: Describe la importancia del comando con respecto a otros en pantalla. Una prioridad de 1 indica al comando más importante. Cuando una MIDlet se ejecuta, el dispositivo escoge el lugar de un comando basándose en su tipo (abajo y a la izquierda para salir, por ejemplo) y coloca los comandos similares con base en su valor de prioridad. Considérese una aplicación con los siguientes comandos: Command cerrar=new Command("Cerrar", Command.EXIT,1); Command micom=new Command("Info", Command.SCREEN,2); Command micom2=new Command("Comprar", Command.SCREEN,2); En este ejemplo, el manejador de la aplicación coloca el comando Cerrar en la pantalla y crea un menú para mantener Info y Comprar. Presionando la tecla correspondiente al menú, el usuario, es llevado a otra pantalla donde puede seleccionar alguna de las dos opciones. Eventos de alto nivel: Ejemplo de menú El manejo de eventos en la api de alto nivel se basa en un modelo de escucha o escuchante (listener, en inglés). Los objetos Screen y Canvas pueden tener "escuchantes" para comandos. Para que un objeto pueda ser un escuchante, debe implementar la interfaz CommandListener. Los comandos se agregan a un objeto con el método addcommand y se registra un escuchante con el método CommandListener. Ambos métodos pertenecen a la clase Displayable y son heredados por Screen y Canvas.
La interfaz CommandListener: Esta interfaz es para MIDlets que necesitan recibir eventos de alto nivel. Esta interfaz tiene un método que todo escuchante debe implementar, el método CommanAction. public void CommanAction(Command c, Displayable d) { El parámetro c es un objeto Command que identifica al comando que fue agregado al d (objeto Displayable) con el método addcommand. El parámetro d es el objeto visible (Form, Canvas, Screen) donde el evento ocurre. Dentro de las llaves ({ ) se introduce el código que se habrá de ejecutar al ocurrir un evento. public void commandaction(command c, Displayable s) { if (c == CmdSalir) { destroyapp(false); notifydestroyed(); En el trozo de código mostrado arriba se emplea una decisión if para identificar qué comando es el que ha sido activado, si se trata del comando CmdSalir se destruye la aplicación, es decir, se cierra y se notifica su destrucción. Primer MIDlet: Se iniciará con el clásico código fuente de una aplicación que lo único que hace es mostrar un mensaje en la pantalla, en este caso el mensaje es " Hola mundo!". import javax.microedition.lcdui.*; import javax.microedition.midlet.*; Se comienza por importar los paquetes que son obligatorios para cualquier MIDlet. Esto puede variar dependiendo de la finalidad de la clase a crear, pero para una clase que será la principal de su paquete, es forzoso el importar las clases del paquete javax.microedition.midlet y lcdui se requiere para las operaciones de entrada y salida de información. public class HolaMundo extends MIDlet implements CommandListener { Se inicia el código de la clase, la cual extiende (o hereda) la clase MIDlet, necesaria, como ya se dijo, para la creación de clases ejecutables, además se implementa la interfaz CommandListener, esta interfaz define una estructura de clase en la que se
deben declarar unos objetos llamados comandos, los cuales responderán a alguna acción del usuario. private Form Forma1; Se ha instanciando un objeto de la clase Form, que, como ya se vio, pertenece al paquete lcdui. Un objeto Form define una pantalla donde se agregarán objetos de entrada y salida de datos por teclado y pantalla, respectivamente. public HolaMundo() { Forma1 = new Form(" Hola mundo!"); Forma1.append(new StringItem(null, " Hola mundo!")); Forma1.addCommand(new Command("Salir", Command.EXIT, 1)); Forma1.setCommandListener(this); En la sección de arriba se describe el constructor de la clase, el cual debe llevar el mismo nombre que la clase, sin especificar tipo y de acceso público. En un constructor de clase se establecen los valores que han de tomar las variables, se crean las instancias de las clases, en fin, se define como habrá de presentarse, al arrancar, la aplicación al usuario. Al iniciar el constructor se instancia un objeto Form con título " Hola mundo!" y de nombre Forma1, enseguida, a esa misma forma se le agrega un elemento SringItem sin etiqueta (título o descripción) y con un contenido igual a " Hola mundo!", se agrega también, un comando, los comandos son las opciones que, en un teléfono celular, aparecen en la parte inferior de la pantalla y que el usuario puede seleccionar presionando las teclas que se encuentran debajo del texto; ese comando tiene por texto o etiqueta la palabra "Salir", es del tipo EXIT y de prioridad 1. En un comando, la prioridad indica la importancia de ese comando con respecto a otros en la pantalla, dicha prioridad puede ir de 1 a 10, siendo 1 el valor de prioridad más alto. public void startapp() { Display.getDisplay(this).setCurrent(Forma1); El método startapp es el que se ejecuta después del constructor, en el se encuentran las instrucciones que serán ejecutadas por la aplicación (es como el procedimiento main de las aplicaciones en C o Java). En el ejemplo, se utiliza un objeto Display que se encarga del control de la pantalla, un método getdisplay(this), el cual arroja como resultado la pantalla del dispositivo (como salida de datos para
la MIDlet this, la actual) y otro método setcurrent(forma1), que indica que lo que se ha de mostrar en la pantalla será lo contenido en Forma1. public void pauseapp() { public void destroyapp(boolean condicion) { public void commandaction(command c, Displayable s) { notifydestroyed(); Las funciones pauseapp y destroyapp, también son obligatorias de cualquier clase MIDP (sea la principal del proyecto o no), en pauseapp se pueden definir las acciones a tomar cuando la aplicación sea pausada por el usuario, por la misma aplicación o por otra; destroyapp indica lo que se realizará antes de cerrar la aplicación. El método commandaction define lo que se hará con los comandos de la MIDlet, como en el ejemplo sólo se tiene un comando basta con notificar la destrucción de la aplicación Para ver el funcionamiento del MIDlet creamos un nuevo proyecto en KToolbar de J2ME Wireless Toolkit con el nombre de HolaMundo, guardamos el código fuente anterior en un bloc de notas con el nombre de HolaMundo.java en la carpeta: C:\WTK20\apps\HolaMundo\src A continuación se muestra el código fuente completo:
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class HolaMundo extends MIDlet implements CommandListener { private Form Forma1; public HolaMundo() { Forma1 = new Form(" Hola mundo!"); Forma1.append(new StringItem(null, " Hola mundo!")); Forma1.addCommand(new Command("Salir", Command.EXIT, 1)); Forma1.setCommandListener(this); public void startapp() { Display.getDisplay(this).setCurrent(Forma1); public void pauseapp() { public void destroyapp(boolean condicion) { public void commandaction(command c, Displayable s) { notifydestroyed(); Luego de realizar el procedimiento anterior, presionamos sobre J2ME Wireless Toolkit el botón build y luego presionamos el botón run. Taller: Interprete e implemente la clase Textbox, la cual se muestra a continuación. La clase Textbox La clase TextBox, genera objetos de pantalla completa, como Form,la diferencia es que TextBox únicamente permite la introducción de texto y el manejo de comandos. A continuación se presenta un ejemplo sencillo: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class TextBoxDemo extends MIDlet implements CommandListener {
private Command CmdSalir; private Display display; private TextBox t = null; De esta primera parte sólo hay que resaltar la creación de un objeto TextBox de nombre t y valor nulo. public TextBoxDemo() { display = Display.getDisplay(this); CmdSalir = new Command("Salir", Command.EXIT, 2); t = new TextBox("Hola", "Esto es una prueba", 256, 0); t.addcommand(cmdsalir); t.setcommandlistener(this); En el constructor de la MIDlet se observa la designación del contenido de la pantalla (esta MIDlet), la creación de un comando de salida de prioridad 2, la instanciación de t con título "Hola", texto inicial "Esto es una prueba", longitud máxima de texto de 256 caracteres y tipo 0, los tipos son valores constantes que la clase TextBox interpreta para permitir la entrada de algunos caracteres e impedir la de otros, en el ejemplo el tipo 0 es la constante Textfield.ANY, que indica que se puede introducir cualquier carácter (también existen Textfield.NUMERIC, TextField.DECIMAL y TextField.PHONENUMBER, entre otras). Después de creado el objeto t, se le agrega el comando CmdSalir. public void startapp() { display.setcurrent(t); En el método startapp se indica que el elemento en pantalla será t. public void pauseapp() { public void destroyapp(boolean condicion) {
public void commandaction(command c, Displayable s) { if (c == CmdSalir) { destroyapp(false); notifydestroyed(); Cuando una MIDlet tiene más de un comando (aunque no es el caso de esta) se puede realizar una decisión con el parámetro c para definir las acciones a tomar en cada comando.