Programacion moviles JAVA ME

41
Análisis de tecnologías para aplicaciones en dispositivos móviles. 1.- Introducción. ¿Qué es un dispositivo móvil? Se trata de un aparato de pequeño tamaño y de poco peso, con pantalla y teclado, con pequeñas capacidades de procesamiento, memoria limitada y conexión (permanente o no) a una red. 1.1.- Clasificación de los dispositivos móviles. SmartPhones o "teléfonos inteligentes". PDA (Personal Digital Assistant - asistentes digitales personales) o PocketPC (PC de bolsillo). Handheld, o PCs de mano. Internet tables, que se encontrarían entre las PDA y los PC Ultramóviles (pequeños tablet PC). Según las fuentes que consultes puedes encontrar diversas clasificaciones donde se incluyan unos u otros tipos de dispositivos, como por ejemplo: Pagers (o buscapersonas), hoy día ya en desuso. Navegadores GPS. E-Readers (lectores de libros digitales). Pequeñas videoconsolas de mano. Cámaras digitales. Calculadoras programables. 2.- Limitaciones de las tecnologías móviles. Suministro de energía limitado. Procesadores con capacidad de cómputo reducida. Suelen tener una baja frecuencia de reloj por la necesidad de ahorrar energía. En algunos casos, por ejemplo, podrían no disponer de la capacidad de cálculos en punto flotante. Poca memoria principal (RAM). Almacenamiento de datos persistente reducido (pequeña memoria flash interna, tarjetas SD, etc.). Conexión a algún tipo de red intermitente y con ancho de banda limitado. Pantallas de reducidas dimensiones. Teclados con funcionalidad muy básica y muy pequeños. 3.- Tecnologías disponibles. Symbian OS, Android, iOS, Blackberry OS y Windows Phone. 3.1.- Hardware. 3.1.1.- Smartphones. Funcionamiento en multitarea. Acceso a Internet. Conectividad Wi-Fi, Bluetooth, etc. Posibilidad de conexión con un ordenador para cargar y descargar información. Normalmente con conexión USB o bien una conexión inalámbrica. Posibilidad de ampliación de memoria mediante tarjetas externas de memoria (por ejemplo SD). Pequeñas pantallas pero de alta resolución y/o con millones de colores. Posibilidad de pantallas táctiles o incluso multitáctiles (multitouch). Sensores (de orientación, de temperatura, de presión, acelerómetros, magnetómetros, etc.). Cámaras digitales integradas. Capacidades fotográficas. Grabación de audio y vídeo. Receptor GPS. Receptor de radio FM. Emisor de radio FM. Posibilidad de instalar y ejecutar aplicaciones sofisticadas. La principal arquitectura de microprocesadores utilizada para telefonía móvil es la diseñada por la empresa ARM ("Advanced RISC Machines", hoy día ARM Holdings. 3.1.3.- PDA. Una PDA (Personal Digital Assistant o asistente digital personal) u ordenador de bolsillo o Pocket PC o Palmtop Computer es un dispositivo móvil cuya funcionalidad original era la de gestión de datos personales. 3.2.- Sistemas operativos. Symbian OS. La mayoría de teléfonos móviles con Symbian son del fabricante Nokia (entre ellos la mayoría de los de la serie N). Android. Desarrollado inicialmente por Google y basado en el núcleo de Linux. El primer fabricante de móviles que lo incorporó fue HTC. iOS. Desarrollado por Apple para el iPhone y usado más tarde también para el iPod Touch y el iPad. Windows Phone (anteriormente llamado Windows Mobile). Desarrollado por Microsoft tanto para smartPhones como para otros dispositivos móviles (por ejemplo PDA). Algunos fabricantes de teléfonos móviles que incorporan este sistema operativo son Samsung, LG o HTC. Blackberry OS. Desarrollado por Research in Motion (RIM) para sus dispositivos Blackberry. HP webOS, desarrollado por Palm, adquirido por HP (Palm era la desarrolladora del más antiguo Palm OS). Está basado en un kernel de Linux. Palm OS. Desarrollado por PalmSource para PDA, aunque las últimas versiones también funcionan para smartPhones. Maemo OS. Desarrollado por Nokia para smartPhones, PDA e Internet tables. Bada. Desarrollado por Samsung. 3.2.1.- Symbian OS. Para el desarrollo de aplicaciones sobre Symbian se utilizó inicialmente una versión específica de C++, aunque hoy día se emplea C++ estándar con el framework Qt. Los entornos de desarrollo más habituales para programar sobre Symbian son Carbide.C++ (basado en Eclipse), o bien QtCreator. También se pueden desarrollar aplicaciones sobre Symbian utilizando Python (Python para S60), Adobe Flash o Java ME. 3.2.2.- Android. Para desarrollar aplicaciones sobre Android se necesita el kit de desarrollo de software para Android (Android SDK), proporcionado gratuitamente por Google. El lenguaje de programación que se utiliza es Java (y por tanto es necesario el JDK de Oracle para poder compilar programas Java). El IDE oficial es Eclipse (a partir de la versión 3.2) junto con el plugin ADT (Android Development Tools - herramientas de desarrollo para Android. 3.2.3.- Windows Phone. Para desarrollar aplicaciones sobre Windows Phone pueden utilizarse las tecnologías Silverlight y XNA de Microsoft, así como el entorno de desarrollo Visual Studio. 3.2.4.- iOS. Para desarrollar aplicaciones sobre iOS, las aplicaciones deben ser compiladas específicamente para este sistema operativo basado en la arquitectura ARM. Para ello puede utilizarse el kit de desarrollo iPhone SDK. El lenguaje de programación principal para este conjunto de herramientas es el Objective-C. Para poder utilizar este kit de desarrollo es necesario un ordenador MAC con un sistema operativo MAC OS X Leopard o superior. 3.3.- Plataformas de desarrollo y lenguajes de programación. Windows Phone. Para desarrollar aplicaciones sobre Windows Phone pueden utilizarse las tecnologías Silverlight, XNA y .NET Compact Framework de Microsoft. Las herramientas Visual Studio 2010 Express y Expression. El lenguaje más habitual para el desarrollo ha sido C#. Android . Google proporciona el Android SDK para programar aplicaciones en Java sobre su sistema operativo. El IDE más utilizado es Eclipse con el plugin ADT (Android Development Tools). También es posible programar en otros lenguajes como C o C++ gracias al uso del Android NDK (Native Development Kit) que permite generar código nativo (native code), frente al código gestionado (managed code), que se ejecuta sobre una máquina virtual, como es el caso de Java o C#. iOS. El lenguaje de programación en este caso es Objective-C. Java ME : no se trata de una serie de herramientas (bibliotecas, compiladores, IDEs, etc.) asociadas a un sistema operativo, sino de un subconjunto de la plataforma Java orientada para el desarrollo sobre dispositivos móviles. Se programaría en lenguaje Java y sería necesario que hubiera instalada una máquina virtual en el sistema operativo del dispositivo sobre el que se deseara ejecutar la aplicación desarrollada como sucede por ejemplo en Symbian (que se puede programar en modo nativo o bien con Java ME). 3.5.- La plataforma Java ME. La plataforma Java Micro Edition (Java ME), consiste en una especificación de un subconjunto de la plataforma Java orientada para proporcionar una colección de API de desarrollo de software para dispositivos con recursos restringidos (teléfonos móviles, PDA, electrodomésticos inteligentes, etc.). Se utiliza para ello una pequeña máquina virtual de Java conocida como KVM. 4.- El entorno de ejecución. Paquetes opcionales.Perfil.Configuración.Máquina virtual Java. 4.1.- Máquinas Virtuales. Las dos máquinas virtuales disponibles en Java ME son la KVM (K Virtual Machine, se le ha dado ese nombre porque sólo ocuparía unos pocos Kilobytes de memoria) y la CVM (Compact Virtual Machine), algo más pesada. 4.2.- Configuraciones. Una configuración define una plataforma Java para un amplio rango de dispositivos, estando directamente relacionada con una máquina virtual. Configuración CLDC (Connected Limited Device Configuration), enfocada a dispositivos con restricciones de procesamiento y memoria. Requerirá el uso de la máquina virtual KVM. Configuración CDC (Connected Device Configuration), enfocada a dispositivos sin tantas limitaciones. Utiliza la máquina virtual CVM. 4.3.- Perfiles. Los perfiles consisten en un conjunto de APIs de alto nivel que combinados con una configuración concreta permitirán ofrecer un entorno de ejecución completo y específico para cada categoría de dispositivo. Mientras que una configuración (CDC o CLDC) definía las características de una familia de dispositivos, el perfil se encarga de las APIs que definen las características de un dispositivo (o un conjunto muy reducido). Para la configuración CDC existen los siguientes perfiles: Foundation Profile (FP). Proporciona un conjunto de APIs sobre la configuración CDC con capacidades de acceso a red orientada a dispositivos que carecen de interfaz gráfica como por ejemplo los descodificadores de TDT.

description

resumen Programacion moviles JAVA ME

Transcript of Programacion moviles JAVA ME

  • Anlisis de tecnologas para aplicaciones en dispositivos mviles. 1.- Introduccin. Qu es un dispositivo mvil? Se trata de un aparato de pequeo tamao y de poco peso, con pantalla y teclado, con pequeas capacidades de procesamiento, memoria limitada y conexin (permanente o no) a una red.

    1.1.- Clasificacin de los dispositivos mviles. SmartPhones o "telfonos inteligentes". PDA (Personal Digital Assistant - asistentes digitales personales) o PocketPC (PC de bolsillo). Handheld, o PCs de mano. Internet tables, que se encontraran entre las PDA y los PC Ultramviles (pequeos tablet PC). Segn las fuentes que consultes puedes encontrar diversas clasificaciones donde se incluyan unos u otros tipos de dispositivos, como por ejemplo: Pagers (o buscapersonas), hoy da ya en desuso. Navegadores GPS. E-Readers (lectores de libros digitales). Pequeas videoconsolas de mano. Cmaras digitales. Calculadoras programables.

    2.- Limitaciones de las tecnologas mviles. Suministro de energa limitado. Procesadores con capacidad de cmputo reducida. Suelen tener una baja frecuencia de reloj por la necesidad de ahorrar energa. En algunos casos, por ejemplo, podran no disponer de la capacidad de clculos en punto flotante. Poca memoria principal (RAM). Almacenamiento de datos persistente reducido (pequea memoria flash interna, tarjetas SD, etc.). Conexin a algn tipo de red intermitente y con ancho de banda limitado. Pantallas de reducidas dimensiones. Teclados con funcionalidad muy bsica y muy pequeos.

    3.- Tecnologas disponibles. Symbian OS, Android, iOS, Blackberry OS y Windows Phone. 3.1.- Hardware. 3.1.1.- Smartphones. Funcionamiento en multitarea. Acceso a Internet. Conectividad Wi-Fi, Bluetooth, etc. Posibilidad de conexin con un ordenador para cargar y descargar informacin. Normalmente con conexin USB o bien una conexin inalmbrica. Posibilidad de ampliacin de memoria mediante tarjetas externas de memoria (por ejemplo SD). Pequeas pantallas pero de alta resolucin y/o con millones de colores. Posibilidad de pantallas tctiles o incluso multitctiles (multitouch). Sensores (de orientacin, de temperatura, de presin, acelermetros, magnetmetros, etc.). Cmaras digitales integradas. Capacidades fotogrficas. Grabacin de audio y vdeo. Receptor GPS. Receptor de radio FM. Emisor de radio FM. Posibilidad de instalar y ejecutar aplicaciones sofisticadas. La principal arquitectura de microprocesadores utilizada para telefona mvil es la diseada por la empresa ARM ("Advanced RISC Machines", hoy da ARM Holdings.

    3.1.3.- PDA. Una PDA (Personal Digital Assistant o asistente digital personal) u ordenador de bolsillo o Pocket PC o Palmtop Computer es un dispositivo mvil cuya funcionalidad original era la de gestin de datos personales.

    3.2.- Sistemas operativos. Symbian OS. La mayora de telfonos mviles con Symbian son del fabricante Nokia (entre ellos la mayora de los de la serie N). Android. Desarrollado inicialmente por Google y basado en el ncleo de Linux. El primer fabricante de mviles que lo incorpor fue HTC. iOS. Desarrollado por Apple para el iPhone y usado ms tarde tambin para el iPod Touch y el iPad. Windows Phone (anteriormente llamado Windows Mobile). Desarrollado por Microsoft tanto para smartPhones como para otros dispositivos mviles (por ejemplo PDA). Algunos fabricantes de telfonos mviles que incorporan este sistema operativo son Samsung, LG o HTC. Blackberry OS. Desarrollado por Research in Motion (RIM) para sus dispositivos Blackberry. HP webOS, desarrollado por Palm, adquirido por HP (Palm era la desarrolladora del ms antiguo Palm OS). Est basado en un kernel de Linux. Palm OS. Desarrollado por PalmSource para PDA, aunque las ltimas versiones tambin funcionan para smartPhones. Maemo OS. Desarrollado por Nokia para smartPhones, PDA e Internet tables. Bada. Desarrollado por Samsung.

    3.2.1.- Symbian OS. Para el desarrollo de aplicaciones sobre Symbian se utiliz inicialmente una versin especfica de C++, aunque hoy da se emplea C++ estndar con el framework Qt. Los entornos de desarrollo ms habituales para programar sobre Symbian son Carbide.C++ (basado en Eclipse), o bien QtCreator. Tambin se pueden desarrollar aplicaciones sobre Symbian utilizando Python (Python para S60), Adobe Flash o Java ME.

    3.2.2.- Android. Para desarrollar aplicaciones sobre Android se necesita el kit de desarrollo de software para Android (Android SDK), proporcionado gratuitamente por Google. El lenguaje de programacin que se utiliza es Java (y por tanto es necesario el JDK de Oracle para poder compilar programas Java). El IDE oficial es Eclipse (a partir de la versin 3.2) junto con el plugin ADT (Android Development Tools - herramientas de desarrollo para Android.

    3.2.3.- Windows Phone. Para desarrollar aplicaciones sobre Windows Phone pueden utilizarse las tecnologas Silverlight y XNA de Microsoft, as como el entorno de desarrollo Visual Studio. 3.2.4.- iOS. Para desarrollar aplicaciones sobre iOS, las aplicaciones deben ser compiladas especficamente para este sistema operativo basado en la arquitectura ARM. Para ello puede utilizarse el kit de desarrollo iPhone SDK. El lenguaje de programacin principal para este conjunto de herramientas es el Objective-C. Para poder utilizar este kit de desarrollo es necesario un ordenador MAC con un sistema operativo MAC OS X Leopard o superior.

    3.3.- Plataformas de desarrollo y lenguajes de programacin. Windows Phone. Para desarrollar aplicaciones sobre Windows Phone pueden utilizarse las tecnologas Silverlight, XNA y .NET Compact Framework de Microsoft. Las herramientas Visual Studio 2010 Express y Expression. El lenguaje ms habitual para el desarrollo ha sido C#.Android. Google proporciona el Android SDK para programar aplicaciones en Java sobre su sistema operativo. El IDE ms utilizado es Eclipse con el plugin ADT (Android Development Tools). Tambin es posible programar en otros lenguajes como C o C++ gracias al uso del Android NDK (Native Development Kit) que permite generar cdigo nativo (native code), frente al cdigo gestionado (managed code), que se ejecuta sobre una mquina virtual, como es el caso de Java o C#. iOS. El lenguaje de programacin en este caso es Objective-C. Java ME: no se trata de una serie de herramientas (bibliotecas, compiladores, IDEs, etc.) asociadas a un sistema operativo, sino de un subconjunto de la plataforma Java orientada para el desarrollo sobre dispositivos mviles. Se programara en lenguaje Java y sera necesario que hubiera instalada una mquina virtual en el sistema operativo del dispositivo sobre el que se deseara ejecutar la aplicacin desarrollada como sucede por ejemplo en Symbian (que se puede programar en modo nativo o bien con Java ME).

    3.5.- La plataforma Java ME. La plataforma Java Micro Edition (Java ME), consiste en una especificacin de un subconjunto de la plataforma Java orientada para proporcionar una coleccin de API de desarrollo de software para dispositivos con recursos restringidos (telfonos mviles, PDA, electrodomsticos inteligentes, etc.). Se utiliza para ello una pequea mquina virtual de Java conocida como KVM. 4.- El entorno de ejecucin. Paquetes opcionales.Perfil.Configuracin.Mquina virtual Java. 4.1.- Mquinas Virtuales. Las dos mquinas virtuales disponibles en Java ME son la KVM (K Virtual Machine, se le ha dado ese nombre porque slo ocupara unos pocos Kilobytes de memoria) y la CVM (Compact Virtual Machine), algo ms pesada.

    4.2.- Configuraciones. Una configuracin define una plataforma Java para un amplio rango de dispositivos, estando directamente relacionada con una mquina virtual. Configuracin CLDC (Connected Limited Device Configuration), enfocada a dispositivos con restricciones de procesamiento y memoria. Requerir el uso de la mquina virtual KVM. Configuracin CDC (Connected Device Configuration), enfocada a dispositivos sin tantas limitaciones. Utiliza la mquina virtual CVM.

    4.3.- Perfiles. Los perfiles consisten en un conjunto de APIs de alto nivel que combinados con una configuracin concreta permitirn ofrecer un entorno de ejecucin completo y especfico para cada categora de dispositivo. Mientras que una configuracin (CDC o CLDC) defina las caractersticas de una familia de dispositivos, el perfil se encarga de las APIs que definen las caractersticas de un dispositivo (o un conjunto muy reducido). Para la configuracin CDC existen los siguientes perfiles: Foundation Profile (FP). Proporciona un conjunto de APIs sobre la configuracin CDC con capacidades de acceso a red orientada a dispositivos que carecen de interfaz grfica como por ejemplo los descodificadores de TDT.

  • Personal Profile (PP). Para dispositivos con un interfaz grfico completo AWT, capacidades web y soporte de Applets Java. RMI Profile. Se construye sobre el Foundation Profile. Soporta un subconjunto de las APIs Java SE v1.3 RMI. Para la configuracin CLDC disponemos de estos otros perfiles: PDA Profile. Diseado para PDA de gama baja, tipo Palm, con una pantalla y algn tipo de puntero. Mobile Information Device Profile (MIDP). Diseado para smartPhones y PDAs, incluye la interfaz de usuario, conectividad de red, almacenamiento local de datos y gestin de aplicaciones. Combinado con CLDC, MIDP aporta un entorno de ejecucin para Java que minimiza los consumos de memoria y de procesador. Este perfil ser el que utilizaremos para desarrollar aplicaciones mviles en este mdulo.

    5.- Jerarqua de clases de perfil. Las aplicaciones que realices utilizando el perfil MIDP son conocidas con Midlets (por hacer algo as como un paralelismo con los Applets). Por tanto un midlet es una aplicacin Java construida con el perfil MIDP sobre la configuracin CLDC. 5.1.- Clases CLDC heredadas de Java SE.

    5.2.- Clases especficas de la configuracin CLDC. CLDC dispone de un conjunto de clases genrico para comunicaciones conocido como "Generic Connection Framework" o GCF. Consisten en un conjunto de clases e interfaces diseado para facilitar el acceso a sistemas de almacenamiento y conexin, sin necesidad de especificar ningn requisito software o hardware. Estas clases e interfaces (la mayora son interfaces) se encuentran en el paquete javax.microedition.io

    5.3.- Paquetes del perfil MIDP. El perfil MIDP incorpora a un conjunto de bibliotecas y clases para interfaces grficas, almacenamiento, persistencia y otros aspectos ms avanzados especficos del perfil de dispositivo. Al estar construido sobre la configuracin CLDC este perfil tambin incluye los paquetes que hemos visto antes para el funcionamiento normal de un programa (clases base, tipos, datos, E/S, utilidades, etc.).

    8.2.- Escritura de cdigo. import javax.microedition.midlet.*; public class HolaMidlet extends MIDlet implements javax.microedition.lcdui.CommandListener { private void initialize() { javax.microedition.lcdui.Display.getDisplay(this).setCurrent(get_helloTextBox()); } public void commandAction(javax.microedition.lcdui.Command command, javax.microedition.lcdui.Displayable displayable) { if (displayable == helloTextBox) { if (command == exitCommand) { javax.microedition.lcdui.Display.getDisplay(this).setCurrent(null); destroyApp(true); notifyDestroyed(); } } } private javax.microedition.lcdui.TextBox get_helloTextBox() { if (helloTextBox == null) { helloTextBox = new javax.microedition.lcdui.TextBox(null, "Hola Mundo!", 120, 0x0); helloTextBox.addCommand(get_exitCommand()); helloTextBox.setCommandListener(this); }

  • return helloTextBox; } private javax.microedition.lcdui.Command get_exitCommand() { if (exitCommand == null) { exitCommand = new javax.microedition.lcdui.Command("Salir", javax.microedition.lcdui.Command.EXIT, 1); } return exitCommand; } javax.microedition.lcdui.TextBox helloTextBox; javax.microedition.lcdui.Command exitCommand; public void startApp() { initialize(); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

    9.- Gestin del entorno de ejecucin. En estos dispositivos lo que existe es un software conocido como Gestor de Aplicaciones o Administrador de Aplicaciones (AMS Application Management System) que se encarga de ejecutar los Midlets y de gestionar los recursos que consumen. El AMS lleva a cabo esencialmente dos funciones: 1.La gestin del ciclo de vida de los Midlets en el dispositivo. 2.El control de los estados por los que pasa midlet mientras resida en la memoria del dispositivo, es decir, mientras est en ejecucin.

    9.2.- Ciclo de vida de una aplicacin. El Gestor de Aplicaciones (AMS) es quien se encarga de gestionar esas fases: 1.Descubrimiento (o localizacin). Consiste en el proceso por el cual un usuario localiza un midlet a travs de su dispositivo. 2.Instalacin. Una vez que la aplicacin ha sido descargada en el dispositivo, sta puede ser instalada. 3.Ejecucin. El AMS es tambin el que permite poner en ejecucin el midlet. 4.Actualizacin. Una vez que un midlet ha sido descargado, el AMS debe de ser capaz de detectar si se trata de una actualizacin de un midlet ya presente en el dispositivo. 5.Borrado. Si el usuario as lo desea, el AMS se encargar de borrar el midlet del dispositivo.

    9.3.- Modelo de estados de una aplicacin. Activo. El midlet est en ese momento ejecutndose. Pausa. El midlet no se encuentra ejecutndose en ese momento. En ese estado no se debe utilizar ningn recurso compartido. Para volver a ejecutar instrucciones de su cdigo, el midlet debe de pasar a estado activo. Destruido. El midlet no est ya en ejecucin ni podr pasar a otro estado. Se liberan todos los recursos ocupados. Un midlet puede cambiar de estado mediante una llamada a algunos de los mtodos: midlet.StartApp ( ). midlet.pauseApp ( ). midlet.destroyApp ( ).

    1.- Herramientas y fases de construccin. 1.1.- Desarrollo del cdigo. 1.1.1.- Creacin de un proyecto Java ME. Un proyecto representa una midlet suite, es decir, un conjunto de midlets (aplicaciones) y no necesariamente slo una. src, que contiene los archivos fuente (Java). dist, que contiene el archivo final JAR y el archivo JAD, as como otras bibliotecas externas en formato JAR o ZIP. De aqu podras sacar el archivo final para copiarlo a un dispositivo e instalarlo. nbproject, que contiene informacin de configuracin del proyecto para NetBeans. build, que contiene el archivo de manifiesto, as como los archivos de clases Java procesadas.

    1.1.2.- El esqueleto de un midlet.Todo midlet necesita tener una clase principal que hereda de la clase abstracta midlet. Esta clase se encuentra en el paquete javax.microedition.midlet. Recuerda que no es posible instanciar directamente un objeto de una clase abstracta sino que es necesario crear una clase que herede de ella y que implemente todos sus mtodos abstractos. Esa nueva clase s ser instanciable. Por tanto, cuando crees una aplicacin de tipo midlet, su clase principal deber heredar de la clase midlet: public class midletEjemplo extends midlet

    Adems de los tres mtodos anteriores, que son de obligada implementacin, un midlet suele incorporar tambin un constructor en el que se definen los elementos grficos y se inicializan las variables de estado de la aplicacin.

    1.1.3.- Funcionamiento de un midlet. Un midlet comienza en estado en pausa. Cuando se carga en memoria, se ejecuta su constructor y, si no se produce ningn problema, se pasa al estado activo ejecutndose el mtodo startApp. La aplicacin continuar en ese estado hasta que pase a un estado en pausa o destruido. el gestor de aplicaciones puede hacer pasar al midlet a estado en pausa, dando los recursos del dispositivo (pantalla, teclado, CPU, etc.) a otra aplicacin y ejecutndose el mtodo pauseApp.

    import javax.microedition.midlet.*; public class MidletEjemplo extends MIDlet { public void startApp() { } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

    Mtodos abstractos de la clase midlet

    Mtodo Descripcin

    protected abstract void startApp () Mtodo que se ejecuta cuando se pasa de estado en pausa a estado activo.

    protected abstract void destroyApp (boolean unconditional)

    Mtodo que se ejecuta cuando se destruye el midlet.

    protected abstract void pauseApp () Mtodo que se ejecuta cuando se pasa de estado activo a estado en pausa.

  • 1.1.4.- Ejemplo de un midlet bsico. 1.2.- Compilacin y preverificacin. Los procesos de verificacin durante la generacin de cdigo se encargan de realizar revisiones de seguridad, integridad y cumplimiento de los estndares. Debido a las importantes restricciones existentes en los dispositivos mviles, la verificacin de las clases tiene dos etapas: Preverificacin, que se realiza como un paso ms de la generacin de los binarios.Verificacin, llevada a cabo por la mquina virtual durante la ejecucin.

    1.3.- Empaquetamiento. Esta fase es la que se encarga de empaquetar la aplicacin con todas las clases y recursos que vaya a necesitar, dejndola lista para ser descargada en un dispositivo que la instale. Esta fase implica la creacin de los siguientes archivos: El archivo JAR (Java Archive), que es el paquete que contendr todos los archivos que conforman la aplicacin (clases; recursos como imgenes y sonidos; archivo de manifiesto; etc.).El archvo de manifiesto, que consiste en una descripcin del contenido del archivo JAR. Es un archivo opcional. Archivo JAD.

    1.3.1.- El archivo de manifiesto. (manifest.mf). Este archivo describe el contenido del JAR y consiste un archivo de texto con una estructura de una lnea por atributo, donde los valores de los atributos son especificados de la forma "atributo: valor". 1.3.2.- Archivos JAD. El archivo JAD (Java Application Descriptor) sirve para proporcionar informacin adicional sobre el juego de midlets contenido en un JAR. Su estructura es similar a la del archivo de manifiesto (pares atributo: valor). 1.4.- Instalacin en un dispositivo real. 1.5.- Ejecucin. La ejecucin de un midlet puede realizarse bien en un emulador (basta con ejecutar el midlet en NetBeans para que ste sea ejecutado en el emulador que tengamos configurado en el proyecto) bien en un dispositivo real. 1.6.- Depuracin. Para depurar una aplicacin de tipo midlet lo ideal es disponer de un IDE adecuado que proporcione todas las posibilidades tpicas de un depurador: Ejecucin paso a paso y sus variantes (saltando funciones, entrando en ellas, etc.).Observar el contenido de las variables (y, si es posible, modificarlo).Establecer puntos de parada o breakpoints.Control de los threads.

    2.- Interfaces de usuario. Interfaz de usuario de alto nivel. En este caso es el dispositivo quien se encarga de la colocacin adecuada de los elementos , de la forma de navegacin y de caractersticas visuales como el color o los tipos de letra. La ventaja de utilizar estas APIs de alto nivel es el alto grado de portabilidad de la aplicacin para diferentes dispositivos. Interfaces de usuario de bajo nivel. En este caso el programador tendr un control total de todo lo que va a aparecer en la pantalla. A partir de ahora, la mayora de tus clases Java dentro de proyectos midlet incluirn la sentencia import javax.microedition.lcdui.*.

    2.1.- Gestin de la pantalla y los dispositivos de entrada. La clase Display. Slo existe una instancia (un objeto) de la clase Display por midlet.

  • 2.2.- Pantallas en un midlet. La clase Displayable. Una pantalla (o displayable en terminologa MIDP) normalmente consistir en un conjunto de objetos de interfaz grfico de usuario (tanto de alto como de bajo nivel) organizados de algn modo. Todos ellos formarn parte de un objeto de la clase Displayable.

    2.3.- Tipos de pantallas. Especializaciones de la clase Displayable. Existen dos grandes categoras de displayables o pantallas, o dicho de otro modo, la clase Displayable tiene dos subclases:

    La clase Screen (tambin clase abstracta), que implementa la API de alto nivel. Dentro de esta categora podramos hablar tambin de dos subcategoras:

    o Pantallas con estructura predefinida, que encapsulan componentes de interfaz especficos y que las aplicaciones no pueden enriquecer con nuevos componentes. Hay tres tipos: Alert. Alertas. List. Listas. TextBox. Cuadros o pantallas de texto.

    o Formularios. Pantallas genricas donde el programador de la aplicacin puede insertar etiquetas, campos de texto, imgenes,

    barras de progreso y otros componentes de interfaz de usuario para dar lugar al tipo de pantalla que la aplicacin necesite. Se trata de la clase Form.

    La clase Canvas (nuevamente tambin abstracta), que implementa la API a bajo nivel. En este caso las aplicaciones tienen un control total sobre los componentes en la pantalla y pueden acceder a eventos de bajo nivel.

    2.4.- Gestin de eventos. tres tipos de eventos disponen a su vez de su correspondiente interfaz de listener asociado:

    CommandListener.

    ItemStateListener.

    ItemCommandListener

    2.5.- Comandos. La clase Command. Los objetos de clase Command mantienen informacin sobre un evento. Contienen tres valores importantes:

  • Etiqueta (Label). Cadena de texto (String) que representa la accin de ese Command.

    Tipo (Type). Nmero entero que indica el tipo de Command (qu funcin puede realizar). Existen ocho tipos definidos de Command: BACK, CANCEL, HELP, EXIT, ITEM, OK, SCREEN, y STOP.

    Prioridad (Priority). Nmero entero que especifica la importancia o prioridad del Command. Cuanto menor sea el nmero, mayor prioridad tendr.

    Si, por ejemplo, se desea crear un objeto Command de tipo BACK, con la etiqueta "Atrs" y prioridad 0 se podra escribir el siguiente cdigo de llamada al constructor: c1= new Command (Atras, Command.BACK, 0) Una vez creado el Command habr que asignarlo a alguna pantalla (Displayable) para que forme parte de ella y activar el oyente de ese Displayable (normalmente el propio midlet). Por ejemplo:

    pantalla1.addCommand (c1); pantalla1.setCommandListener (this); // Establecemos como oyente al propio midlet

    2.6.- Oyentes. La interfaz CommandListener y el mtodo commandAction. Recuerda que para implementar una interfaz en Java es necesario utilizar la palabra reservada implements: public class Ejemplomidlet extends midlet implements javax.microedition.lcdui.CommandListener La interfaz CommandListener contiene slo un mtodo: commandAction (Command c, Displayable d). Dentro de ese mtodo es donde se incluir el cdigo que debe ejecutarse cuando se produzca el evento Command c que se encuentra en el objeto Displayable d. // Mtodo para la recepcin y tratamiento de los eventos producidos // (Necesario al implementar CommandListener) public void commandAction (Command c, Displayable d) { //Miramos si se ha pulsado nuestro Command c1 if (c == c1) { destroyApp(true); notifyDestroyed(); } else System.out.println("Otro comando pulsado"); }

    3.- La interfaz de usuario de alto nivel: pantallas bsicas. 3.1.- Pantallas de la interfaz de usuario de alto nivel. La clase Screen. Como ya vimos, hay cuatro tipos de pantallas o displayables en esta interfaz. Es decir, cuatro clases que heredan directamente de la clase Screen: TextBox. List. Alert. Form. Los principales mtodos de la clase Screen, heredados en todas sus subclases son: String getTitle ().

  • setTitle (String titulo).

    3.2.- Cuadros de texto. La clase TextBox.

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploTextBox extends MIDlet implements CommandListener { private Display display; private TextBox smsTextBox; private Command cmdSalir; private Command cmdEnviar; public MidletEjemploTextBox () { // Obtenemos el Display display= Display.getDisplay (this); // Creamos el TextBox (el unico displayable/pantalla que va a tener la aplicacin) smsTextBox= new TextBox ("Introduzca su mensaje", "Texto...", 160, TextField.ANY); cmdSalir= new Command ("Salir", Command.EXIT, 0); cmdEnviar= new Command ("Enviar", Command.CANCEL, 0);

    TextBox smsTextBox; String mensaje; smsTextBox= new TextBox (Introduzca su mensaje, Texto, 160, TextField.ANY); mensaje= smsTextBox.getString();

    public void commandAction (Command c, Displayable d) { //Miramos si se ha pulsado nuestro Command c1 if (c == cmdSalir) { destroyApp (true); notifyDestroyed (); } else System.out.println("Pulsado Command Enviar..."); } }

  • smsTextBox.addCommand(cmdSalir); smsTextBox.addCommand(cmdEnviar); smsTextBox.setCommandListener(this); } public void startApp() { // Establecemos como pantalla ("displayable") activa el TextBox smsTextBox display.setCurrent(smsTextBox); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } // Mtodo para la recepcin y tratamiento de los eventos producidos // (Necesario al implementar CommandListener)

    3.3.- Alertas. La clase Alert.

    Se dispone de varios tipos de alertas predefinidos. Cada uno de ellos tiene asociado un sonido: ALARM. Indica la llegada de una peticin a notificar. CONFIRMATION. Indica la finalizacin de un evento o accin. ERROR. Indica que se ha producido un error. INFO. Indica informacin general. WARNING. Indica una situacin o problema potencial.

  • 3.4.- Listas. La clase List.

    List listaExclusiva= new List (Lista exclusiva, List.EXCLUSIVE); List listaMultiple= new List (Lista multiple, List.MULTIPLE); List listaImplicita= new List (Lista implcita, List.IMPLICIT); Adems de este constructor, tambin puedes utilizar un segundo constructor que permite proporcionar una lista con un conjunto inicial de opciones y de imgenes asociadas. List(String titulo, int listType, String[] elementos, Image[] imagenes)

    3.4.1.- Listas implcitas. menu= new List (Menu, List.IMPLICIT); menu.insert (0, Opcion 1, null); menu.insert (1, Opcion 2, null); menu.append (Opcion 3, null); ... Cuando se seleccione un elemento de la lista se generar un evento de tipo List.SELECT_COMMAND que tendr que ser gestionado desde el gestor de eventos commandAction (como si se hubiera seleccionado un Command): public void commandAction (Command c, Displayable d) { if ( c == List.SELECT_COMMAND ) { ... } else { // Gestin de otros posibles Commands de la aplicacin } El elemento de la lista seleccionado se puede obtener mediante el mtodo getSelectedIndex: if ( c == List.SELECT_COMMAND ) { switch (menu.getSelectedIndex()) {

    tres tipos diferentes de listas: Exclusivas (List.EXCLUSIVE), donde slo se permite una seleccin en cada momento. Mltiples (List.MULTIPLE), donde se permiten cero o ms selecciones al mismo tiempo. Implcitas (List.IMPLICIT), donde la seleccin de un elemento genera un evento.

  • case 0: // Accin a realizar si se ha seleccionado el primer elemento. case 1: // Accin a realizar si se ha seleccionado el segundo elemento. case 2: // Accin a realizar si se ha seleccionado el tercer elemento. }

    3.4.2.- Listas exclusivas. En este caso, la seleccin de un item de la lista no da lugar a la generacin de ningn evento como suceda con las listas implcitas, de manera que ser necesario utilizar un Command para consultar el estado de las opciones de la lista, lista= new List (Lista, List. EXCLUSIVE); Para obtener la opcin elegida usamos tambin el mtodo getSelectedIndex: public void commandAction (Command c, Displayable d) { if ( c == cmdSeleccionar ) { int indice= lista.getSelectedIndex() switch (indice) { // Realizar la opcin oportuna en funcin de la opcin elegida case 0: // Accin a realizar si se ha seleccionado el primer elemento. case 1: // Accin a realizar si se ha seleccionado el segundo elemento. case 2: // Accin a realizar si se ha seleccionado el tercer elemento. }

    3.4.3.- Listas mltiples. lista= new List (Lista, List. MULTIPLE); Para la obtencin de las opciones elegidas, tendrs que usar el mtodo getSelectedFlags, que rellena un array de bolean indicando para cada elemento si est seleccionado (true) o no (false): public void commandAction (Command c, Displayable d) { boolean elementos[]= new boolean [lista.size()]; lista.getSelectedFlags (elementos); for (int i=0; i

  • // Acciones a realizar si el elemento i ha sido seleccionado. } else { // Acciones a realizar si el elemento i no ha sido seleccionado. } }}

    4.- La interfaz de usuario de alto nivel: formularios. 4.1.- Formularios. La clase Form. Un mismo Item no puede estar en dos formularios a la vez! Si intentas insertar un tem en un formulario cuando ese tem ya est siendo utilizado en otro formulario se producir una excepcin de tipo IllegalStateException.

    4.2.- Elementos en un formulario. La clase Item. La clase Item es una clase abstracta y no puede ser instanciada. Los componentes que se pueden incrustar en un formulario sern objetos de clases que derivan de Item. En concreto dispones de los siguientes: Etiquetas de texto. Clase StringItem. Imgenes. Clase ImageItem. Campos de texto. Clase TextField. Campos de fecha y hora. Clase DateField. Grupos de seleccin. Clase ChoiceGroup. Barras de progreso. Clase Gauge.

    4.3.- Etiquetas de texto. La clase StringItem.

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploStringItem extends MIDlet implements CommandListener { Display display; Form formulario; Command cmdTerminar; StringItem strItem1, strItem2, strItem3; public MidletEjemploStringItem () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con StringItem"); // StringItems strItem1= new StringItem ("StringItem1: ", "Apariencia PLAIN", Item.PLAIN); strItem2= new StringItem ("StringItem2: ", "Apariencia HYPERLINK", Item.HYPERLINK); strItem3= new StringItem ("StringItem3: ", "Apariencia BUTTON", Item.BUTTON); formulario.append(strItem1);

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploFormVacio extends MIDlet implements CommandListener { Display display; Form formulario; Command cmdTerminar; public MidletEjemploFormVacio () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario vacio"); // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); formulario.addCommand (cmdTerminar); // Establecemos el oyente formulario.setCommandListener(this); } public void startApp() { display.setCurrent(formulario); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed ();

    } } }

    Las posibles apariencias del texto de un objeto StringItem son: Item.PLAIN. Aspecto normal. Utilizado normalmente para mostrar informacin textual no interactiva. Item.HYPERLINK. Aspecto de tipo hiperenlace. Item.BUTTON. Aspecto de tipo "botn". Utilizado para simular botones en el formulario (lo veremos ms adelante).

    formulario.append(strItem2); formulario.append(strItem3); // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); formulario.addCommand (cmdTerminar); // Establecemos el oyente formulario.setCommandListener(this); } public void startApp() { display.setCurrent(formulario); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed (); } }}

  • 4.4.- Imgenes. La clase Image. Las imgenes (objetos de la clase Image) pueden ser: Inmutables. Imgenes que una vez que son creadas no es posible modificarlas. Una imagen inmutable suele ser creada a partir de un recurso (archivo, array de bytes, etc.). Mutables. Cuando se crea una imagen mutable en realidad se est reservando un bloque de memoria para crear en l la imagen ms adelante (y modificarla si as se decide). Para que una imagen mutable se haga visible es necesario que se indique explcitamente (por ejemplo mediante el mtodo paint de la clase Canvas). Las imgenes inmutables pueden aparecer en: Formularios (Form), incrustado como un tem ms. Los elementos de una lista (List) o de un ChoiceGroup (como un adorno que acompaa a cada elemento). Alertas (Alert), como imagen que acompaa al texto de la alerta.

    Image imagen; imagen= Image.createImage (/resources/europa_occidental.png);

    4.5.- Imgenes. La clase ImageItem. Para insertar imgenes (objetos de tipo Image) en un formulario es necesario utilizar un marco (un componente o tem de formulario) en el que poder incrustarlas: la clase ImageItem.

    El parmetro textoAlt del constructor consiste en el texto alternativo a la imagen que se mostrar en caso de que sta no pueda ser dibujada en la pantalla (normalmente porque no quepa). El parmetro layout indica la posicin de la imagen (layout o disposicin) en la pantalla (LAYOUT_LEFT, LAYOUT_CENTER, LAYOUT_RIGHT, LAYOUT_NEWLINE_AFTER, LAYOUT_NEWLINE_BEFORE.). El parmetro apariencia tiene los mismos posibles valores que en el caso de StringItem (PLAIN, HYPERLINK, BUTTON). Image imagen= Image.createImage (/resources/europa_occidental.png); ImageItem elemento= new ImageItem (Europa occidental, imagen, ImageItem.LAYOUT_DEFAULT, Cargando);

    4.6.- Campos de texto. La clase TextField.

    Form formulario= new Form ("Formulario con campos de texto"); TextField nombre= new TextField (Nombre: , null, 100, TextField.ANY); TextField password= new TextField ("Clave: ", "", 50, TextField.PASSWORD); TextField telefono= new TextField ("Telefono: ", "+34", 15, TextField.PHONENUMBER); TextField email= new TextField ("E-mail: ", "", 50, TextField.EMAILADDR); TextField web= new TextField ("Pagina web: ", "", 50, TextField.URL); formulario.append (nombre); formulario.append (password); import javax.microedition.midlet.*; import javax.microedition.lcdui.*;

    formulario.append (telefono); formulario.append (email); formulario.append (web);

  • public class MidletEjemploTextField extends MIDlet implements CommandListener { Display display; Form formulario; Command cmdTerminar; StringItem etiqueta1; TextField nombre, telefono, email, web, password; public MidletEjemploTextField () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con campos de texto"); // StringItems etiqueta1= new StringItem ("", "Ejemplos de TextField", Item.PLAIN); password= new TextField ("Clave: ", "", 50, TextField.PASSWORD); nombre= new TextField ("Nombre: ", null, 100, TextField.ANY); telefono= new TextField ("Telefono: ", "+34", 15, TextField.PHONENUMBER); email= new TextField ("E-mail: ", "", 50, TextField.EMAILADDR); web= new TextField ("Pagina web: ", "", 50, TextField.URL);

    4.7.- Campos de fecha y hora. La clase DateField.

    Esta clase hace uso de la clase java.util.Date para manipular fechas y horas. El modo de entrada del contenido de un objeto DateField puede establecerse para manipular fechas (DATE), horas (TIME) o ambas (DATE_TIME). Date ahora= new Date (); DateField fechaAhora= new DateField (Instante actual: , DateField.DATE_TIME); DateField fechaCita= new DateField (Fecha de la cita: , DateField.DATE); DateField horaCita= new DateField (Hora de la cita: , DateField.TIME); -------------------------------------------------------------------------------------------------- import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.Date; public class MidletEjemploDateField extends MIDlet implements CommandListener { Display display; Form formulario; Command cmdTerminar; StringItem etiqueta; DateField fechaAhora, fechaCita, horaCita; Date ahora; public MidletEjemploDateField () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con campos de fecha"); public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed (); } } }

    4.8.- Grupos de seleccin. La clase ChoiceGroup. Los eventos de un componente de tipo ChoiceGroup se pueden gestionar de dos formas diferentes: Mediante el mtodo commandAction (interfaz CommandListener), del mismo modo que cuando se trabajaba con listas (exclusivas o mltiples). Es decir, incluyendo en el formulario un Command que cuando sea activado realice una consulta de las opciones elegidas en el ChoiceGroup. Mediante el mtodo itemStateChanged (interfaz ItemStateListener), que ser llamado cada vez que se seleccione (o deseleccione) una opcin

    formulario.append(etiqueta1); formulario.append(nombre); formulario.append(password); formulario.append(telefono); formulario.append(email); formulario.append(web); // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); formulario.addCommand (cmdTerminar); // Establecemos el oyente formulario.setCommandListener(this); } public void startApp() { display.setCurrent(formulario); } public void pauseApp() { }

    // Elementos etiqueta= new StringItem ("", "Ejemplos de DateField", Item.PLAIN); ahora= new Date (); fechaAhora= new DateField ("Instante actual: ", DateField.DATE_TIME); fechaAhora.setDate(ahora); fechaCita= new DateField ("Fecha de la cita: ", DateField.DATE); horaCita= new DateField ("Hora de la cita: ", DateField.TIME); formulario.append(etiqueta); formulario.append(fechaAhora); formulario.append(fechaCita); formulario.append(horaCita); // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); formulario.addCommand (cmdTerminar); // Establecemos el oyente formulario.setCommandListener(this); } public void startApp() { display.setCurrent(formulario); } public void pauseApp() { }

  • import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploChoiceGroup extends MIDlet implements CommandListener { Display display; Form formulario; Command cmdTerminar; StringItem etiqueta; ChoiceGroup grupo; public MidletEjemploChoiceGroup () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con grupos de seleccion"); // Elementos etiqueta= new StringItem ("", "Ejemplos de ChoiceGroup", Item.PLAIN); grupo= new ChoiceGroup ("Posibles destinos:", Choice.MULTIPLE); grupo.append("Kenia", null); grupo.append("Tanzania", null); grupo.append("Uganda", null); grupo.append("Ruanda", null); grupo.append("Burundi", null); formulario.append(etiqueta); formulario.append(grupo);

    4.9.- Barras de progreso. La clase Gauge. Una barra de progreso se considera interactiva cuando puede ser cambiada por el usuario al realizar ste alguna accin, por ejemplo, al pulsar un botn. Se considera no interactiva cuando su valor cambia por la lgica interna de la aplicacin, por ejemplo, la barra de progreso de un contador de tiempo, o de una descarga, o de la instalacin de un programa.

    // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); formulario.addCommand (cmdTerminar); // Establecemos el oyente formulario.setCommandListener(this); } public void startApp() { display.setCurrent(formulario); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed (); } } }

  • import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploGauge extends MIDlet implements CommandListener { Display display; Form formulario; Command cmdTerminar; StringItem etiqueta; Gauge barra1, barra2, barra3; public MidletEjemploGauge () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con barras de desplazamiento"); // Elementos etiqueta= new StringItem ("", "Ejemplos de Gauge", Item.PLAIN); barra1= new Gauge ("Volumen", true, 100, 20); barra2= new Gauge ("Tono", true, 100, 50); barra3= new Gauge ("Resonancia", false, 100, 70); formulario.append(etiqueta); formulario.append(barra1); formulario.append(barra2); formulario.append(barra3);

    4.10.- Organizando los elementos en un formulario. El de los orden de insercin elementos en el formulario es importante (mtodo append), pues se irn mostrando en ese orden. Tambin puedes

    decidir insertar un elemento en una posicin determinada (entre dos elementos) con el mtodo insert.

    El atributo de disposicin (layout) de un tem puede permitirte situarlo en una determinada zona de la pantalla dentro de la fila en la que se est

    colocando el componente (Item.LAYOUT_LEFT, Item.LAYOUT_RIGHT, etc.), pero adems puedes decidir si quieres que ese elemento comience

    en una nueva fila obligatoriamente (Item.LAYOUT_NEWLINE_BEFORE) o que no haya ms tems en esa fila despus de l

    (Item.LAYOUT_NEWLINE_AFTER). Tambin existen otras opciones posibles como utilizar todo el espacio disponible (Item.LAYOUT_EXPAND) o

    lo contrario (Item.LAYOUT_SHRINK).

    El tem Spacer (tambin subclase de Item) permite definir tems "invisibles" pero de un determinado tamao, de manera que puedes colocar

    separadores (espacios en blanco) entre elementos que estn en una misma fila.

    4.11.- Gestin de eventos en un formulario. En este caso se trata de la interfaz ItemStateListener y de su mtodo abstracto itemStateChanged. Otra forma de gestionar eventos sobre los elementos de un formulario es mediante la interfaz ItemCommandListener, que

    dispone tambin de un nico mtodo y que nuevamente se llama commandAction. Para ello, tendremos que asociar un Command a un Item de

    manera que cuando se accione ese Command se ejecutar el mtodo commandAction.

    4.11.1.- Gestin de los cambios en un Item. La interfaz ItemStateListener. Debes tener en cuenta que si es la propia aplicacin la que modifica el valor de un Item, el listener listener no ser activado y por tanto no se llamar al mtodo itemStateChanged. Para llevar a cabo esta gestin ser necesario lo siguiente:

    Crear y asignar a un formulario los Items cuya modificacin se desea controlar. Asignar un oyente para los elementos del formulario (mtodo setItemStateListener). Escribir el cdigo apropiado para gestionar el evento (implementar mtodo itemStateChanged de la interfaz ItemStateListener).

    public class midlet extends midlet implements CommandListener, ItemStateListener Form formulario; ... public void itemStateChanged (Item item) { if (item == item1) { // Accin si se ha modificado el item1 } else if (item == item2) { // Accin si se ha modificado el item1 } else if (item == fecha) { // Accin si se ha modificado el item1

    // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); formulario.addCommand (cmdTerminar); // Establecemos el oyente formulario.setCommandListener(this); } public void startApp() { display.setCurrent(formulario); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed (); } }}

  • import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploItemStateListener extends MIDlet implements CommandListener, ItemStateListener { Display display; Form formulario; Command cmdTerminar; StringItem etiqueta; TextField nombre; Gauge edad; DateField fecha; Alert alerta; public MidletEjemploItemStateListener () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con eventos"); // StringItems etiqueta= new StringItem (null, "Elementos del formulario:", Item.PLAIN); nombre= new TextField ("Nombre: ", null, 15, TextField.ANY); edad= new Gauge ("Edad", true, 100, 20); fecha= new DateField ("Fecha: ", DateField.DATE); formulario.append(etiqueta); formulario.append(nombre); formulario.append(edad); formulario.append(fecha); // Alerta alerta= new Alert ("Mensaje", "Pulsado...", null, AlertType.INFO); alerta.setTimeout (Alert.FOREVER); // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); formulario.addCommand (cmdTerminar); // Establecemos los oyentes formulario.setCommandListener(this); formulario.setItemStateListener (this); }

    4.11.2.- Gestin de Commands asociados a un Item. La interfaz ItemCommandListener. Es posible asociar Commands a un Item mediante el mtodo addCommand o setDefaultCommand. void CommandAction (Command c, Item item) Para llevar a cabo esta gestin ser necesario lo siguiente: Crear el Item al que se le desea asociar un comando. Crear el Command que se le desea asociar. Asignar el Command al Item (mtodo addCommand o setDefaultCommand). Asignar un oyente para el Item (mtodo setItemCommandListener). Escribir el cdigo apropiado para gestionar el evento (implementar el mtodo CommandAction de la interfaz ItemCommandListener).

    public void startApp() { display.setCurrent(formulario); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed (); } } public void itemStateChanged (Item item) { String mensaje; if (item == nombre) { mensaje= "Detectado cambio en TextField"; } else if (item == edad) { mensaje= "Detectado cambio en Gauge"; } else if (item == fecha) { mensaje= "Detectado cambio en DateField"; } else { mensaje= "Detectado cambio en objeto no identificado"; } alerta.setString(mensaje); display.setCurrent(alerta, formulario); } }

  • import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploItemCommandListener extends MIDlet implements CommandListener, ItemCommandListener { Display display; Form formulario; Command cmdTerminar, cmdEtiqueta; StringItem etiqueta; Alert alerta; public MidletEjemploItemCommandListener () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con eventos"); // Items etiqueta= new StringItem ("", "Etiqueta", Item.PLAIN); formulario.append(etiqueta); // Alerta alerta= new Alert ("Etiqueta", "Pulsada la etiqueta.", null, AlertType.INFO); alerta.setTimeout (Alert.FOREVER); // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); cmdEtiqueta= new Command ("OK", Command.OK, 1); formulario.addCommand (cmdTerminar); etiqueta.addCommand(cmdEtiqueta); // Establecemos los oyentes formulario.setCommandListener(this); etiqueta.setItemCommandListener (this); }

    public void startApp() { display.setCurrent(formulario); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed (); } } public void commandAction (Command c, Item item) { if (item == etiqueta) { if (c == cmdEtiqueta) { display.setCurrent(alerta, formulario); } } }}

  • 4.11.3.- Ejemplo de Commands asociados a Items. Simulacin de botones.

    Para simular un botn basta con que sigamos los pasos vistos en el apartado anterior: Crear un Item (StringItem o ImageItem) al que se le asocia un Command. En este caso es mejor utilizar el mtodo setDefaultCommand. Establecer el oyente de ese Item. Implementar el mtodo commandAction con las acciones que se deban tomar cuando se active el Command sobre ese Item. En estos casos se suele utilizar el valor Item.BUTTON para la apariencia del Item (normalmente un StringItem o un ImageItem) y de ese modo en la pantalla aparecer de manera que tenga un aspecto "pulsable", aunque eso siempre depender de la implementacin de la mquina virtual en el dispositivo (podra darse el caso en que no haya diferencia de presentacin entre las apariencias PLAIN, BUTTON o HYPERLINK). Se recomienda utilizar el mtodo setDefaultCommand (establecer comando por defecto) para asociar un Command a un Item a la hora de simular un botn porque as cuando se pulse en el dispositivo la tecla con la que habitualmente se seleccionan opciones (normalmente el botn central de los cursores o del joystick) se activar ese Command (el establecido por defecto). De ese modo la simulacin del botn quedar muy elegante import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MidletEjemploBotones extends MIDlet implements CommandListener, ItemCommandListener { Display display; Form formulario; Command cmdTerminar, cmdBoton1, cmdBoton2, cmdBoton3; StringItem boton1, boton2, boton3; Alert alerta; public MidletEjemploBotones () { // Display display= Display.getDisplay(this); // Formulario formulario= new Form ("Formulario con botones"); // Items boton1= new StringItem ("", "Boton 1", Item.BUTTON); boton2= new StringItem ("", "Boton 2", Item.BUTTON); boton3= new StringItem ("", "Boton 3", Item.BUTTON); formulario.append(boton1); formulario.append(boton2); formulario.append(boton3); // Alerta alerta= new Alert ("Atencion:", "Pulsado un boton.", null, AlertType.INFO); alerta.setTimeout (Alert.FOREVER); // Commands cmdTerminar= new Command ("Terminar", Command.EXIT, 0); cmdBoton1= new Command ("OK", Command.OK, 1); cmdBoton2= new Command ("OK", Command.OK, 1); cmdBoton3= new Command ("OK", Command.OK, 1); formulario.addCommand (cmdTerminar); boton1.setDefaultCommand(cmdBoton1); boton2.setDefaultCommand(cmdBoton2); boton3.setDefaultCommand(cmdBoton3); // Establecemos los oyentes formulario.setCommandListener(this); boton1.setItemCommandListener (this); boton2.setItemCommandListener (this); boton3.setItemCommandListener (this); }

    4.12.- Unindolo todo Tambin es recomendable que tus aplicaciones incluyan siempre algunas pautas que ayuden al usuario a manejar el programa con facilidad: Una pantalla inicial de presentacin de la aplicacin. Una pantalla de ayuda con algunas instrucciones mnimas sobre la aplicacin. Comandos con etiquetas claras y concisas. Formularios sin recargar excesivamente.

    5.- Creacin de interfaces grficos de usuario utilizando asistentes y herramientas del entorno integrado. En este apartado vamos a echar un vistazo al asistente de diseo de aplicaciones mviles de NetBeans: Visual Mobile Designer Cuando un midlet es desarrollado con el VMD (Visual Mobile Designer) dispondrs de cuatro posibles vistas para trabajar con l:

    Vista Flow. Es la vista que te permite crear y modificar el flujo de pantallas de la aplicacin, indicando cmo se puede ir de una pantalla a otra y a travs de qu comando.

    Vista Screen Design. A travs de esta vista puedes realizar el diseo de las pantallas, observando el aspecto final que tendrn cuando la aplicacin sea ejecutada.

    Vista Source. sta la vista que has estado utilizando hasta ahora. Es la vista del cdigo fuente de las clases de la aplicacin.

    Vista Analyzer. Esta vista es til para comprobar la compatibilidad de la aplicacin con versiones anteriores de la configuracin CLDC.

    public void startApp() { display.setCurrent(formulario); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == cmdTerminar) { destroyApp (false); notifyDestroyed (); } } public void commandAction (Command c, Item item) { String mensaje= "Evento no identificado"; if (item == boton1) { if (c == cmdBoton1) { mensaje= "Pulsado boton 1"; } } else if (item == boton2) { if (c == cmdBoton2) { mensaje= "Pulsado boton 2"; } } else if (item == boton3) { if (c == cmdBoton3) { mensaje= "Pulsado boton 3"; } } alerta.setString(mensaje); display.setCurrent(alerta, formulario); }}

  • CMO INSERTAR IMGENES EN UN MEN DE TIPO LISTA (Clase List) Tenis que tener en cuenta que la carpeta raz considera que es la carpeta SRC de nuestro PROYECTO. El formato ideal es PNG, aunque tambin entiende JPG. Un buen tamao es 25x25 pxeles.

    a) Un objeto Image para guardar en l la imagen: private Image img1, img2, img3; b) Un objeto de tipo array de imgenes (Image []) que ser donde guardemos todas las imgenes

    Image[] todasImagenes = {img1, img2, img3}; Creamos las imgenes mediante el mtodo createImagen(ruta);

    Cargamos el ARRAY con todos los objetos IMAGE: Image[] todasImagenes={img1,img2,img3}; Creamos la lista usando el constructor: List(String title, int listType, String[] stringElements, Image[] imageElements) menu=new List("MENU PRINCIPAL", List.IMPLICIT, ItemsMenu, todasImagenes); Tambin se podra haber hecho as: Image[] todasImagenes=new Image[6]; bucle { imagenes[i]=Image.createImage(ruta del archive.png); fin bucle}

    6.- La interfaz de usuario de bajo nivel. Todas las pantallas que utilicen la API de bajo nivel heredan de la clase Canvas. 6.1.- El lienzo donde dibujar. La clase Canvas. La clase Canvas posee un mtodo abstracto llamado paint() que se encarga de dibujar en la pantalla del dispositivo. Ese mtodo tendr que ser implementado en cada clase que sea subclase de Canvas. El cdigo para crear una clase en java es bien simple, as: Public class HelloCanvas extends Canvas implements CommandListener { //cdigo de la clase } implements CommandListener. Esa instruccin permite que el mvil detecte los comandos como exitCommand, o los okCommand u otros. 1) Constructor de la Clase HelloCanvas: public HelloCanvas() { try { // Set up this canvas to listen to command events setCommandListener(this); Con la instruccin: setCommandListener deja listo al Canvas para escuchar los comandos // Add the Exit command Agrega un exitCommand al Canvas addCommand(new Command("Exit", Command.EXIT, 1)); } catch(Exception e) { e.printStackTrace(); } } 2) El mtodo paint: se usa para dibujar en el Canvas y mostrarse en la pantalla del mvil public void paint(Graphics g) { Esa sentencia crea un objeto de la clase Graphics, el objeto se llama g. g.drawString("Sample Text",0,0,Graphics.TOP|Graphics.LEFT); } La clase Graphics. La clase Graphics posee todos los mtodos necesarios para dibujar en pantalla, mostrar grficos y mostrar textos. drawString y sirve para dibujar una cadena de caracteres dentro del Canvas,

    3) Mtodos para detectar eventos relacionados con las pulsaciones de una tecla protected void keyPressed(int keyCode) { Se ejecuta cuando se presiona una tecla } protected void keyReleased(int keyCode) { Se ejecuta cuando se suelta una tecla } protected void keyRepeated(int keyCode) { Se ejecuta cuando se deja presionada una tecla } 4) Mtodos para detectar eventos relacionados con punteros protected void pointerDragged(int x, int y) { } protected void pointerPressed(int x, int y) { } protected void pointerReleased(int x, int y) { } 5) Mtodos para procesar comandos (el commandAction) public void commandAction(Command command, Displayable displayable) { }

  • Enlazar la clase HelloCanvas con nuestro Midlet La solucin es sencilla y quiz muchos ya lo saben, recuerde las clases son plantillas para crear objetos, HelloCanvas es una clase, entonces es posible crear un objeto de la clase HelloCanvas y usarlo en la clase MIDlet Para crear un objeto, primero hay que declararlo: HelloCanvas miCanvas; Lo anterior es la declaracin, para realmente para crearlo se usa el comando new as: miCanvas = new HelloCanvas(); Solo falta un detalle, recordad que para mostrar cualquier cosa en la pantalla del mvil se usa la clase Display. Esta clase, representa el hardware, la pantalla del mvil, para acceder a esta pantalla se usa el mtodo getdisplay(this) (se usa el this, para indicar que el MIDlet actual es el que se enva como parmetro), finalmente el mtodo setCurrent(pantalla) es usado para indicar que la pantalla actual ser la definida por el objeto pantalla. Display.getDisplay(this).setCurrent(miCanvas); Por tanto, el cdigo del MIDlet debe quedaros as: public class Midlet extends MIDlet { HelloCanvas miCanvas; public void startApp() { miCanvas = new HelloCanvas(); Display.getDisplay(this).setCurrent(miCanvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } el comando EXIT se agrega (como ya dije) en la clase HelloCanvas, cmo podra entonces mandar llamar el mtodo destroyApp(), si este mtodo est en la clase MIDlet? Ahora si se ve el problema verdad?. La solucin es la siguiente, es posible enviar informacin entre clases, esto slo se logra por medio del constructor. se tiene que enviar un objeto de la clase MIDlet, para que con el objeto se pueda mandar llamar el mtodo destroyApp(). entonces la sentencia para crear el objeto es as: miCanvas = new HelloCanvas(this); Por tanto, el cdigo final de nuestro MIDlet ser: public class Midlet extends MIDlet { HelloCanvas miCanvas; public void startApp() { miCanvas = new HelloCanvas(this); Display.getDisplay(this).setCurrent(miCanvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Cambios a realizar en la clase HelloCanvas 1) Cambiaremos el CONSTRUCTOR: public HelloCanvas(Midlet m ) { // cdigo del constructor } IMPORTANTSIMO: El nombre que debis poner donde yo puse Midlet debe ser el nombre que hayis dado a vuestra clase MIDlet cuando la creasteis y que coincide con el nombre del archivo .java que contiene vuestro MIDlet. Podra ser: EjMidlet, PrimerMidlet, Declaro un objeto de la clase Midlet (en mi ejemplo es Midlet, en el vuestro., ver el comentario que os puse en IMPORTANTSIMO): private Midlet mid; Ahora, a ese objeto privado le asigno el valor de m que se recibe como parmetro: mid = m; O tambin podemos poner (ms correcto, aunque hace lo mismo): this.mid = m; De momento, el cdigo parcial de la clase HelloCanvas queda as: public class HelloCanvas extends Canvas implements CommandListener { private Midlet mid; /** * constructor */ public HelloCanvas(Midlet m ) { this.mid = m; // cdigo del constructor } 2) Aadiremos el cdigo para el botn EXIT: public void commandAction(Command command, Displayable displayable) { mid.destroyApp(true); mid.notifyDestroyed(); } Como slo es un comando el que se tiene en la clase HelloCanvas es posible hacer lo anterior, cuando hay ms de un comando se debe usar un if para identificar cul comando se presion pero en este ejemplo slo se tiene el comando de EXIT. Si al ejecutarlo, ves la pantalla negra y no sale el texto, es porque tu emulador de telfono usa como color inicial el NEGRO y por tanto, TEXTO NEGRO sobre FONDO NEGRO no se ve. En este caso, aade esta lnea (justo antes de escribir el texto Hola Mundo) a tu mtodo paint() de la clase HelloCanvas: g.setColor(255, 255, 255); Con esta lnea ests eligiendo el color BLANCO y como el fondo es negro, ya vers el texto. Por si tienes dudas, t mtodo paint() debe quedar as: public void paint(Graphics g) { g.setColor(255, 255, 255); g.drawString("Hola Mundo, en modo grfico", 20, 100, Graphics.TOP | Graphics.LEFT); }

  • 6.2.- Eventos de bajo nivel. Se dispone de dos medios de interaccin con un objeto Canvas:

    Mediante los Commands, como has hecho en la API de alto nivel. Mediante eventos de bajo nivel.

    Los eventos de bajo nivel son: Eventos de teclado. Eventos de puntero.

    /*-ejemplo creacin tablero nxm casillas protected void paint(Graphics g) { int ancho= getWidth (); int alto= getHeight (); int i,j; // Fondo g.setColor (0xFFFFFF); // Color blanco g.fillRect(0, 0, ancho, alto); // Tablero g.setColor (0x000000); // Color negro for (i=0; i

  • Si por ejemplo queremos mostrar en pantalla cul es la tecla que se va pulsando en cada momento podramos escribir el siguiente cdigo en el mtodo keyPressed: protected void keyPressed (int keyCode) { texto = "Key code: " + String.valueOf(keyCode) + " - Key name: " + getKeyName(keyCode) ; repaint(); }

    6.2.2.- Acciones de juego. Las acciones de juego no son ms que cdigos estndar para las funciones tpicas de juegos (direcciones, disparo, etc.). El perfil MIDP define las siguientes acciones de juego: UP, DOWN, LEFT, RIGHT, FIRE, GAME A, GAME B, GAME C y GAME D.

    La implementacin del mtodo keyPressed podra quedar entonces as: Protected void keyPressed (int keyCode) { int gameAction= getGameAction (keyCode); switch (gameAction) { case UP: // Acciones si se pulsa tecla arriba case DOWN: // Acciones si se pulsa tecla abajo case LEFT: // Acciones si se pulsa tecla izquierda case RIGHT: // Acciones si se pulsa tecla derecha case FIRE: // Acciones si se pulsa tecla disparo } repaint (); }

    6.3.- Dibujar elementos en la pantalla. El mtodo paint. Para ello Canvas dispone del mtodo abstracto paint que se encarga de dibujar el contenido de la pantalla. Dado que el mtodo paint es abstracto, para cada subclase de Canvas que definas debers implementar ese mtodo. Un ejemplo trivial de implementacin de paint podra ser: protected void paint (Graphics g) { g.drawRect (5,5,10,10); }

  • Cuando el administrador de aplicaciones hace visible un Canvas en la pantalla, llama al mtodo showNotify y cuando lo elimina de la pantalla hace una llamada a hideNotify. Estos mtodos estn vacos en la clase Canvas. Su implementacin puede resultar muy til para: Almacenar el estado de la aplicacin (disposicin de la pantalla, variables, etc.) cuando el AMS por alguna razn (por ejemplo por una llamada telefnica entrante o por la llegada de un mensaje corto) quita un objeto Canvas de la pantalla del dispositivo (antes llamar a hideNotify). Restaurar posteriormente la aplicacin (al llamar a showNotify) con la informacin que previamente haba sido almacenada.

    6.4.- Herramientas de dibujo. La clase Graphics. Hay dos formas de obtener un objeto de la clase Graphics:

    Como parmetro del mtodo paint: protected void paint (Graphics g). Ese objeto es el que podrs utilizar para dibujar elementos en la pantalla.

    A travs de una imagen mutable (una imagen que se cre reservando un bloque de memoria y sobre la que luego se puede obtener un objeto Graphics para poder escribir sobre ella).

    6.5.- Sistema de coordenadas. El sistema de coordenadas representa posiciones entre pxeles, no los propios pxeles. Por tanto el primer pxel en la esquina superior izquierda de la pantalla sera el cuadrado definido por las coordenadas (0,0), (1,0), (0,1) y (1,1). Mediante los mtodos getWidth y getHeight de la clase Canvas se puede obtener el alto y el ancho de la pantalla. /*-------------------------------------------------- * Mtodo paint * Dibujamos los ejes de coordenadas *-------------------------------------------------*/ protected void paint (Graphics g) { // Borramos la pantalla g.setColor(0xFFFFFF); g.fillRect(0, 0, getWidth(), getHeight()); // Origen de coordenadas g.setColor(0x000000); //Negro g.drawString("(0,0)",0,0,Graphics.TOP|Graphics.LEFT); // Eje vertical g.drawLine(0, 0, 0, getHeight()); g.fillTriangle(-getHeight()/20, (19*getHeight())/20, getHeight()/20, (19*getHeight())/20, 0, getHeight()); // Eje horizontal g.drawLine(0, 0, getWidth(), 0); g.fillTriangle((19*getWidth())/20, -getWidth()/20, getWidth(), 0, (19*getWidth())/20, getWidth()/20); } El origen de coordenadas puede ser modificado mediante el mtodo translate de la clase Graphics, provocando un desplazamiento de todos los objetos en la pantalla.

    6.6.- Manejo de los colores. La clase Graphics proporciona un modelo de coloreado de 24 bits de tipo RGB con 8 bits para cada componente de color (rojo, verde, azul).

    Graphics g; g.setColor (0, 0, 0); // Color negro g.setColor (255, 255, 255); // Color blanco g.setColor (0, 0, 255); // Color azul g.setColor (0x00FF00); // Color verde Una vez seleccionado un color determinado para el "pincel", cualquier cosa que se dibuje en la pantalla ser con ese color hasta que se establezca otro color. Por ejemplo: g.setColor (255, 0, 0); g.fillRect (0, 0, getWidth(), getHeight()); // pintara toda la pantalla de color rojo

  • 6.7.- Escritura de texto. Para dibujar texto en la pantalla la clase Graphics proporciona una serie de herramientas (entre ellas el mtodo drawString). El aspecto que tendr el texto al mostrarse en la pantalla podr ser configurado a travs de la clase Font, permitiendo jugar con la combinacin de tres tipos de atributos: aspecto, estilo y tamao.

    Para obtener una fuente podemos utilizar el mtodo esttico getFont de la clase Font que devuelve un objeto de tipo Font. Para ello se debe indicar una especificacin del tipo de fuente que se desea (atributos face, style y size; o aspecto, estilo y tamao), por ejemplo: Font fuente= Font.getFont (FACE_SYSTEM, STYLE_BOLD, SIZE_LARGE); Una vez que se disponga de un objeto de la clase Font, habr que asociarlo al objeto Graphics que ser quien ejecutar alguno de sus mtodos (por ejemplo drawString) para dibujar el texto. Esa asociacin se puede llevar a cabo mediante el mtodo setFont de la clase Graphics. Por ejemplo: g.setFont (fuente); g.drawString (Ejemplo de texto en Canvas, getWidth()/2, getHeight()/2, BASELINE | HCENTER); La definicin de un punto de anclaje consiste en la combinacin de una constante horizontal (LEFT, HCENTER, RIGHT) con una constante vertical (TOP, BASELINE, BOTTOM) mediante el operador lgico OR.

    6.8.- Dibujo de figuras geomtricas.

    6.9.- Dibujo de imgenes. Uso del contexto grfico. Para imgenes inmutables: -Se crea la imagen (por ejemplo a partir de un archivo grfico): Image imagen= Image.createImage (/resources/europa_occidental); -Se muestra la imagen en un Canvas (usando el mtodo drawImage de la clase Graphics dentro del mtodo paint del Canvas): protected void paint (Graphics g) { ... g.drawImage (imagen, g.getWidth(), g.getHeight(), Graphics.HCENTER | Graphics.VCENTER); ...} Para imgenes mutables: -Se crea la imagen mutable (reserva de espacio nicamente): Image imagen= Image.createImage (60, 40); -Se crea y manipula el contenido de la imagen (mediante el uso de las herramientas proporcionadas por la clase Graphics: rectngulos, tringulos, lneas, arcos, textos, etc.). Para ello hay que obtener el contexto grfico de la imagen (un objeto de tipo Graphics).

  • Graphics contexto= imagen.getGraphics (); // Obtencin del contexto grfico de la imagen // Dibujo sobre la imagen contexto.setColor (255, 255, 0); contexto.fillRect (0, 0, imagen.getWidth(), imagen.getHeight()); Se muestra la imagen en un Canvas (usando el mtodo drawImage de la clase Graphics dentro del mtodo paint del Canvas): protected void paint (Graphics g) { ... g.drawImage (imagen, g.getWidth(), g.getHeight(), Graphics.HCENTER | Graphics.VCENTER); ... }

    6.10.- Recorte de regiones. Cada vez que se realiza una llamada al mtodo paint, el dispositivo tiene que redibujar toda la pantalla. Si pudieras dibujar nicamente una parte de la pantalla (la que va a ser modificada) podra obtenerse un importante ahorro en tiempo.

    6.11.- Desplazamiento del origen de coordenadas.

    7.- Una interfaz de usuario para juegos. Es importante recordar que las clases especializadas para el desarrollo de juegos fueron incorporadas a partir de la versin 2.0 del perfil MIDP, as que aquellos mviles que slo soporten la versin 1.0 no podrn ejecutarlas.

    7.1.- Utilizacin de la API de juegos. Adems de los mtodos de Canvas, esta clase proporciona algunas funcionalidades adicionales para el desarrollo de juegos como: Creacin de animaciones rpidas y sin parpadeo mediante una sincronizacin apropiada de los grficos en la pantalla. Posibilidad de examinar el estado de las teclas del dispositivo. A partir de los objetos de esta clase y todos los dems componentes del paquete Game (capas, sprites, escenarios, etc.) podrs comenzar a disear pequeos juegos de prueba. Se crea primero una clase que derive o herede de la clase GameCanvas (igual que hacamos con Canvas), en cdigo es as: public class EjemploGameCanvas extends GameCanvas { // Cdigo de la clase } Pero eso no es todo, est clase porque as est diseada, se debe ejecutar en su propio subproceso, para implementar esto en Java se usa la interfaz Runnable, para hacerlo se escribe en la definicin de la clase el implements Runnable as: import javax.microedition.lcdui.game.*; public class EjemploGameCanvas extends GameCanvas implements Runnable { // Cdigo de la clase } El constructor de la clase que hereda de GameCanvas, segn la documentacin, requiere un parmetro que es de tipo booleano (verdadero o falso), si es verdadero se suprimen los mecanismos para los eventos de las teclas, si es falso se activan los mecanismos y se pueden detectar fcilmente las teclas que se han presionado. public class EjemploGameCanvas extends GameCanvas implements Runnable { public EjemploGameCanvas () {

  • super(true); // cdigo del constructor } } toda clase que lleve en su definicin el implements Runnable debe obligatoriamente implementar el mtodo run() este mtodo es la clave de los subprocesos, public class EjemploGameCanvas extends GameCanvas implements Runnable { public EjemploGameCanvas () { super(true); // cdigo del constructor } public void run() { //Cdigo del subproceso } } El Mtodo getGraphics() Por otro lado, la clase GameCanvas contiene varios mtodos, uno de ellos es getGraphics(), este mtodo es el primer paso para iniciar a dibujar en el GameCanvas, el mtodo regresa un objeto tipo grafico con el que posteriormente se dibuja, la instruccin para usarlo es as: g = getGraphics(); queda entonces la clase as: public class EjemploGameCanvas extends GameCanvas implements Runnable { Graphics g; public EjemploGameCanvas () { super(true); // cdigo del constructor g = getGraphics(); } public void run() { //Cdigo para el subproceso } } Creacin del Subproceso Otra vez regresamos a los subprocesos, no basta con escribir el implements Runnable y el mtodo run se debe en verdad crear el subproceso, esto se hace creando un objeto de la clase Thread, como se crea el objeto, ya lo vimos, primero se declara y se crea usando la palabra new, esto incluso se puede escribir en una sola lnea as: Thread subproceso = new Thread(this); Ya est creado el subproceso con la lnea anterior pero mientras no se inicie jams se va a ejecutar el mtodo run, as que para iniciarlo basta con mandar llamar su mtodo start as: subproceso.start(); queda entonces la clase as: public class EjemploGameCanvas extends GameCanvas implements Runnable { Graphics g; public EjemploGameCanvas () { super(true); // cdigo del constructor g = getGraphics(); Thread subproceso = new Thread(this); subproceso.start(); } public void run() { //Cdigo } Ahora si a Dibujar Listo tenemos todos los elementos para empezar a dibujar lo que queramos en la pantalla del mvil, usando de por medio el objeto g tal y como se hizo con la clase Canvas, esto ya se vio por lo que no entrar en detalles, el cdigo siguiente coloca la pantalla del mvil en negro y escribe hola Mundo usando GameCanvas, en otro color: // pantalla en negro g.setColor(0x000000); g.fillRect(0, 0, getWidth(), getHeight()); // dibujo de las letras hola mundo g.setColor(0xff00FF); g.drawString("Hola mundo, con GameCanvas", 0, 60, Graphics.LEFT | Graphics.TOP); Dnde va el cdigo? En el mtodo run() despus de todo es el que se ejecuta al iniciar el subproceso, antes de ver donde, veamos otro mtodo de la clase GameCanvas. El mtodo flushGraphics(); Este mtodo, tambin de la clase GameCanvas es usado para colocar realmente en la pantalla del mvil lo dibujado por el objeto g, el cdigo anterior que pinta la pantalla de negro y dibuja el letrero est en la memoria o buffer y no se puede ver, hasta que se invoque el mtodo flushGraphics(), al hacerlo se ve ahora si lo dibujado, este cdigo va al final, despues del mtodo drawString, tambin va en el mtodo run, queda finalmente el cdigo as: sora: M Alejandra Toms Fernndez 5 de 5 public class EjemploGameCanvas extends GameCanvas implements Runnable { Graphics g; public EjemploGameCanvas () { super(true); // cdigo del constructor g = getGraphics(); Thread subproceso = new Thread(this); subproceso.start(); } public void run() { // pantalla en negro g.setColor(0x000000); g.fillRect(0, 0, getWidth(), getHeight()); // dibujo de las letras hola mundo g.setColor(0xff00FF); g.drawString("Hola mundo, con GameCanvas", 0, 60, Graphics.LEFT | Graphics.TOP); flushGraphics(); } }

    Ya slo faltara crear el MIDlet que llame a esta clase GameCanvas que se

    hace como siempre con el cdigo:

    . EjemploGameCanvas canvas=new EjemploGameCanvas(); display.setCurrent(canvas);

    ..

  • Programacin de aplicaciones para dispositivos mviles (II). 1.- Extensiones, plataformas y paquetes opcionales. 1.1.- Java Community Process. Java Community Process (JCP), establecido en 1998, es un organismo formado por diferentes entidades (empresas, asociaciones, individuos particulares, etc.) interesadas en las tecnologas Java.

    1.2.- Paquetes opcionales para Java ME. Entre las JSR que la comunidad JCP ha definido para trabajar con dispositivos mviles se encuentran las JSR 37, 118 y 271 que implementan precisamente el perfil MIDP en sus versiones 1.0, 2.0 y 3.0. Aqu tienes algunos de los paquetes opcionales para Java ME ms conocidos:

    Wireless Messaging API (WMA). JSR-120, JSR-205. API de mensajera inalmbrica. Para el envo de mensajes SMS y MMS.

    Bluetooth API. JSR-82. API para la comunicacin por Bluetooth.

    Personal Information Management and File Connection API. JSR-75. Acceso a la lista de contactos del dispositivo y al sistema de archivos.

    Mobile Media API (MMAPI). JSR-135. Soporte de audio y vdeo. Reproduccin y captura.

    Location API. JSR-179. Localizacin geogrfica del dispositivo, mediante GPS u otros mecanismos.

    Mobile 3D Graphics. JSR-184. Soporte de grficos 3D.

    J2ME Web Services API (WSA). JSR-172. Soporte de servicios web en dispositivos mviles.

    Security and Trust Services API. JSR-177. Tratamiento de informacin privada, ejecucin segura, identificacin, autentificacin, etc.

    1.3.- Sun Java Wireless Toolkit. La plataforma Sun Java Wireless Toolkit contiene una gran cantidad de herramientas y utilidades. Entre esas herramientas se encuentra la consola de mensajera inalmbrica (para trabajar con el envo y recepcin de mensajes cortos y multimedia en el emulador), control del Bluetooth, gestin de contenidos y del sistema de archivos. Si dentro del administrador de plataformas eliges la opcin "Sun Java(TM) Wireless Toolkit 2.5.2 for CLDC", y a continuacin, en la pestaa "Tools & Extensions", pulsas el botn "Open Utilities", obtendrs una ventana con una serie herramientas que te podrn ser de gran utilidad. Entre ellas se encuentra la "WMA Console" que te permitir, entre otras cosas, enviar mensajes a los nmeros de telfono que quieras para poder probar la recepcin de mensajes en los dispositivos que ests emulando en ese momento.

    2.- Aplicaciones multihilo. En ms de una ocasin necesitars que tu aplicacin realice varias tareas al mismo tiempo. Esto puede conseguirse mediante el uso de distintos hilos (o threads o hebras) de ejecucin en el programa. Una aplicacin multihilo contendr al menos dos hilos (flujos de ejecucin diferentes) que podrn ejecutarse de manera ms o menos independiente y simultnea. La plataforma Java ME proporciona la posibilidad de construir y ejecutar aplicaciones multihilo al igual que tambin lo haca Java SE, aunque con algunas limitaciones.

    2.1.- El modelo de hilos en Java ME. Las mquinas virtuales que proporciona la plataforma Java ME permiten la ejecucin de aplicaciones mulitihilo utilizando los mismos mecanismos que la plataforma Java SE (clase Thread, interfaz Runnable, objetos synchronized, mtodos wait y notify, etc.), aunque con algunas diferencias:

    No se permiten los grupos de hilos de ejecucin (clase ThreadGroup).

    No se dispone de los mtodos destroy, interrupt, isInterrupt.

    Los mtodos obsoletos resume, suspend y stop han sido eliminados.

    El mtodo dumpStack no est disponible.

    2.2.- Creacin de midlets multihilo. Toda aplicacin mulitihilo tiene un hilo principal que es lanzado por la mquina virtual en el momento en que la aplicacin empieza a ejecutarse. Desde ese hilo principal se irn creando el resto de hilos del programa y ser el ltimo que termine su ejecucin. Cuando finalice el hilo principal, finalizar el programa. n Java existen dos formas de crear nuevos hilos de ejecucin:

    Mediante la implementacin de la interfaz Runnable.

    Mediante la extensin (herencia) de la clase Thread. Si decides implementar la interfaz Runnable para dotar a tu aplicacin de varios hilos de ejecucin puedes seguir los siguientes pasos:

    Declarar una clase que implemente la interfaz Runnable.

    Sobrescribir el mtodo run de la interfaz Runnable, que contendr el cdigo que se desea ejecutar en el hilo de ejecucin independiente.

    Crear un objeto de esa clase.

    Crear un objeto de la clase Thread (hilo) utilizando el objeto recin creado como parmetro para el constructor del Thread.

    Llamar al mtodo start del hilo (thread) recin creado. A partir de ese momento se ejecutar el mtodo run en un hilo de ejecucin diferente al hilo principal desde el cual se ha creado.

    public class Contador implements Runnable { private int vInicial; private int incremento; private long contador; private boolean enMarcha; public Contador (int vInicial, int incremento) { this.vInicial= vInicial; this.incremento= incremento; this.enMarcha= true; } public void run () { // Contador "infinito" hasta que se indique la seal de fin contador= vInicial;

    while (enMarcha) { contador += incremento; } } public long getValorActual (){ return contador; } public long detener () { enMarcha= false; return contador; }

    } Midlet del ejemplo: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class MidletEjemploRunnable extends MIDlet { private Display display; private Contador[] contador= {null, null, null}; private FormPrincipal formPrincipal; public MidletEjemploRunnable () { // Creamos los tres contadores contador[0]= new Contador (0, 1); // Contador de 1 en 1 contador[1]= new Contador (0, 10); // Contador de 10 en 10 contador[2]= new Contador (0, 100); // Contador de 100 en 100 // Creamos el formulario principal formPrincipal= new FormPrincipal (this); }

    public void startApp() { // Obtenemos el Display display= Display.getDisplay(this); // Ejecutamos cada contador en un hilo diferente. // Al no ser objetos sublcase de Thread hay que crear nuevos hilos (threads) de ejecucin para que que el mtodo run de esos ojbetos se ejecute independientemente en cada hilo. // Establecemos la mnima prioridad posible para estos hilos, para que no sobrecarguen el sistema. Thread t0, t1, t2; t0= new Thread (contador[0]); t0.setPriority(Thread.MIN_PRIORITY);

  • t1= new Thread (contador[1]); t1.setPriority(Thread.MIN_PRIORITY); t2= new Thread (contador[2]); t2.setPriority(Thread.MIN_PRIORITY); // La llamada al mtodo "start" har que se pongan en funcionamiento. t0.start (); t1.start (); t2.start (); // Establecemos como pantalla inical el formulario formPrincipal display.setCurrent(formPrincipal); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } /*-------------------------------------------------- * Finaliza el midlet.

    /*-------------------------------------------------*/ public void exitMidlet () { destroyApp (true); notifyDestroyed (); } /*-------------------------------------------------- * Muestra una pantalla de alerta. /*-------------------------------------------------*/ public void showAlert (Alert alerta, Displayable sigPantalla) { display.setCurrent(alerta, sigPantalla); } /*-------------------------------------------------- * Obtiene el valor de un contador. /*-------------------------------------------------*/ public long getContador (int numContador) { return contador[numContador].getValorActual(); } }

    Si te decides por la otra opcin (crear una clase que herede de Thread) podras hacerlo as:

    Declarar una clase que herede de la clase Thread.

    Sobrescribir el mtodo run, que contendr el cdigo que se desea ejecutar en el hilo.

    Crear un objeto de esa clase (ser el nuevo hilo).

    Llamar al mtodo start del hilo recin creado. En este caso se trata de hacer que la clase Contador, en lugar de implementar la interfaz Runnable, extienda (herede de) la clase Thread: public class Contador extends Thread{ El mtodo run de esta clase seguir siendo el mismo: public void run () { // Contador "infinito" hasta que se indique la seal de fin contador= vInicial; while (enMarcha) { contador += incremento; } } A la hora de crear los contadores se har lo mismo (creacin de objetos de la clase contador): contador= new Contador (0, 1); Pero esta vez no ser necesario crear un objeto de tipo Thread y pasarle el objeto contador como parmetro al constructor, pues el objeto contador es ya un objeto de tipo Thread. Por tanto ser suficiente con ejecutar el mtodo start de ese objeto: contador.start (); Ejemplo completo: public class Contador extends Thread { private int vInicial; private int incremento; private long contador; private boolean enMarcha; public Contador (int vInicial, int incremento) { this.vInicial= vInicial; this.incremento= incremento; this.enMarcha= true; // Establecemos la mnima prioridad posible para estos hilos, para que no sobrecarguen el sistema. this.setPriority(Thread.MIN_PRIORITY); } public void run () {

    // Contador "infinito" hasta que se indique la seal de fin contador= vInicial; while (enMarcha) { contador += incremento; } } public long getValorActual (){ return contador; } public long detener () { enMarcha= false; return contador; }

    Midlet del ejemplo: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class MidletEjemploRunnable extends MIDlet { private Display display; private Contador[] contador= {null, null, null}; private FormPrincipal formPrincipal; public MidletEjemploRunnable () { // Creamos los tres contadores contador[0]= new Contador (0, 1); // Contador de 1 en 1 contador[1]= new Contador (0, 10); // Contador de 10 en 10 contador[2]= new Contador (0, 100); // Contador de 100 en 100 // Creamos el formulario principal formPrincipal= new FormPrincipal (this); } public void startApp() { // Obtenemos el Display display= Display.getDisplay(this); // Ejecutamos cada contador en un hilo diferente. // Son objetos sublcase de Thread. // La llamada al mtodo "start" har que se pongan en funcionamiento. contador[0].start(); contador[1].start();

    contador[2].start(); // Establecemos como pantalla inical el formulario formPrincipal display.setCurrent(formPrincipal); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } /*-------------------------------------------------- * Finaliza el midlet. /*-------------------------------------------------*/ public void exitMidlet () { destroyApp (true); notifyDestroyed (); } /*-------------------------------------------------- * Muestra una pantalla de alerta. /*-------------------------------------------------*/ public void showAlert (Alert alerta, Displayable sigPantalla) { display.setCurrent(alerta, sigPantalla); } /*-------------------------------------------------- * Obtiene el valor de un contador. /*-------------------------------------------------*/

  • public long getContador (int numContador) { return contador[numContador].getValorActual();

    } }

    3.- Mecanismos de persistencia (I). Sistemas de gestin de registros. La plataforma Java ME proporciona, al menos, dos mecanismos de almacenamiento y recuperacin de informacin para el perfil MIDP:

    Mediante el sistema RMS (Record Management System), donde el almacenamiento tiene lugar en la memoria interna del dispositivo.

    Mediante el sistema de gestin de archivos en memoria externa (paquete opcional JSR-75, tambin conocido como "PDA Optional Packages for the Java ME Platform").

    3.1.- El sistema de gestin de registros (RMS). Un almacn de registros o Record Stores consiste en un conjunto de registros que permanece en la memoria no voltil del dispositivo, sin ser borrada (persistente), aun cuando el midlet que la ha creado haya finalizado su ejecucin.Las herramientas necesarias para poder trabajar con este sistema de almacenamiento (clases, interfaces y excepciones) se encuentran en el paquete javax.microedition.rms y son las siguientes:

    3.2.- Estructura de un almacn de registros. Un RecordStore est formado por un conjunto de registros. Cada registro est formado por d