<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2933929503119362201</id><updated>2024-09-14T07:08:39.331-07:00</updated><category term="Practicas"/><category term="1. Introduccion"/><category term="J2ME"/><category term="2. Definicion de una Clase"/><category term="Instrucciones iterativas"/><category term="5. Herencias"/><category term="9. Instrucciones del lenguaje"/><category term="Instrucciones Condicionales"/><category term="4. Definición de métodos de una clase"/><category term="7. Matrices arrays o Vectores"/><category term="Interfaces"/><category term="3. Definición de constructores de una clase"/><category term="Codigo Fuente"/><category term="Excepciones"/><category term="Lenguaje Java"/><category term="Tipos de Datos"/><category term="Trucos Java"/><category term="6. Polimorfismo"/><category term="Cliente Servidor"/><category term="Glosario de Java"/><category term="Lectura por Teclado"/><category term="Python y Java"/><category term="Sun"/><category term="Web Services"/><category term="XML"/><category term="XSL"/><title type='text'>aprendiendo-lenguaje-java.com</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default?start-index=26&amp;max-results=25'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-6428737614839852574</id><published>2009-04-12T13:26:00.000-07:00</published><updated>2009-04-12T13:26:00.898-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>Nuestro primer MIDlet</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;En este capítulo vamos a construir y ejecutar nuestro primer MIDlet. Existen  diferentes herramientas válidas para construir programas bajo el standard J2ME,  como el propio &quot;Sun One Studio&quot; de Sun Microsystems o &quot;Jbuilder&quot; de Borland.  Nosotros vamos a valernos del &quot;J2ME Wireless Toolkit 2.0&quot; que proporciona Sun.  Este entorno es el más sencillo de utilizar, y aunque no nos ofrece una gran  potencia a la hora de desarrollar aplicaciones, no nos distraerá con grandes  complejidades del principal objetivo que es aprender a hacer aplicaciones  (juegos) en J2ME.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para instalar J2ME Wireless Toolkit, primero hemos de instalar el entorno de  programación de J2SE (JDK). Puedes descargar la última versión de JDK desde la  URL &lt;a href=&quot;http://java.sun.com/j2se/downloads.html&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;http://java.sun.com/j2se/downloads.html&lt;/a&gt;. Una vez descargado e  instalado, estaremos en condiciones de descargar e instalar J2ME desde la URL &lt;a href=&quot;http://java.sun.com/j2me/download.html&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;http://java.sun.com/j2me/download.html&lt;/a&gt;. El entorno de desarrollo que  nos provee el Wireless Toolkit se llama KToolBar.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;Compilando el primer MIDlet.-&lt;/span&gt; Vamos a construir  paso a paso nuestro primer MIDlet usando esta herramienta. Tras la instalación  del wireless toolkit, tendremos un nuevo submenú en el menú inicio con un  aspecto similar a éste:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/5184_7_1.gif&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Selecciona la aplicación KToolBar e inicializa el entorno. Verás aparecer  la ventana del entorno.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/5184_7_2.gif&quot; /&gt; &lt;br /&gt;&lt;br /&gt;Vamos a crear un nuevo proyecto, así que pulsamos el botón New Project.  Nos solicitará un nombre para el proyecto y otro para la clase principal de la  aplicación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/5184_7_3.gif&quot; /&gt; &lt;br /&gt;&lt;br /&gt;Tanto el proyecto como la clase principal se llamarán HelloWorld, así  que introducimos este nombre en ambos cuadros de texto y pulsamos el botón  Create Project. En este momento KToolBar crea la estructura de directorios  necesaria para albergar el proyecto.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/5184_7_4.gif&quot; /&gt; &lt;br /&gt;&lt;br /&gt;Cada una de las carpetas creadas tiene una misión concreta. Por ahora  nos bastará saber que nuestros archivos fuente irán emplazados en el directorio  src, y los recursos necesarios como gráficos, sonidos, etc... se alojarán en el  directorio res.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A diferencia de otros entornos de programación, KToolBar no cuenta con un  editor integrado para editar los programas, por lo tanto vamos a utilizar uno  externo. Puedes utilizar el bloc de notas de Windows o tu editor favorito.  Personalmente utilizo Crimson Editor (&lt;a href=&quot;http://www.crimsoneditor.com/&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;http://www.crimsoneditor.com/&lt;/a&gt;), que tiene soporte para  Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Utilizando tu editor favorito introduce el programa siguiente:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;strong&gt;import javax.microedition.midlet.*;&lt;br /&gt;import  javax.microedition.lcdui.*;&lt;/strong&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;public class HelloWorld extends MIDlet implements CommandListener  {&lt;br /&gt; private Command exitCommand;&lt;br /&gt; private Display display;&lt;br /&gt; private Form  screen;&lt;br /&gt;&lt;br /&gt; public HelloWorld() {&lt;br /&gt;  // Obtenemos el objeto Display del  midlet.&lt;br /&gt;  display = Display.getDisplay(this);&lt;br /&gt; &lt;br /&gt;  //  Creamos el  comando Salir.&lt;br /&gt;  exitCommand = new Command(&quot;Salir&quot;,  Command.EXIT,2);&lt;br /&gt; &lt;br /&gt;  // Creamos la pantalla principal (un  formulario)&lt;br /&gt;  screen = new Form(&quot;HelloWorld&quot;);&lt;br /&gt; &lt;br /&gt;  // Creamos y  añadimos la cadena de texto a la pantalla&lt;br /&gt;  StringItem saludo = new  StringItem(&quot;&quot;,&quot;Hola Mundo...&quot;);&lt;br /&gt;  screen.append(saludo);&lt;br /&gt; &lt;br /&gt;  //  Añadimos el comando Salir e indicamos que clase lo  manejará&lt;br /&gt;  screen.addCommand(exitCommand);&lt;br /&gt;  screen.setCommandListener(this);&lt;br /&gt; } &lt;/strong&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt; public void startApp() throws MIDletStateChangeException {&lt;br /&gt;  //  Seleccionamos la pantalla a  mostrar&lt;br /&gt;  display.setCurrent(screen);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void pauseApp()  {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void destroyApp(boolean incondicional)  {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void commandAction(Command c, Displayable s) {&lt;br /&gt;  //  Salir&lt;br /&gt;  if (c == exitCommand)  {&lt;br /&gt;   destroyApp(false);&lt;br /&gt;   notifyDestroyed();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/strong&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;No es necesario que trates de comprender el programa ahora. Entraremos en más  detalles un poco más adelante. Por ahora simplemente lo vamos a almacenar en el  directorio src que ha creado KToolBar con el nombre HelloWorld.java. Es  importante que el nombre sea exactamente éste incluidas mayúsculas y minúsculas.  Esto es así, ya que el nombre de la clase principal tiene que ser idéntico al  nombre del archivo que lo contiene. Una vez hecho esto, volvemos al entorno  KTooBar y pulsamos el botón Build. Si todo va bien, aparecerá el texto Build  Complete. Ya tenemos nuestro programa compilado y podemos ejecutarlo en el  emulador. En el desplegable Device puedes seleccionar el emulador que quieres  utilizar. El DefaultColorPhone tiene soporte de color, así que te resultará más  atractivo. Pulsa el botón Run. Verás aparecer un emulador con forma de teléfono  móvil. En la pantalla del móvil aparece un menú con un sólo programa llamado  HelloWorld. Pulsa select para ejecutarlo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/5184_7_5.gif&quot; /&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Deberías ver como aparece la frase Hola Mundo... en la pantalla.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Ahora que hemos comprobado que el programa funciona en el emulador, estamos  listos para empaquetar el programa y dejarlo listo para descargar a un  dispositivo real. En KToolBar despliega el menú project, y selecciona create  package del submenú package. KToolBar nos informa de que ha creado los archivos  HelloWorld.jar y HelloWorld.jad dentro del directorio bin. Estos son los  archivos que habremos de transferir al teléfono móvil.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/6428737614839852574/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/6428737614839852574' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6428737614839852574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6428737614839852574'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/nuestro-primer-midlet.html' title='Nuestro primer MIDlet'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-8291997744731129219</id><published>2009-04-11T12:40:00.000-07:00</published><updated>2009-04-11T12:40:01.281-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>Conclusión y bibliografía de J2ME</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;De unos años a la fecha las instituciones de educación tecnológica en México,  particularmente las relacionadas con la computación y el desarrollo de software,  han centrado sus esfuerzos en un solo fin para la programación: aplicaciones de  bases de datos, principalmente para computadoras de escritorio con conexión a  una red o, en los mejores casos, para servidores de grandes compañías. Esta  situación se debe, principalmente, a lo difícil o casi imposible que se ha  vuelto el competir con los gigantes del software (Microsoft, Sun, Borland, etc.)  en aplicaciones de interés general, como pueden ser: procesadores de texto,  juegos, anti virus, hojas de cálculo, reproductores multimedia, entornos de  programación y un largo etcétera; todo el mercado de estos productos de consumo  masivo se considera, en la mayoría de las ocasiones, fuera del alcance de un  estudiante de nivel licenciatura, algunas veces de posgrado, y que decir de uno  de preparatoria, por muy brillantes que estos sean.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Si bien es cierto que para un ser humano solitario, y hasta cierto grado  principiante, es imposible competir contra un grupo enorme de profesionales que  llevan años dedicándose al desarrollo de los mismos módulos para un mismo  paquete, también lo es que ese ser humano puede llegar a formar parte de uno de  esos mitificados grupos y, por qué no, puede incluso ser el fundador de uno de  ellos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A lo largo de este documento se han podido ver las enormes capacidades de  desarrollo que los llamados &quot;pequeños dispositivos inalámbricos&quot; presentan,  desde la mas sencilla página web, hasta una completa aplicación con fines  científicos, de manejo de bases de datos o de acceso a la red empresarial.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Lo anterior sugiere que, siendo el campo de la programación de equipos  pequeños e inalámbricos, un campo hasta cierto punto virgen en muchas regiones  del mundo, se puede orientar a los alumnos a la creación, no ya de sistemas de  inventarios para un supermercado&lt;a href=&quot;http://imagenes.mailxmail.com/editor.cfm?GET=CONTENT&amp;amp;cid=3917&amp;amp;cap=7#_ftn1&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;[1]&lt;/a&gt;, sino de aplicaciones que, por ser de uso general  -y aunque su precio de venta sea mucho menor- resuelvan más necesidades de más  personas alrededor del mundo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Actualmente, en los teléfonos celulares, se pueden utilizar aplicaciones como  calculadoras simples, sencillísimos editores de texto para el envío de mensajes,  juegos que cada vez tienen mayor complejidad, entre otras. No hay todavía una  calculadora científica, un editor de texto con corrección de ortografía (aunque  sea por medio de la red) o un paquete de oficina compatible con los de las  PC.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se ha elegido, para este proyecto de investigación, demostrar los  conocimientos adquiridos con una aplicación de hoja de cálculo debido a la  representatividad de este tipo de paquetes, es decir, ¿Qué tipo de software  puede ser más general?. En una hoja de cálculo se puede ingresar texto, datos  numéricos, realizar operaciones, hacer programas sencillos (y en ocasiones no  tan sencillos) en las mejores hojas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Con lo anterior se pretende enviar un mensaje a cada lector que, habiendo  pasado por las páginas anteriores, haya conservado el interés en este reporte y  esté ahora leyendo estas líneas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&quot;Tenemos ante nuestros ojos un campo por labrar, un campo donde quién va  pasando por un tramo se apodera de él. Es un campo enorme y, hasta ahora, son  pocos los que lo ocupan y relativamente poco el espacio que han abarcado.  Podemos dejar que suceda lo que sucedió con las computadoras de escritorio y  quedarnos sólo con el espacio donde estamos parados (y probablemente ni eso), o  podemos comenzar a ganar terreno. Quizá nunca tengamos más del espacio  suficiente para construir nuestra choza, pero es mejor que poder apenas levantar  las manos para cubrirnos de la lluvia&quot;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;8.BIBLIOGRAFÍA&lt;/span&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;1.Deitel, H.M. Deitel, P.J. &quot;Cómo programar en Java&quot;, Prentice Hall. México.  1998.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;2.Froute, Agustín, &quot;Tutorial de Java&quot;. &lt;a href=&quot;mailto:froufe@arrakis.es&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;froufe@arrakis.es&lt;/a&gt;. España. Julio de 1996.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;3.Lopez Camacho, Vicente, &quot;Linux, guía de instalación y administración&quot;,  McGraw-Hill, España, 2001.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;4.Java.sun.com&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;5.www.motocoder.com&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;6.&lt;a href=&quot;http://www.motorola.com/&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;www.motorola.com&lt;/a&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;7.&lt;a href=&quot;http://www.nokia.com/&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;www.nokia.com&lt;/a&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;8.&lt;a href=&quot;http://www.sonyericsson.com/&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;www.sonyericsson.com&lt;/a&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;9.www.wapforum.com&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;10.&lt;a href=&quot;http://www.wmlclub.com/&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;www.wmlclub.com&lt;/a&gt;  &lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/8291997744731129219/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/8291997744731129219' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/8291997744731129219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/8291997744731129219'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/conclusion-y-bibliografia-de-j2me.html' title='Conclusión y bibliografía de J2ME'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-5799414750499096987</id><published>2009-04-10T12:37:00.000-07:00</published><updated>2009-04-10T12:37:01.048-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>DESARROLLO DE UNA APLICACIÓN</title><content type='html'>&lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;6.1.Descripción del proyecto&lt;/span&gt; &lt;/p&gt; &lt;p style=&quot;text-align: justify;&quot;&gt;El proyecto en el que se ha pretendido aplicar los conocimientos adquiridos  mediante esta investigación consiste en una pequeña hoja de cálculo con la que  se puedan realizar las operaciones aritméticas básicas (igualación, suma, resta,  multiplicación y división) y combinaciones sencillas de estas (potencia,  promedio, por ejemplo), además de comparaciones entre varios elementos  (determinar el valor mayor o menor de una lista).&lt;/p&gt;&lt;div&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;También se busca que la aplicación tenga la capacidad de almacenar los datos  de la hoja de cálculo de manera persistente en el equipo, así como de abrir  documentos (hojas) guardados con anterioridad y borrar las hojas, que ya han  sido guardadas previamente, para liberar el limitado espacio de almacenamiento  del dispositivo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;6.2. Herramientas a utilizar&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para la realización de la hoja de cálculo (llamada &lt;i&gt;hojaC&lt;/i&gt;, nombre  perteneciente a la clase principal), se ha utilizado una computadora de las  siguientes características:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Procesador AMD Duron a 1.3 Ghz.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-160 MB de memoria RAM.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Disco duro de 8.4 Gb.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Sistema operativo: Mandrake Linux 8.2.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se inició la escritura del código de &lt;i&gt;hojaC&lt;/i&gt;, como se comentó en el  capítulo 4, utilizando un editor de texto llamado Gedit y Java Wireless Toolkit  para la compilación. Aunque esto resultaba sumamente tediosos, por lo que se  optó por utilizar el Entorno Integrado de Desarrollo (IDE) Sun ONE Studio, en  una versión de evaluación especial para la plataforma micro de Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;6.3. Desarrollo&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La aplicación está compuesta por cinco clases principales, de las cuales la  llamada &lt;i&gt;hojaC&lt;/i&gt; es la que se ejecuta al iniciar y la que inicia el resto de  las clases. A continuación se describen las funciones con que cada clase debe  cumplir.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;hojaC&lt;/i&gt;: Es la clase MIDlet, es decir, la que se ejecuta. esta clase  sólo utiliza una forma (&lt;i&gt;Form&lt;/i&gt;) sobre la que se instancian una clase  &lt;i&gt;Tabla&lt;/i&gt; y una clase &lt;i&gt;TextField&lt;/i&gt;, de estas, TextField se encarga de  mostrar en la parte inferior de la pantalla el valor de la celda actual, Tabla  se explica enseguida.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Tabla&lt;/i&gt;&lt;a href=&quot;http://imagenes.mailxmail.com/editor.cfm?GET=CONTENT&amp;amp;cid=3917&amp;amp;cap=6#_ftn1&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt; [1]&lt;/a&gt;: Esta es la clase que realiza la mayor parte del  trabajo, ya que es la encargada de dibujar la hoja y sus valores, almacenar  dichos valores temporalmente, realizar las llamadas a otras clases y la  actualización del campo de texto (TextField). Esta clase implementa la interfaz  &lt;i&gt;CustomItem&lt;/i&gt;, la que permite la utilización de elementos propios de la  clase &lt;i&gt;Canvas&lt;/i&gt; (eventos de teclas, dibujo de líneas, rellenado de  rectángulos, cambio de colores, etc.) y de los formularios o formas  (&lt;i&gt;TextField&lt;/i&gt;, por ejemplo).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Texto&lt;/i&gt;: Hereda o extiende a la clase &lt;i&gt;TextBox&lt;/i&gt;, su única función  consiste en capturar los valores de las celdas y enviarlos al arreglo donde los  guarda Tabla.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;funcion&lt;/i&gt;: Esta clase contiene los métodos necesarios para la  resolución de las fórmulas que se introducen a la hoja de cálculo. Un objeto  instanciado en esta clase se construye cada vez que la hoja se actualiza, esto  es, cada que se presiona una tecla&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Archivo&lt;/i&gt;: La clase &lt;i&gt;Archivo&lt;/i&gt; es la encargada de todas las  operaciones que se realizan con archivos. En ella se encuentran los métodos  destinados a pedir el nombre o mostrar la lista de los archivos, así como  guardarlos, borrarlos o abrirlos, según lo solicite el usuario.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Ahora se explicará cada clase mostrando aquellos fragmentos de código que se  consideren importantes para tal explicación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;&lt;i&gt;6.3.1.&lt;/i&gt;Clase &lt;i&gt;hojaC&lt;/i&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La clase &lt;i&gt;hojaC&lt;/i&gt;, como el resto de las clases de esta aplicación, forma  parte del paquete &lt;i&gt;hoja&lt;/i&gt;. Debido a que será la clase que habrá de albergar  a las demás, debe heredar el paquete &lt;i&gt;midlet&lt;/i&gt;, &lt;i&gt;lcdui&lt;/i&gt; será para poder  utilizar la clase &lt;i&gt;Form&lt;/i&gt;. Además la clase, para poder se ejecutada,  necesita extender la clase &lt;i&gt;MIDlet&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;package hoja;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.midlet.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.lcdui.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class hojaC extends MIDlet implements CommandListener {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Esta clase incluirá los comandos Salir, Guardar, Abrir, Borrar y Nuevo.  También se declaran las clases &lt;i&gt;disp&lt;/i&gt;, &lt;i&gt;forma1&lt;/i&gt;, &lt;i&gt;tabla&lt;/i&gt;,  &lt;i&gt;txt1&lt;/i&gt; y una variable lógica &lt;i&gt;prim&lt;/i&gt; que servirá para identificar  cuando sea la primer vez que se ejecuta la clase, esto sirve para no redefinir  los comandos y los valores de algunas variables.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private final static Command Salir = new Command(&quot;Salir&quot;,                                                                                                            Command.EXIT, 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command Guardar = new Command(&quot;Guardar&quot;,                                                                                               Command.SCREEN, 3);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command Abrir = new Command(&quot;Abrir&quot;,                                                                                                           Command.SCREEN, 3);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command Borrar = new Command(&quot;Borrar&quot;,                                                                                                      Command.SCREEN, 3);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command Nuevo = new Command(&quot;Nuevo&quot;,                                                                                                     Command.SCREEN, 3);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Display disp;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Form forma1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Tabla tabla;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public TextField txt1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private boolean prim;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el constructor de la clase sólo se instancian las clases &lt;i&gt;forma1&lt;/i&gt;,  &lt;i&gt;tabla&lt;/i&gt;, &lt;i&gt;txt1&lt;/i&gt; y se le asigna a &lt;i&gt;prim&lt;/i&gt; el valor inicial de  verdadero.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public hojaC(){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        forma1=new Form(&quot;Mini-hoja de cálculo&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;tabla=new Tabla(null, Display.getDisplay(this),this);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        txt1=new TextField(&quot;=&quot;, null, 64, 0);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        prim=true;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el método startApp() se agregan los comandos, la tabla y el campo de texto  a &lt;i&gt;forma1&lt;/i&gt; y se define esta como objeto a mostrar.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void startApp() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (prim){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            disp=Display.getDisplay(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.append(tabla);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.append(txt1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.addCommand(Salir);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.addCommand(Guardar);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.addCommand(Abrir);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.addCommand(Borrar);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.addCommand(Nuevo);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            prim=false;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            disp.setCurrent(forma1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            disp.setCurrent(forma1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public void pauseApp() {    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public void destroyApp(boolean unconditional) {    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La función &lt;i&gt;settexto&lt;/i&gt; es utilizada por la clase &lt;i&gt;Tabla&lt;/i&gt; para  actualizar el contenido de &lt;i&gt;txt1&lt;/i&gt; cada vez que en la tabla se cambia de  celda.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;protected void settexto(String texto){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        txt1.setString(texto);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Finalmente, en el método &lt;i&gt;commandAction&lt;/i&gt; se define que se hará en caso  de cada opción del menú.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void commandAction(Command c, Displayable d){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (c==Salir){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            destroyApp(false);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            notifyDestroyed();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(c==Abrir){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Archivo ar=new Archivo(&#39;A&#39;,tabla.getDatos(),disp,forma1);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;           &lt;/i&gt; &lt;i&gt;forma1.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(c==Guardar){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Archivo ar=new Archivo(&#39;G&#39;,tabla.getDatos(),disp,forma1);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;           &lt;/i&gt; &lt;i&gt;forma1.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(c==Borrar){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Archivo ar=new Archivo(&#39;B&#39;,tabla.getDatos(),disp,forma1);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            forma1.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(c==Nuevo){ tabla.limpiar(); }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;&lt;i&gt;6.3.2.&lt;/i&gt;Clase &lt;i&gt;Tabla&lt;/i&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Esta clase importará el paquete &lt;i&gt;javax.microedition.lcdui&lt;/i&gt; y la clase  &lt;i&gt;funcion&lt;/i&gt; de el paquete &lt;i&gt;hoja&lt;/i&gt;. Además agrega un comando al menú que  había creado &lt;i&gt;hojaC&lt;/i&gt;, el comando &lt;i&gt;cmdAny&lt;/i&gt; (que mostrará el texto  &quot;Valor&quot;). Se hereda la capacidad de manejo de herramientas de &lt;i&gt;Canvas&lt;/i&gt; en  la misma pantalla que elementos de &lt;i&gt;Form&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;package hoja;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.lcdui.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import hoja.funcion;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class Tabla extends CustomItem implements ItemCommandListener {&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command cmdAny = new Command(&quot;Valor&quot;,                                                                                                    Command.SCREEN,1);       &lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Display display;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Ancho de la columna que muestra el número de fila o renglón&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private static int num=18;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Filas y columnas en pantalla&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int rows = 6;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int cols = 3;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Filas y columnas reales de la tabla (filas y columnas del arreglo)&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private int rrows = 5;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int rcols = 3;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Tamaño de una celda&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int dx = 51;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int dy = 19;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Celda seleccionada&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int currentX = 0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int currentY = -1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Arreglo donde se almacenarán los datos&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private String[][] data = new String[rrows][rcols];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Indicador de la pantalla vertical y horizontal donde se encuentra&lt;a href=&quot;http://imagenes.mailxmail.com/editor.cfm?GET=CONTENT&amp;amp;cid=3917&amp;amp;cap=6#_ftn2&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;&lt;strong&gt;[2]&lt;/strong&gt;&lt;/a&gt;.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private int pantallaV=1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int pantallaH=1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Se necesita utilizar una clase hojaC para la actualización de txt1.&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private hojaC hoja1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el constructor de &lt;i&gt;Tabla&lt;/i&gt; se crea una clase &lt;i&gt;CustomItem&lt;/i&gt;  (&lt;i&gt;super&lt;/i&gt;) con &lt;i&gt;title&lt;/i&gt; como parámetro, se asigna valor a &lt;i&gt;d&lt;/i&gt; y se  definen el &lt;i&gt;comando&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public Tabla(String title, Display d,hojaC hoja) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        super(title);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        display = d;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        addCommand(cmdAny);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        setDefaultCommand(cmdAny);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        setItemCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        hoja1=hoja;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El método &lt;i&gt;paint&lt;/i&gt; es el encargado de dibujar el estado actual de la  tabla, originalmente integra a la clase &lt;i&gt;Canvas&lt;/i&gt;, y &lt;i&gt;CustomItem&lt;/i&gt; lo  hereda de esta. Lo primero que se hace es dibujar las líneas y los títulos de  columna y renglón.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  &lt;/i&gt; &lt;i&gt;protected void paint(Graphics g, int w, int h) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        for (int i = 0; i &lt;= rows; i++) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            if (i&gt;0&amp;amp;&amp;amp;i&lt;rows){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipX = g.getClipX();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipY = g.getClipY();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipWidth = g.getClipWidth();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipHeight = g.getClipHeight();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.setClip(1, (i*dy), num - 1, dy - 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.drawString(String.valueOf(i), num-2, ((i + 1) *  dy)+1,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                              Graphics.BOTTOM |  Graphics.RIGHT);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.setClip(ClipX, ClipY, ClipWidth, ClipHeight);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            if (i==0)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.drawLine(0,0, cols * dx+num, i * dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            g.drawLine(0, i * dy, cols * dx+num, i * dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        for (int i = 0; i &lt;= cols; i++) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            if (i&gt;0){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int x;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                x=((i * dx)+((i-1)*dx))/2;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipX = g.getClipX();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipY = g.getClipY();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipWidth = g.getClipWidth();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                int ClipHeight = g.getClipHeight();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.setClip(((i-1)*dx)+num, 1, dx - 1, dy - 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.drawString(letrade(i), x+num,dy,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                        Graphics.BOTTOM |  Graphics.HCENTER);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.setClip(ClipX, ClipY, ClipWidth, ClipHeight);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }else&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                g.drawLine(0,0, 0, rows * dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            g.drawLine((i * dx)+num, 0, (i * dx)+num, rows * dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Después se dibuja un rectángulo de color diferente al resto para indicar la  celda seleccionada.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;int oldColor = g.getColor();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        g.setColor(0x00D0D0D0);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        g.fillRect((currentX * dx) + 1+num, ((currentY+1) * dy)+1, dx - 1,  dy - 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        g.setColor(oldColor);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Finalmente se busca en el arreglo &lt;i&gt;data&lt;/i&gt; todas aquellas celdas que  contengan algún valor y se dibuja su contenido en la posición adecuada.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;for (int i = 1; i &lt;&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            for (int j = 0; j &lt;&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                if (data[i-1][j] != null) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    int oldClipX = g.getClipX();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    int oldClipY = g.getClipY();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    int oldClipWidth = g.getClipWidth();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    int oldClipHeight = g.getClipHeight();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    funcion func=new funcion(data);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    g.setClip((j * dx) + num, i * dy+1, dx - 1, dy -  1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    g.drawString(func.Valor(data[i-1][j]), (j * dx) +  num+1,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                          ((i + 1) * dy) - 2, Graphics.BOTTOM |  Graphics.LEFT);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    g.setClip(oldClipX, oldClipY, oldClipWidth,  oldClipHeight);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El método &lt;i&gt;traverse&lt;/i&gt; está definido como integrante de &lt;i&gt;CustomItem&lt;/i&gt;,  esta clase utiliza los eventos de teclas de la clase &lt;i&gt;Canvas&lt;/i&gt; para lograr  el desplazamiento por las celdas de la tabla.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;protected boolean traverse(int dir, int viewportWidth, int  viewportHeight,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                             int[] visRect_inout) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        switch (dir) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            case Canvas.DOWN:&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    if (currentY &lt; (rrows - 1)) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        currentY++;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        repaint(currentX * dx, currentY * dy, dx, dy);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        repaint(currentX * dx, currentY+1 * dy, dx,  dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    } else {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        pantallaV++;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                break;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            case Canvas.UP:&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    if (currentY &gt; 0) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        currentY--;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        repaint(currentX * dx, (currentY + 2) * dy, dx,  dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        repaint(currentX * dx, (currentY+1) * dy, dx,  dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    } else {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        pantallaV--;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                        return false;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                break;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            case Canvas.LEFT:&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                if (currentX &gt; 0) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    currentX--;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    repaint((currentX + 1) * dx, currentY * dy, dx,  dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    repaint(currentX * dx, currentY * dy, dx, dy);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    pantallaH--;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                break;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            case Canvas.RIGHT:&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                if (currentX &lt; (rcols - 1)) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    currentX++;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    repaint((currentX - 1) * dx, currentY * dy, dx,  dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    repaint(currentX * dx, currentY * dy, dx, dy);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    pantallaH++;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        visRect_inout[0] = currentX;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        visRect_inout[1] = currentY;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        visRect_inout[2] = dx;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        visRect_inout[3] = dy;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        //Se actualiza el contenido de txt1, de la clase hoja.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;hoja1.settexto(data[currentY][currentX]);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return true;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se utiliza &lt;i&gt;setText&lt;/i&gt; para almacenar en el arreglo &lt;i&gt;data&lt;/i&gt; una cadena  de caracteres que corresponde al valor de la celda actual.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void setText(String text) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (text.compareTo(&quot;&quot;)==0){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            text=null;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        data[currentY][currentX] = text;       &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        currentY--;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        repaint(currentY * dx, currentX * dy, dx, dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando en el menú se selecciona la opción &quot;Nuevo&quot;, la clase &lt;i&gt;hojaC&lt;/i&gt;  llama al método &lt;i&gt;limpiar&lt;/i&gt;, el cual recorre toda la tabla eliminando  cualquier valor que ésta tenga y actualizando la celda.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void limpiar() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        for(int y=0;y&lt;rrows;y++)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            for(int x=0;x&lt;rcols;x++){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                data[y][x] = null;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                repaint(y * dx, x * dy, dx, dy);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las funciones &lt;i&gt;getdato&lt;/i&gt;, &lt;i&gt;getText&lt;/i&gt; y &lt;i&gt;getDatos&lt;/i&gt; se emplean  para obtener el valor de la celda actual, de una celda determinada y de toda la  tabla, respectivamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;protected String getdato(){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return data[currentY][currentX];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    protected String getText(int x, int y){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return data[y][x];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    protected String[][] getDatos(){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return data;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Al seleccionar la opción &quot;Valor&quot; del menú se asigna a &lt;i&gt;modo&lt;/i&gt; el valor  para admitir cualquier carácter y se crea una instancia de &lt;i&gt;Texto&lt;/i&gt;,  mostrándola en pantalla.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void commandAction(Command c, Item i) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;         if (c==cmdAny){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;             modo=TextField.ANY;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Texto txt1 = new Texto(data[currentY][currentX], this,  display, modo);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            display.setCurrent(txt1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;         }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por efecto de claridad y espacio, se han omitido algunos fragmentos del  código de la clase &lt;i&gt;Tabla&lt;/i&gt; que se han considerado innecesarios en la  explicación del funcionamiento de la clase, aunque eso no significa que no sean  vitales para la operación real de la misma.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;&lt;i&gt;6.3.3.&lt;/i&gt;Clase &lt;i&gt;Texto&lt;/i&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La clase &lt;i&gt;Texto&lt;/i&gt; extiende a la clase &lt;i&gt;TextBox&lt;/i&gt;, motivo por el cual  debe importar  &lt;i&gt;javax.microedition.midlet.MIDlet&lt;/i&gt;, aunque no sea una clase  ejecutable por sí sola. Se utiliza una clase &lt;i&gt;Tabla&lt;/i&gt;, una clase  &lt;i&gt;Display&lt;/i&gt; para mostrar el &lt;i&gt;TextBox&lt;/i&gt;, los comandos &lt;i&gt;CMD_OK&lt;/i&gt; y  &lt;i&gt;CMD_CANCEL&lt;/i&gt; para insertar el texto en la tabla o cancelar la modificación  y una variable &lt;i&gt;String&lt;/i&gt; que habrá de almacenar el texto ingresado.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;package hoja;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.lcdui.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.midlet.MIDlet;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class Texto extends TextBox implements CommandListener {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command CMD_OK = new Command(&quot;OK&quot;,                                                                                                                  Command.OK,1);       &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command CMD_CANCEL = new Command(&quot;Cancelar&quot;,&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                        Command.CANCEL,1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Tabla parent;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Display display;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private String text;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El constructor toma como parámetros una cadena de texto, una clase  &lt;i&gt;Tabla&lt;/i&gt; que es la que lo llama, una clase &lt;i&gt;Display&lt;/i&gt; donde se ha de  mostrar ca caja de texto y una variable entera &lt;i&gt;modo&lt;/i&gt;, esta variable entera  está pensada para la posible utilización de varios formatos de cadenas de texto  (numérico, carácter, correo electrónico, etc.). Los valores de los parámetros  tomados se asignan a los objetos con el mismo nombre declarados en esta  clase.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public Texto(String text, Tabla parent, Display display, int  modo) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        super(&quot;Ingrese valor&quot;, text, 64, modo);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;this.parent = parent;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        this.display = display;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        this.text=text;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        addCommand(CMD_OK);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        addCommand(CMD_CANCEL);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El método &lt;i&gt;commandAction&lt;/i&gt; utiliza el método &lt;i&gt;setText&lt;/i&gt; de la clase  &lt;i&gt;Tabla&lt;/i&gt; (&lt;i&gt;parent&lt;/i&gt; en este caso) y regresa &lt;i&gt;display&lt;/i&gt; a dicha clase  si se selecciona el comando &lt;i&gt;CMD_OK&lt;/i&gt;, de los contrario no utiliza  &lt;i&gt;setText&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void commandAction(Command c, Displayable d)  {       &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (c == CMD_OK) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            parent.setText(getString());&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            display.setCurrentItem(parent);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        } else&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            if (c == CMD_CANCEL) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                display.setCurrentItem(parent);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;}&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;&lt;i&gt;6.3.4.&lt;/i&gt;Clase &lt;i&gt;funcion&lt;/i&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Al igual que las hojas de cálculo para computadoras de escritorio, ésta  permite la utilización de fórmulas para realizar operaciones, ya sea con valores  constantes o con valores introducidos dentro de las celadas de la hoja. El  formato para la utilización de fórmulas en &lt;i&gt;hojaC&lt;/i&gt; es el siguiente:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;operación(operando1, operando2, ... , operando n)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Donde los operandos pueden ser números enteros, celdas de la hoja (A1, B3,  C4, por ejemplo) u otras funciones y operación se sustituye con el símbolo  correspondiente a la operación que se desee realizar, tales símbolos se muestran  en la tabla 6.1.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tabla 6.1. Símbolos utilizados en las funciones de la hoja de cálculo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Símbolo&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Función&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Sintaxis&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Ejemplo&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;+&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Suma.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;+(op1, op2, ... , opn)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;+(A1,2,8,B4)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;-&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Resta (A-B).&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;-(op1, op2)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;-(356,*(A1,3))&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;*&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Multiplicación.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;*(op1, op2, ... , opn)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;*(4,5,2,1,3)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;/&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;División (A/B).&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;/(op1, op2)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;/(25,5)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Mínimo.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;op1,&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;(32,1,0,A2)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&gt;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Máximo.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&gt;op1, op2, ... , opn)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&gt;(C3,A2,B1,5)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;%&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Tanto por ciento (A * B%).&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%(op1, op2)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%(100,25)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;:&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Promedio.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;:(op1, op2, ... , opn)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;:(10,9,8,7,6)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;@&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Potencia.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;@(base, potencia)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;@(9,2)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;  = &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Igualación.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;=(Valor)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;=(B2)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A continuación se explica el código fuente de esta clase:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se utilizará una variable &lt;i&gt;data&lt;/i&gt;, la cual es una arreglo de  &lt;i&gt;String&lt;/i&gt; (igual al &lt;i&gt;data&lt;/i&gt; de la clase &lt;i&gt;Tabla&lt;/i&gt;), para tener acceso  a todos los valores de la hoja, debido a que una función puede hacer referencia  al valor de cualquier celda.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private static String data[][];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    int lev=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public funcion(String[][] data1){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        data=data1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La función &lt;i&gt;getDato&lt;/i&gt; toma como parámetro el nombre de una celda (A1, B2,  etc.), lo transforma a coordenadas en la tabla ([1][2], por ejemplo) para  después obtener el valor contenido en esa localidad, ese valor es el que esta  función devuelve como cadena de caracteres.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private String getDato(String celda){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        int x,y;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        String a;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        char b;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            a=celda.substring(1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            y=Integer.parseInt(a);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            b=celda.charAt(0);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            x=Character.digit(b,Character.MAX_RADIX)-9;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            return &quot;Error&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if ((x&lt;1)||(y&lt;1)||(x&gt;24)||(y&gt;65))&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;           &lt;/i&gt; &lt;i&gt;return &quot;Error&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        a=data[y-1][x-1];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (a==null||a.compareTo(&quot;&quot;)==0)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            return &quot;0&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return data[y-1][x-1];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los valores de las celdas que empleará una operación (suma, resta. división  etc.) se almacenan en un objeto de la clase Vector, lo más similar en Java a los  arreglos dinámicos de C++, de manera que primero se deben introducir todos los  datos al vector y después se procesan según lo solicite la fórmula.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En la suma se convierten a enteros todos los términos del vector y se suman  los resultados de tal conversión. Si alguno de los términos no se puede  convertir (no es la representación de un entero) la función devuelve la  constante -32767 que se ha designado como error.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int suma(Vector datos){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;int result=0,R=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        for(int x=0;x&lt;datos.size();x++){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                R=Integer.parseInt(datos.elementAt(x).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result+=R;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return result;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La resta se puede realizar únicamente entre dos elementos enteros, si el  vector tiene más elementos o si alguno de ellos no se ha podido convertir a  entero, se devuelve la constante de error (-32767), de lo contrario la resta se  realiza y se devolverá el resultado.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int resta(Vector datos){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;int result,r=0,R=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        int s=datos.size();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(s==2){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                R=Integer.parseInt(datos.elementAt(0).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                r=Integer.parseInt(datos.elementAt(1).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=R-r;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=-32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return result;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El proceso de la igualación es muy sencillo, sólo se verifica que en el  vector exista un único elemento y se regresa ese valor, o -32767 de no ser  así.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private String igual(Vector datos){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;if(datos.size()==1){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            return datos.elementAt(0).toString();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            return &quot;Error&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El proceso de multiplicación es igual al de la suma, se convierten los  elementos a entero y se procesan (multiplican, en este caso)  acumulativamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private int multi(Vector datos){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        int result=1,R=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        for(int x=0;x&lt;datos.size();x++){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                R=Integer.parseInt(datos.elementAt(x).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result*=R;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return result;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Así como la suma y la multiplicación siguen el mismo procedimiento, la resta  y la división también lo hacen, con las obvias diferencias en la operación  medular.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;private int divi(Vector datos){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        int result,r=0,R=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(datos.size()==2){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                R=Integer.parseInt(datos.elementAt(0).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                r=Integer.parseInt(datos.elementAt(1).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=R/r;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=-32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return result;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para calcular máximos y mínimos se utiliza la misma función, incluyendo el  parámetro de entrada &lt;i&gt;mm&lt;/i&gt;, el cual habrá de tomar un valor de &#39;m&#39; si se  trata de un mínimo o &#39;M&#39; si lo que hay que calcular es el máximo. Al igual que  el resto de las operaciones, el máximo y el mínimo también devuelven la  constante de error si los datos del vector no se pueden convertir a enteros.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int maxmin(Vector datos, char mm){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        int M=-32767,x,B;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            M=Integer.parseInt(datos.elementAt(0).toString());&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;}catch(Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }   &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        for (x=1;x&lt;datos.size();x++){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                B=Integer.parseInt(datos.elementAt(x).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch(Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            if(mm==&#39;M&#39;)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                if(M&lt;b){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    M=B;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            if(mm==&#39;m&#39;)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                if(M&gt;B){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                    M=B;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return M;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El cálculo del tanto por ciento también utiliza sólo dos valores, el primero  es el valor base y el segundo el tanto por ciento a calcular.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int pciento(Vector datos){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;int result,r=0,R=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(datos.size()==2){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                R=Integer.parseInt(datos.elementAt(0).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                r=Integer.parseInt(datos.elementAt(1).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=R/100 * r;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=-32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return result;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Debido a lo similares que son las funciones en su procedimiento, las  siguientes sólo se especificarán en nombre, ya que sería una redundancia  innecesaria el explicar los procesos ya explicados.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Promedio.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int prom(Vector datos){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;int result=0,R=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        for(int x=0;x&lt;datos.size();x++){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                R=Integer.parseInt(datos.elementAt(x).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result+=R;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        result=result/datos.size();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return result;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Potencia.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private int pot(Vector datos){ &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        int result,r=0,R=0;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(datos.size()==2){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                R=Integer.parseInt(datos.elementAt(0).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                r=Integer.parseInt(datos.elementAt(1).toString());&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }catch (Exception e){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                return -32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            for (int x=0;x&lt;r;x++){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                result*=R;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }else{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            result=-32767;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return result;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La función recurrente &lt;i&gt;Valor&lt;/i&gt; es la que realiza la mayor parte del  trabajo, toma el valor de la ceda tal y como se ha introducido, lo analiza para  verificar si se trata de una constante o de una fórmula. En este último caso,  separa sus términos, ordena la obtención del valor final (constante) de los  datos y finalmente selecciona la operación a realizar.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  &lt;/i&gt; &lt;i&gt;public String Valor(String dato){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        char c;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        Vector A=new Vector();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        String cad;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        lev++;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para evitar referencias circulares, no puede haber más de nueve niveles de  anidación en las fórmulas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;if (lev&gt;9){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            dato=null;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            return &quot;Error&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        cad=dato;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        //separar términos&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        c=cad.charAt(0);//se toma el primer carácter (donde está el  símbolo)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;         if(c==&#39;+&#39;||c==&#39;-&#39;||c==&#39;*&#39;||c==&#39;/&#39;||c==&#39;&lt;&#39;||c==&#39;&gt;&#39;||c==&#39;%&#39;||c==&#39;:&#39;||&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                      &lt;br /&gt;&lt;/i&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/5799414750499096987/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/5799414750499096987' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/5799414750499096987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/5799414750499096987'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/desarrollo-de-una-aplicacion.html' title='DESARROLLO DE UNA APLICACIÓN'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-541690660567931603</id><published>2009-04-09T12:28:00.000-07:00</published><updated>2009-04-09T12:28:00.603-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>PROGRAMACIÓN MIDP</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;PROGRAMACIÓN MIDP&lt;/span&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el presente capítulo se tratarán las características básicas de la  programación de aplicaciones MIDP, NO se trata de un tutorial de programación,  únicamente se revisarán los aspectos generales que hacen a la programación MIDP  diferente de el resto de las aplicaciones Java. En el siguiente capítulo se  desarrollará una aplicación y se explicará el funcionamiento de cada instrucción  o bloque de instrucciones.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Pero primero se deben conocer los pasos a seguir en el proceso de desarrollo  para facilitar su comprensión y dar una idea previa de lo que se deberá  hacer.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.1.Herramientas necesarias&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A continuación se proporciona una lista con las herramientas necesarias para  programar MIDlets.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Plataforma de desarrollo Java (J2SDK, por ejemplo) disponible en &lt;a href=&quot;http://www.java.sun.com/&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;java.sun.com.&lt;/a&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Editor de textos (block de notas, edit, vi, emacs, etc.).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Compilador CLDC (1.0, 1.1) y al menos un perfil (MIDP, PDAP), ambos  disponibles en &lt;a href=&quot;http://www.java.sun.com/&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;java.sun.com.&lt;/a&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hay algunos paquetes de desarrollo Java que incluyen los dos últimos  requisitos, además de proveer de otras herramientas que pueden facilitar la  programación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Java Wireless Toolkit: Este paquete se puede descargar del sitio Java de Sun  Microsystems, provee de un compilador (incluye CLDC y MIDP) y organizador de  proyectos. Se crea en este programa un proyecto y automáticamente se generan las  carpetas donde se han de guardar los códigos fuente, las clases, imágenes y  otros accesorios que la aplicación utilice. Disponible para Windows y Linux. En  la figura 5.1 se muestra la barra de herramientas de JWT (Java Wireless  Toolkit).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/7062_5_1.jpg&quot; /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Figura 5.1. Java Wireless Toolkit.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Nokia Developer Suite for J2ME: En la sección de desarrolladores de Nokia  (www.nokia.com) se puede descargar este entorno de desarrollo, incluye todo lo  que se necesita para la programación de MIDlets (a excepción del SDK). Se puede  instalar en plataformas Windows 2000, XP y Linux.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Este paquete puede resultar poco conveniente para computadoras poco actuales,  ya que entre sus requerimientos se mencionan 256 MB de memoria RAM y procesador  de 300 Mhz.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Motorola SDK for J2ME. Sólo existe para Windows, es otro kit de desarrollo  completo al que sólo hay que agregar el SDK de Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Code Warrior. Quizá uno de los mejores entornos integrados de desarrollo  (IDE) para la edición micro de la plataforma Java. Se puede descargar gratis  después de suscribirse en el sitio de programadores de Motorola, aunque en  versión de evaluación por treinta días.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Sun ONE Studio: Otro entorno completo, bastante útil, incluye editor de  texto, compilador, preverificador y simuladores para probar las aplicaciones. En  el sitio oficial de Sun se puede descargar una evaluación de 60 días o comprar  la versión completa.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el presente documento se utilizará el Wireless Toolkit de Java, debido a  que es más pequeño (en espacio de disco) y, por lo tanto, más fácil de obtener  con una conexión telefónica a Internet, además de que está disponible para Linux  que será la plataforma empleada para la programación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.2. Ciclo de desarrollo de una aplicación MIDP&lt;/span&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las aplicaciones MIDP (MIDlets) siguen un proceso desde que son ideadas hasta  que están instaladas y ejecutándose en los dispositivos. Dicho proceso es el  siguiente:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Escritura.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Compilación y preverificación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Prueba y corrección.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Empaquetado.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Prueba del paquete.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.2.1. Escritura de la aplicación&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hay algunas reglas para el desarrollo de MIDlets, además de las establecidas  por el lenguaje, que deben ser consideradas:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Toda MIDlet debe importar los paquetes &lt;i&gt;javax.microedition.midlet.*&lt;/i&gt; y  &lt;i&gt;javax.microedition.lcdui.*&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.midlet.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.lcdui.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;javax.microedition.midlet.*.&lt;/i&gt; Define que se utilizará MIDP.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;javax.microedition.lcdui.*.&lt;/i&gt; Proporciona las apis de interfaz de  usuario.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Cada MIDlet debe extender la clase &lt;i&gt;MIDlet&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class FirstMIDlet extends MIDlet {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Una MIDlet no debe tener ningún método &lt;i&gt;public static void main(),&lt;/i&gt;  contrario a  lo que sucede en las aplicaciones Java de escritorio.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Constructor de la clase&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public FirstMIDlet() {  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Inicia la MIDlet, en lugar de &lt;i&gt;main()&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public void startApp() {    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.2.2. Compilar y preverificar&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando se utiliza Java Wireless Toolkit, o algún otro entorno de desarrollo,  el proceso de compilación y preverificación es sumamente sencillo:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una vez escrito el código de las clases que compongan la aplicación se  ejecuta JWT y se abre la aplicación a compilar. En JWT se puede también depurar  el código, probar y empaquetar la aplicación, etc.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para compilar la MIDlet, una vez abierta, hay que seleccionar la opción  &quot;Build&quot;, esto creará el archivo de clase o bien indicará los errores que se  tengan. El compilado con JWT incluye la preverificación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;También se puede compilar y preverificar el código fuente desde la linea de  comando del sistema operativo. Teniendo correctamente instalado el SDK de Java y  CLDC se utiliza:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;javac -d .| bootclasspath&lt;/i&gt; [ruta] [archivo.java]&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;para crear el archivo de clase en el mismo directorio (-d .\) que el de  código y para preverificar el resultado de la compilación se utiliza el  comando:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;preverify -classpath&lt;/i&gt; [ruta_clases]&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;este comando preverifica todos los archivos de clases en el directorio  ruta_clases y guarda el resultado en un subdirectorio, dentro de esa ruta,  llamado &quot;output&quot;, para preverificar una sola clase hay que especificar su  nombre.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.2.3. Probando la MIDlet&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Si no se utiliza JWT la aplicación puede ser probada, desde linea de  comandos, con la siguiente instrucción:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;midp&lt;/i&gt; [nombre_MIDlet]&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Aunque si su aplicación consta de varias MIDlets o archivos de clase y  requiere dejar que el usuario escoja cuales ejecutar, entonces es necesario  empaquetar la aplicación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Utilizando JWT este trabajo se simplifica bastante, sólo se abre un proyecto  y, si ya está compilado y preverificado, se selecciona &quot;Run&quot; o &quot;Ejecutar&quot; para  ver el resultado en un emulador (Fig. 5.2).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/7062_5_2.jpg&quot; /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Figura 5.2. Una de las vistas del emulador de JWT&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.2.4. Empaquetado&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Si una aplicación consta de múltiples clases, una archivo .&lt;i&gt;jar&lt;/i&gt; es  usado para agruparlas, así es más fácil de distribuir y desplegar. esto se puede  hacer desde linea de comandos de la siguiente manera:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;jar cf&lt;/i&gt; [archivo.jar] [clases]&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El siguiente paso es crear el archivo descriptor de la aplicación (archivo  &lt;i&gt;.jad&lt;/i&gt;), el cual provee información sobre el contenido del archivo  .&lt;i&gt;jar.&lt;/i&gt; Un ejemplo de archivo  descriptor de aplicación es el  siguiente:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-Name: MID1&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-Version:1.0.0&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-Vendor:Sun Microsystems, Inc.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-Description: Primera MIDlet&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-Info-URL: http://java.sun.com/j2me.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-Jar-URL: MID1.jar&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-Jar-Size: 1063&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MicroEdition-Profile: MIDP-2.0&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MicroEdition-Configuration: CLDC-1.0&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-1: MID,icono.png, MIDlet1&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;MIDlet-2: MID1,MIDlet2&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las primeras lineas resultarán, seguramente, más que obvias así que se  explicará únicamente el último elemento (MIDlet-1), este contiene los datos de  la primera MIDlet integrante del paquete (hay que recordar que un paquete se  puede componer de muchas MIDlets) y consta de tres partes: nombre de la  aplicación, ícono (opcional) y clase. El nombre aparecerá en la pantalla del  dispositivo, acompañado del ícono (si existe), para que pueda ser seleccionado y  la clase es el archivo compilado que se ejecuta al seleccionar un nombre.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.2.5. Probar la aplicación empaquetada&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una vez que se ha empaquetado la aplicación, se puede probar para asegurar su  funcionamiento agregando la opción &lt;i&gt;-descriptor&lt;/i&gt; al comando  &lt;i&gt;midp&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;midp -descriptor&lt;/i&gt; MID1.jad&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Utilizando en kit de Java es el mismo proceso que probar la aplicación sin  empaquetar, ya que al realizar el paquete se genera automáticamente el archivo  descriptor.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.3. Mapeo de teclas&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se le llama mapeo de teclas a la distribución que tienen las funciones del  dispositivo (navegación, comandos, selección, etc.) sobre las teclas exteriores,  es decir, la función desplazarse hacia la derecha, puede estar colocada en la  tecla con el número 6 de un teléfono y esa misma función puede operar sobre la  tecla &quot;é&quot; de otro dispositivo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando el programador requiere de aplicaciones altamente portables debe darle  a este aspecto una gran importancia, no se puede permitir que un comando o  función de su MIDlet quede inhabilitada a causa de un descuido de ese tipo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4. Manejo de eventos&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando no se utilizan cajas de texto, listas o formularios en una pantalla,  se puede tomar el control de las acciones a realizar cuando se presione, libere  o mantenga presionada cierta tecla del dispositivo. A la presión (rápida o  detenida) y liberación de teclas se les conoce como eventos, aunque no son el  único tipo de eventos, también pueden serlo el cierre repentino y deliberado de  la aplicación, la llegada de un mensaje o una llamada telefónica, el encendido  del teléfono, en fin, un evento es toda acción llevada a cabo por un agente  exterior a la MIDlet y que influya sobre su operación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Un evento es, por tanto, una acción sobre la MIDlet, tomada por el usuario en  tiempo de ejecución.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4.1.Llamadas&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se conoce como &lt;i&gt;Llamada&lt;/i&gt; (Callback en inglés) a las invocaciones a  métodos definidos por el programador que son ejecutados por la aplicación en  respuesta a eventos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Además de J2ME, los conceptos de llamadas y eventos son utilizados en muchos  entornos de programación, principalmente aquellos con desarrollo de interfaces  gráficas (Visual Basic, Delphi, Visual J, etc.).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En lenguajes como C++, las llamadas se implementan mediante apuntadores, una  función desvía su apuntador a otra al ocurrir un evento. Como Java no utiliza  apuntadores, las llamadas se implementan mediante interfaces, las interfaces son  clases que únicamente tienen métodos únicamente definidos, las acciones a tomar  en cada método dependen del programador, es decir, una interfaz es como el  esqueleto de una clase que debe ser llenado por el programador.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En MIDP hay cuatro clases de llamadas de interfaces de usuario.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Comandos abstractos que son parte de la API de alto nivel.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Eventos de bajo nivel que representan presión y liberación de teclas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Llamadas al método &lt;i&gt;paint()&lt;/i&gt; de una clase &lt;i&gt;Canvas&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Llamadas al método &lt;i&gt;Run&lt;/i&gt; de objetos ejecutables (de la interfaz  &lt;i&gt;Runnable&lt;/i&gt;) solicitados por una llamada al método &lt;i&gt;CallSerially&lt;/i&gt; de la  clase &lt;i&gt;Dispaly&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4.2.Navegación en pantalla&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Un aplicación MIDP, a excepción de las demasiado sencillas, siempre utilizará  más de una pantalla, por lo que resulta necesaria una herramienta que permita a  los usuarios desplazarse de una pantalla a otra según lo requiera la propia  MIDlet.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El paquete &lt;i&gt;javax.microedition.lcdui&lt;/i&gt; proporciona la clase  &lt;i&gt;Command&lt;/i&gt;, la cual captura la información de un evento. Un comando creado  con la clase &lt;i&gt;Command&lt;/i&gt; solamente contiene información sobre él mismo, no de  la acción que realiza cuando está activado, la acción está definida en un objeto  de la interfaz &lt;i&gt;CommandListener&lt;/i&gt; asociado con la pantalla. A continuación  &lt;i&gt;s&lt;/i&gt;e muestra como declarar un comando:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Command miComando=new Command(&quot;Mio&quot;, Command.SCREEN,2);&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los tres parámetros que el constructor de la clase &lt;i&gt;Command&lt;/i&gt; debe  incluir son los siguientes:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Etiqueta: Una cadena de caracteres usada para la presentación visual del  comando.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Tipo: Especifica su intención, es decir, la acción que realizará el comando.  Algunos tipos pueden ser:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Command.SCREEN.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Command.EXIT.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Command.BACK.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Command.ITEM&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Prioridad: Describe la importancia del comando con respecto a otros en  pantalla. Una prioridad de 1 indica al comando más importante.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando una MIDlet se ejecuta, el dispositivo escoge el lugar de un comando  basándose en su tipo (abajo y a la izquierda para salir, por ejemplo) y coloca  los comandos similares con base en su valor de prioridad. Considérese una  aplicación con los siguientes comandos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Command Salir=new Command(&quot;Exit&quot;, Command.EXIT,1);&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Command miCom=new Command(&quot;Mio1&quot;, Command.SCREEN,2);&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Command miCom2=new Command(&quot;Mio2&quot;, Command.SCREEN,2);&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En este ejemplo, el manejador de la aplicación coloca el comando &lt;i&gt;Exit&lt;/i&gt;  en la pantalla y crea un menú para mantener &lt;i&gt;Info&lt;/i&gt; y &lt;i&gt;Buy&lt;/i&gt;.  Presionando la tecla correspondiente al menú, el usuario, es llevado a otra  pantalla donde puede seleccionar alguna de las dos opciones. (Fig. 5.3)&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La clase &lt;i&gt;Command&lt;/i&gt; provee de tres métodos para conocer tipo, etiqueta y  prioridad del comando.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-int getCommandType().&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-String getLabel().&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-int getPriority().&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/7062_5_3.gif&quot; /&gt;   &lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/7062_5_4.gif&quot; /&gt;  &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Figura 5.3. Ejemplo de la clase &lt;i&gt;Command&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4.3. Eventos de alto nivel&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El manejo de eventos en la api de alto nivel se basa en un modelo de escucha  o escuchante (&lt;i&gt;listener&lt;/i&gt;, en inglés). Los objetos &lt;i&gt;Screen&lt;/i&gt; y  &lt;i&gt;Canvas&lt;/i&gt; pueden tener &quot;escuchantes&quot; para comandos. Para que un objeto pueda  ser un escuchante, debe implementar la interfaz &lt;i&gt;CommandListener&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los comandos se agregan a un objeto con el método &lt;i&gt;addCommand&lt;/i&gt; y se  registra un escuchante con el método &lt;i&gt;CommandListener&lt;/i&gt;. Ambos métodos  pertenecen a la clase &lt;i&gt;Displayable&lt;/i&gt; y son heredados por &lt;i&gt;Screen&lt;/i&gt; y  &lt;i&gt;Canvas&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;&lt;i&gt;5.4.3.1.&lt;/i&gt;La interfaz  &lt;i&gt;CommandListener&lt;/i&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Esta interfaz es para MIDlets que necesitan recibir eventos de alto nivel.  Esta interfaz tiene un método que todo escuchante debe implementar, el método  &lt;i&gt;CommanAction&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public void CommanAction(Command c, Displayable d) { }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El parámetro &lt;i&gt;c&lt;/i&gt; es un objeto &lt;i&gt;Command&lt;/i&gt; que identifica al comando  que fue agregado al &lt;i&gt;d&lt;/i&gt; (objeto &lt;i&gt;Displayable&lt;/i&gt;) con el método  &lt;i&gt;addCommand&lt;/i&gt;. El parámetro &lt;i&gt;d&lt;/i&gt; es el objeto visible (&lt;i&gt;Form, Canvas,  Screen&lt;/i&gt;) donde el evento ocurre. Dentro de las llaves ({ }) se introduce el  código que se habrá de ejecutar al ocurrir un evento.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt; &lt;/i&gt; &lt;i&gt;public void commandAction(Command c, Displayable s) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    if (c == CmdSalir) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;      destroyApp(false);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;      notifyDestroyed();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el trozo de código mostrado arriba se emplea una decisión &lt;i&gt;if&lt;/i&gt; para  identificar qué comando es el que ha sido activado, si se trata del comando  &lt;i&gt;CmdSalir&lt;/i&gt; se destruye la aplicación, es decir, se cierra y se notifica su  destrucción.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;&lt;i&gt;5.4.3.2.&lt;/i&gt;La interfaz  &lt;i&gt;ItemStateListener&lt;/i&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las aplicaciones usan esta interfaz para recibir eventos que indican cambios  en el estado interno de los elementos en una pantalla, formulario. Esto pasa  cuando el usuario hace cualquiera de las siguientes cosas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Ajustar el valor de una barra de avance interactiva.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Ingresar o modificar el valor de un TextField.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Ingresar una nueva fecha u hora en una DateField.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Cambiar los valores seleccionados en un ChoiceGroup.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Esta interfaz tiene un único método que un escuchante debe implementar.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public void itemStateChanged(Item i){ }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para registrar un escuchante de esta interfaz se utiliza el método  &lt;i&gt;setItemStateListener&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;ItemStateListener listener = new ItemStateListener();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;Form.setItemStateListener(listener);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public void itemStateChanged(Item item) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4.4.Eventos de bajo nivel&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Si se usa la clase &lt;i&gt;Canvas&lt;/i&gt; para tener acceso a eventos de entrada o  para dibujar gráficos en la pantalla, es necesario manejar los eventos de bajo  nivel. Aplicaciones como los juegos, pueden ser realizadas utilizando la clase  &lt;i&gt;Canvas&lt;/i&gt;, gracias a que esta posee métodos para controlar eventos de teclas  y los llamados &quot;eventos de juego&quot;. Los eventos de teclas se registran como  códigos específicos que están directamente relacionados a las teclas del  aparato. Los eventos de juego producen un código relacionado con la acción  asignada a una tecla del dispositivo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4.4.1.Eventos de teclas&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Como ya se mencionó, los eventos de teclas están relacionados directamente  con las teclas del dispositivo. Los eventos de teclas definidos en la clase  &lt;i&gt;Canvas&lt;/i&gt; son:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM0.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM1.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM2.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM3.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM4.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM5.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM6.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM7.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM8.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_NUM9.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_STAR.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-KEY_POUND.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los números del 0 al 9, el asterisco &quot;*&quot; y la almohadilla &quot;#&quot; son las teclas  genéricas en todos los dispositivos, quizá existan otros eventos en diferentes  dispositivos, pero por motivos de portabilidad, se recomienda solamente usar  estos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4.4.2.Eventos de juego&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Debido a que en los equipos actuales varía mucho la distribución de las  teclas, si se requiere una localización específica de estas, flechas de  dirección, por ejemplo; es necesario utilizar los eventos de juego, estos  eventos son los siguientes:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-DOWN.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-LEFT.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-RIGHT.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-UP.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-FIRE.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-GAME_A.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-GAME_B.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-GAME_C.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-GAME_D.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Anteriormente se explicó que cada aparato mapea sus teclas de forma diferente  al resto. Con los eventos de juego se puede lograr que la aplicación reaccione a  la presión de una tecla que indique movimiento hacia arriba en el dispositivo  anfitrión, independientemente del código de esta tecla.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.4.5.Métodos de manejo de eventos&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para el manejo de eventos de bajo nivel, J2ME provee al programador de los  siguientes métodos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void keyPressed (int keyCode).&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void keyReleased (int keyCode)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void keyRepeated (int keyCode)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void pointerPressed (int x, int y)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void pointerDragged (int x, int y)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void pointerReleased (int x, int y)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void showNotify ()&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected void hideNotify ()&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;protected abstract void paint (Graphics g)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;commandAction()&lt;/i&gt;. De la interfaz &lt;i&gt;CommandListener&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cabe aclarar que los eventos de apuntador (&lt;i&gt;pointer&lt;/i&gt;) no son aplicables  a todos los dispositivos, sólo para aquellos que cuenten con un indicador de ese  tipo (apuntador de ratón, por ejemplo), se puede comprobar si el equipo lo  soporta utilizado los métodos &lt;i&gt;hasPointerEvents&lt;/i&gt; y  &lt;i&gt;hasPointerMotionEvents&lt;/i&gt;. Otro método que podría no estar disponible en  algún dispositivo es &lt;i&gt;keyRepeated&lt;/i&gt;,  se puede comprobar su operabilidad con  el método &lt;i&gt;hasRepeatEvents&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.5. Principales componentes&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Son muchos y muy variados los componentes que incluyen las apis de MIDP y  CLDC, además cada programador puede crear componentes propios tomando como base  los ya existentes.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por lo anterior, se explicarán sólo aquellos que son considerados cómo  básicos para la realización de aplicaciones en general.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En la tabla 5.1 se muestra cada uno de los componentes y una breve  descripción de estos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tabla 5.1. Clases del paquete &lt;i&gt;lcdui&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Clase&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Descripción&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Alert&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Pantalla que muestra un mensaje al usuario y espera un cierto periodo de  tiempo antes de pasar a la siguiente pantalla.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;AlertType&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Indica la naturaleza de las alertas (exclamación, error, etc.).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Canvas&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Es la base para la escritura de aplicaciones que utilicen eventos de bajo  nivel y para dibujar objetos gráficos en la pantalla.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;ChoiceGroup&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Un grupo de elementos seleccionables, colocados dentro de una forma  (Form).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Command&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Una estructura que encapsula la información semántica de una acción (p. ej.  &quot;Salir&quot;).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;DateField&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Componente modificable para presentar en pantalla la información de hora y  fecha.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Display&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Representa el manejador de pantalla y dispositivos de entrada (teclas) del  sistema.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Displayable&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Característica de un objeto que tiene la capacidad de ser mostrado en la  pantalla.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Font&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Representa las propiedades de la fuente (letra).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Form&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Una pantalla que contiene una mezcla arbitraria de elementos (imágenes, cajas  de texto, etc.)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Gauge&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Una barra que puede ser utilizada como indicador de avance en un  proceso.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Graphics&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Provee la capacidad de presentar gráficos 2D simples.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Image&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Muestra una imagen.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;ImageItem&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Proporciona el control de trazado (colocación) de una imagen en una forma o  alerta&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Item&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Superclase para elementos que van a ser adheridos a una forma o  alerta.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;List&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Muestra una lista de opciones.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Screen&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;La superclase de todas las clases de interfaz de usuario de alto  nivel.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;StringItem&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Un elemento que puede contener una cadena de caracteres.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;TextBox&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Pantalla que permite al usuario insertar y modificar texto.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;TextField&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Un componente de texto modificable que puede ser colocado en una  forma.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Ticker&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Un texto que cruza continuamente la pantalla, puede ser agregado en todos los  tipos de pantalla a excepción de &lt;i&gt;canvas&lt;/i&gt;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En los siguientes apartados se verá como utilizar algunas de las clases  listadas en la tabla anterior, esto mediante la explicación de programas  sencillos que, aunque pudiesen carecer de utilidad, ilustran de forma clara la  forma de implementar una clase determinada.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;5.5.1.¡Hola mundo!&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se iniciará esta serie de programas de ejemplo con el clásico código fuente  de una aplicación que lo único que hace es mostrar un mensaje en la pantalla, en  este caso el mensaje es &quot;¡Hola mundo!&quot;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El código fuente es el siguiente:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.lcdui.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.midlet.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se comienza por importar los paquetes que son obligatorios para cualquier  MIDlet. Esto puede variar dependiendo de la finalidad de la clase a crear, pero  para una clase que será la principal de su paquete, es forzoso el importar las  clases del paquete  &lt;i&gt;javax.microedition.midlet&lt;/i&gt; y &lt;i&gt;lcdui&lt;/i&gt; se requiere  para las operaciones de entrada y salida de información.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class Holamundo extends MIDlet implements CommandListener {&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se inicia el código de la clase, la cual extiende (o hereda) la clase  &lt;i&gt;MIDlet&lt;/i&gt;, necesaria, como ya se dijo, para la creación de clases  ejecutables, además se implementa la interfaz &lt;i&gt;CommandListener&lt;/i&gt;, esta  interfaz define una estructura de clase en la que se deben declarar unos objetos  llamados comandos, los cuales responderán a alguna acción del usuario.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   private Form Forma1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se ha instanciado un objeto de la clase &lt;i&gt;Form&lt;/i&gt;, que, como ya se vio,  pertenece al paquete &lt;i&gt;lcdui&lt;/i&gt;. Un objeto &lt;i&gt;Form&lt;/i&gt; define una pantalla  donde se agregarán objetos de entrada y salida de datos por teclado y pantalla,  respectivamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  public Holamundo() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    Forma1 = new Form(&quot;¡Hola mundo!&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;Forma1.append(new StringItem(null, &quot;¡Hola mundo!&quot;));&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    Forma1.addCommand(new Command(&quot;Salir&quot;, Command.EXIT, 1));&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    Forma1.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En la sección de arriba se describe el constructor de la clase, el cual debe  llevar el mismo nombre que la clase, sin especificar tipo y de acceso público.  En un constructor de clase se establecen los valores que han de tomar las  variables, se crean las instancias de las clases, en fin, se define como habrá  de presentarse, al arrancar, la aplicación al usuario. Al iniciar el constructor  se instancia un objeto &lt;i&gt;Form&lt;/i&gt; con título &quot;¡Hola mundo!&quot; y de nombre  &lt;i&gt;Forma1&lt;/i&gt;, enseguida, a esa misma forma se le agrega un elemento  &lt;i&gt;SringItem&lt;/i&gt; sin etiqueta (título o descripción) y con un contenido igual a  &quot;¡Hola mundo!&quot;, se agrega también, un comando, los comandos son las opciones  que, en un teléfono celular, aparecen en la parte inferior de la pantalla y que  el usuario puede seleccionar presionando las teclas que se encuentran debajo del  texto; ese comando tiene por texto o etiqueta la palabra &quot;Salir&quot;, es del tipo  &lt;i&gt;EXIT&lt;/i&gt; y de prioridad 0. En un comando, la prioridad indica la importancia  de ese comando con respecto a otros en la pantalla, dicha prioridad puede ir de  1 a 10, siendo 1 el valor de prioridad más alto.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  &lt;/i&gt; &lt;i&gt;public void startApp() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    Display.getDisplay(this).setCurrent(Forma1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El método &lt;i&gt;startApp&lt;/i&gt; es el que se ejecuta después del constructor, en el  se encuentran las instrucciones que serán ejecutadas por la aplicación (es como  el procedimiento &lt;i&gt;main&lt;/i&gt; de las aplicaciones en C o Java). En el ejemplo, se  utiliza un objeto &lt;i&gt;Display&lt;/i&gt; que se encarga del control de la pantalla, un  método &lt;i&gt;getDisplay(this)&lt;/i&gt;, el cual arroja como resultado la pantalla del  dispositivo (como salida de datos para la MIDlet &lt;i&gt;this&lt;/i&gt;, la actual) y otro  método &lt;i&gt;setCurrent(Forma1)&lt;/i&gt;, que indica que lo que se ha de mostrar en la  pantalla será lo contenido en &lt;i&gt;Forma1&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  &lt;/i&gt; &lt;i&gt;public void pauseApp() {}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   public void destroyApp(boolean unconditional) {}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   public void commandAction(Command c, Displayable s) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   notifyDestroyed();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las funciones &lt;i&gt;pauseApp&lt;/i&gt; y &lt;i&gt;destroyApp&lt;/i&gt;, también son obligatorias  de cualquier clase MIDP (sea la principal del proyecto o no), en &lt;i&gt;pauseApp&lt;/i&gt;  se pueden definir las acciones a tomar cuando la aplicación sea pausada por el  usuario, por la misma aplicación o por otra; &lt;i&gt;destroyApp&lt;/i&gt; indica lo que se  realizará antes de cerrar la aplicación. El método &lt;i&gt;commandAction&lt;/i&gt; define  lo que se hará con los comandos de la MIDlet, como en el ejemplo sólo se tiene  un comando basta con notificar la destrucción de la aplicación,&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;span class=&quot;destacats&quot;&gt;5.5.2.TextBox&lt;/span&gt;   &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La clase &lt;i&gt;TextBox&lt;/i&gt;, genera objetos de pantalla completa, como  &lt;i&gt;Form,&lt;/i&gt;la diferencia es que &lt;i&gt;TextBox&lt;/i&gt; únicamente permite la  introducción de texto y el manejo de comandos. A continuación se presenta un  ejemplo sencillo:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.midlet.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.lcdui.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class TextBoxDemo extends MIDlet&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                           implements CommandListener {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  private Command CmdSalir;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  private Display display;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  private TextBox t = null;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;De esta primera parte sólo hay que resaltar la creación de un objeto  &lt;i&gt;TextBox&lt;/i&gt; de nombre &lt;i&gt;t&lt;/i&gt; y valor nulo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt; &lt;/i&gt; &lt;i&gt;public TextBoxDemo() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    display = Display.getDisplay(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    CmdSalir = new Command(&quot;Salir&quot;, Command.EXIT, 2);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    t = new TextBox(&quot;Hola&quot;, &quot;Esto es una prueba&quot;, 256, 0);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;t.addCommand(CmdSalir);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    t.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el constructor de la MIDlet se observa la designación del contenido de la  pantalla (esta MIDlet), la creación de un comando de salida de prioridad 2, la  instanciación de &lt;i&gt;t&lt;/i&gt; con título &quot;Hola&quot;, texto inicial &quot;Esto es una prueba&quot;,  longitud máxima de texto de 256 caracteres y tipo 0, los tipos son valores  constantes que la clase &lt;i&gt;TextBox&lt;/i&gt; interpreta para permitir la entrada de  algunos caracteres e impedir la de otros, en el ejemplo el tipo 0 es la  constante &lt;i&gt;Textfield.ANY,&lt;/i&gt; que indica que se puede introducir cualquier  carácter (también existen &lt;i&gt;Textfield.NUMERIC&lt;/i&gt;, &lt;i&gt;TextField.DECIMAL&lt;/i&gt; y  &lt;i&gt;TextField.PHONENUMBER&lt;/i&gt;, entre otras). Después de creado el objeto  &lt;i&gt;t&lt;/i&gt;, se le agrega el comando &lt;i&gt;CmdSalir.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  public void startApp() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    display.setCurrent(t);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el método &lt;i&gt;startApp&lt;/i&gt; se indica que el elemento en pantalla será  &lt;i&gt;t&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  public void pauseApp() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  public void destroyApp(boolean unconditional) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  public void commandAction(Command c, Displayable s) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    if (c == CmdSalir) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;      destroyApp(false);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;      notifyDestroyed();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando una MIDlet tiene más de un comando (aunque no es el caso de esta) se  puede realizar una decisión con el parámetro &lt;i&gt;c&lt;/i&gt; para definir las acciones  a tomar en cada comando.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;span class=&quot;destacats&quot;&gt;5.5.3.TextField&lt;/span&gt;   &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El elemento &lt;i&gt;Textfield&lt;/i&gt; trabaja sobre una forma (&lt;i&gt;Form&lt;/i&gt;), por lo  que ésta debe ser declarada e instanciada antes de utilizar el  &lt;i&gt;Textfield&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;private Form mainForm;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm = new Form(&quot;Text Field&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;private TextField txt1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;txt1=newTextField(&quot;Cualquier carácter&quot;, &quot;&quot;, 15, TextField.ANY)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una vez instanciada la forma, se utiliza el método &lt;i&gt;append&lt;/i&gt; para crear  en ella los campos de texto que consideremos necesarios:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm.append(txt1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm.append(new TextField(&quot;E-Mail&quot;, &quot;&quot;, 15, TextField.EMAILADDR));&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm.append(new TextField(&quot;Entero&quot;, &quot;&quot;, 15, TextField.NUMERIC));&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm.append(new TextField(&quot;Decimal&quot;, &quot;10.5&quot;, 15,  TextField.DECIMAL));&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm.append(new TextField(&quot;Teléfono&quot;, &quot;&quot;, 15,  TextField.PHONENUMBER));&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm.append(new TextField(&quot;Password&quot;, &quot;&quot;, 15,  TextField.PASSWORD));&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;mainForm.append(new TextField(&quot;URL&quot;, &quot;&quot;, 15, TextField.URL));&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Como se puede observar, el constructor de la clase &lt;i&gt;Textfield&lt;/i&gt; lleva  cuatro parámetros, el primero de ellos indica la etiqueta que habrá de llevar el  campo de texto, en el segundo se debe especificar el valor inicial, el siguiente  es la longitud (en caracteres) que habrá de tolerar el campo y el último indica  el filtro a utilizar para dicho campo, es decir, que caracteres admitirá.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Quizá el lector observe que, el utilizar la palabra clave &lt;i&gt;new&lt;/i&gt; dentro  de los paréntesis del método &lt;i&gt;append&lt;/i&gt; podría limitar el control que se  tenga sobre los objetos de la forma, por lo tanto es recomendable declarar e  instanciar antes los objetos y sólo nombrarlos en &lt;i&gt;append&lt;/i&gt;, como se hizo  con &lt;i&gt;txt1&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hay varios filtros además de los mostrados en el ejemplo, se recomienda al  lector interesado revisar la especificación de la clase &lt;i&gt;Textfield&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;span class=&quot;destacats&quot;&gt;5.5.4.Datefield&lt;/span&gt;   &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hasta ahora no se ha descrito, en las clases &lt;i&gt;TextField&lt;/i&gt; y  &lt;i&gt;TextBox&lt;/i&gt;, un método relativamente fácil para introducir una fecha, los  signos &quot;/&quot; en un teléfono son un poco difíciles de localizar, sin contar con que  los números son la última o una de las últimas opciones en el orden de las  teclas de la mayoría de los equipos, estos problemas no lo son tanto si se  utiliza la clase DateField. Enseguida se explica cómo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class DateFieldDemo extends MIDlet implements CommandListener{&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command CmdSalir = new Command(&quot;Salir&quot;,  Command.EXIT,1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private boolean primera;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Form mainForm;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public DateFieldDemo() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        Primera = true;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        Forma = new Form(&quot;Ejemplo de fecha&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En esta clase de nombre &lt;i&gt;DateFieldDemo&lt;/i&gt;, se utilizan por primera vez los  cambios de pantalla, implícitos en la clase &lt;i&gt;DateField&lt;/i&gt;, es por esto que se  crea una variable lógica &lt;i&gt;Primera&lt;/i&gt; que servirá para no instanciar los  objetos dos veces (al iniciar la MIDlet y al volver del cambio de pantalla).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;    &lt;i&gt;protected void startApp() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            if(Primera) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                Forma.append(new DateField(&quot;Fecha&quot;, DateField.DATE));&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                Forma.append(new DateField(&quot;Hora&quot;, DateField.TIME));&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                  Forma.append(new DateField(&quot;Fecha y hora&quot;,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                      DateField.DATE_TIME));       &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                Forma.addCommand(CmdSalir);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                Forma.setCommandListener(this); &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                Primera = false;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        Display.getDisplay(this).setCurrent(mainForm);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }   &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Además de los ya conocido, en &lt;i&gt;startApp&lt;/i&gt; se agregan a la forma tres  campos de fecha, el primero pedirá, según la forma que tenga dispositivo de  hacerlo, la fecha; el segundo pedirá la hora y el tercero ambos datos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;protected void destroyApp(boolean unconditional) { }   &lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    protected void pauseApp() { }  &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public void commandAction(Command c, Displayable d) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (c == CmdSalir) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            destroyApp(false);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            notifyDestroyed();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }   &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;span class=&quot;destacats&quot;&gt;5.5.5.StringItem&lt;/span&gt;   &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando lo que se desea no es pedir al usuario un dato, sino mostrarle  información, seguramente no es recomendable utilizar clases cuyo contenido pueda  ser alterado. Para esto se utiliza la clase &lt;i&gt;StringItem&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class StringItemDemo extends MIDlet implements CommandListener,&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                      ItemCommandListener {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Display display;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Form mainForm;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command IR = new Command(&quot;Ir&quot;, Command.ITEM,  1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command PRES = new Command(&quot;Pres&quot;,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                  Command.ITEM, 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command Salir = new Command(&quot;Salir&quot;,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                  Command.EXIT, 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  &lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En esta primera parte del código de la clase, se puede ver que se ha  implementado una nueva interfaz, &lt;i&gt;ItemCommmandListener&lt;/i&gt;, la cual se utiliza  para agregar comandos, no sólo a los objetos de pantalla completa (como TextBox  o Form), sino a los agrupados en estos objetos. Ahora podemos utilizar los  comandos de tipo &lt;i&gt;ITEM&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    protected void startApp() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;display = Display.getDisplay(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm = new Form(&quot;String Item Demo&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm.append(&quot;Esto es sólo una etiqueta&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;StringItem item = new StringItem(&quot;Etiqueta de String Item:  &quot;,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                          &quot;Texto de String Item&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm.append(item);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        item = new StringItem(&quot;Etiqueta: &quot;, &quot;texto&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm.append(item);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        item = new StringItem(&quot;Hipervínculo &quot;, &quot;Ir a&quot;,  Item.HYPERLINK);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        item.setDefaultCommand(IR);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        item.setItemCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm.append(item);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        item = new StringItem(&quot;Botón &quot;, &quot;Presionar&quot;, Item.BUTTON);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        item.setDefaultCommand(PRES);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        item.setItemCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm.append(item);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm.addCommand(Salir);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        mainForm.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        display.setCurrent(mainForm);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En &lt;i&gt;startApp&lt;/i&gt; sólo se muestran las posibilidades que se tienen para  escribir un texto que el usuario no pueda modificar y que además pueda ejecutar  alguna acción. Desde simplemente escribir &quot;Esto es sólo una etiqueta&quot;  hasta un  botón que, al ser presionado, puede realizar una tarea. En el ejemplo, se  distinguen dos tipos de constructores de &lt;i&gt;StringItem&lt;/i&gt;, el primero, que  tiene como parámetros dos cadenas de texto (etiqueta o título y contenido) y el  segundo, que además permite la definición de un tipo de texto (hipervínculo o  botón).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void commandAction(Command c, Item item) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (c == IR) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            String text = &quot;Ir a la URL...&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Alert a = new Alert(&quot;URL&quot;, text, null, AlertType.INFO);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            display.setCurrent(a);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        } else if (c == PRES) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            String text = &quot;Do an action...&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Alert a = new Alert(&quot;Action&quot;, text, null, AlertType.INFO);&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            display.setCurrent(a);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public void commandAction(Command c, Displayable d) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            destroyApp(false);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            notifyDestroyed();       &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tal vez llame la atención el hecho de tener dos funciones con el mismo nombre  (&lt;i&gt;CommandAction&lt;/i&gt;), pero hay que observar los parámetros que toman al  activarse, ambas capturan un evento en el teclado, pero la primera captura los  eventos ocasionados en el componente de la forma que esté seleccionado, mientras  el otro se ocupa de los eventos generales y funcionan solamente sobre los  eventos&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;protected void destroyApp(boolean unconditional) {    }&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    protected void pauseApp() {    }           &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;span class=&quot;destacats&quot;&gt;5.5.6.ChoiceGroup&lt;/span&gt;   &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los grupos de selección o &lt;i&gt;ChoiceGroup&lt;/i&gt;, por su nombre en inglés, son  listados de elementos en los que se puede seleccionar uno o varios de ellos y  permiten realizar operaciones (principalmente comparaciones lógicas) con dicha  selección.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.lcdui.*;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;import javax.microedition.midlet.MIDlet;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class Choice1 extends MIDlet implements CommandListener {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command CMD_Salir = new Command(&quot;Salir&quot;,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                  Command.EXIT,1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Display display;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private boolean primera;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Form Forma;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    public ChoiceGroupDemo() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        primera = true;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hasta este punto todo se ve como en los ejemplos anteriores, se importan las  clases, se define la clase con extensiones e implementaciones, se crea un  comando que se utilizará para salir de la MIDlet, se declaran los objetos y  variables a utilizar y se determina lo que ha de hacer el constructor.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;protected void startApp() {       &lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if(primera) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            display = Display.getDisplay(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Forma = new Form(&quot;Choice Group&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Forma.append(&quot;Choice Group&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Image[] ArrImg = null;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            try {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                Image Imag =  Image.createImage(&quot;/midp/uidemo/icono.png&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                ArrImg = new Image[] { Imag, Imag, Imag, Imag };&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            } catch (java.io.IOException err) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        String[] arrString = {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            &quot;Opcion A&quot;, &quot;Opcion B&quot;, &quot;Opcion C&quot;, &quot;Opcion D&quot;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;};&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ChoiceGroup[] grupos = {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;              new ChoiceGroup(&quot;Exclusivo&quot;, ChoiceGroup.EXCLUSIVE,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                   arrString,ArrImg),&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;              new ChoiceGroup(&quot;Multiple&quot;, ChoiceGroup.MULTIPLE,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                  arrString,ArrImg),&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;              new ChoiceGroup(&quot;Pop-Up&quot;, ChoiceGroup.POPUP,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                  arrString,ArrImg)&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            };&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            for (int iter = 0; iter &lt;&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                Forma.append(grupos[iter]);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Forma.addCommand(CMD_Salir);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            Forma.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            primera = false;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        display.setCurrent(Forma);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;startApp&lt;/i&gt; crea tres grupos de selección, exclusivo, múltiple y pup-up.  Todos estos grupos contienen cuatro opciones (A, B, C y D) y cuatro iconos,  correspondientes, cada uno, a una opción, contenidos en &lt;i&gt;arrString&lt;/i&gt; y  &lt;i&gt;arrImg&lt;/i&gt;, respectivamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El grupo exclusivo es aquel que permite que uno y sólo uno de sus elementos  esté seleccionado. El grupo múltiple permite la selección de uno o varios  elementos. El modo pop-up permite escoger una sola opción, pero, a diferencia  del exclusivo, las muestra en un menú desplegable.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public void commandAction(Command c, Displayable d) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        if (c == CMD_Salir) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;           destroyApp(false);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;           notifyDestroyed();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   protected void destroyApp(boolean unconditional) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   protected void pauseApp() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;span class=&quot;destacats&quot;&gt;5.5.7.List&lt;/span&gt;   &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una lista de elementos, a diferencia de lenguajes como HTML WML, en J2ME es  una lista de la que se puede seleccionar un elemento, es decir, es como un grupo  de selección (&lt;i&gt;ChoiceGroup&lt;/i&gt;). A continuación se muestra un código de  ejemplo para la utilización de listas:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class Lista extends MIDlet implements CommandListener {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command SALIR = new Command(&quot;Salir&quot;,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                  Command.EXIT, 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private final static Command ATRAS = new Command(&quot;Atrás&quot;,&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                                                                                  Command.BACK, 1);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private Display display;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private List Lista1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private List ListaEx;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private List ListaIm;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private List ListaMul;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    private boolean primera;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En esta primera parte del código únicamente se han declarado las variables y  los objetos que se utilizarán, notese que entre esos objetos se encuentran  cuatro listas u objetos &lt;i&gt;List&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public Lista() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        display = Display.getDisplay(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        String[] Opciones = {&quot;Opción A&quot;, &quot;Opción B&quot;, &quot;Opción C&quot;, &quot;Opción  D&quot;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;       &lt;/i&gt; &lt;i&gt;};&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        Image[] imagenes = null;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaEx = new List(&quot;Exclusiva&quot;, Choice.EXCLUSIVE, Opciones,&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                 imagenes);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaEx.addCommand(ATRAS);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaEx.addCommand(SALIR);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaEx.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaIm = new List(&quot;Implícita&quot;, Choice.IMPLICIT, Opciones,&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                imagenes);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaIm.addCommand(ATRAS);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaIm.addCommand(SALIR);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaIm.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaMul = new List(&quot;Múltiple&quot;, Choice.MULTIPLE, Opciones,&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                                imagenes);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaMul.addCommand(ATRAS);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaMul.addCommand(SALIR);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        ListaMul.setCommandListener(this);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        primera = true;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El constructor de la clase principal crea un arreglo &lt;i&gt;Opciones&lt;/i&gt; que  contiene los elementos de la lista, otro arreglo &lt;i&gt;imagenes&lt;/i&gt; de valor nulo  que definirá las imágenes a utilizar como iconos a mostrar al lado de los  elementos; finalmente se instancian las listas según el tipo al que pertenecerán  y se les agrega un comando &lt;i&gt;ATRAS&lt;/i&gt; y otro &lt;i&gt;SALIR.&lt;/i&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/541690660567931603/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/541690660567931603' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/541690660567931603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/541690660567931603'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/programacion-midp.html' title='PROGRAMACIÓN MIDP'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-6483852104533765184</id><published>2009-04-08T12:19:00.000-07:00</published><updated>2009-04-08T12:19:01.097-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>¿Qué es J2ME?</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;¿QUÉ ES J2ME?&lt;/span&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;J2ME (Java 2 Micro Edition) es la  plataforma basada en el lenguaje Java que  Sun Microsystems ha creado para la programación de dispositivos inalámbricos  pequeños como teléfonos celulares, paginadores y PDA. La figura 4.1 muestra como  está compuesta la plataforma J2ME.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/7062_4_1.gif&quot; /&gt;  &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Figura 4.1. Componentes de J2ME&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.1.Perfiles,  configuraciones y máquinas virtuales&lt;/span&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La edición micro de Java se compone, además del lenguaje, de una máquina  virtual, configuraciones, perfiles y paquetes adicionales (Fig. 4.1).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La máquina virtual es la base de la plataforma, es el interprete del lenguaje  y sobre la cual se han de ejecutar las aplicaciones, también sobre esta máquina  virtual corren las configuraciones (CDC y CLDC), las cuales incorporan apis  básicas para la creación de aplicaciones y sirven de soporte a los perfiles. Los  perfiles incluyen la mayor parte de las clases y apis que se van a utilizar en  la programación, como pueden ser instrucciones de entrada y salida o de inicio y  terminación de la aplicación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los paquetes adicionales son aquellos que la especificación de la tecnología  inalámbrica Java (JSR185) no establece como obligatorios para incorporar en los  dispositivos. Ejemplos de esto pueden ser las apis de mensajes inalámbricos  (WMAPI) y de multimedia (WMAPI).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.2. MIDP 2.0&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hasta este momento es el único perfil aplicado a los dispositivos en el  mercado, aunque se están investigando algunos otros, como el especializado en  PDA.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;MIDP 2.0 incorpora apis de interfaz de usuario, de ciclo de vida del  programa, almacenamiento persistente, juegos, trabajo en red y multimedia. Según  la especificación de la tecnología inalámbrica de Java todo dispositivo que  soporte MIDP 2.0 debe incluir mínimamente las siguientes características:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Debe permitir archivos Java (JAR) de más de 64 KB. y archivos descriptores  de aplicaciones (JAD) mayores a 5 KB.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Se debe permitir a cada MIDlet la utilización de 30 KB de almacenamiento  persistente y se recomienda que las MIDlets incluyan información acerca de el  almacenamiento mínimo con el que trabajan correctamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-El espacio de memoria libre para una aplicación ejecutándose (Heap o del  montón) debe ser por lo menos de 256 KB.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Soporte para pantallas de 125 x 125 pixeles, con una profundidad de color de  12 bits.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Se deben incluir la capacidad de que el dispositivo reaccione a eventos de  tiempo (una alarma a determinada hora, los llamados ticklers o  despertadores).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Mecanismos para tomar un número telefónico del directorio del equipo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Soporte para imágenes en formato JPEG y PNG.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Acceso a contenidos multimedia por el protocolo HTTP 1.1.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.3. CLDC 1.1&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Además de la Configuración para Dispositivos Conectados (CDC), CLDC  (Connected Limited Device Configuration) es la única opción en configuraciones  en la tecnología inalámbrica Java, aunque esta última está dedicada a la clase  de aparatos que nos ocupan.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;CLDC es la base para que los perfiles (como MIDP o PDAP) funcionen,  proveyendo las apis básicas y la máquina virtual (KVM). CLDC está diseñada para  equipos microprocesadores RISC o CISC de 16 a 32 bits y con una memoria mínima  de 160 KB para la pila de la tecnología Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La JSR185 pide como requisitos mínimos para todo equipo que implemente CLDC  1.0 o 1.1&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Soporte mínimo para diez hilos relacionados con aplicaciones (MIDlets).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Usar zonas de tiempo personalizables, con referencia en el formato de zonas  de tiempo GMT (GMT \7:00, por ejemplo).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Soporte para propiedades de carácter y conversiones mayúsculas-minúsculas en  los bloques suplementales Unicode para Basic Latin y Latin-1 (nuestros  caracteres).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.4. KVM&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Como ya se explicó anteriormente la máquina virtual es la base de la  plataforma Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el caso de la plataforma J2ME, debido a las capacidades limitadas de  almacenamiento, memoria, procesamiento y pantalla de los dispositivos; no se  puede integrar una máquina virtual Java (JVM) del las dimensiones de J2SE o  J2EE. Por esto se ha creado una nueva máquina virtual: KVM (Kilobyte Virtual  Machine)&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;KVM es una máquina virtual Java compacta y portable específicamente diseñada  para ser la base de desarrollo en dispositivos pequeños y de recursos limitados.  Actualmente CLDC trabaja sobre KVM. Además KVM está diseñada para mantener los  aspectos centrales del lenguaje Java ejecutándose en unos cuantos kilobytes de  memoria (de ahí su nombre).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Aunque KVM deriva de la máquina virtual J2SE (JVM), algunas características  de esta última han sido eliminadas para soportar CLDC, debido a que resultan  demasiado costosas de implementar o su presencia supone problemas de seguridad,  resultando una KVM con las siguientes limitantes:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Soporte de punto flotante.- KVM no soporta números de punto flotante, esto  debido a que la mayoría de los dispositivos en los que se implementa no lo  soportan tampoco.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Finalización.- Las apis CLDC no incluyen el método &lt;i&gt;object.finalize&lt;/i&gt;,  así que no se pueden hacer operaciones de limpieza final antes de que el  recolector de basura tome los objetos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Manejo de errores.- CLDC sólo define tres clases error:  &lt;i&gt;java.lang.Error&lt;/i&gt;, &lt;i&gt;java.lang.OutOfMemoryError&lt;/i&gt; y  &lt;i&gt;java.lang.VirtualMachineError&lt;/i&gt;. Todo tipo de errores que no sean en tiempo  de ejecución se manejan de modo dependiente del dispositivo, esto incluye la  finalización de una aplicación o reinicio del dispositivo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Interfaz Nativa Java (JNI).-No se implementa JNI (posibilidad de incluir  código en C dentro de clases Java), primeramente por motivos de seguridad,  aunque también es considerado excesivo dadas las limitantes de memoria del  dispositivo al que se dirige.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Cargadores de clases definidas por el usuario.- KVM debe tener un cargador  de clases que no pueda ser manipulado o remplazado por el usuario,  principalmente por razones de seguridad.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-No hay soporte para la API &lt;i&gt;reflection&lt;/i&gt;. La API &lt;i&gt;reflection&lt;/i&gt; es  más bien usada para aplicaciones de bajo nivel (depuradores, constructores GUI,  etc). La falta de esta API impide también la serialización de objetos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Grupos de hilos o hilos &quot;demonio&quot;.- Aunque CLDC soporta programación  multihilo, no soporta grupos de hilos o hilos &quot;demonio&quot;. Si requiere usar  operaciones para grupos de hilos use objetos de colección para almacenar los  objetos hilo a nivel de aplicación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Referencias débiles.- Ninguna aplicación construida con CLDC puede requerir  referencias débiles.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.4.1.Verificador de clases&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En la máquina virtual de J2SE, el verificador de clases es el responsable de  rechazar archivos de clase no válidos. Una máquina virtual que soporte CLDC  (ahora KVM) también debe ser capaz de rechazar estos archivos. Sin embargo, el  proceso de verificación de clases es tardado y costoso y, por lo tanto, no  recomendable para equipos con recursos limitados.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los diseñadores de KVM decidieron mover la mayor parte del trabajo de  verificación de clases fuera del dispositivo, es decir, hacia la computadora de  escritorio donde las clases son compiladas o el servidor de donde se descargan.  A este proceso de verificación se le llama preverificación. Los dispositivos son  únicamente responsables de ejecutar algunas pruebas en la clase preverificada  para asegurarse de que aún es válida.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.5. Apis en J2ME-CLDC&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las apis para CLDC tienen el objetivo de proveer un conjunto de bibliotecas  mínimo y útil para el desarrollo de aplicaciones y definición de perfiles para  una gran variedad de aparatos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las apis CLDC se pueden dividir en dos categorías:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Clases derivadas de apis J2SE. Estas se localizan en los paquetes  &lt;i&gt;java.lang&lt;/i&gt;, &lt;i&gt;java.io&lt;/i&gt; y &lt;i&gt;java.util&lt;/i&gt; y se derivan de apis del  Java Developement Kit (JDK) 1.3. En las tablas 4.1 y 4.2 se muestra una lista  detallada de las clases incluidas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Clases específicas para CLDC. Se localizan en el paquete  &lt;i&gt;javax.microedition&lt;/i&gt; y sus subpaquetes y se explican con detalle abajo en  la tabla 4.4.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.5.1.Clases heredadas (derivadas)&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;CLDC hereda algunas clases de sistema, entrada y salida (E/S) y utilidades de  la plataforma J2SE, las tablas 4.1 y 4.2 muestran los paquetes y sus clases que  se heredaron de la edición estándar.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tabla 4.1. Clases de NO excepción heredadas de J2SE&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Paquete&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Clases&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;java.lang&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Boolean, Byte, Character, Class, Integer, Long, Math, Object, Runnable,  Runtime, Short, String, StringBuffer, System, Thread, Throwable&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;java.io&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;ByteArrayInputStream, ByteArrayOutputStream, DataInput, DataOutput,  DataInputStream, DataOutputStream, InputStream, OutputStream, InputStreamReader,  OutputStreamWriter, PrintStream, Reader, Writer&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;java.util&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Calendar, Date, Enumeration, Hashtable, Random, Stack, TimeZone,  Vector&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tabla 4.2. Clases de excepción heredadas de J2SE&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Paquete&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Clases&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;java.lang&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;ArithmeticException, ArrayIndexOutOfBoundException, ArrayStoreException,  ClassCastException, ClassNotFoundException, Error, Exception,  IllegalAccessException, IllegalArgumentException, IllegalMonitorStateException,  IllegalThreadStateException, IndexOutOfBoundException, InstantiationException,  InterruptedException, OutOfMemoryError, NegativeArraySizeException,  NumberFormatException, NullPointerException, RuntimeException,  SecurityException, StringIndexOutOfBoundException,  VirtualMachineError&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;java.io&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;EOFException, IOException, InterruptedException,  UnsupportedEncodingException, UTFDataFormatException&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;java.util&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;EmptyStackException, NoSuchElementException&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.5.1.1.Soporte de propiedades&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En CLDC no hay implementación para la clase &lt;i&gt;java.util.Properties&lt;/i&gt;, sin  embargo las propiedades mostradas en la tabla 4.3 están disponibles y se pueden  obtener llamando al método &lt;i&gt;System.getProperty(clave),&lt;/i&gt; donde clave puede  ser cualquiera de las siguientes:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tabla 4.3. Claves de las propiedades CLDC.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Clave&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Explicación&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Valor predeterminado&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;microedition.platform&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;La plataforma o dispositivo huésped.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;null&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;microedition.encoding&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Codificación predeterminada de caracteres.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;ISO8859_1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;microedition.configurations&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Configuración y versión J2ME actual.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;CLDC-1.0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;microedition.profiles&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Nombre de los perfiles soportados.&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;null&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.5.2.Clases específicas de CLDC&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las siguientes clases (Tabla 4.4) son específicas de CLDC y están contenidas  en el paquete &lt;i&gt;javax.microedition.io&lt;/i&gt;:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tabla 4.4. Clases específicas de CLDC.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Paquete&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Clases&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;javax.microedition.io&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;Connection, ConnectionNotFoundException, Connector, ContentConnector,  Datagram, DatagramConnection, InputConnection, OutputConnection,  StreamConnection, StreamConnectionNotifier&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;4.5.2.1.Clases específicas de MIDP&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Además de las clases específicas de MIDP contenidas en  &lt;i&gt;javax.microedition.rms&lt;/i&gt;, &lt;i&gt;javax.microedition.midlet&lt;/i&gt; y  &lt;i&gt;javax.microedition.lcdui&lt;/i&gt;; están disponibles las siguientes clases,  interfaces y clases de excepción:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;IllegalStateException.&lt;/i&gt; Clase en el paquete &lt;i&gt;java.lang&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-&lt;i&gt;Timer&lt;/i&gt; y &lt;i&gt;TimerTask.&lt;/i&gt; Clases en el paquete  &lt;i&gt;java.util&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;HttpConnection.&lt;/i&gt; Interfaz para acceso a una red por  el protocolo HTTP contenida en el paquete &lt;i&gt;javax.microedition.io&lt;/i&gt;. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/6483852104533765184/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/6483852104533765184' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6483852104533765184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6483852104533765184'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/que-es-j2me.html' title='¿Qué es J2ME?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-2017952170140994330</id><published>2009-04-07T12:18:00.000-07:00</published><updated>2009-04-07T12:18:00.771-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>El lenguaje de programación Java</title><content type='html'>&lt;span class=&quot;destacats&quot;&gt;3. EL LENGUAJE DE PROGRAMACIÓN JAVA&lt;/span&gt;  &lt;p style=&quot;text-align: justify;&quot;&gt;Debido a que el presente documento centra su atención en la programación de  dispositivos móviles, solamente se dará un descripción general del  funcionamiento y características del lenguaje Java, ya que después se  profundizará en su variante J2ME.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando se programa en Java, se coloca todo el código en métodos, de la misma  forma que se escriben funciones en lenguajes como C. En el presente capítulo se  describen algunas de las principales características del lenguaje de  programación Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.1. Acerca de la máquina virtual&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Como ya se ha mencionado, Java es un lenguaje interpretado, esto es que los  programas no se compilan a archivos ejecutables, sino a archivos que habrán de  ser interpretados por otros que si lo sean. Los archivos compilados de Java se  llaman archivos de códigos de bytes o bytecodes.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando se hace un programa en Java, el o los archivos que contengan el código  fuente deben ser nombrados con extensión &quot;.java&quot; y al momento de ser compilados  se creará un archivo de bytecodes con extensión &quot;.class&quot; del mismo nombre que el  archivo fuente. Este archivo será la aplicación y, por lo tanto el que se habrá  de ejecutar.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El trabajo de la máquina virtual es interpretar estos códigos de bytes según  el sistema operativo en que se esté trabajando. He aquí el secreto de la  portabilidad de Java: existe una máquina virtual para cada sistema operativo y  los bytecodes se verifican cada vez que han de ser ejecutados, es decir, no  corren directamente sobre el sistema operativo, sino que la maquina virtual los  ejecuta convirtiendo los bytecodes a instrucciones propias de la plataforma  anfitrión.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.Características básicas del lenguaje&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.1. Comentarios&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los comentarios se introducen en los programas como ayuda para quienes habrán  de leerlos, ya sea los propios programadores o aquellos quienes les han de dar  mantenimiento. Un comentario no se ejecuta ni compila junto con el resto del  programa, es únicamente para información. En Java hay tres tipos de  comentarios:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A) // comentarios para una sola línea.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Todo el texto de una línea que se encuentre después de &quot;//&quot; será omitido por  el compilador.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;B) /* comentarios de una o&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;más líneas*/&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se omitirá en la compilación y ejecución todo el texto contenido a partir de  la apertura del comentario &quot;/*&quot; y hasta su cierre &quot;*/&quot;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;C) /** comentario de documentación,&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;de una o más líneas*/&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los comentarios de documentación, colocados inmediatamente antes de una  declaración (de variable o función), indican que ese comentario ha de ser  colocado en la documentación que se genera automáticamente cuando se utiliza la  herramienta &lt;i&gt;javadoc&lt;/i&gt;. Dichos comentarios sirven como descripción del  elemento declarado permitiendo generar una documentación de nuestras clases  escrita al mismo tiempo que se genera el código.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En este tipo de comentario para documentación, se permite la introducción de  algunos tokens o palabras clave, que harán que la información que les sigue  aparezca de forma diferente al resto en la documentación.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.2. Identificadores&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los identificadores se utilizan para nombrar variables, funciones, clases y  objetos; cualquier cosa que el programador necesite identificar o usar.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En Java, un identificador debe comenzar con una letra, un subrayado (_) o un  símbolo de dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se  distinguen las mayúsculas de las minúsculas (case sensitive) y no hay longitud  máxima en el identificador.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Serían identificadores válidos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;identificador&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;nombre_usuario&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Nombre_Usuario&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;_variable_del_sistema&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;$transaccion&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Y su uso sería, por ejemplo:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int contador_principal;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;char _lista_de_archivos;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;float $cantidad_en_Ptas;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.3. Palabras clave&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las palabras claves en un lenguaje de programación son aquellas que tienen  alguna función especifica para dicho lenguaje, por ejemplo una palabra que  indique la impresión de una cadena de texto en pantalla.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las siguientes son las palabras clave que están definidas en Java y que no se  pueden utilizar como identificadores:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;abstract               continue            for                       new                   switch&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;boolean               default               goto                    null                     synchronized&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;break                   do                      if                         package           this&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;byte                      double               implements       private              threadsafe&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;byvalue                else                   import                protected          throw&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;case                    extends             instanceof          public                transient&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;catch                    false                  int                       return                true&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;char                     final                   interface            short                  try&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;class                    finally                 long                    static                 void&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;const                    float                   native                 super                while&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Seguramente no serán estas las únicas palabras que no podrán ser utilizadas  como identificadores, debido a que existen también las palabras utilizadas por  las clases que utilicemos (extendamos) en nuestros programas y las palabras  reservadas de Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.4. Palabras Reservadas&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Además de las anteriores, el lenguaje se reserva unas cuantas palabras más,  pero que hasta ahora no tienen un cometido específico. Esas palabras son:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;cast                      future                 generic              inner&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;operator              outer                  rest                    var&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.5. Literales y tipos de datos&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Java utiliza cinco tipos de datos básicos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A) Enteros. Números sin punto decimal.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;byte                            8 bits                 complemento a dos&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;short                           16 bits              complemento a  dos&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int                               32 bits              complemento a dos&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;long                            64 bits              complemento a dos&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por ejemplo: 21, 077, 0xDC00&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;B) Reales en coma flotante. Números con punto decimal.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;float                            32 bits              IEEE 754&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;double                        64 bits              IEEE 754&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por ejemplo: 3.14,  2e12, 3.1E12&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;C) Lógicos o booleanos. almacenan sólo valores de falso o verdadero.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;true (verdadero).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;false (falso).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;D) Caracteres. Únicamente almacenan un carácter, una letra, símbolo o número  (no se toma en cuenta su valor matemático).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por ejemplo:    &quot;a&quot;, \t, \u????    [????] es un número unicode.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;E) Cadenas. Son una agrupación de caracteres.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por ejemplo: &quot;Esto es una cadena literal&quot;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.5.1.Arreglos&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Son asociaciones de varios datos del mismo tipo, por ejemplo un arreglo de  cinco datos enteros o una lista de diez nombres, también son llamados  arrays.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En Java se pueden declarar arreglos de cualquier tipo:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;char s[];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;int iArray[];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Incluso se pueden construir arreglos de arreglos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;int tabla[][] = new int[4][5];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los límites de los arreglos se comprueban en tiempo de ejecución para evitar  desbordamientos y la corrupción de memoria, es decir, se verifica que no se  intenten ocupar más espacios de los especificados en la declaración del  arreglo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En Java un arreglo es realmente un objeto, porque tiene definido el operador  &quot;[ ]&quot;. Tiene una función miembro: length. Se puede utilizar este método para  conocer su longitud.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;int a[][] = new int[10][3];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;a.length;         /* 10 */&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;a[0].length;      /*  3 */&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para crear un arreglo en Java hay dos métodos básicos. Crearlo vacío:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;int lista[] = new int[50];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;o se puede crear el arreglo con sus valores iniciales:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;String nombres[] = {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;      &quot;Juan&quot;,&quot;Pepe&quot;,&quot;Pedro&quot;,&quot;María&quot;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;};&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Esto que es equivalente a:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;String nombres[];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;nombres = new String[4];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;nombres[0] = new String( &quot;Juan&quot; );&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;nombres[1] = new String( &quot;Pepe&quot; );&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;nombres[2] = new String( &quot;Pedro&quot; );&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;nombres[3] = new String( &quot;María&quot; );&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;No se pueden crear arreglos estáticos en tiempo de compilación:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int lista[50];  // generará un error en tiempo de compilación&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Tampoco se puede llenar un array sin declarar el tamaño con el operador  new:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;int lista[];&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;for( int i=0; i &lt;&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    lista[i] = i;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Es decir, todos los arrays en Java son estáticos, esto mejora la seguridad en  el manejo de memoria. Para convertir un arreglo en el equivalente a los arreglos  dinámicos de C++, se usa la clase vector, que permite operaciones de inserción,  borrado, etc.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.6. Operadores&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los operadores de Java son muy parecidos en estilo y funcionamiento a los de  C. En la siguiente tabla aparecen los operadores que se utilizan en Java, por  orden de precedencia:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;.                   []                   ()              ++                --                 !&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;~                  instanceof   *               /                   %                +&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-                   &lt;&lt;                 &gt;&gt;             &gt;&gt;&gt;            &lt;                 &gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;=               &gt;=                 ==            !=                 &amp;amp;                ^&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;|                   &amp;amp;&amp;amp;                ||               ?  :               =                 op=&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;*=                /=                  %=           +=               -=&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los operadores numéricos se comportan como esperamos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    int + int = int&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los operadores relacionales devuelven un valor booleano.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Para las cadenas, se pueden utilizar los operadores relacionales para  comparaciones además de + y += para la concatenación:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    String nombre = &quot;nombre&quot; + &quot;Apellido&quot;;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El operador = siempre hace copias de objetos, marcando los antiguos para  borrarlos, y ya se encargará el garbage collector de devolver al sistema la  memoria ocupada por el objeto eliminado.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.7. Separadores&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los separadores en Java definen la forma y función del código. Agrupan  bloques de código e identificadores, definen la prioridad en operaciones. Los  separadores admitidos en Java son los siguientes:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-() - paréntesis. Para contener listas de parámetros en la definición y  llamada a métodos. También se utiliza para definir precedencia en  expresiones.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-{} - llaves. Para contener los valores de matrices iniciadas  automáticamente. También se utiliza para definir un bloque de código, para  clases, métodos y ámbitos locales.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-[] - corchetes. Para declarar tipos matriz. También se utiliza cuando se  referencian valores de matriz.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-; - punto y coma. Separa sentencias.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-, - coma. Separa identificadores consecutivos en una declaración de  variables. También se utiliza para encadenar sentencias dentro de una sentencia  &lt;i&gt;for&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-. - punto. Para separar nombres de paquete de subpaquetes y clases. También  se utiliza para separar una variable o método de una variable de referencia.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.8. Control de flujo&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las instrucciones de control de flujo son aquellas que, basándose en  criterios dados por el programador, alteran el flujo natural (lineal) del  programa.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En Java tenemos casi las mismas instrucciones de control de flujo (selección,  decisión, salto y repetición) que en C.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.8.1.Estructuras de decisión y selección&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Son fragmentos de código que se ejecutan solamente si una condición contenida  en ellos se cumple, como se muestra en los siguientes ejemplos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A) if/else:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    if( condición_Boolean ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        Instrucciones_si_se_cumple_la_condición_Boolean;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    else {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        Instrucciones_si:no_se_cumple;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;B) switch:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    switch( expr1 ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        case expr2:&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            instrucciones_si_expr1_=_expr2;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            break;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        case expr3:&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            instrucciones_si_expr1_=_expr3;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            break;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        default:&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            instrucciones_si_expr1_&lt;&gt;_expr2_y_a_expr3;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            break;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.8.2.Ciclos de repetición&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Estas estructuras repiten su ejecución tantas veces como se haya indicado o  bien cuando se cumpla una determinada condición.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A) for&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;for( expr1 inicio; expr2 test; expr3 incremento ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    sentencias;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;También se soporta el operador coma (,) en los ciclos for&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;for( a=0,b=0; a &lt;&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;B) while&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;while( Boolean ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    sentencias;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;C) do/while&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;do {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    sentencias;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt; }while( Boolean );&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.8.3.Excepciones&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Algunas veces los programas producen algún error en tiempo de ejecución y  quisiéramos tener la capacidad de decirle qué hacer cuando esto suceda,  principalmente para evitar que el programa se colapse cada vez que el error se  presenta. para esto nos sirven las excepciones de Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A) try-catch-throw&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    try {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        sentencias;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    } catch( Exception ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        sentencias;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Java implementa excepciones para facilitar la construcción de código robusto.  Cuando ocurre un error en un programa, el código que encuentra el error lanza  una excepción, que se puede capturar y recuperarse de ella. Java proporciona  muchas excepciones predefinidas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.8.4.Control general del flujo&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Rompen el flujo natural del programa incondicionalmente, ya sea para terminar  un módulo o todo el programa o simplemente para pasar a otro lugar del  código.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;break [etiqueta]&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;continue [etiqueta]&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;return expr;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;etiqueta: sentencia;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por ejemplo, en caso de que nos encontremos con ciclos anidados, se permite  el uso de etiquetas para poder salirse de ellos, por ejemplo:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    uno: for( ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        dos: for( ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;               continue;        /* seguiría en el ciclo interno, pero  omitiría las                                                                        instrucciones siguientes*/&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                continue uno;       // seguiría en el ciclo uno  principal&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                break uno;          // se saldría del ciclo principal&lt;/i&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;                }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;            }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el código de una función siempre hay que ser consecuentes con la  declaración que se haya hecho de ella. Por ejemplo, si se declara una función  para que devuelva un entero, es imprescindible que se coloque un &lt;i&gt;return&lt;/i&gt;  final para salir de esa función, independientemente de que haya otros en medio  del código que también provoquen la salida de la función. En caso de no hacerlo  se generará un a advertencia (Warning), y el código Java no se puede compilar  con &quot;Warnings&quot;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;int func() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    if( a == 0 )&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        return 1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    return 0;    // es imprescindible porque se retorna un entero&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.9. Clases&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las clases son la parte fundamental de Java. Todo en Java forma parte de una  clase, es una clase o describe como funciona una clase. por lo tanto, el  conocimiento de las clases es fundamental para poder entender los programas  Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Todas las acciones de los programas Java se colocan dentro del bloque de una  clase o un objeto, todos los métodos se definen dentro del bloque de la clase.  Java no soporta funciones o variables globales, todo debe pertenecer a una  clase. Así pues, el esqueleto de cualquier aplicación Java se basa en la  definición de una clase.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Todos los datos básicos, como los enteros, se deben declarar en las clases  antes de hacer uso de ellos. En C la unidad fundamental son los archivos con  código fuente, en Java son las clases. De hecho son pocas las sentencias que se  pueden colocar fuera del bloque de una clase. La palabra clave &lt;i&gt;import&lt;/i&gt;  (equivalente al #include) puede colocarse al principio de un archivo, fuera del  bloque de la clase. Sin embargo, el compilador reemplazará esa sentencia con el  contenido del archivo que se indique, que consistirá, como es de suponer, en más  clases.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.9.1.Tipos de clases&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hasta ahora sólo se ha utilizado la palabra clave &lt;i&gt;public&lt;/i&gt; para  calificar el nombre de las clases que se han visto, pero hay más modificadores.  Los tipos de clases que se pueden definir son:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-abstract&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una clase &lt;i&gt;abstract&lt;/i&gt; tiene al menos un método abstracto. Una clase  abstracta no se instancia, sino que se utiliza como clase base para la  herencia.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-final.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una clase final se declara como la clase que termina una cadena de herencia.  No se puede heredar de una clase final. Por ejemplo, la clase &lt;i&gt;Math&lt;/i&gt; es una  clase final.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-public.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las clases &lt;i&gt;public&lt;/i&gt; son accesibles desde otras clases, bien sea  directamente o por herencia. Son accesibles dentro del mismo paquete en el que  se han declarado. Para acceder desde otros paquetes, primero tienen que ser  importadas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-synchronizable.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Este modificador especifica que todos los métodos definidos en la clase son  sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde  distintos hilos (&lt;i&gt;threads&lt;/i&gt;) de programación; el sistema se encarga de  colocar las banderas (&lt;i&gt;flags&lt;/i&gt;) necesarias para evitarlo. Este mecanismo  hace que desde hilos diferentes se puedan modificar las mismas variables sin que  haya problemas de que se sobrescriban.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-protected.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una clase definida como &lt;i&gt;protected&lt;/i&gt; puede ser utilizadas desde cualquier  clase del mismo paquete, sin posibilidad, a diferencia de las clases  &lt;i&gt;public&lt;/i&gt;, de ser accedidas desde otros paquetes, aun importandolas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.9.2.Paquetes de clases&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Al crear una clase se puede incluir en un paquete que se compilará como tal,  es decir, la aplicación no funcionará si falta alguna de las clases integrantes  del paquete.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La agrupación en paquetes es bastante útil para motivos de organización y  portabilidad, ya que nos obliga a tener todas las clases relacionadas a un  proyecto en la misma carpeta o directorio. Para incluir una clase en un paquete  se hace de la siguiente forma:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;package Clases; //esta línea indica que esta clase forma parte del paquete                                                //clases&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public MiClase {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;     int i;   ....&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.10. Variables y métodos de instancia&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Una clase en Java puede contener variables y métodos. Las variables pueden  ser tipos primitivos como int, char, etc. Los métodos son funciones.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por ejemplo, en el siguiente segmento de código podemos observarlo:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;public MiClase {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;         int i;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;         public MiClase() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;             i = 10;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;             }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;         public void Suma_a_i( int j ) {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;             i = i + j;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;             }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;         }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La clase MiClase contiene una variable (i) y dos métodos, MiClase que es el  constructor de la clase y Suma_a_i( int j ).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.10.1.Ámbito de una variable&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los bloques de sentencias compuestas en Java se delimitan con dos llaves. Las  variables de Java sólo son válidas desde el punto donde están declaradas hasta  el final de la sentencia compuesta que la engloba. Se pueden anidar estas  sentencias compuestas, y cada una puede contener su propio conjunto de  declaraciones de variables locales. Sin embargo, no se puede declarar una  variable con el mismo nombre que una de ámbito exterior.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;El siguiente ejemplo intenta declarar dos variables separadas con el mismo  nombre. En C y C++ son distintas, porque están declaradas dentro de ámbitos  diferentes. En Java, esto es ilegal.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;Class ambito {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    int i = 1;        // ámbito exterior&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        {             // crea un nuevo ámbito&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        int i = 2;    // error de compilación&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.10.2.Métodos y Constructores&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los métodos son funciones que pueden ser llamadas dentro de la clase o por  otras clases. El constructor es un tipo específico de método que siempre tiene  el mismo nombre que la clase.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando se declara una clase en Java, se pueden declarar uno o más  constructores opcionales que realizan la inicialización cuando se instancia (se  crea) un objeto de dicha clase.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Utilizando el código de ejemplo anterior, cuando se crea una nueva instancia  de MiClase, se crean (instancian) todos los métodos y variables, y se llama al  constructor de la clase:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;   &lt;/i&gt; &lt;i&gt;MiClase mc;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    mc = new MiClase();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La palabra clave new se usa para crear una instancia de la clase. Antes de  ser instanciada con new no consume memoria, simplemente es una declaración de  tipo. Después de ser instanciado un nuevo objeto mc, el valor de i en el objeto  mc será igual a 10. Se puede referenciar la variable (de instancia) i con el  nombre del objeto:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    mc.i++; // incrementa la instancia de i de mc&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Al tener mc todas las variables y métodos de MiClase, se puede usar la  primera sintaxis para llamar al método Suma_a_i() utilizando el nuevo nombre de  clase mc:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    mc.Suma_a_i( 10 );&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;y ahora la variable mc.i vale 21.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.2.10.3.Finalizadores&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Java no utiliza destructores (al contrario que C++) ya que tiene una forma de  recoger automáticamente todos los objetos que se salen del alcance. No obstante  proporciona un método que, cuando se especifique en el código de la clase, el  reciclador de memoria (garbage collector) llamará:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    // Cierra el canal cuando este objeto es reciclado&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;    protected void finalize() {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        close();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;        }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;3.3. Programación multihilo (multithread)&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se le llama programación multihilo o multithreaded (en inglés) al método de  programación donde el flujo del programa se diseña como caminos o hilos  independientes que pueden ejecutarse al mismo tiempo,&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Lo anterior significa que con Java se pueden realizar aplicaciones que  realicen varias tareas a la vez y que se puede controlar cada una de estas  tareas independientemente del resto.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La programación multihilo en Java se logra realizando una agrupación en hilos  como si de procedimientos se tratase, aunque se usa la clase &lt;i&gt;thread&lt;/i&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En el siguiente ejemplo veremos como crear un hilo en lenguaje Java y como  ordenar su ejecución:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//La clase principal&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;public class MiClase{&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  //código de la clase&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  //Se deben instanciar las clases hilo.&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt; &lt;/i&gt; &lt;i&gt;Hilo1 H1;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  Hilo2 H2;&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  H1 = new Hilo1 (&quot;1&quot;);&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  H2 = new Hilo2 ();&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  //Llamadas a los hilos&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  H1.start&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  H2.start&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;//Hilos&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;class Hilo1 extends Thread { //Extiende (hereda) la clase Thread&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  //Constructor de la clase Hilo1&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  public Hilo1(String nom){ //este constructor utiliza un nombre de  hilo&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  pulic void run(){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;              //run contiene el código que se ejecutará&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;class Hilo2 extends Thread {&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  public Hilo2(){ /*Variante del constructor que no pide nombre de hilo  (define                               los nombres de hilo como Thread1,  Thread2... Treadn.*/&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  pulic void run(){&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;  }&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;}&lt;/i&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&quot;Un programa inicia la ejecución de un hilo invocando el método &lt;i&gt;start&lt;/i&gt;  de ese hilo, a su vez &lt;i&gt;start&lt;/i&gt;, invoca el método &lt;i&gt;run&lt;/i&gt;. Una vez que  &lt;i&gt;start&lt;/i&gt; echa a andar el hilo, regresa de inmediato el control a su  invocador. De ahí en adelante el invocador se ejecutará en paralelo con el hilo  iniciado. El método &lt;i&gt;start&lt;/i&gt; lanza una excepción de estado de hilo ilegal  (&lt;i&gt;IllegalThreadStateException&lt;/i&gt;) si el hilo que está tratando de iniciar ya  se está ejecutando.&quot;[1] &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Desafortunadamente nuestro espacio para la explicación del lenguaje Java es  reducido puesto que no es ese nuestro tema principal, aunque se incluye por  considerarse necesario, y no podemos dedicarle lo merecido al interesante tema  de la programación multihilo. Recomendamos al lector el libro citado al pie de  esta página, dedica un capítulo (que tal vez resulte también insuficiente pero  es mejor que dos cuartillas) completo a este tema.&lt;/p&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/2017952170140994330/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/2017952170140994330' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2017952170140994330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2017952170140994330'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/el-lenguaje-de-programacion-java.html' title='El lenguaje de programación Java'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-6898907746899180456</id><published>2009-04-06T12:14:00.000-07:00</published><updated>2009-04-06T12:14:01.251-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>Diseño de páginas web para dispositivos pequeños</title><content type='html'>&lt;div&gt;&lt;span class=&quot;destacats&quot;&gt;2. DISEÑO DE PÁGINAS WEB PARA DISPOSITIVOS  PEQUEÑOS&lt;/span&gt;  &lt;p&gt;Como todos los interesados en el diseño y programación web saben, las páginas  web se hacen con los llamados lenguajes de aumento de texto, dependiendo del  tipo de página se utiliza un lenguaje determinado, aunque todos tienen  características similares.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.1.Lenguajes de aumento o ganancia (markup) de  texto&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Los lenguajes de aumento de texto, como HTML (Hipertext Markup Language),  DHTML (Dynamic HTML), XML (eXtensible Markup Language) y WML (Wireless Markup  Language), son lenguajes que, basándose en la utilización de etiquetas (tags),  dan al texto simple características especiales, que pueden ir desde mostrarlo  con tamaño, alineación o tipo distinto de fuente hasta la creación de enlaces a  otros documentos o aplicaciones o bien la generación de formularios gráficos  para introducir datos a una base de datos, auxiliándose de otros lenguajes.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.Lenguaje WML&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Debido a que el tema que ocupa a este documento es la programación de  dispositivos inalámbricos, este capítulo se dedicará a la explicación del  lenguaje de diseño web dedicado a ellos, WML.&lt;/p&gt; &lt;p&gt;WML es un lenguaje basado en XML y creado especialmente para el diseño de  páginas web para equipos con capacidades de procesamiento, memoria e interfaz  limitadas, es decir, para las llamadas PDA, teléfonos celulares y paginadores  (pagers).&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.1.Cartas y Barajas&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Todo el código WML se organiza dentro de una colección de cartas y barajas.  Las cartas especifican una o más unidades de interacción con el usuario, por  ejemplo  un menú de opciones, una pantalla de texto o un campo de entrada de  texto. Lógicamente, un usuario navega a través de una serie de cartas de WML,  revisando el contenido de cada una de ellas, introduciendo la información  requerida, realizando elecciones y moviéndose a otra carta. Las cartas están  agrupadas dentro de barajas. Una baraja es la unidad más pequeña WML que un  servidor puede enviar al terminal del usuario.&lt;/p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.2.Etiquetas&lt;/span&gt;  &lt;p&gt;Al igual que HTML, WML basa su codificación en etiquetas, éstas definen el  formato y otras propiedades que tendrá el texto o los objetos que se encuentren  dentro de ellas.&lt;/p&gt; &lt;p&gt;Las etiquetas WML se señalan escribiéndose dentro de los signos &lt;&gt;, por  ejemplo &lt;&lt;i&gt;etiqueta&lt;/i&gt;&gt;, aunque la mayoría de las etiquetas cuentan con  apertura y cierre, este último se hace agregando un &quot;/&quot; antes del nombre de la  etiqueta y después del signo &quot;&lt;&quot;, ejemplo:  &lt;/&lt;i&gt;cierre_de_etiqueta&lt;/i&gt;&gt;.&lt;/p&gt; &lt;p&gt;Todo texto u objeto ubicado entre una apertura y un cierre de etiqueta se  verá afectado por ella, por ejemplo, &lt;i&gt;&lt;center&gt;Texto&lt;/center&gt;,&lt;/i&gt;  hará que &quot;Texto&quot; aparezca en el centro de la pantalla, así como cualquier imagen  u objeto que se encuentre dentro de los límites de la etiqueta  &lt;i&gt;&lt;center&gt;&lt;/center&gt;&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.3.Etiquetas básicas&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.3.1.Obligatorias del documento&lt;/span&gt; &lt;/p&gt; &lt;p&gt;-&lt;?xml version=&quot;1.0&quot;?&gt;. Con esta etiqueta se debe iniciar cualquier  documento WML, indica al navegador que se abrirá un archivo codificado en XML,  hay que recordar que es la base de WML.&lt;/p&gt; &lt;p&gt;-&lt;!DOCTYPE WML PUBLIC&quot;-//WAPFORUM//DTD WML 1.1//EN&quot; &quot;&lt;a href=&quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;http://www.wapforum.org/DTD/WML_1.1.xml&lt;/a&gt;&quot;&gt;. Se especifica el tipo  de XML que se abrirá, WML en este caso y además se indica al navegador la URL  que seguirá para la descodificación del lenguaje.&lt;/p&gt; &lt;p&gt;-&lt;wml&gt;... &lt;/wml&gt;. Se escribe después de los dos anteriores,  determina el cuerpo principal del documento, cumple la misma función que la  etiqueta &lt;html&gt; en ese lenguaje.&lt;/p&gt; &lt;p&gt;-&lt;card id=&quot;cartauno&quot;&gt;...&lt;/card&gt;. Recordemos que una página WML se  divide en cartas, esta etiqueta marca los límites de una carta llamada  &quot;cartauno&quot;. Una página WML puede tener tantas cartas como sean necesarias.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.3.2.De formato de texto&lt;/span&gt; &lt;/p&gt; &lt;p&gt;-&lt;p&gt;...&lt;/p&gt;. Limita un párrafo, en WML todo texto debe estar  incluido en un párrafo.&lt;/p&gt; &lt;p&gt;-&lt;br/&gt;. Salto de linea, como en HTML.&lt;/p&gt; &lt;p&gt;-&lt;a href=&quot;#cartados&quot;&gt;a la cartados&lt;/a&gt;. Enlace de hipertexto a  una carta llamada cartados, en lugar de &quot;#cartados&quot; puede ir cualquier URL  válida.&lt;/p&gt; &lt;p&gt;-&lt;b&gt;  &lt;/b&gt;. Pone el texto contenido en negritas.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;  &lt;/i&gt;. Todo texto dentro de esta etiqueta se mostrará en  itálicas.&lt;/p&gt; &lt;p&gt;-&lt;em&gt;  &lt;/em&gt;. Similar a la itálica.&lt;/p&gt; &lt;p&gt;-&lt;strong&gt;  &lt;/strong&gt;. Otra opción para letra negrita.&lt;/p&gt; &lt;p&gt;-&lt;u&gt;  &lt;/u&gt;. Texto subrayado.&lt;/p&gt; &lt;p&gt;-&lt;big&gt;  &lt;/big&gt;. Letra grande, se debe recordar que se está ante  dispositivos con limitantes gráficas, así que no se puede ser muy exigente con  los tamaños de letra.&lt;/p&gt; &lt;p&gt;-&lt;small&gt;  &lt;/small&gt;. Letra pequeña&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.3.3.Caracteres especiales&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Al igual que en HTML, hay algunos caracteres utilizados por el lenguaje que  presentan ciertas dificultades a la hora de mostrarlos en pantalla (&quot;, $ #,  etc.). En caso de que sea necesario hacerlo se proporciona una lista, en la  tabla 2.1, de códigos por los que se deben sustituir los caracteres para que  aparezcan sin ningún problema.&lt;/p&gt; &lt;p&gt;Tabla 2.1. Códigos de caracteres especiales.&lt;/p&gt; &lt;table&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Signo&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Código&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Signo&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;Código&lt;/i&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;lt; %3c&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&gt;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;gt;%3e&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&#39;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;apos;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&quot;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;quot;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&amp;amp;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;amp;%26&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;$&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;$$%24&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;[&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%5b&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;]&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%5d&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;/&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%2f&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;\&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%55c&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;?&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%3f&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%3b&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;:&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%3a&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;^&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%5e&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;@&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%40&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;|&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%7c&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;=&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%3d&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;+&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%2b&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;}&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%7d&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;{&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%7b&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;,&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%2c&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;espacio&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%20&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;#&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%23&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;`&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;%27&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.3.4.Tildes y eñes&lt;/span&gt; &lt;/p&gt; &lt;p&gt;      En WML se deben sustituir las letras acentuadas y eñes por los  siguientes caracteres:&lt;/p&gt; &lt;p&gt;            &amp;#225;           á                   &amp;#193;            `                    &amp;#233;           é&lt;/p&gt; &lt;p&gt;            &amp;#201;           É                    &amp;#237;           i                        &amp;#205;           Í&lt;/p&gt; &lt;p&gt;            &amp;#243;           ó                     &amp;#211;            Ó                    &amp;#250;           ú&lt;/p&gt; &lt;p&gt;            &amp;#218;           Ú                    &amp;#241;            ñ                      &amp;#209;           Ñ&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.4.Variables&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Una de las grandes diferencias entre el WML y el HTML es que WML permite la  definición variables en las cartas, asignarles valores y presentarlos en la  pantalla, incluso utilizar las variables en expresiones. Con esto se puede  conservar información en el paso de una carta a otra y así dividir el contenido  en varios pasos (cosa bastante útil para pantallas tan pequeñas).&lt;/p&gt; &lt;p&gt;Las variables son cadenas de texto &lt;i&gt;case-sensitive (&lt;/i&gt;distingue  mayúsculas y minúsculas) a la que se le asigna un valor (secuencia de  caracteres) o ningún valor.&lt;/p&gt; &lt;p&gt;El nombre de la variable puede empezar por el guión bajo: &quot;_&quot; o una letra,  seguida de una o más letras, números o el guión bajo. Ejemplos de nombres de  variables válidos: NOMBRE_Usuario, _mivar1, X700II&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.4.1.Crear variables y asignarles valores&lt;/span&gt;  &lt;/p&gt; &lt;p&gt;&lt;setvar name=&quot;mivar1&quot; value=&quot;Juan&quot;&gt;. Juan es el valor de la variable  mivar1. Con setvar se crea la variable y a la vez se le asigna un valor.&lt;/p&gt; &lt;p&gt;Input. Con input se puede crear (declarar) la variable, asignarla un valor y  también devolverle el valor original. Input se utiliza para la entrada de datos  y esos datos (valores) se asignarán a una variable. Se presenta como un cuadro  de texto.&lt;/p&gt; &lt;p&gt;Select. Con select se puede crear (declarar) la variable, asignarle un valor  y también devolverle el valor original. Select permite seleccionar al usuario  uno o más valores entre una lista de opciones que se asignarán a una  variable.&lt;/p&gt; &lt;p&gt;Postfield. Con postfield se puede crear (declarar) la variable, asignarle un  valor y también devolverle el valor original.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.4.2.Hacer referencia a variables&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Es posible incluir el valor de una variable dentro de un documento WML, tanto  para que aparezca en la pantalla como para que se envíe a un programa. Hay tres  formas de hacer esto:&lt;/p&gt; &lt;p&gt;1.&lt;i&gt;$nombrevariable&lt;/i&gt;. Se utiliza cuando no hay ambigüedad con el nombre  de la variable dentro del contexto.&lt;/p&gt; &lt;p&gt;2.&lt;i&gt;$(nombrevariable)&lt;/i&gt;. Cuando puede existir ambigüedad con el nombre de  la variable dentro del contexto.&lt;/p&gt; &lt;p&gt;3.&lt;i&gt;$(nombrevariable:conversión)&lt;/i&gt;. Cuando se introduce el valor de una  variable dentro de una baraja, se puede definir el formato (escape, unescape o  no escape) así:&lt;/p&gt; &lt;p&gt;1.&lt;i&gt;$(var:e)&lt;/i&gt;, &lt;i&gt;$(var:E)&lt;/i&gt;, &lt;i&gt;$(var:escape)&lt;/i&gt;: cualquiera de los  tres traduce al formato escape&lt;a href=&quot;http://imagenes.mailxmail.com/editor.cfm?GET=CONTENT&amp;amp;cid=3917&amp;amp;cap=2#_ftn1&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;2.&lt;i&gt;$(var:u)&lt;/i&gt;, &lt;i&gt;$(var:U)&lt;/i&gt;, &lt;i&gt;$(var:unesc)&lt;/i&gt;: cualquiera de los  tres traduce del formato escape a texto US-ASCII.&lt;/p&gt; &lt;p&gt;3.&lt;i&gt;$(var:n)&lt;/i&gt;, &lt;i&gt;$(var:N)&lt;/i&gt;, &lt;i&gt;$(var:noesc)&lt;/i&gt;: cualquiera de los  tres hace que el valor de la variable no se traduzca al formato escape.&lt;/p&gt; &lt;p&gt;WML siempre aplica el formato escape cuando se trata de atributos que  trabajan con URLs. Por eso muchas veces se puede asumir que el WML convertirá al  formato escape cuando lo tiene que hacer. De todas formas, conviene incluirlo si  tenemos mínimas dudas de lo que ocurrirá.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.4.3.Las variables y las tareas &lt;noop&gt;,  &lt;prev&gt;, &lt;refresh&gt;  y &lt;go&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;- &lt;noop/&gt;. No hace nada. Se utiliza para desactivar eventos en el nivel  de la baraja.&lt;/p&gt; &lt;p&gt;-&lt;prev/&gt;. Prev vuelve al anterior URL. Si dentro de prev hay un  elemento setvar, como en el ejemplo, se procesa antes de que se ejecute el  prev.&lt;/p&gt; &lt;p&gt;&lt;prev&gt;&lt;/p&gt; &lt;p&gt;&lt;setvar name=&quot;mivar&quot; value=&quot;contenido&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;/prev&gt;&lt;/p&gt; &lt;p&gt;-&lt;refresh/&gt;. Refresh refresca los contenidos visibles del navegador. Si  refresh contiene un setvar, como en el ejemplo, se procesa el setvar y después  se procede al refresh.&lt;/p&gt; &lt;p&gt;&lt;refresh&gt;&lt;/p&gt; &lt;p&gt;&lt;setvar name=&quot;mivar&quot; value=&quot;contenido&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;/refresh&gt;&lt;/p&gt; &lt;p&gt;-&lt;go&gt;. Go lleva a otra URL u otra carta. Si dentro de Go hay un  elemento setvar, se procesa primero éste y después se ejecuta la tarea &quot;Go&quot;.&lt;/p&gt; &lt;p&gt;&lt;go&gt; href= &quot;&lt;a href=&quot;http://www.wmlclub.com/cgi-bin/programa.pl&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;http://www.WMLclub.com/cgi-bin/programa.pl&lt;/a&gt;&lt;a href=&quot;http://www.wmlclub.com/cgi-bin/programa.pl?x=$%28mivar1&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt; ?x=$(mivar1&lt;/a&gt;)&amp;amp;y=$(mivar2)&quot; method=&quot;post&quot;&gt;&lt;/p&gt; &lt;p&gt;                        &lt;setvar name=&quot;mivar1&quot; value=&quot;50&quot;&gt;&lt;/p&gt; &lt;p&gt;                        &lt;setvar name=&quot;mivar2&quot; value=&quot;80&quot;&gt;&lt;/p&gt; &lt;p&gt;            &lt;/go&gt;&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.5.Creación de tablas&lt;/span&gt; &lt;/p&gt; &lt;p&gt;El manejo de tablas en WML es similar al de HTML, se define el elemento  &lt;table&gt; y se indican las columnas (&quot;columns&quot;), después se especifican,  dentro de cada columna, las filas y los datos que han de llevar.&lt;/p&gt; &lt;p&gt;Aunque el tag de &lt;table&gt; está recogido en las especificaciones del WML  1.1, existen algunos móviles que no lo implementan, como es el caso del Nokia  7110, en su lugar los datos son mostrados en una tabla de una columna. A  continuación vemos un ejemplo de código para creación de tablas:&lt;/p&gt; &lt;p&gt;&lt;p&gt;&lt;table columns=&quot;3&quot;&gt;&lt;/p&gt; &lt;p&gt;                        &lt;tr&gt;&lt;/p&gt; &lt;p&gt;                                   &lt;td&gt;&lt;p&gt;fila 1, columna  1&lt;/p&gt;&lt;/td&gt;&lt;/p&gt; &lt;p&gt;                                   &lt;td&gt;&lt;p&gt;fila 1, columna  2&lt;/p&gt;&lt;/td&gt;&lt;/p&gt; &lt;p&gt;                                   &lt;td&gt;&lt;p&gt;fila 1, columna  3&lt;/p&gt;&lt;/td&gt;&lt;/p&gt; &lt;p&gt;                        &lt;/tr&gt;&lt;/p&gt; &lt;p&gt;                        &lt;tr&gt;&lt;/p&gt; &lt;p&gt;                                   &lt;td&gt;&lt;p&gt;fila 2, columna  1&lt;/p&gt;&lt;/td&gt;&lt;/p&gt; &lt;p&gt;                                   &lt;td&gt;&lt;p&gt;fila 2, columna  2&lt;/p&gt;&lt;/td&gt;&lt;/p&gt; &lt;p&gt;                                   &lt;td&gt;&lt;p&gt;fila 2, columna  3&lt;/p&gt;&lt;/td&gt;&lt;/p&gt; &lt;p&gt;                        &lt;/tr&gt;&lt;/p&gt; &lt;p&gt;&lt;/table&gt;&lt;/p&gt;&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.2.6.Manejo de imágenes&lt;/span&gt; &lt;/p&gt; &lt;p&gt;En los dispositivos móviles se permite la visualización de imágenes, pero  éstas deben estar en formato WBMP, en lugar de las utilizadas en HTML que pueden  ser gif, jpg o bmp; aunque algunos de los más modernos equipos ya cuentan con  soporte para jpg.&lt;/p&gt; &lt;p&gt;Una imagen WBMP puede ser creada por el diseñador en un programa especial, o  bien convertida de otro formato en el mismo programa. Uno de estos programas  puede ser Image Magic o bien el incluido en el kit de desarrollo WAP de  Nokia.&lt;/p&gt; &lt;p&gt;La forma de incluir una imagen en una página WML es la siguiente:&lt;/p&gt; &lt;p&gt;&lt;p&gt;&lt;img src=&quot;movil1.wbmp&quot; alt=&quot;Movil1&quot; /&gt;&lt;/p&gt; &lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.3.Scripts en WML (WMLS)&lt;/span&gt; &lt;/p&gt; &lt;p&gt;WMLS son las siglas de Wireless Markup Language Script y es un lenguaje de  programación que junto con el WML nos permite el diseño de las páginas que se  visualizan en los terminales móviles.&lt;/p&gt; &lt;p&gt;El navegador, además de poseer un intérprete para WML, también tiene uno para  los scripts. Además del propio lenguaje en sí, este intérprete implementa un  conjunto de librerías que permiten a nuestros programas acceder a ciertos  servicios del terminal.&lt;/p&gt; &lt;p&gt;El código WMLS debe incluirse en un archivo distinto al WML asociado.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.3.1.Utilización de WMLScript&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Al utilizar WMLS se pretende cubrir los huecos de funcionalidad que deja WML,  es decir, se trata hacer con las páginas cosas que resultarían imposibles con el  simple WML. Entre las utilidades del WMLScript están las siguientes:&lt;/p&gt; &lt;p&gt;-Validación de los datos de entrada por parte del usuario.&lt;/p&gt; &lt;p&gt;-Manejar mediante código funciones propias del terminal, como realizar  llamadas desde el teléfono, enviar mensajes, agregar número de teléfono a la  libreta de direcciones y acceder a la tarjeta SIM.&lt;/p&gt; &lt;p&gt;-Realizar alertas, mensajes de error, confirmaciones, etc.&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;destacats&quot;&gt;2.3.1.1.Identificadores&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Se utilizan identificadores para nombrar las variables, las funciones y los  &lt;i&gt;pragmas&lt;/i&gt; (información para la unidad de compilación). Estos  identificadores tienen las mismas reglas de definición que los nombres de  variables en WML, además no pueden ser iguales a una palabra reservada.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.1.2.&lt;/strong&gt;&lt;strong&gt;Comentarios&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;Los comentarios en el WMLS, son como en el C o en el C++ (una sola línea,  empieza por // y más de una línea empieza por /* y termina por */):&lt;/p&gt; &lt;p&gt;            //comentario&lt;/p&gt; &lt;p&gt;            /*Comentarios de más&lt;/p&gt; &lt;p&gt;            de una línea   */&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.1.3.&lt;/strong&gt;&lt;strong&gt;Caracteres especiales&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;Al estar basado en WML, el manejo de caracteres especiales se realiza de la  misma forma.&lt;/p&gt; &lt;p&gt;NOTA: Los WMLscripts se pueden escribir en cualquier editor de texto normal y  corriente. No pueden ser ejecutados sin que sean llamados desde una carta  WML.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.2.&lt;/strong&gt;&lt;strong&gt;Primeros pasos&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;A continuación se muestra un sencillo WMLS que convierte pesos a dólares  (suponiendo el tipo de cambio a 11.05 pesos por dólar).&lt;/p&gt; &lt;p&gt;Primero es necesario hacer el WML que recogerá la cifra que se desee pasar a  dólares.&lt;/p&gt; &lt;p&gt;&lt;?xml version=&quot;1.0&quot;?&gt;&lt;/p&gt; &lt;p&gt;&lt;!DOCTYPE WML PUBLIC &quot;-//WAPFORUM//DTD WML 1.1//EN&quot;&lt;/p&gt; &lt;p&gt;&quot;http://www.wapforum.org/DTD/WML_1.1.xml&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;wml&gt;&lt;/p&gt; &lt;p&gt;&lt;card id=&quot;monedas&quot; title=&quot;Cambio de divisas&quot; newcontext=&quot;true&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;p&gt;Conversor de pesos a dólares&lt;/p&gt;&lt;/p&gt; &lt;p&gt;&lt;p&gt;&lt;input type=&quot;text&quot; name=&quot;cantidad&quot; title=&quot;Cantidad: &quot; format=&quot;*N&quot;&gt;&lt;/p&gt;&lt;/p&gt; &lt;p&gt;&lt;p&gt;&lt;do type=&quot;accept&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;go href=&quot;peso-dolar.WMLs#calcular(&#39;$(cantidad)&#39;)&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;/do&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/p&gt; &lt;p&gt;&lt;p&gt;Resultado: $(resultado)&lt;/p&gt;&lt;/p&gt; &lt;p&gt;&lt;/card&gt;&lt;/p&gt; &lt;p&gt;&lt;/wml&gt;&lt;/p&gt; &lt;p&gt;En esta carta se ha creado una variable que se llama cantidad y lleva la  cifra a convertir en dólares. Además se incluye una variable, que no tiene nada,  llamada resultado. En esta variable se almacenará el resultado en el WMLs  siguiente:&lt;/p&gt; &lt;p&gt;extern function calcular(cantidad) {&lt;/p&gt; &lt;p&gt;            var dolar = (cantidad/11.05);&lt;/p&gt; &lt;p&gt;            var dolarString = String.toString(dolar);&lt;/p&gt; &lt;p&gt;            dolarString = String.format(&quot;%.2f&quot;, dolarString);&lt;/p&gt; &lt;p&gt;            WMLBrowser.setVar(&quot;resultado&quot;, dolarString);&lt;/p&gt; &lt;p&gt;            WMLBrowser.refresh();&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;Primero se declara la función, en este caso llamada calcular. La función es  extern, esto significa que puede ser llamada desde fuera del archivo WMLS. Esta  función recibirá como parámetro la variable cantidad. Al igual que C++ y Java,  la función comienza con { y termina con }.&lt;/p&gt; &lt;p&gt;Se declara una variable llamada dólar y se le asigna un valor, en este caso,  lo que haya introducido el usuario dividido entre 11.05 (el supuesto valor  actual de la moneda estadounidense).&lt;/p&gt; &lt;p&gt;Como el resultado puede tener una cantidad enorme de cifras decimales,  primero se convierte a una cadena de texto, con String.toString. El resultado  irá dentro de la variable dolarString, después con &quot;%.2f&quot; se indica que el  formato será un &lt;i&gt;float&lt;/i&gt; (de punto flotante o decimal) con dos cifras  después del punto.&lt;/p&gt; &lt;p&gt;Se crea una variable de nombre resultado y cuyo valor es el contenido de  dolarString y además se envía a la carta desde la cual fue llamada esta  función.&lt;/p&gt; &lt;p&gt;Actualiza el navegador (&lt;i&gt;browser&lt;/i&gt;) para que en la pantalla aparezcan los  cambios (ahora la variable &quot;resultado&quot; tiene un valor y tiene que aparecer en  pantalla)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.2.1.&lt;/strong&gt;&lt;strong&gt;Variables en WMLScript&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;Las variables deben ser declaradas antes de poder utilizarlas en una  expresión. Esta es la forma de declarar una variable:&lt;/p&gt; &lt;p&gt;var NombreVariable;&lt;/p&gt; &lt;p&gt;El nombre de la variable puede llevar caracteres alfabéticos, números y el  guión bajo (&quot;_&quot;), pero nunca puede empezar con un número.&lt;/p&gt; &lt;p&gt;En la declaración de una variable puede asignársele un valor inicial. Hay dos  formas de hacerlo, con igual resultado:&lt;/p&gt; &lt;p&gt;var a; a = 1;&lt;/p&gt; &lt;p&gt;O esta otra forma:&lt;/p&gt; &lt;p&gt;var a = 1;&lt;/p&gt; &lt;p&gt;También se pueden declarar varias variables a la vez, separadas por comas en  la misma instrucción var.&lt;/p&gt; &lt;p&gt;El valor de las variables en el WMLScript sólo duran lo que dura la función  en la que son declaradas. Por eso sólo se puede acceder a su valor dentro de la  función donde han sido declaradas.&lt;/p&gt; &lt;p&gt;Las variables pueden contener cualquier tipo de datos:&lt;/p&gt; &lt;p&gt;-Boolean (true o false).Ejemplo: var respuesta = true;&lt;/p&gt; &lt;p&gt;-Integer (número entero positivo o negativo, sólo desde -2147483648 hasta el  2147483647). Ejemplo: var num = 7890;&lt;/p&gt; &lt;p&gt;-Float (número decimal, el mínimo es: +-1.17549435E-38 y el máximo es:  +-3.402823476E+38).Ejemplo: var num = 6.78;&lt;/p&gt; &lt;p&gt;-String (caracteres alfabéticos, se puede utilizar comillas dobles o  simples).Ejemplo: var nombre = &quot;Juan&quot;;&lt;/p&gt; &lt;p&gt;-Invalid (para distinguirlo de los otros tipos de datos o para saber por  ejemplo cuándo el resultado de una operación se sale de los máximos o los  mínimos, un float menor a +-1.17549435E-38, por ejemplo).&lt;/p&gt; &lt;p&gt;Ejemplo: var ex = invalid;&lt;/p&gt; &lt;p&gt;Hay una forma de crear variables globales, esto es, variables que se  almacenan en el contexto del navegador y que pueden ser accesadas tanto por las  cartas WML, como por las funciones del WMLScript. Estas variables hay que  crearlas con la función setVar de la librería WMLBrowser, así:&lt;/p&gt; &lt;p&gt;&lt;i&gt;WMLBrowser&lt;/i&gt;.&lt;i&gt;setVar&lt;/i&gt; (&quot;nombreVariable&quot;, valor);&lt;/p&gt; &lt;p&gt;La variable siempre tiene que tener un valor inicial:&lt;/p&gt; &lt;p&gt;&lt;i&gt;WMLBrowser&lt;/i&gt;.&lt;i&gt;setVar&lt;/i&gt; (&quot;nombre&quot;, 0);                    &lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.3.&lt;/strong&gt;&lt;strong&gt;Librerías&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;WMLScript cuenta con seis librerías, éstas incluyen gran variedad de  funciones con las que podemos trabajar, dichas librerías son: &lt;i&gt;lang, float,  string, URL, dialogue y WMLbrowser&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.3.1.&lt;/strong&gt;&lt;strong&gt;Lang&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;Todas las funciones se utilizan como i se hiciera en un entorno orientado a  objetos: &lt;i&gt;lang.abs(-9)&lt;/i&gt;, por ejemplo. Todos los nombres de funciones  comienzan con minúscula.&lt;/p&gt; &lt;p&gt;&lt;i&gt;1.&lt;/i&gt;&lt;i&gt;Funciones aritméticas:&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;abs&lt;/i&gt; (número). Calcula y devuelve el valor absoluto.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;max&lt;/i&gt; (número1, número2), min (número1, número2). Regresan el mayor y  el menor, respectivamente, entre dos números comparados.&lt;/p&gt; &lt;p&gt;&lt;i&gt;2.&lt;/i&gt;&lt;i&gt;Funciones de tipos de datos:&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;isFloat&lt;/i&gt; (valor). Devuelve true si valor puede ser convertido en  número con decimales, false si no puede ser convertido e invalid si el sistema  no soporta decimales.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;isInt&lt;/i&gt; (valor). Es true si el valor puede ser convertido a entero.  False si ni puede ser. Invalid si excede los limites antes mencionados.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;parseFloat&lt;/i&gt; (cadena de texto). Devuelve un número con decimales,  sacado de la cadena de texto. Analiza la cadena de texto y termina en el primer  carácter que no sea parte de un número con decimales. Devuelve &quot;invalid&quot; cuando  hay un error en el análisis -no encuentra un número con decimales- o el  dispositivo WAP no acepta números con decimales.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;parseInt&lt;/i&gt; (cadena de texto). Devuelve el número entero, sacado de la  cadena de texto. El análisis de la cadena de texto se detiene en el primer  carácter que no sea parte de un número con decimales. Devuelve &quot;invalid&quot; cuando  hay un error en el análisis -no encuentra un número con decimales-.&lt;/p&gt; &lt;p&gt;&lt;i&gt;3.&lt;/i&gt;&lt;i&gt;Funciones de entorno.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Con estas funciones puedes conocer las capacidades del dispositivo WAP en el  que se ejecuta el WMLscript.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;CharacterSet&lt;/i&gt;(). Devuelve un número entero que es el valor asignado  por el IANA (Internet Assigned Numbers Authority) identificando el set de  caracteres que soporta el intérprete del WMLScript.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;Float&lt;/i&gt;(). Devuelve true si el dispositivo soporta los números con  decimales; false, en caso contrario.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;MaxInt&lt;/i&gt;(). Devuelve el número entero máximo que acepta el dispositivo  (actualmente es 2.147.483.647).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;minInt&lt;/i&gt;(). Devuelve el número entero mínimo que acepta el dispositivo  (actualmente es -2.147.483.648)&lt;/p&gt; &lt;p&gt;&lt;i&gt;4.&lt;/i&gt;&lt;i&gt;Funciones de control de flujo.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Te permite terminar la ejecución del script y devolver el control al lugar  desde donde fue llamado (por ejemplo, otra función del mismo WMLscript).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;abort&lt;/i&gt; (cadena de texto). Termina &quot;inesperadamente&quot; la interpretación  del bytecode del WMLscript y devuelve una cadena de texto describiendo el error.  A esta cadena de texto no se puede acceder desde un documento WML.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;exit&lt;/i&gt; (valor). Termina &quot;normalmente&quot; la interpretación del bytecode  del script y devuelve un valor a la función desde la que fue llamado. A esta  cadena de texto no se puede acceder desde un documento WML.&lt;/p&gt; &lt;p&gt;&lt;i&gt;5.&lt;/i&gt;&lt;i&gt;Funciones de números aleatorios.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;random&lt;/i&gt;(número entero). Devuelve un entero positivo aleatorio entre 0  y el número indicado.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;seed&lt;/i&gt; (número entero). Inicia en generador de números aleatorios en el  número indicado.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.3.2.&lt;/strong&gt;&lt;strong&gt;Float&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;i&gt;1.&lt;/i&gt;&lt;i&gt;Funciones de entorno:&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;maxFloat&lt;/i&gt;(). Devuelve el número positivo decimal máximo. Actualmente  es 3.40282347E+38, para todos los dispositivos que disponen de números  decimales. Si el dispositivo no los soporta, el resultado será &quot;invalid&quot;.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;MinFloat&lt;/i&gt;(). Devuelve el número positivo decimal mínimo. Actualmente  es 1.17549435E-38 para todos los dispositivos que disponen de números decimales.  Si el dispositivo no los soporta, devolverá &quot;invalid&quot;.&lt;/p&gt; &lt;p&gt;&lt;i&gt;2.&lt;/i&gt;&lt;i&gt;Funciones aritméticas.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;ceil&lt;/i&gt;(número). Devuelve el entero menor más próximo a &lt;i&gt;número&lt;/i&gt;.  Si el número ya es entero, devuelve el mismo número dado.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;floor&lt;/i&gt;(número). Es lo contrario de ceil. Devuelve el entero más  próximo a &lt;i&gt;número&lt;/i&gt;, pero que no sea mayor que él.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;int&lt;/i&gt;(número). De un &lt;i&gt;número&lt;/i&gt; dado devuelve la parte entera.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;pow&lt;/i&gt; (número1, número2). Devuelve el &lt;i&gt;número1 elevado&lt;/i&gt; a la  potencia &lt;i&gt;número2&lt;/i&gt;. Si &lt;i&gt;número1&lt;/i&gt; es negativo, &lt;i&gt;número2&lt;/i&gt; debe ser  un número entero. Si &lt;i&gt;número1&lt;/i&gt; es cero y &lt;i&gt;número2&lt;/i&gt; es menor que cero,  pow devuelve &quot;invalid&quot;.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;round&lt;/i&gt;(número). Devuelve el número entero más cercano al &lt;i&gt;número&lt;/i&gt;  dado. Si dos enteros están igualmente cerca del número, round devuelve el mayor  de ellos.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;sqrt&lt;/i&gt;(número). Devuelve la raíz cuadrada del &lt;i&gt;número&lt;/i&gt;. Si el  resultado es menor que cero sqrt devuelve &quot;invalid&quot;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.3.3.&lt;/strong&gt;&lt;strong&gt;String&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;i&gt;1.&lt;/i&gt;&lt;i&gt;Funciones básicas.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;charAt&lt;/i&gt; (cadenadetexto, número). Devuelve el carácter en la posición  &lt;i&gt;número&lt;/i&gt; de &lt;i&gt;cadenadetexto&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;compare&lt;/i&gt; (cadenadetexto1, cadenadetexto2). Compara dos cadenas de  texto.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;lenght&lt;/i&gt; (cadenadetexto). Regresa la cantidad de caracteres que tiene  una cadena.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;isEmpty&lt;/i&gt; (cadenadetexto). Devuelve true si la cadena está vacía, false  si no lo está.&lt;/p&gt; &lt;p&gt;&lt;i&gt;2.&lt;/i&gt;&lt;i&gt;Funciones de subcadena (Substring).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;subString&lt;/i&gt;(cadena,Inicio,Longitud). Extrae una subcadena de  determinada &lt;i&gt;longitud&lt;/i&gt; de caracteres, comenzando en la posición  &lt;i&gt;Inicio&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;find&lt;/i&gt; (cadena, subcadena). Determina si una &lt;i&gt;subcadena&lt;/i&gt; pertenece  a una &lt;i&gt;cadena&lt;/i&gt;, devuelve True si existe.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;replace&lt;/i&gt; (cadena, cadena1, cadena2). Reemplaza en &lt;i&gt;cadena&lt;/i&gt; todas  las apariciones de &lt;i&gt;cadena1&lt;/i&gt; por &lt;i&gt;cadena2&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;&lt;i&gt;3.&lt;/i&gt;&lt;i&gt;Funciones de elementos.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;elementAt&lt;/i&gt; (cadena, numElemento, separador).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;elements&lt;/i&gt; (cadena, separador).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;insertAt&lt;/i&gt; (cadena, cadena2, número, separador).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;removeAt&lt;/i&gt; (cadena, número, separador).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;replaceAt&lt;/i&gt; (cadena, elemento, número, separador).&lt;/p&gt; &lt;p&gt;&lt;i&gt;4.&lt;/i&gt;&lt;i&gt;Funciones de conversión:&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;format&lt;/i&gt; (formatString, valor). Da un formato especifico a un  determinado valor.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;toString&lt;/i&gt; (valor). Devuelve el valor expresado como cadena de  caracteres. Por ejemplo:&lt;/p&gt; &lt;p&gt;a=String.toString(3.5); //a=&quot;3.5&quot;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.3.4.&lt;/strong&gt;&lt;strong&gt;URL&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;La librería URL tiene funciones para manipular y verificar URLs relativos y  absolutos. La sintaxis de un URL (definido en detalle en [Request For Comments  (RFC) 2396]) es:&lt;/p&gt; &lt;p&gt;&lt;scheme&gt;://&lt;host&gt;&lt;:port&gt;/&lt;path&gt;;&lt;parameters&gt;?&lt;query&gt;#&lt;fragment&gt;&lt;/p&gt; &lt;p&gt;      Ejemplo:&lt;/p&gt; &lt;p&gt;      http://www.WMLclub.com:80/docs/faqs/index.htm;3;2?id=juan#nombre&lt;/p&gt; &lt;p&gt;Para las funciones que devuelven una cadena que contiene un componente de un  URL, los delimitadores de adelante y de atrás no están incluidos en el resultado  devuelto. La única excepción es en la ruta (donde se incluyen las diagonales  (/)). Hay tres tipos de funciones de la librería URL:&lt;/p&gt; &lt;p&gt;&lt;i&gt;1.&lt;/i&gt;&lt;i&gt;Funciones para manejar URLs&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Permiten validar, recuperar, crear y convertir a formato escape las URLs:&lt;/p&gt; &lt;p&gt;-&lt;i&gt;escapeString&lt;/i&gt;(cadenadetexto).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;getBase&lt;/i&gt;().&lt;/p&gt; &lt;p&gt;-&lt;i&gt;GetReferer&lt;/i&gt;().&lt;/p&gt; &lt;p&gt;-&lt;i&gt;isValid&lt;/i&gt;(url).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;resolve&lt;/i&gt;(baseString,incluidoString).&lt;/p&gt; &lt;p&gt;-&lt;i&gt;unescapeString(cadenadetexto).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;&lt;i&gt;2.&lt;/i&gt;&lt;i&gt;Funciones para extraer componentes.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Se utilizan para recuperar componentes individuales de URLs relativos y  absolutos. Estas funciones primero comprueban que el URL es válido, utilizando  isValid(), antes de extraer los componentes. Si isValid es &quot;false&quot;, estas  funciones devolverán &quot;invalid&quot;.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;getFragment(&lt;/i&gt;cadenadetexto&lt;i&gt;).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;getHost(&lt;/i&gt;cadenadetexto&lt;i&gt;).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;getPort(&lt;/i&gt;cadenadetexto&lt;i&gt;).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;getParameters(&lt;/i&gt;cadenadetexto&lt;i&gt;).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;getPath(&lt;/i&gt;cadenadetexto&lt;i&gt;).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;getScheme(&lt;/i&gt;cadenadetexto&lt;i&gt;).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;getQuery(&lt;/i&gt;cadenadetexto&lt;i&gt;).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;&lt;i&gt;3.&lt;/i&gt;&lt;i&gt;Funciones para extraer contenido.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Sólo hay una función para extraer contenido de un URL y es la que permite  asignar el contenido de un archivo de texto a una variable WMLScript.&lt;/p&gt; &lt;p&gt;&lt;i&gt;loadString&lt;/i&gt;(URLString,contentTypeString)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.3.5.&lt;/strong&gt;&lt;strong&gt;Dialogue&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;Los diálogos son mensajes en pantalla que esperan una respuesta del usuario.  La forma en la que aparece en pantalla dependerá de cada micronavegador. Esta  librería sólo tiene tres funciones:&lt;/p&gt; &lt;p&gt;-&lt;i&gt;prompt&lt;/i&gt;(cadena,cadenaPorDefecto). El texto que sale en pantalla es  &quot;cadena&quot; y espera una respuesta por parte del usuario (un input). El valor por  defecto del input es cadenaPorDefecto. Devuelve la cadena que el usuario ha  introducido.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;confirm&lt;/i&gt;(cadena,cadenaOK,cadenaCancelar). El texto que sale en  pantalla es &quot;cadena&quot; y despliega dos opciones a elegir (&quot;cadenaOK&quot; y  &quot;cadenaCancelar&quot;) y espera una respuesta del usuario. La función confirm  devuelve &quot;true&quot; si el usuario ha seleccionado OK y &quot;false&quot; si ha seleccionado  Cancel.&lt;/p&gt; &lt;p&gt;-&lt;i&gt;alert&lt;/i&gt;(cadena). Presenta una cadena de texto y espera la confirmación  del usuario. Devuelve una cadena vacía.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.3.3.6.&lt;/strong&gt;&lt;strong&gt;WMLbrowser&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;Las funciones de esta librería permiten acceder a las variables de contexto  del micronavegador del dispositivo. También permiten ejecutar una tarea cuando  el intérprete WMLscript termina su ejecución.&lt;/p&gt; &lt;p&gt;Todas estas funciones devuelven invalid si el micronavegador no soporta WML o  si el intérprete de WMLscript no puede ser invocado desde el micronavegador.&lt;/p&gt; &lt;p&gt;&lt;i&gt;1.&lt;/i&gt;&lt;i&gt;Funciones de variables.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;      Permiten leer y escribir variables en el contexto del  micronavegador.&lt;/p&gt; &lt;p&gt;- &lt;i&gt;getVar&lt;/i&gt;(nombre). Devuelve la cadena que contiene la variable  &lt;i&gt;nombre&lt;/i&gt;, devolverá una cadena vacía si la variable no existe, &quot;invalid&quot; si  &lt;i&gt;nombre&lt;/i&gt; no es un nombre de variable apropiado. Ejemplo:&lt;/p&gt; &lt;p&gt;var a = &quot;Hola&quot;;&lt;/p&gt; &lt;p&gt;var b = WMLBrowser.getVar(a);   //  b = &quot;Hola&quot;&lt;/p&gt; &lt;p&gt;- &lt;i&gt;setVar&lt;/i&gt;(nombre, valor). Inicia la variable &lt;i&gt;nombre&lt;/i&gt; con el  contenido de &lt;i&gt;valor&lt;/i&gt;, si la operación se realiza con éxito devuelve &quot;True&quot;,  de lo contrario &quot;False&quot; e &quot;Invalid&quot; si &lt;i&gt;nombre&lt;/i&gt; no es un nombre de variable  válido. Por ejemplo:&lt;/p&gt; &lt;p&gt;var a = WMLBrowser.setVar(color,azul);   //  a = true&lt;/p&gt; &lt;p&gt;&lt;i&gt;2.&lt;/i&gt;&lt;i&gt;Funciones de tareas.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;go&lt;/i&gt;(cadenaURL). Carga el URL dado. Esto sucede cuando el script  devuelve el control al navegador. Ej.:&lt;/p&gt; &lt;p&gt;var carta=&quot;http://www.WMLclub.com/demos/a.WML#carta2&quot;;&lt;/p&gt; &lt;p&gt;WMLBrowser.go(carta);&lt;/p&gt; &lt;p&gt;-&lt;i&gt;prev&lt;/i&gt;(). Carga la carta vista anteriormente. Al igual que go(), su  efecto se da sólo cuando el WMLscript devuelve el control al micronavegador.  Ej.:&lt;/p&gt; &lt;p&gt;WMLBrowser.prev();&lt;/p&gt; &lt;p&gt;-&lt;i&gt;refresh&lt;/i&gt;(). Actualiza la carta visualizada. Ej.:&lt;/p&gt; &lt;p&gt;WMLBrowser.refresh();&lt;/p&gt; &lt;p&gt;-&lt;i&gt;newContext&lt;/i&gt;(). Vacía el contexto del navegador y devuelve una cadena  vacía. Ej.:&lt;/p&gt; &lt;p&gt;            WMLBrowser.newContext();&lt;/p&gt; &lt;p&gt;&lt;i&gt;3.&lt;/i&gt;&lt;i&gt;Funciones de consulta.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;-&lt;i&gt;GetCurrentCard&lt;/i&gt;(). Devuelve la carta actual (la que llamó al script)  junto con la ruta más corta con respecto a la ubicación del archivo .WMLs.  Ej.:&lt;/p&gt; &lt;p&gt;Si www.server.com/a.WML llama a  www.server.com/pro.WMLs:&lt;/p&gt; &lt;p&gt;var a = getCurrentCard();   //  a = &quot;a.WML&quot;&lt;/p&gt; &lt;p&gt;O si www.serv0.com/a.WML llama a www.serv1.com/test/test.WMLs:&lt;/p&gt;var a =  getCurrentCard();   //  a = &quot;&lt;a href=&quot;http://www.serv0.com/a.wml&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;http://www.serv0.com/a.WML&lt;/a&gt;&quot;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://imagenes.mailxmail.com/editor.cfm?GET=CONTENT&amp;amp;cid=3917&amp;amp;cap=2#_ftnref1&quot; rel=&quot;nofollow&quot; name=&quot;&quot;&gt;[1]&lt;/a&gt;Formato adoptado por Internet Society para  identificar los caracteres utilizados en las URL, donde se escribe el &quot;%&quot; y el  número de carácter, %20 para el espacio, por ejemplo.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/6898907746899180456/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/6898907746899180456' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6898907746899180456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6898907746899180456'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/diseno-de-paginas-web-para-dispositivos.html' title='Diseño de páginas web para dispositivos pequeños'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-1793987932446652768</id><published>2009-04-05T12:08:00.002-07:00</published><updated>2009-04-05T12:15:55.301-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="J2ME"/><title type='text'>Desarrollo de aplicaciones para dispositivos inalámbricos (J2ME)</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;Durante los últimos años hemos experimentado, más que en ninguna otra época  de la humanidad, un sorprendente avance en la tecnología; tanto en la de las  grandes organizaciones: comerciales, militares y educativas, como en la que  usamos diariamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Indudablemente algunos de los más grandes avances se han dado en el área de  las comunicaciones: televisión, radio, satélites, teléfonos celulares; y en la  electrónica y computación: computadoras con capacidades que antes eran  inimaginadas, dispositivos de tamaños minimizados sorprendentemente, sin  sacrificar por esto gran poder de procesamiento.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Hasta hace pocos años estas dos ramas de la tecnología se desarrollaban  independiente una de la otra, pero con el surgimiento de Internet,  revolucionando la forma de comunicarse, los teléfonos celulares o móviles fueron  creciendo en cuanto a capacidad, de forma que han llegado a convertirse -algunos  modelos- en computadoras de bolsillo, con las limitantes de poder que sus  características suponen, obviamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Quién habría de imaginarse hace treinta años que un teléfono podría  trasladarse de un lugar a otro, no requerir de cable y tener mayor funcionalidad  que las supercomputadoras de aquella época o que no sería necesario sino un  bolsillo de 8 x 13 cm para cargar una computadora completa,  seguramente nadie.  Las nuevas tecnologías utilizadas por los fabricantes de estos aparatos tienden  a reducir el tamaño sin sacrificar funcionalidad e incluso aumentarla.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Dentro de las nuevas tecnologías que incorporan los pequeños dispositivos  portátiles -PDA (Portable Digital Assistant), teléfonos celulares, etc.- se  encuentran primordialmente el acceso a Internet, con todas las ventajas de  movilidad e información que proporcionan ambas tecnologías (telefonía móvil e  Internet), por un lado y la capacidad para el usuario de crear sus propias  aplicaciones o descargarlas de Internet e instalarlas en su equipo.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En cuanto al acceso y navegación en Internet, se utiliza un protocolo llamado  WAP (Wireless Application Protocol) que es el encargado de la comunicación y la  interpretación de los contenidos; también se utiliza, para la creación de las  páginas que se verán en estos dispositivos, el lenguaje WML (Wireless Markup  Language), el cual es similar al HTML de las computadoras de escritorio, aunque  diseñado especialmente para las características de los dispositivos portátiles.  En este documento se tratarán brevemente los fundamentos del diseño de páginas  WML.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Por el lado de desarrollo de aplicaciones se tienen lenguajes como C++ y Java  en versiones especiales para los equipos en cuestión, el presente reporte de  investigación se centrará en el lenguaje Java, ya que ocupa una abrumadora  mayoría en el mercado y está demostrando ser la mejor opción disponible para  todos los programadores interesados en el tema, ademas de las características de  seguridad y estabilidad inherentes a cualquier producto Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;1.1.Un vistazo a las comunicaciones inalámbricas&lt;/span&gt;  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Este amplísimo campo abarca desde las señales de radio y televisión hasta  teléfonos celulares y comunicación por satélite. Conceptualmente, puede ser  dividido en dos tipos:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-LAN (Local Area Network): Operan regularmente en distancias cortas -unos  cuantos metros. Pueden ser desde el control de la alarma de un auto, un juguete  de radio control o una red BlueTooth.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-WAN (Wide Area Network): Sobrepasan por mucho las distancias de los  dispositivos LAN, aunque basan su funcionamiento en una red terrestre  excelentemente elaborada: Una red de antenas de radio cuidadosamente colocadas,  los aparatos pueden funcionar mientras se encuentren en el rango de al menos una  de las antenas. Como los teléfonos celulares y los receptores de radio.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;1.2.Introducción a la plataforma Java&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Java fue creado por Sun Microsystems en un intento por desarrollar un  lenguaje que facilitara la programación de aparatos electrodomésticos conectados  a la red de una casa inteligente. Después de un tiempo de desarrollo, la  directiva del proyecto vio que las capacidades del lenguaje iban mucho mas allá  de una red casera y decidieron enfocarlo hacia las aplicaciones basadas en  Internet o con cierto nivel de desempeño requerido en el trabajo de red, además  de satisfacer a las empresas que demandaban un lenguaje que se pudiese  implementar en todas sus máquinas, sin importar el sistema operativo sobre el  que trabajaran.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Aunque el lenguaje Java es sintácticamente similar a C++, difiere enormemente  en su fundamento:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Java es un lenguaje puramente orientado a objetos, interpretado, esto  significa que los programas realizados con Java no son ejecutables por si solos,  existe otro programa que los interpreta cada vez que son requeridos. Esto puede  causar disminución en la velocidad de ejecución de las aplicaciones, pero,  aunque aun no se alcanza la rapidez de ejecución de los programas hechos en C++  o Visual BASIC, se ha mejorado enormemente con respecto a las primeras versiones  del lenguaje, lo que significa que tal vez en un futuro cercano la rapidez deje  de ser un impedimento para usar Java.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-C++ utiliza, como característica principal, apuntadores a memoria y delega a  los programadores, simples seres humanos, la tarea de localizarla, controlarla y  liberarla. Mientras tanto, Java utiliza objetos de tipo seguro, no permite la  asignación de memoria dinámica y gracias a su recolector de basura (garbage  collector) la memoria sin usar se recicla automáticamente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La base de la plataforma Java es una máquina virtual, la cual puede ser  implementada en los más populares sistemas operativos y en gran variedad de  hardware. Por lo que se puede tener aplicaciones binarias Java operando  consistentemente a través de diferentes implementaciones.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las APIs (Application Programming Interface) Java son el conjunto de clases y  objetos que permiten, mediante la utilización del lenguaje Java, la interacción  entre el programador y la computadora y entre esta y el usuario final.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Juntos, el lenguaje de programación Java, la máquina virtual y las apis,  forman la plataforma Java (Fig. 1.1) , la cual, en su versión 2, se puede  encontrar en tres ediciones:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Java 2 Standard Edition (J2SE). Diseñada para computadoras de escritorio,  puede trabajar en sistemas operativos como: Windows, Linux, MacOS, Solaris, OS  x.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Java 2 Enterprise Edition (J2EE). Plataforma para aplicaciones multiusuario  o empresariales. Se basa en J2SE y agrega apis para trabajo en el servidor.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Java 2 Micro Edition (J2ME). Conjunto de tecnologías y especificaciones  desarrolladas para dispositivos pequeños como los teléfonos celulares y PDA  (palm, agendas electrónicas). Utiliza derivados de componentes J2SE, como son  una máquina virtual más pequeña y un conjunto de apis menos potentes.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/7062_1_1.gif&quot; /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;                                               Figura 1.1. La plataforma  Java&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;1.2.1.Introducción a J2ME&lt;/span&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A diferencia de J2SE, la micro edición de Java no es sólo una pieza de  software ni una simple especificación, J2ME es una plataforma, una colección de  tecnologías y especificaciones diseñadas para diferentes partes del mercado de  los dispositivos pequeños.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;J2ME se divide en configuraciones, perfiles y paquetes opcionales. Las  configuraciones son especificaciones que detallan una máquina virtual y un  conjunto base de apis que pueden ser usadas en cierta clase de dispositivos. La  maquina virtual puede ser completa, como la describe la especificación o algún  derivado de ella.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Un perfil trabaja sobre una configuración pero agrega apis específicas para  hacer un entorno completo de construcción de aplicaciones. Usualmente incluyen  apis para el ciclo de vida de las aplicaciones, interfaz de usuario y  almacenamiento persistente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Un paquete opcional provee una funcionalidad que puede no estar relacionada  con alguna configuración o perfil, por ejemplo la API Bluetooh (JSR182).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Actualmente J2ME tiene disponibles dos configuraciones:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Connected Limited Device Configuration (CLDC). Para dispositivos pequeños  con conexiones de red intermitentes, como teléfonos celulares y PDA.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Connected Device Configuration (CDC). Diseñada para aparatos más grandes (en  términos de memoria y poder de procesamiento) con conexiones de red  robustas.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;MIDP (Mobile Information Device Profile) es el perfil con mayor desarrollo en  la plataforma Java, aunque se está investigando el PDA Profile. MIDP incluye  apis de interfaz de usuario, de ciclo de vida de aplicaciones y algunas de  almacenamiento persistente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los dispositivos implementan una &quot;pila&quot; de software completa, la cual  consiste usualmente en una configuración, un perfil y apis opcionales.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;img src=&quot;http://imagenes.mailxmail.com/cursos/imagenes/7062_1_2.gif&quot; /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Figura 1.2. Pila de software para JSR185&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;JSR185, Java Technnology for Wireless Industyry (JWTI), es la especificación  vigente para el desarrollo de aplicaciones inalámbricas en Java, con esta  especificación se intenta dejar de lado algunos problemas de compatibilidad  entre dispositivos que las anteriores especificaciones dejaron pendientes,  así  que JSR185 exige que todos los fabricantes que deseen adoptar esta  especificación deben incluir en sus dispositivos CLDC 1.0 o 1.1, MIDP 2.0 y WMA  (Wireless Messaging API), dejando opcional MMAPI (MultiMedia API), de esta forma  el desarrollador puede saber que esperar de una clase de dispositivos y con esto  crear aplicaciones altamente portables. En la figura 1.2 se presenta  gráficamente esta pila de software.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;1.3.Tecnología WAP y WML&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;1.3.1.WAP (Wireless Application Protocol)&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Este protocolo pretende ofrecer a los usuarios de equipos con recursos de  memoria, resolución de pantalla y capacidad de procesamiento limitados las  mismas funcionalidades que se ofrecen de Internet a través de computadoras  personales, pero con las ventajas y limitantes propias de estos  dispositivos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;destacats&quot;&gt;1.3.2.WML (Wireless Markup Language)&lt;/span&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;WML es un lenguaje de aumento o ganancia (markup) de texto basado en el  lenguaje de aumento extensible (XML, &lt;i&gt;Extensible Markup Language&lt;/i&gt;) y fue  desarrollado para especificar contenidos e interfaces de usuario para terminales  de banda estrecha tales como teléfonos móviles e intérpretes de páginas. WML  est` diseñado para trabajar con dispositivos inalámbricos pequeños que poseen  cuatro características:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Pantalla pequeña de baja resolución. Al nacimiento de este lenguaje, la  resolución de los teléfonos celulares se limitaba a unas cuantas lineas de texto  y de 8 a 12 columnas de caracteres, debido al rápido aumento en ese ramo, las  nuevas versiones del lenguaje se pueden implementar en equipos con resoluciones  de hasta 256 x 256 pixeles..&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Los aparatos de entrada tienen una capacidad limitada o están diseñados para  un propósito determinado. Un teléfono móvil tiene comúnmente teclas numéricas y  un reducido número de teclas adicionales con funciones especificas. Algunos  dispositivos más sofisticados pueden poseer teclas programables de software,  pero no un ratón ni otros dispositivos de selección.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Los recursos computacionales están limitados por una CPU de baja potencia,  una memoria reducida y una potencia restringida.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-La red ofrece un reducido ancho de banda y una alta latencia. No son  infrecuentes los aparatos con conexiones de red de 300 bit/s a 10 Kb/s y  latencia &quot;&lt;i&gt;round-trip&lt;/i&gt;&quot; de entre 5 y 10 segundos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Las características del lenguaje WML pueden agruparse en cuatro áreas  principales:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Ofrece un soporte de texto e imagen y tiene una amplia variedad de formatos  y comandos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Las cartas (fragmentos de página o pantallas) WML se agrupan en barajas. Una  baraja WML es similar a una página HTML identificada por una URL (&lt;i&gt;Universal  Resource Location&lt;/i&gt;, localización universal de recursos) y es la unidad básica  de transmisión de contenidos.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Ofrece soporte para gestión de navegación entre cartas y barajas, e incluye  comandos para su manejo. Estos pueden usarse para navegar o ejecutar scripts,  WML también provee de conexiones de anclaje similares a las usadas en el HTML  versión 4.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;-Se pueden establecer parámetros para todas las barajas de WML usando un  modelo establecido. Se pueden usar variables en lugar de cadenas y sustituirse  en el tiempo de ejecución. Esta forma de establecer parámetros permite que los  recursos de la red sean usados de forma eficiente.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Toda la información de WML se transmite en formato codificado por la red  inalámbrica. &lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/1793987932446652768/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/1793987932446652768' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/1793987932446652768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/1793987932446652768'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2009/04/desarrollo-de-aplicaciones-para.html' title='Desarrollo de aplicaciones para dispositivos inalámbricos (J2ME)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-6397900907778752762</id><published>2008-11-16T17:27:00.000-08:00</published><updated>2008-11-16T17:29:01.400-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cliente Servidor"/><title type='text'>Programación Cliente-Servidor</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Java es un nuevo lenguaje de programación, como tantos otros.  Así que uno se pregunta el por qué del revuelo que se ha formado con su  aparición. La respuesta no es inmediatamente obvia si se observa el asunto desde  el punto de vista de la programación tradicional, porque aunque resuelve algunos  de los problemas típicos de este tipo de programación, lo que verdaderamente es  importante es que también resuelve los problemas que se generan en  &lt;i&gt;Internet&lt;/i&gt;, en la &lt;i&gt;Telaraña Mundial&lt;/i&gt;, en el &lt;i&gt;World-Wide-Web&lt;/i&gt;, en  la &lt;i&gt;Web&lt;/i&gt;. &lt;p&gt;Internet puede resultar algo misterioso al principio, sobre todo porque se  utiliza un vocabulario propio, que hasta que no se domina, uno anda un poco  despistado. Pero, en esencia, Internet es un sistema Cliente-Servidor gigante.  La idea primaria de un sistema cliente-servidor es que debe haber un sitio donde  se centraliza la información, que se desea distribuir bajo demanda a un conjunto  de personas o máquinas.&lt;/p&gt; &lt;p&gt;La clave de este concepto radica en que si se produce un cambio en la  información del sistema central, inmediatamente es propagada a los receptores de  la información, a la parte cliente. Luego, el concepto básico es muy simple; el  problema se presenta cuando hay solamente un servidor que tiene colgados a  muchos clientes, en que el rendimiento general del sistema decrece de forma  exponencial al aumento del número de clientes.&lt;/p&gt; &lt;p&gt;El funcionamiento de la Web sigue este mismo principio. Inicialmente, se  solicita una información a un servidor y éste envía de vuelta un fichero que  será interpretado por el navegador (el cliente) que lo formateará para  visualizarlo en la máquina cliente. El &lt;i&gt;navegador&lt;/i&gt; fue el primer paso  adelante en la expansión de Internet, ya que permitía visualizar un mismo  fichero en plataformas diferentes sin hacerle cambio alguno; pero su finalidad  principal es la visualización de ficheros, no la interactividad con el usuario,  ni la posibilidad de ejecutar programas en la parte del usuario, en la parte  cliente del sistema.&lt;/p&gt; &lt;p&gt;Para proporcionar un poco de interactividad, se dotó al lenguaje HTML de  ciertos mecanismos básicos de entrada de datos, como botones, cajas de  selección, campos de texto, y algunos otros; pero la carga que incorporaban al  sistema caía del todo dentro del lado del servidor, con lo cual, si había muchos  clientes colgando, el colapso del servidor era casi seguro. Así que surgieron  algunas alternativas a los CGI, para que se pudiese descargar al servidor de  tanto trabajo y que el cliente realizase también operaciones.&lt;/p&gt;&lt;/span&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;titulo1&quot;&gt;&lt;a name=&quot;Plug-ins&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Plug-ins&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Esto son piezas de código que se incorporan al navegador y  le indican que &quot;&lt;i&gt;a partir de ahora dispones de una nueva característica&lt;/i&gt;&quot;.  Hay carasterísticas que se añaden a los navegadores a través de plug-ins que son  muy rápidas y eficientes, pero el problema es que escribir un plug-in no es una  tarea trivial ni tampoco es algo que haya que hacer en el proceso de  construcción de un Site. Luego los pulg-ins son herramientas válidas para  programadores muy expertos que permiten incorporar características nuevas al  navegador sin necesidad de que el vendedor conceda su permiso.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;titulo1&quot;&gt;&lt;a name=&quot;Scripts&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Scripts&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Un lenguaje script permite embeber código fuente para la  programación del lado cliente, directamente en la página HTML, y el plug-in que  interpreta ese lenguaje se activará automáticamente cuando se cargue en el  navegador. Estos lenguajes tienden a ser muy simples y sencillos, además se  cargan muy rápidamente porque van incluidos en la página que envía el servidor.  La pega es que el código del programador está expuesto a la vista de cualquiera,  aunque tampoco se pueden hacer demasiadas filigranas con un lenguaje  script.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt; &lt;p&gt;Estos lenguajes se utilizan fundamentalmente para hacer más atractivos los  interfaces gráficos de las páginas, porque disponen de elementos gráficos y  pueden llegar a resolver el 80% de los problemas que se plantean en la  programación de la parte cliente del sistema cliente-servidor; y, además, son  lenguajes mucho más sencillos de aprender e implementar soluciones con ellos que  recurrir a Java o ActiveX. Siempre que los problemas del caigan dentro de ese  80% que son capaces de resolver los lenguajes script, y el programador se  encuentre cómodo con este tipo de lenguajes, serían la elección prioritaria,  antes de adentrarse en las profundidades que representa siempre el estudio de un  nuevo lenguaje de programación.&lt;/p&gt; &lt;p&gt;El lenguaje script más utilizado es &lt;i&gt;JavaScript&lt;/i&gt;, que no tiene nada que  ver con Java, me imagino que se llamará así para aprovechar el tirón de  popularidad de Java, pero también se pueden realizar scripts en la parte cliente  con &lt;i&gt;Visual Basic&lt;/i&gt; o con &lt;i&gt;Tcl/Tk&lt;/i&gt;.&lt;/p&gt;&lt;/span&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;titulo1&quot;&gt;&lt;a name=&quot;Java&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Java&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;¿Y qué pasa con el 20% de los problemas que no pueden  resolver los lenguajes script? La respuesta más común, si se hiciese una  encuesta, sería Java, y no solamente porque sea un poderoso lenguaje de  programación enfocado a la seguridad, multi-plataforma e internacional, sino  porque Java está siendo continuamente extendido para proporcionarle nuevas  características y librerías que resuelven elegantemente problemas que son muy  difíciles en la programación tradicional como el acceso a bases de datos, el uso  de multihilo, la programación de redes y la programación distribuida, y además  porque Java, a través de los &lt;i&gt;applets&lt;/i&gt;, permite la programación de la parte  cliente.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt; &lt;p&gt;Un applet es un miniprograma que corre solamente bajo un navegador y es  descargado automáticamente como parte de una página Web, al igual que cualquier  gráfico, y cuando se activa, ejecuta un programa. Este es el interés,  proporciona una forma a través de la cual se puede distribuir software al  cliente desde el servidor, en el momento en que el cliente necesite ese  software, y no antes, con lo cual siempre tendrá el cliente la última versión de  ese software, se actualice cuando se actualice. Además, tal como está diseñado  Java, el programador necesita crear su programa una sola vez, y ya estará listo  para ser ejecutado en todas las plataformas que dispongan de un navegador con  soporte Java.&lt;/p&gt; &lt;p&gt;Con Java se podrá realizar tanto trabajo como sea posible en el cliente antes  y después de hacer peticiones al servidor. Por ejemplo, se puede evitar el  enviar una petición a través de Internet mientras el usuario no haya introducido  los parámetros correctos de esa petición, que estará chequeando el cliente, sin  necesidad de tener que consultar continuamente al servidor; con ello se gana en  velocidad de respuesta ante el usuario, una reducción general en el tráfico de  red y una gran descarga de trabajo para el servidor.&lt;/p&gt; &lt;p&gt;Una de las ventajas de los applets sobre los scripts es que están en forma  compilada, con lo cual el código fuente no es visible; aunque se puede  descompilar sin demasiadas complicaciones, pero vamos, no está del todo  accesible. Además, un applet puede comprimir varios módulos, utilizando ficheros  &lt;i&gt;JAR&lt;/i&gt;, evitando múltiples conexiones con el servidor, ya que en una sola se  descargan todos los componentes necesarios.&lt;/p&gt; &lt;p&gt;Y, finalmente, está la curva de aprendizaje, porque a pesar de lo que el  lector haya podido escuchar o leer por ahí, Java no es un lenguaje trivial. Si  el lector domina Visual Basic, por ejemplo, el que realice sus trabajos en  VBscript le resultará más fácil y rápido y resolverá sus problemas de  programación cliente-servidor sin embarcarse en la dura empresa de aprender  Java.&lt;/p&gt;&lt;/span&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;titulo1&quot;&gt;&lt;a name=&quot;ActiveX&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ActiveX&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;La competencia directa de Java es &lt;i&gt;ActiveX&lt;/i&gt;, de  Microsoft, aunque su enfoque sea bastante diferente. ActiveX es originalmente  una solución orientada a entornos Windows, aunque parece ser que ahora está  siendo desarrollado para ser multiplataforma. Lo que hace ActiveX es decir  &quot;&lt;i&gt;si tu programa se conecta a este entorno, se podrá descargar en una página  Web y correr bajo un navegador que soporte controles ActiveX&lt;/i&gt;&quot;. &lt;i&gt;Microsoft  Internet Explorer&lt;/i&gt; soporta ActiveX directamente y &lt;i&gt;Netscape&lt;/i&gt; lo soporta  a través de plug-in. Por lo tanto, ActiveX no está constreñido a un solo  lenguaje de programación, sino que se pueden desarrollar componentes ActiveX en  el lenguaje que domine el programador, ya sea C++, Visual Basic o el Delphi de  Borland.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;titulo1&quot;&gt;&lt;a name=&quot;Scriptlets&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Scriptlets&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Microsoft ha subido una vez más la apuesta en su batalla  contra Java con el lanzamiento de los &lt;i&gt;scriplets&lt;/i&gt;, que son similares en  naturaleza a los componentes JavaBeans, y aparecen como una campaña de  &lt;i&gt;vaporware&lt;/i&gt; por parte de Microsoft. Su aparente meta es posicionar esta  tecnología como un potencial rival multiplatafroma de Java, que, según dice  Microsoft, no cumple su compromiso de ser tan manejable como propugna su  publicidad. Los scriptlets, a diferencia de Java, sólo se pueden utilizar sobre  un navegador Web. Si bien es cierto que a los applets les ocurre lo mismo, Java  deja abierta la posibilidad de crear aplicaciones, dependientes de una máquina  virtual Java, pero no de un navegador; y en cuanto la máquina virtual Java se  encuentra incluida en el propio sistema operativo, el usuario no advierte  dependencia alguna. La verdad es que los scriptlets no aportan nada nuevo a las  posibilidades de las herramientas actuales, sino que son otra forma de hacer lo  mismo. &lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt; &lt;/span&gt;&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;La descarga y ejecución automática de programas a través de Internet, en  principio, suena como el sueño de cualquier creador de virus. Los componentes  ActiveX son especialmente sensibles a este ataque, ya que se puede hacer lo que  se quiera, sin control alguno, con lo cual, el usuario puede bajarse un  componente ActiveX que haga estragos en su máquina. Esto no es nuevo, sino que  es un problema largamente conocido desde los tiempos de las BBS, pero que aquí  se ve amplificado por la velocidad de Internet.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Cuando se pide una página Web, se reciben ficheros gráficos, el código de la  página (con o sin scripts), código Java precompilado y componentes ActiveX. De  estos, algunos son casi inofensivos, como los ficheros gráficos y el código HTML  de la página, porque es muy poco lo que se puede manipular sobre ellos. Java  está diseñado para ejecutar los applets en una caja cerrada (&lt;i&gt;sand box&lt;/i&gt;),  envuelta en una capa de seguridad que impide cualquier acceso a disco o a  memoria que se encuentre fuera de esa caja cerrada. Así que, la parte más  propensa a introducir elementos no deseados en la máquina cliente son los  componentes ActiveX.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Actualmente se está intentando paliar esta desagradable posibilidad a través  de las &lt;i&gt;firmas digitales&lt;/i&gt;, que permiten reconocer al autor. Esta idea parte  de que los autores de virus normalmente son anónimos, y si se eliminan estos  componentes anónimos, siempre se podrá forzar al programador a que sea  responsable de sus acciones. Puede se una buena idea, porque permitirá a los  programas ser más funcionales, aunque si un programa tiene un bug inadvertido  que pueda resultar destructivo, todavía podrá causar problemas.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Con respecto a Java, hay diversas opiniones respecto a la draconiana  restricción a que un applet no pueda escribir en el disco local del cliente;  porque, que pasa si el usuario quiere crear una base de datos local, o quiere  guardar cualquier tipo de información para cuando se encuentre desconectado de  Internet. La asunción inicial de que todo el mundo estaría conectado es  impracticable, aunque si se redujesen los precios del teléfono, pudiese llegar a  ser el estado normal de muchos usuarios; así que la solución debe llegar por  otra vía. Los &lt;i&gt;applets firmados&lt;/i&gt;, que utilizan una clave pública para  comprobar que el applet viene del lugar correcto y no ha sido manipulado puede  ser una de esas soluciones. Desde Java 1.1 se dispone de un entorno para  implementar firmas digitales, por lo que si fuese necesario se podría hacer que  un applet se saliese de su caja cerrada.&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/6397900907778752762/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/6397900907778752762' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6397900907778752762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6397900907778752762'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/11/programacin-cliente-servidor.html' title='Programación Cliente-Servidor'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-5977697075561804534</id><published>2008-11-16T17:24:00.000-08:00</published><updated>2008-11-16T17:26:16.939-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1. Introduccion"/><title type='text'>Mas de Java</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;El uso principal que se hace de Internet e incluso de las  redes internas (corporativas) es correo electrónico (e-mail), aunque actualmente  hay un auge sorprendente de la navegación &lt;i&gt;web&lt;/i&gt;. Los documentos web pueden  contener variedad de texto, gráficos de todas clases y proporcionar enlaces  hipertexto hacia cualquier lugar de la red. Los navegadores utilizan documentos  escritos en lenguaje &lt;i&gt;HTML&lt;/i&gt;. La combinación actual de navegadores HTML/WWW  están limitados pues a texto y gráficos. Si se quiere reproducir un sonido o  ejecutar un programa de demostración, primero hemos de bajarnos (download) el  fichero en cuestión y luego utilizar un programa en nuestro ordenador capaz de  entender el formato de ese fichero, o bien cargar un módulo (plug-in) en nuestro  navegador para que pueda interpretar el fichero que hemos bajado.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Hasta ahora, la única forma de realizar una página web con  contenido interactivo, era mediante la interfaz &lt;i&gt;CGI&lt;/i&gt; (Common Gateway  Interface), que permite pasar parámetros entre formularios definidos en lenguaje  HTML y programas escritos en Perl o en C. Esta interfaz resulta muy incómoda de  programar y es pobre en sus posibilidades.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;El lenguaje Java y los navegadores con soporte Java,  proporcionan una forma diferente de hacer que ese navegador sea capaz de  ejecutar programas. Con Java se puede reproducir sonido directamente desde el  navegador, se pueden visitar &lt;i&gt;home pages&lt;/i&gt; con animaciones, se puede  &lt;i&gt;enseñar&lt;/i&gt; al navegador a manejar nuevos formatos de ficheros, e incluso,  cuando se pueda transmitir video por las líneas telefónicas, nuestro navegador  estará preparado para mostrar esas imágenes.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Utilizando Java, se pueden eliminar los inconvenientes de  la interfaz CGI y también se pueden añadir aplicaciones que vayan desde  experimentos científicos interactivos de propósito educativo, a juegos o  aplicaciones especializadas para la televenta. Es posible implementar publicidad  interactiva y periódicos personalizados. Por ejemplo, alguien podría escribir un  programa Java que implementara una simulación química interactiva -una cadena de  adn-. Utilizando un navegador con soporte Java, un usuario podría recibir  fácilmente esa simulación e interaccionar con ella, en lugar de conseguir  simplemente un dibujo estático y algo de texto. Lo recibido cobra vida. Además,  con Java podemos estar seguros de que el código que hace funcionar el  experimento químico no contiene ningún trozo de código malicioso que dañe al  sistema. El código que intente actuar destructivamente o que contenga errores,  no podrá traspasar los muros defensivos colocados por las características de  seguridad y robustez de Java.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Además, Java proporciona una nueva forma de acceder a las  aplicaciones. El software viaja transparentemente a través de la red. No hay  necesidad de instalar las aplicaciones, ellas mismas vienen cuando se necesitan.  Por ejemplo, la mayoría de los navegadores del Web pueden procesar un reducido  número de formatos gráficos (típicamente GIF y JPEG). Si se encuentran con otro  tipo de formato, el navegador estándar no tiene capacidad para procesarlo,  tendría que ser actualizado para poder aprovechar las ventajas del nuevo  formato. Sin embargo, un navegador con soporte Java puede enlazar con el  servidor que contiene el algoritmo que procesa ese nuevo formato y mostrar la  imagen. Por lo tanto, si alguien inventa un nuevo algoritmo de compresión para  imágenes, el inventor sólo necesita estar seguro de que hay una copia en código  Java de ese algoritmo instalada en el servidor que contiene las imágenes que  quiere publicar. Es decir, los navegadores con soporte Java se actualizan a sí  mismos sobre la marcha, cuando encuentran un nuevo tipo de fichero o  algoritmo.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;En esta filosofía es en la que se basan los &lt;b&gt;NC&lt;/b&gt;  (&lt;i&gt;Network Computer&lt;/i&gt;), que serán ordenadores sin disco y con mucha memoria.  Sus programas residen en un servidor que se los envía cuando los solicita. Es  quizá un guiño al pasado y una versión futurista de lo que ha sido un  &lt;i&gt;Terminal-X&lt;/i&gt; en otros tiempos, salvando las diferencias, evidentemente (no  sea que alguien me tilde de irreverente con las nuevas tecnologías).&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/5977697075561804534/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/5977697075561804534' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/5977697075561804534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/5977697075561804534'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/11/mas-de-java.html' title='Mas de Java'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-6624277374481681296</id><published>2008-11-16T17:00:00.001-08:00</published><updated>2008-11-16T17:24:26.404-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1. Introduccion"/><title type='text'>Portabilidad de Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt; &lt;p&gt;Java es una palabra que actualmente está en boca de todos y ha creado una  auténtica revolución. Nosotros nos enfocaremos al lenguaje Java, y la verdad es  que no es para tanto el armar ese revuelo. Verdad es que Java es una gran idea,  pero, no escandalosamente genial. Quizá todo se haya visto magnificado por  Internet, pero Java se anuncia como un lenguaje completo de propósito general y,  bueno, hay ciertas porciones del mismo que no están definidas o son discutibles,  y algunas características son ciertamente oscuras. A lo largo del Tutorial  iremos presentando todas esas cosas.&lt;/p&gt; &lt;p&gt;La creación de este Tutorial ha partido de la necesidad de aprendizaje del  lenguaje Java para implantarlo en aplicaciones críticas. Se necesitaba una  evaluación del lenguaje para comprobar si podría emplearse en el desarrollo de  pequeñas aplicaciones (no necesariamente con Internet por medio, aunque  también). Esto ha hecho que hayamos investigado en muchas fuentes,  principalmente de Sun Microsystems, y obtenido las conclusiones a que queríamos  llegar. Que resumiendo vienen a indicarnos que, tal como se encuentra definido  Java actualmente y con las herramientas que hay, si no hay interés en Internet,  lo mejor es olvidarse de Java. Aunque pronto pueda que esta afirmación sea  falsa, dado el empeño que todo el mundo está poniendo en llevar a Java a buen  puerto, pero la decisión del grupo que hemos formado fue descartar Java  (momentáneamente).&lt;/p&gt; &lt;p&gt;En toda esta historia nos hemos dado cuenta de que falta literatura en  castellano; como siempre, vamos a remolque. Por ello ha sido el desarrollar este  &lt;i&gt;Tutorial de Java&lt;/i&gt;, que esperamos (espero) humildemente, sea de provecho  para alguien. Eso sería ya una gran satisfacción para mí. Quizá yo no sea la  persona más indicada para estar escribiendo esto, porque todavía soy y siempre  me consideraré un principiante en Java, pero sí que puedo transmitir los pocos  conocimientos que he adquirido, y eso es lo que haré.&lt;/p&gt; &lt;p&gt;Todas las sugerencias que alguien pueda ofrecer, serán bienvenidas. Prometo  contestar a todo el mundo, si no me sobrepasa el correo. Y me gustaría que  pudiésemos ir haciendo crecer este &lt;i&gt;Tutorial de Java&lt;/i&gt; entre mucha más  gente. No obstante, la experiencia de muchos años de BBS me dice que hay mucho  &lt;i&gt;&lt;b&gt;escuchador&lt;/b&gt;&lt;/i&gt; y poco &lt;i&gt;&lt;b&gt;participador&lt;/b&gt;&lt;/i&gt;, por lo que el  Tutorial esta casi planteado en un noventa por ciento. Aunque, repito, todas las  colaboraciones serán bienvenidas y si van con el estilo, incluidas en el  &lt;i&gt;Tutorial de Java&lt;/i&gt; que arranca aquí.&lt;/p&gt; &lt;p&gt;Y una recomendación final, antes de que alguien se decida a publicar un  applet nada más terminar de leerse éste u otro Tutorial sobre Java. &lt;i&gt;Hay que  ser críticos con nuestro trabajo&lt;/i&gt;. Debemos valorar mucho nuestra estima y,  por ende, el código que escribimos bajo nuestro nombre. Actualmente hay muchos  applets que se pueden visualizar y, desgraciadamente, bastantes de ellos son de  muy baja calidad, escritos por programadores que están dando sus primeros  balbuceos en Java. Más que applets son &lt;i&gt;crapplets&lt;/i&gt; (&lt;i&gt;crap&lt;/i&gt; es una  forma coloquial de mierda), algunos de ellos incluso se quedan colgados o no  tienen un rendimiento mínimo aceptable. Debemos renunciar a una excesiva rapidez  de desarrollo en beneficio de un código fiable y bien diseñado. Y parafraseando  palabras de Alex Newman, director ejecutivo de Sun User Group/Java: &quot;&lt;i&gt;Hay un  montón de buenos programadores que no se dedican a ir por ahí vendiendo código.  Lo que hacen es buscar trabajo. Saber programar en Java será algo positivo para  incluir en el currículum&lt;/i&gt;&quot;.&lt;/p&gt; &lt;p&gt;No obstante, y para que todos tengamos una idea general de lo que es Java,  haremos una serie de aclaraciones o indicaciones, para que alguien que no esté  muy decidido a aprender Java, pueda tener elementos de juicio y de comparación  para tomar esa decisión. Por ello, haremos una introducción más extensa de lo  que sería habitual en un Tutorial, lo que también me permitirá verter ciertas  opiniones que en otro sitio no tendrían cabida.&lt;/p&gt; &lt;p&gt;Esta es la segunda versión del &lt;i&gt;Tutorial de Java&lt;/i&gt; corregida, ampliada y  readaptada para acomodarse a las nuevas características introducidas a Java por  &lt;i&gt;Sun&lt;/i&gt; desde la versión 1.1 del &lt;i&gt;Java Development Kit&lt;/i&gt; (&lt;b&gt;JDK&lt;/b&gt;) y  adaptándose en todo lo posible a la versión 1.2. He revisado todo el código  fuente, he añadido algunos ejemplos más en las partes en las que más consultas  he tenido y también, en respuesta a demanda, he incorporado algunas secciones,  que aunque no son tan básicas como pretendo yo con el Tutorial, sí parece que  resultan muy interesantes a la mayoría de los lectores de la versión anterior  del Tutorial (que todavía se puede encontrar en la dirección http://www.fie.us.es/info/internet/JAVA/).  &lt;/p&gt;&lt;/span&gt;&lt;b&gt; &lt;p align=&quot;center&quot;&gt;&lt;span style=&quot;font-family:Arial,Helvetica;font-size:85%;color:#0000a0;&quot;&gt;ESTA NO ES UNA  TRADUCCION DEL &quot;&lt;i&gt;JAVA TUTORIAL&lt;/i&gt;&quot; DE &lt;i&gt;SUN Microsystems&lt;/i&gt;, POR LO QUE LOS  TEMAS QUE SE TRATAN SON LOS QUE A MI ME PARECEN MAS INTERESANTES. TAMPOCO ME UNE  NINGUN TIPO DE RELACION CON SUN NI CON NINGUNA DE SUS FILIALES.&lt;/span&gt;&lt;/p&gt;&lt;/b&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Quien vaya a desarrollar applets para su publicación en  Internet y pretenda que llegue a la mayoría de navegantes que aterricen en su  página, ha de saber que si desarrolla con el JDK 1.1.X, y más con el JDK 1.2,  sus applets no podrán verse con una versión inferior a la 4.0 de los navegadores  más extendidos, &lt;i&gt;Netscape&lt;/i&gt; y &lt;i&gt;Microsoft Explorer&lt;/i&gt;. E incluso estos  navegadores no tienen soporte total del JDK 1.1.X, a fecha de  hoy.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt; &lt;p&gt;El JDK 1.1 fue un tremendo paso adelante en la evolución de Java y en el JDK  1.2 se han incorporado a la &lt;em&gt;Plataforma Java&lt;/em&gt; muchas de las APIs que  estaban en versiones individuales. El rendimiento y estabilidad de Java son  mucho más sólidos, y los JavaBeans van a representar un modelo a seguir por  muchas empresas. También el movimiento 100% Pure Java asegurará que los applets  que hoy se están desarrollando, funcionarán en cualquier entorno del mañana, y  no todo el mundo puede precisar algo semejante. Creo que nunca una tecnología  nueva ha sido adoptada por tanta gente en tan poco tiempo.&lt;/p&gt; &lt;p&gt;Las críticas que se hacen a Java de que no está completamente definido y de  que sus capacidades dejan bastante que desear, deben hacer reflexionar a quienes  las predican, porque es menester recordar que el rendimiento es un camino no una  meta, siempre estamos en condiciones de mejorar algo, sea lo que sea. Y tal como  se está moviendo el mercado entorno a Java, pronto veremos que Java entra de  verdad en el mundo de los negocios y su estabilidad se verá infinitamente más  robustecida.&lt;/p&gt;&lt;/span&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;titulo1&quot;&gt;&lt;a name=&quot;Conocimientos_previos&quot;&gt;&lt;/a&gt;Conocimientos  Previos&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;En el planteamiento inicial se supone que tú, que estás  leyendo esto, tienes experiencia en algún lenguaje de programación, como puede  ser C o un lenguaje similar, también que sabes utilizar un navegador de WWW como  Netscape o Internet Explorer, también que eres capaz de desarrollar páginas WWW  con HTML y comprendes la programación orientada a objetos. Intentaré que estos  conocimientos sean suficientes para poder seguir el Tutorial. Haré referencias a  C++ para la mejor comprensión de lo que hace diferente a Java, porque muchos de  los lectores del anterior Tutorial tenían conocimientos de C++, y la mayoría de  las consultas que se me hacen van en esa orientación.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt; &lt;/span&gt;&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;El entorno de desarrollo habitual entre la gente que trabajamos con el JDK  (los pobres sin poder para comprarse herramientas comerciales) consiste en tener  abiertas sobre el escritorio de la pantalla, ya sea en Solaris, Windows &#39;95/NT o  Linux, varias ventanas, que usamos para lo siguiente: &lt;/span&gt; &lt;/p&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt; &lt;li&gt;En una de ellas tenemos abierto &lt;i&gt;HotJava&lt;/i&gt;, apuntando al fichero  &lt;i&gt;packages.html&lt;/i&gt; de la documentación del API de Java, para poder tener al  momento la información sobre los parámetros de llamada, valores de retorno y la  información de cada una de las funciones que estemos utilizando.  &lt;/li&gt;&lt;li&gt;Los que estén desarrollando sobre Windows &#39;95 o NT, podrán disponer de la  documentación del API también desde el sistema de ayuda de Windows si han  descargado esta documentación en formato Winhelp desde &lt;i&gt;Dippy&lt;/i&gt;.  &lt;/li&gt;&lt;li&gt;En otra tendremos abierto un navegador con soporte Java, normalmente será  &lt;i&gt;Netscape&lt;/i&gt;, en una versión superior a la 4.0.3, para que tenga soporte al  JDK 1.1.X en los applets que desarrollemos, o &lt;i&gt;Microsoft Explorer&lt;/i&gt;, en  versión 4.0 o superior. Aunque, lo mejor sin duda es utilizar, por ahora, el  &lt;i&gt;appletviewer&lt;/i&gt; para la verificación del correcto funcionamiento de los  applets, antes de pelearnos con problemas que pueden originarse en el soporte  &lt;i&gt;a medias&lt;/i&gt; del JDK 1.1.X por parte de los navegadores &lt;i&gt;comerciales&lt;/i&gt;.  &lt;/li&gt;&lt;li&gt;Tendremos abierta otra ventana con un editor, donde iremos escribiendo el  código de nuestro applet o aplicación Java. En Windows &#39;95 son muy utilizados el  editor &lt;i&gt;Jpad&lt;/i&gt; y &lt;i&gt;Diva&lt;/i&gt;. Aunque en estos momentos, quien tiene potencia  suficiente en su ordenador, está programando Java desde el &lt;i&gt;Java Workshop&lt;/i&gt;  de Sun.  &lt;/li&gt;&lt;li&gt;Y una ventana más donde tendremos acceso al prompt del sistema para poder  invocar al compilador y a las demás herramientas del &lt;i&gt;JDK&lt;/i&gt;.  &lt;/li&gt;&lt;li&gt;Los que tengan algo de dinero podrán estar utilizando alguno de los entornos  shareware que ya hay disponibles como &lt;i&gt;RadJa&lt;/i&gt;, &lt;i&gt;Kawa&lt;/i&gt; o  &lt;i&gt;JavaMaker&lt;/i&gt;.  &lt;/li&gt;&lt;li&gt;Los que disponen de poder adquisitivo abundante habrán empezado con el  &lt;i&gt;Symantec Café&lt;/i&gt; de Symantec, ahora estarán trabajando con &lt;i&gt;Borland  Latte&lt;/i&gt;, o estarán entusiasmados con el &lt;i&gt;Visual J++&lt;/i&gt; de Microsoft. Y los  enamorados de OS2, que en su versión 4.0 ya incluía una Máquina Virtual Java  (JVM) en su kernel, se lo pasarán en grande con el &lt;i&gt;IBM VisualAge for  Java&lt;/i&gt;.  &lt;/li&gt;&lt;li&gt;También somos afortunados los que podemos disfrutar de las ventajas que  ofrece &lt;i&gt;Linux&lt;/i&gt;, que con ser el sistema operativo más económico, resulta ser  uno de los más potentes. Y esto también es válido cuando se trata de Java,  porque el &lt;i&gt;porting&lt;/i&gt; realizado del JDK es muy bueno.&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;titulo1&quot;&gt;&lt;a name=&quot;Objetivos&quot;&gt;&lt;/a&gt;Objetivos&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Entre los objetivos que me he marcado están los que  expongo a continuación. Estos objetivos esperan que tú, que estás leyendo esto,  cuando llegues al final del Tutorial, saques el máximo aprovechamiento de lo que  yo sé y seas capaz de:  &lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;&lt;li&gt;Crear páginas HTML que llamen a applets Java  &lt;/li&gt;&lt;li&gt;Crear contextos gráficos en Java  &lt;/li&gt;&lt;li&gt;Utilizar los componentes del interfaz gráfico que proporciona Java  &lt;/li&gt;&lt;li&gt;Crear aplicaciones autónomas en Java  &lt;/li&gt;&lt;li&gt;Crear aplicaciones multi-threaded  &lt;/li&gt;&lt;li&gt;Utilizar las librerías de E/S para manipular ficheros de texto y datos  &lt;/li&gt;&lt;li&gt;Crear servidores y clientes TCP/IP que se comuniquen vía socket &lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Intentaré cumplir lo que acabo de prometer, aunque también pido paciencia, ya  que Java en este momento es un lenguaje con una tremenda vitalidad, que todavía  estoy yo aprendiendo. Y por otro lado, no es nada sencillo el hacerse entender,  por lo que tengo que dar varias vueltas a cada una de las frases que escribo  para cerciorarme de que tú, lector, comprendes exactamente lo que yo te quiero  transmitir.&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;normal&quot;&gt;Eso sí, tampoco esperes que te proporcione ungüentos milagrosos, que por arte  de magia traspasen el conocimiento. El estudio de Java, y sus applets, no será  sino el examen de una particular forma de ver las cosas, con un poco de  estructuración en la presentación y un cierto trasfondo de Internet; el resto  es, como siempre, tarea del programador. Es decir, uno puede aprender a  construir un applet, o dejar que alguna de las herramientas lo construyan  automáticamente, igual que puede enseñarse a codificar un diálogo en un entorno  gráfico, pero... la inteligencia de esa pieza siempre dependerá de la habilidad  y experiencia del programador respecto del lenguaje usado y de sus recursos. En  fin, un buen applet será únicamente resultado del trabajo de un buen programador  Java. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span class=&quot;normal&quot;&gt;Para concluir esta presentación, aquí está un enlace a  páginas que mantienen relación con el Tutorial, bien en forma de enlaces o  &lt;i&gt;mirrors&lt;/i&gt;, y en donde puedes encontrar información que cumplimente todo lo  que en este Tutorial se cuenta.&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/6624277374481681296/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/6624277374481681296' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6624277374481681296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6624277374481681296'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/11/portabilidad-de-java.html' title='Portabilidad de Java'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-2645041741102573587</id><published>2008-11-06T17:13:00.000-08:00</published><updated>2008-11-06T17:48:11.815-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Trucos Java"/><title type='text'>Cambiar los colores del Nimrod Look&amp;Feel</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;El creador de Nimrod Look&amp;amp;Feel ha dado la posibilidad de cambiar los colores y la opacidad de este Look&amp;amp;Feel. Esto se realiza a través de un editor que incorpora el fichero .jar del propio &quot;skin&quot;.&lt;br /&gt;&lt;br /&gt;Cuando el fichero nimrodlf.jar (el mismo que usted importa al proyecto para obtener el Look&amp;amp;Feel) es ejecutado haciendo doble click sobre el mismo o escribiendo en la línea de comandos:&lt;br /&gt;&lt;br /&gt;java -jar nimrodlf.jar&lt;br /&gt;&lt;br /&gt;...se puede observar el editor que trae consigo este Look&amp;amp;Feel y que le permite, entre otras cosas cambiar los colores del Look&amp;amp;Feel y la opacidad.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;img title=&quot;Editor Nimrod Look&amp;amp;Feel&quot; alt=&quot;Editor Nimrod Look&amp;amp;Feel&quot; src=&quot;http://www.bitemyphoto.com/item/image/26213/medium/Nimrod.jpg&quot; border=&quot;1&quot; height=&quot;400&quot; width=&quot;366&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aquí se pueden modificar, probar y guardar en un fichero llamado NimRODThemeFile.theme (este nombre se puede cambiar, por supuesto) las características antes mencionadas(color y opacidad). Esto se logra haciendo clicks en los recuadros &quot;Selection&quot;, &quot;Background&quot;, &quot;Menu Opacity&quot; e &quot;Internal Frame Opacity&quot; y escogiendo los colores y opacidad que usted desee.&lt;br /&gt;&lt;br /&gt;Después de haber escogido los colores y la opacidad deseada se pulsa el botón &quot;Save&quot; y se guarda esta configuración en un fichero .theme con el nombre por defecto NimRODThemeFile.&lt;br /&gt;&lt;br /&gt;Este fichero se coloca luego dentro de la carpeta de tabajo(../src) y cuando se compila la aplicación, habiendo importado previamente el .jar del Nimrod Look&amp;amp;Feel este detecta automáticamente el fichero .theme con la configuración requerida y....se puede observar al ejecutar acto seguido la aplicación como cambia el aspecto de este Look&amp;amp;Feel.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aquí les dejo un video de como se lleva acabo todo el proceso...&lt;br /&gt;&lt;/div&gt;&lt;p align=&quot;justify&quot;&gt; &lt;/p&gt; &lt;div style=&quot;text-align: center;&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/2PXuePoG_iA&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;&quot; height=&quot;350&quot; width=&quot;425&quot;&gt;&lt;/embed&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/2645041741102573587/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/2645041741102573587' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2645041741102573587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2645041741102573587'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/11/cambiar-los-colores-del-nimrod-look.html' title='Cambiar los colores del Nimrod Look&amp;Feel'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-1348124642639229187</id><published>2008-11-03T10:56:00.001-08:00</published><updated>2008-11-03T11:39:47.738-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Trucos Java"/><title type='text'>Maximizar jFrame</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Si queremos que al iniciar una aplicación Java nuestra ventana principal se encuentre maximizada no importa la resolución de pantalla con la cual se esté trabajando lo único que tenemos que hacer es escribir en el constructor de nuestro jFrame principal la siguiente línea de código:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;this.setExtendedState(this.MAXIMIZED_BOTH);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;De forma tal que nuestro constructor nos quedaría más o menos así:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public MyFrame(){&lt;br /&gt;this.setExtendedState(this.MAXIMIZED_BOTH);&lt;br /&gt;initComponents();&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A la línea:&lt;br /&gt;this.setExtendedState(this.MAXIMIZED_BOTH);&lt;br /&gt;&lt;br /&gt;se le pueden pasar otros parámetros:&lt;br /&gt;&lt;br /&gt;this.MAXIMIZED_HORIZ //Maximiza la aplicación horizontalmente&lt;br /&gt;&lt;br /&gt;this.MAXIMIZED_VERT  //Maximiza la aplicación verticalmente</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/1348124642639229187/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/1348124642639229187' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/1348124642639229187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/1348124642639229187'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/11/maximizar-jframe.html' title='Maximizar jFrame'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-4509441586956014293</id><published>2008-10-29T20:26:00.001-07:00</published><updated>2008-10-29T22:15:34.525-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lenguaje Java"/><title type='text'>Java en los Browser</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;JAVA EN LOS BROWSERS:------El primer lugar y el más frecuente, donde encontramos al lenguaje Java, es en los exploradores o navegadores de Internet. Veamos cómo llega hasta ahí.&lt;br /&gt;&lt;br /&gt;La World Wide Web:------Llamada así por sus siglas WWW, es la aplicación que ha popularizado a Internet, y ha sido la causante de la explosión de la red de redes.&lt;br /&gt;&lt;br /&gt;Hablando sencillamente, la WWW basa su existencia en dos aplicaciones: los servidores de Web y los clientes. Los primeros son programas dedicados, instalados en las máquinas nodos de la red, que atienden a todos los pedidos de los clientes. Estos solicitan archivos, recursos de la Web , en general, archivos HTML y gráficos. Los archivos HTML son archivos de texto, que contienen una descripción de lo que vemos como página en nuestro browser. La sigla HTML significa Hypertext Markup Languaje (lenguaje de marcación de hipertexto), y es el lenguaje que describe las páginas Web.&lt;br /&gt;&lt;br /&gt;En esas páginas se colocan textos, gráficos y otros recursos. Es trabajo del cliente, nuestro browser, interpretar esa página, mostrarla en pantalla, y reclamar todo lo que se necesite para armarla, como los gráficos y archivos de sonido que la pueden acompañar.&lt;br /&gt;&lt;br /&gt;Java en la Web:------Los programas Java son, al fin, otro recurso más, como pueden serlo una página HTML o un archivo gráfico. Al igual que estos últimos viajan desde el servidor a la máquina cliente, y se ejecutan en ésta.&lt;br /&gt;&lt;br /&gt;Verá, cuando arme alguna applet, que existe una construcción, la marca HTML &lt;applet...&gt;, que especifica un determinado lugar en una página Web, para que el browser posicione y ejecute una aplicación Java. Los archivos Java que viajan son de un tipo: se trata de archivos con extensión .class y contienen las instrucciones Java ya compiladas, no viajan en código fuente. Una applet se compone, como mínimo, de un archivo .class, pero puede requerir más archivos .class (con más código para ejecutar), que el browser recupera, o archivos gráficos, de sonido u otros, que la propia applet se encarga de recuperar.&lt;br /&gt;&lt;br /&gt;Máquinas Virtuales:------Se ha mencionado que el lenguaje Java se compila, no pensando en una plataforma o procesador en particular, sino produciendo código (que se denomina bytecodes), destinado a ser interpretado por la llamada máquina virtual Java. Esta máquina no es una única, sino que hay una por cada plataforma y, en realidad, cada browser que implementa Java tiene la suya. Así, el Microsoft Explorer usará su máquina en Windows, mientras que el Netscape Navigator usará la suya, que variará de Windows a UNIX.&lt;br /&gt;&lt;br /&gt;Pero todas tienen la misma funcionalidad (o debería esperarse eso). Tanto el usuario como los programadores no deberíamos preocuparnos por las distintas implementaciones. Sin embargo, se escuchan quejas de los desarrolladores, originadas en la pequeñas diferencias que se encuentran tanto entre una implementación y otra, como en el aspecto de la interface gráfica.&lt;br /&gt;&lt;br /&gt;Además de la máquina virtual, cada browser instala una serie de clases, ya listas para usar, que Java espera tener disponibles en cualquier plataforma. Esas clases tienen una funcionalidad definida, que no debería sufrir modificaciones.&lt;br /&gt;&lt;br /&gt;Netscape y Microsoft:------La empresa Netscape, creadora del Netscape Navigator, soporta Java desde la versión 2 de su browser. Microsoft no se ha quedado atrás y soporta Java desde la versión 2.0 de su browser. Microsoft no se ha quedado atrás (pues no le convenía, dado la mayoría de las páginas contiene - aunque sea - un poquito de Java) y soporta Java desde la versión 3.0 de su Internet Explorer. Ambos browsers instalan y usan su propia máquina virtual Java. No hay diferencias apreciables en las prestaciones de estos dos browsers, respecto de Java.&lt;br /&gt;&lt;br /&gt;Hay que hacer algunas aclaraciones: en general, los browsers, de cualquier origen, soportan Java en ambientes que permiten la multitarea y los llamados múltiples hilos de ejecución (multihttrading).&lt;br /&gt;&lt;br /&gt;Seguridad:------Debido a la naturaleza de Internet, traer programas desde un lugar lejano y no controlado a nuestra computadora, para ejecutarlo, puede ser riesgoso.&lt;br /&gt;&lt;br /&gt;Con respecto a las applets Java debemos quedarnos tranquilos: Sun y los constructores de browsers han implementado una política de seguridad, que impide a una applet, por ejemplo, leer o escribir en nuestro disco, o interferir con otras aplicaciones en ejecución. Es tan grande la seguridad que, como programadores, nos puede llegar a molestar: en una applet nunca podremos grabar un archivo local, con datos transitorios o de configuración.&lt;br /&gt;&lt;br /&gt;Nuevos browsers:&lt;br /&gt;Entre Netscape (en múltiples plataformas) y Microsoft (en plataformas Windows) acaparan el mercado de los browsers.&lt;br /&gt;&lt;br /&gt;Java sin browsers:&lt;br /&gt;&lt;br /&gt;Pero no todo es Internet en Java. Este es un lenguaje de uso general, que sólo incidentalmente cobró popularidad en Internet. Podemos desarrollar aplicaciones Java que se ejecuten en nuestra máquina, sin necesidad de estar conectados a la red, y sin el auxilio de browsers. Mientras los programas Java para Internet y páginas HTML se llaman applets, los que pueden ejecutarse fuera de la red se llaman genéricamente aplicaciones.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/4509441586956014293/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/4509441586956014293' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/4509441586956014293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/4509441586956014293'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/java-en-los-browser.html' title='Java en los Browser'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-4187726606766431797</id><published>2008-10-28T16:44:00.000-07:00</published><updated>2008-10-28T17:05:25.091-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Sun"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Services"/><title type='text'>Metro: Pila de webservices de Sun</title><content type='html'>Metro es la   actualización del antiguo JWSDP (Java Web Services Developer Pack), y digo   actualización porque la mayor parte del código se hereda de JWSDP (dicho por uno   de sus desarrolladores, si el código es bueno y funciona bien, para que   cambiarlo? ).&lt;p&gt;&lt;/p&gt;Esta incluido en   Glassfish (Servidor de aplicaciones de Sun) a partir de su versión   2.&lt;br /&gt;&lt;p&gt;Metro realmente   es un paquete de diferentes tecnologías, entre las que se encuentran &lt;a href=&quot;https://jax-ws.dev.java.net/&quot; target=&quot;_blank&quot;&gt;JAX-WS&lt;/a&gt;, &lt;a href=&quot;https://jaxb.dev.java.net/&quot; target=&quot;_blank&quot;&gt;JAXB&lt;/a&gt;, y &lt;a href=&quot;http://java.sun.com/webservices/interop/&quot;&gt;WSIT&lt;/a&gt; (implementación de webservices, implementación de XML-Bindings y   Webservices intercomunication tecnology, que permite comunicar sin problemas   webservices java y .net 3).&lt;/p&gt;Según los   desarrolladores de Metro,&lt;br /&gt;&lt;p&gt;Veamos que   necesitamos para usarlo y un pequeño ejemplo.&lt;/p&gt;AVISO: Este   tutorial presupone el conocimiento por parte del lector de muchos de los   términos e ideas que aquí se exponen, por tanto exige niveles de conocimiento   altos en las tecnologías subyacentes. Los ejemplos se muestran como fragmentos   que el lector debe completar.&lt;br /&gt;&lt;h2&gt;Instalación&lt;/h2&gt;La instalación es   muy sencilla. Hay que descargarse el jar (&lt;a href=&quot;https://metro.dev.java.net/1.1/&quot;&gt;https://metro.dev.java.net/1.1/&lt;/a&gt;) y   ejecutarlo (java -jar metro-installer.jar o doble clic sobre el archivo si estas   en windows).&lt;br /&gt;&lt;p&gt;Lo que nos va a   instalar es una serie de herramientas y los ficheros necesarios para su   funcionamiento. Estas herramientas, al igual que en axis, son las que nos van a   permitir la generación automática de código para poder crear nuestros   webservices.&lt;/p&gt;Tendremos por   tanto 2 posibilidades de crear un webservice.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;A partir de un   fichero WSDL (WebServices Description Language).&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt;     &lt;ul&gt;&lt;br /&gt;       &lt;li&gt;útil cuando ya   tenemos este tipo de fichero, o queremos reimplementar la funcionalidad de un   webservice ya publicado en internet (y que nos da igual que este en .net, java o   cualquier otra tecnología).&lt;br /&gt;       &lt;/li&gt;&lt;li&gt;&lt;p&gt;No es   recomendable este método para generar un webservice desde 0, puesto que es   trabajo de crear el fichero .wsdl puede llegar a ser muy   tedioso.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En la versión   usada, Metro 1.1, WSDL 2.0 no está soportado.&lt;br /&gt;       &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;A partir de una   clase java.&lt;br /&gt;   &lt;ul&gt;&lt;ul&gt;&lt;li&gt;Perfecto para   crear un webservice desde 0, o publicar ciertos métodos de una aplicación java   que tenemos ya desarrollada.&lt;br /&gt;       &lt;/li&gt;&lt;br /&gt;       &lt;li&gt;No recomendable   cuando tengamos el fichero wsdl (El webservice generado puede no ser totalmente   compatible con el del wsdl que   teníamos).&lt;br /&gt;       &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Veamos   detalladamente cada uno de los pasos.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Crear un WebService&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Para todos los   ejemplos vamos a usar el webservice público definido en &#39;&lt;a href=&quot;http://wscc.info/index.php?show=32031_SWE&amp;amp;&amp;amp;page_anchor=http://wscc.info/p32031/p32031_swe.php&quot;&gt;http://wscc.info/index.php?show=32031_SWE&amp;amp;&amp;amp;page_anchor=http://wscc.info/p32031/p32031_swe.php&lt;/a&gt;&#39;,   y que devuelve información de geolocalización de una ip dada. Además el   webservice está realizado en .net, y así comprobaremos si WSIT   funciona.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Desde un fichero WSDL&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Para generar el   webservice desde este tipo de ficheros vamos a usar la herramienta que trae   Metro, &lt;em&gt;wsimport&lt;/em&gt;, y que nos va a crear todas las clases necesarias para   poder poner en funcionamiento el webservice. Un ejemplo de uso del comandos   sería:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;wsimport.sh -s src/main/java -p com.autentia.service -Xnocompile http://ws.ip2location.com/ip2locationwebservice.asmx?wsdl&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Donde:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;-s: ruta donde se   van a generar los fuentes.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;-p : paquete en   el que se generará el código.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;-Xnocompile :   indica a la herramienta que no compile el código   generado.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;y nos generará   las siguientes clases:&lt;br /&gt;&lt;p&gt;&lt;strong&gt;IP2Location.java&lt;/strong&gt;: Java bean de tipo de dato   complejo.&lt;br /&gt;&lt;br /&gt;   &lt;strong&gt;Ip2LocationWebService.java&lt;/strong&gt;: Proxy del   webservice.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;IP2LOCATION.java&lt;/strong&gt;: Java bean de tipo de dato   complejo.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;Ip2LocationWebServiceSoap.java&lt;/strong&gt;: Interfaz del   servicio.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;IP2LocationResponse.java&lt;/strong&gt;: Java bean de la respuesta del   servicio.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;ObjectFactory.java&lt;/strong&gt;: Factoría de objetos usados internamente   por el servicio.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;package-info.java&lt;/strong&gt;: Archivo para   javadoc.&lt;/p&gt;Como lo que vamos   a hacer es reescribir el servicio web (hacer un webservice compatible con el   wsdl usado pero realizado en java), no nos quedaría nada más que crear la clase   skeleton del webservice (la que implementa la lógica de negocio del   webservice).&lt;br /&gt;&lt;p&gt;Creamos una nueva   clase java que tendrá la siguiente estructura (en este ejemplo la llamaremos   IP2LocationSkel.java):&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;@WebService(endpointInterface=&quot;com.autentia.service.Ip2LocationWebServiceSoap&quot;)  public class IP2LocationSkel implements Ip2LocationWebServiceSoap {          ...  }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Donde veis lo   simple que es: creamos la clase y hacemos que implemente la interfaz generada   anteriormente (no es obligatorio, pero si muy recomendable para saber cómo es el   método a implementar en tiempo de compilación).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Lo que si es   obligatorio es la anotación de la clase (y lo que le da potencia y sencillez a   Metro): @WebService. La propiedad endpointInterface indica la clase (nombre   cualificado) de la interfaz del webservice (y es por esto por lo que no es   obligatorio implemetar la interfaz anterior).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Y ya está! Ya   tendríamos nuestro webservice creado, en pocos pasos y de manera muy   sencilla!&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Desde java&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Vamos a hacer   ahora la operación inversa. Queremos realizar un webservice desde 0, no tenemos   el fichero WSDL o ya tenemos una clase java de la que queremos hacer públicos   alguno de sus métodos a través de webservice.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;No tedríamos más   que generar una clase java, que debe cumplir los siguientes   requisitos:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;La clase &lt;strong&gt;se   debe anotar&lt;/strong&gt; con &lt;em&gt;@javax.jws.WebService&lt;/em&gt;.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;Todos los métodos   que se desean exponer como operación del webservice &lt;strong&gt;se pueden anotar&lt;/strong&gt; con &lt;em&gt;@javax.jws.WebMethod &lt;/em&gt;(si todos los métodos de la clase son operaciones   del servicio web se puede omitir dicha anotación)&lt;em&gt;.&lt;/em&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;Todos los métodos   que se desean exponer como operación del webservice &lt;strong&gt;pueden&lt;/strong&gt; lanzar &lt;em&gt;java.rmi.RemoteException&lt;/em&gt;, aparte de todas las excepciones específicas del   servicio.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;Todos los   parámetros de los métodos del servicio y tipos de retorno &lt;strong&gt;deben&lt;/strong&gt; ser   compatibles con â€œJAXB 2.0 Java to XML Schema mapping   definition&quot;.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;Los parámetros de   los métodos del servicio y tipos de retorno &lt;strong&gt;no pueden&lt;/strong&gt; implementar directa   o indirectamente la interfaz java.rmi.Remote.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Veamos una   sección de la clase (una clase que implementa una pequeña   calculadora):&lt;br /&gt;&lt;pre&gt;@WebService  &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; AddNumbersImpl {       @WebMethod   &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; addNumbers(&lt;strong&gt;int&lt;/strong&gt; number1, &lt;strong&gt;int&lt;/strong&gt; number2) &lt;strong&gt;throws&lt;/strong&gt; AddNumbersException {    ...   }  }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Fijaos en las   anotaciones: hemos anotado la clase con @WebService, y el método addNumbers con   @WebMethod (el único que expondremos como método del servicio   web).&lt;/p&gt;El siguiente   paso: generar las clases de apoyo necesarias para poner en marcha el webservice,   y para ello usaremos otra herramienta que nos provee Metro, y que se llama &lt;em&gt;wsgen&lt;/em&gt;&lt;br /&gt;&lt;pre&gt;wsgen.sh  -cp  -keep com.autentia.service.AddNumbersImpl&lt;/pre&gt;Donde:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;-cp : indica el   classpath a utilizar, es decir, la ruta o rutas de .jar o carpetas que contienen   los .class necesarios para la compilación.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;-keep : indica   que no se borren los ficheros .java generados.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;com.autentia.service.AddNumbersImpl: para el ejemplo, es la   clase que implementa el webservice (denominado &lt;em&gt;SEI: service endpoint   implementation&lt;/em&gt;).&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Que nos generará   las siguientes clases:&lt;br /&gt;&lt;p&gt;&lt;strong&gt;AddNumbersExceptionBean.java&lt;/strong&gt; : java bean para la excepción que   puede lanzar el webservice.&lt;br /&gt;&lt;br /&gt;   &lt;strong&gt;AddNumbers.java&lt;/strong&gt; : Skeleton del   webservice.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;AddNumbersResponse.java&lt;/strong&gt; : clase de tratamiento de la   respuesta SOAP.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ya tenemos   nuestro webservice! (sencillito, eh?)&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Creando una aplicación web con nuestro webservice (war)&lt;/h2&gt;Una vez creado   nuestro webservice veamos qué recursos y configuraciones debemos incluir para   que el webservice funcione como una aplicación web y la podamos publicar (yo he   usado tomcat y funciona sin problemas).&lt;br /&gt;&lt;p&gt;Ante todo debemos   meter en la carpeta WEB-INF/lib de nuestro war los .jar (webservice*.jar) que   vienen en la instalación de Metro.&lt;/p&gt;Dentro de WEB-INF   deben ir localizados web.xml y sun-jaxws.xml&lt;br /&gt;&lt;p&gt;El fichero de   descripción de la aplicación web, web.xml, debe contener el siguiente fragmento   (se define el servlet y filtros necesarios para que funcione   Metro):&lt;/p&gt;web.xml:&lt;br /&gt;&lt;pre&gt;...  &amp;lt;listener&amp;gt;          &amp;lt;listener-class&amp;gt;                  com.sun.xml.ws.transport.http.servlet.WSServletContextListener          &amp;lt;/listener-class&amp;gt;  &amp;lt;/listener&amp;gt;  &amp;lt;servlet&amp;gt;          &amp;lt;description&amp;gt;JAX-WS endpoint - fromjava&amp;lt;/description&amp;gt;          &amp;lt;display-name&amp;gt;metro ws engine servlet&amp;lt;/display-name&amp;gt;          &amp;lt;servlet-name&amp;gt;metroServlet&amp;lt;/servlet-name&amp;gt;          &amp;lt;servlet-class&amp;gt;                  com.sun.xml.ws.transport.http.servlet.WSServlet          &amp;lt;/servlet-class&amp;gt;          &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;  &amp;lt;/servlet&amp;gt;  &amp;lt;servlet-mapping&amp;gt;          &amp;lt;servlet-name&amp;gt;metroServlet&amp;lt;/servlet-name&amp;gt;          &amp;lt;url-pattern&amp;gt;/ws/*&amp;lt;/url-pattern&amp;gt;  &amp;lt;/servlet-mapping&amp;gt;  ...&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;El fichero de   descripción del webservice para Metro:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;sun-jaxws.xml:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;endpoints   xmlns=&quot;http://java.sun.com/xml/ns/jax-ws/ri/runtime&quot;   version=&quot;2.0&quot;&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;    &amp;lt;endpoint          name=&quot;addnumbers-example&quot;          implementation=&quot;com.autentia.service.AddNumbersImpl&quot;          url-pattern=&quot;/ws/addnumbers&quot;/&amp;gt;  &amp;lt;/endpoints&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Ojo! El   url-mapping del servlet de webservice de metro y de la definición del webservice   deben ser compatibles:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src=&quot;http://www.blogger.com/metroWS/wsMetroImg01.png&quot; name=&quot;gráficos1&quot; id=&quot;gráficos1&quot; align=&quot;left&quot; border=&quot;1&quot; height=&quot;251&quot; width=&quot;594&quot; /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Una vez empaquetado el código convenientemente podemos instalar   la aplicación en Tomcat, y acceder a &lt;a href=&quot;http://localhost:8080/&quot;&gt;http://localhost:8080/&lt;/a&gt;&amp;lt;war-name&amp;gt;/ws/addnumbers:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src=&quot;http://www.blogger.com/metroWS/wsMetroImg02.png&quot; name=&quot;gráficos2&quot; id=&quot;gráficos2&quot; align=&quot;left&quot; border=&quot;1&quot; height=&quot;228&quot; width=&quot;901&quot; /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;podemos ver el   wsdl generado al pulsar sobre el link que nos propone la   página.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Generar el cliente&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Bien, ya he creado mi web service, ya lo he publicado... y   ahora cómo lo uso? O cómo me conecto a un webservice externo?. Veamos cómo crear   entonces un cliente apra webservice, y lamaera es muy sencilla, y es 99% igual   que la forma en que generábamos un servicio web a partir de un wsdl.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ejecutando el comando (la URI del wsdl tomaremos la del   webservice del ejemplo comentado al inicio):&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;wsimport.sh -s src/main/java -p com.autentia.service -Xnocompile http://ws.ip2location.com/ip2locationwebservice.asmx?wsdl&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;con el que ya   vimos anteriormente qué clases se generaban automáticamente.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La diferencia   entre crear un webservice a aprtir de un WSDL y un cliente es la clase que   tenemos que crear. Ahora codificaremos una clase como sigue, que será la que se   conecte y haga la llamda al webservice:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; IP2LocationStub &lt;strong&gt;implements&lt;/strong&gt; Ip2LocationWebServiceSoap {     &lt;strong&gt;public&lt;/strong&gt; IP2LOCATION ip2Location(String ip, String license) {      // Create Service    Ip2LocationWebService service = &lt;strong&gt;new&lt;/strong&gt; Ip2LocationWebService();      // create proxy    Ip2LocationWebServiceSoap proxy = service.getIp2LocationWebServiceSoap();      // invoke    &lt;strong&gt;return&lt;/strong&gt; proxy.ip2Location(ip, license);   }  }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Donde, como al   crear el webservice, no es obligatorio que la clase implemente la interfaz Ip2LocationWebServiceSoap, pero si es muy   recomendable.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Si llamáis al webservice del ejemplo necesitáis una clave de uso,   con lo que la llamada volverá con los datos vacíos y con un mensaje de error,   pero eso implica que el ejemplo funciona!!!&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Conclusión&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Ya habéis visto lo sencillo que es crear un servicio web y un   cliente de webservice con Metro (y hemos probado además que WSIT   funciona!).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En mi humilde opinión el desarrollo a base de anotaciones agiliza   y simplifica mucho la tarea de generar web services, además nos permite   reutilizar clases que ya teníamos.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En cuanto al rendimiento, existe en &lt;a href=&quot;http://weblogs.java.net/blog/kohsuke/archive/2007/02/jaxws_ri_21_ben.html&quot;&gt;http://weblogs.java.net/blog/kohsuke/archive/2007/02/jaxws_ri_21_ben.htm&lt;/a&gt;l   una comparativa de Metro vs Axis2, donde se muestra que para el envío de ciertos   tipos de datos, Metro puede llegar a ser el doble de rápido que axis2 (por tanto   más eficiente), aunque claro, la comparativa está realizada por uno de los   propios desarrolladores de Metro... A final vuestra experiencia será la que diga   la última palabra.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;No os perdáis los próximos tutoriales sobre metro donde veremos   cómo automatizar las tareas que realizábamos &#39;a mano&#39; mediante maven2, y otro   que nos enseñará a usar RESTFull con Metro.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/4187726606766431797/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/4187726606766431797' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/4187726606766431797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/4187726606766431797'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/metro-pila-de-webservices-de-sun.html' title='Metro: Pila de webservices de Sun'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-2162714473911705900</id><published>2008-10-23T18:35:00.000-07:00</published><updated>2008-10-23T18:41:10.478-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Python y Java"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><category scheme="http://www.blogger.com/atom/ns#" term="XSL"/><title type='text'>Validación de documentos XML</title><content type='html'>&lt;p&gt;Veamos cómo se valida un documento XML.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;strong&gt;import javax.xml.parsers.*;&lt;br /&gt;import org.xml.sax.*;&lt;br /&gt;import  org.xml.sax.ext.LexicalHandler;&lt;br /&gt;import  org.xml.sax.helpers.DefaultHandler;&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;public class Validate {&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;    public Validate(String filename) {&lt;br /&gt;       StringBuffer buff =  new StringBuffer();&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;        try {&lt;br /&gt;           File f = new File(&quot;.&quot;,  filename);&lt;br /&gt;           StringBuffer errorBuff = new  StringBuffer();&lt;br /&gt;           InputSource input = new InputSource(new  FileInputStream(f));&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;            // Set systemID so parser can find the dtd with a  relative URL in the source document.&lt;br /&gt;            input.setSystemId(f.toString());&lt;br /&gt;           SAXParserFactory spfact =  SAXParserFactory.newInstance();&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;            spfact.setValidating(true);&lt;br /&gt;            spfact.setNamespaceAware(true);&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;            SAXParser parser = spfact.newSAXParser();&lt;br /&gt;            XMLReader reader = parser.getXMLReader();&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;            //Instantiate inner-class error and lexical  handler.&lt;br /&gt;           Handler handler = new Handler(filename,  errorBuff);&lt;br /&gt;           reader.setProperty(&quot;&lt;/strong&gt;&lt;a href=&quot;http://xml.org/sax/properties/lexical-handler&quot; name=&quot;&quot;&gt;&lt;strong&gt;http://xml.org/sax/properties/lexical-handler&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;  &quot;, handler);&lt;br /&gt;           parser.parse(input, handler);&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;            if (handler.containsDTD &amp;amp;&amp;amp;  !handler.errorOrWarning) { // valid&lt;br /&gt;               buff.append(&quot;VALID &quot; +  filename +&quot;\n&quot;);&lt;br /&gt;           }&lt;br /&gt;           else if (handler.containsDTD) {  // not valid&lt;br /&gt;               buff.append (&quot;NOT VALID &quot; + filename +  &quot;\n&quot;);&lt;br /&gt;               buff.append(errorBuff.toString());&lt;br /&gt;            }&lt;br /&gt;           else buff.append(&quot;NO DOCTYPE DECLARATION &quot; + filename +  &quot;\n&quot;);&lt;br /&gt;       }&lt;br /&gt;       catch (Exception e) {&lt;br /&gt;            buff.append(&quot;NOT WELL-FORMED &quot; + filename + &quot;. &quot; + e.getMessage() +  &quot;\n&quot;);&lt;br /&gt;       }&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;        System.out.print(buff.toString());&lt;br /&gt;   }&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;    class Handler extends DefaultHandler implements LexicalHandler  {&lt;br /&gt;       boolean errorOrWarning;&lt;br /&gt;       boolean containsDTD;&lt;br /&gt;        String sourceFile;&lt;br /&gt;       StringBuffer errorBuff;&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;        Handler(String sourceFile, StringBuffer errorBuff)  {&lt;br /&gt;           super();&lt;br /&gt;           this.sourceFile =  sourceFile;&lt;br /&gt;           this.errorBuff = errorBuff;&lt;br /&gt;            errorOrWarning = false;&lt;br /&gt;           containsDTD = false;&lt;br /&gt;        }&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;        public void error(SAXParseException exc) {&lt;br /&gt;            errorBuff.append(sourceFile + &quot; Error: &quot; + exc.getMessage()+  &quot;\n&quot;);&lt;br /&gt;           errorOrWarning = true;&lt;br /&gt;       }&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;        public void warning(SAXParseException exc) {&lt;br /&gt;            errorBuff.append(sourceFile + &quot; Warning:&quot; + exc.getMessage()+  &quot;\n&quot;);&lt;br /&gt;           errorOrWarning = true;&lt;br /&gt;       }&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;        public void startDTD (String name, String publicId, String  systemId) throws SAXException {&lt;br /&gt;           containsDTD = true;&lt;br /&gt;        }&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;        public void endDTD () throws SAXException {}&lt;br /&gt;        public void startEntity (String name) throws SAXException {}&lt;br /&gt;       public  void endEntity (String name) throws SAXException {}&lt;br /&gt;       public void  startCDATA () throws SAXException {}&lt;br /&gt;       public void endCDATA () throws  SAXException {}&lt;br /&gt;       public void comment (char ch[], int start, int  length) throws SAXException {}&lt;br /&gt;   }&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;    public static void main(String[] args) {&lt;br /&gt;       Validate v =  new Validate(&quot;birds.xml&quot;);&lt;br /&gt;   }&lt;br /&gt;}&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/2162714473911705900/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/2162714473911705900' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2162714473911705900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2162714473911705900'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/validacin-de-documentos-xml.html' title='Validación de documentos XML'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-2655924752308824859</id><published>2008-10-11T17:33:00.000-07:00</published><updated>2008-10-11T17:34:54.261-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Glosario de Java"/><title type='text'>Glosario de Java</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;abstract&lt;/strong&gt;: Abstracto.Aplicable a clases o métodos. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;array&lt;/strong&gt;: Variable que posee varias posiciones para almacenar  un valor en cada posición. Las posiciones son accedidas mediante un índice  numérico. &lt;/p&gt;&lt;div&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;break&lt;/strong&gt;: Palabra clave que finaliza la ejecución de un bucle o  de una instrucción switch.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;bucles&lt;/strong&gt;: Tipo de estructura iterativa, que permite repetir un  conjunto de instrucciones un número variable de veces. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;clase&lt;/strong&gt;: Estructura que define como son los objetos, indicando  sus atributos y sus acciones. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;clase base&lt;/strong&gt;: Clase de la cuál se hereda para construir otra  clase, denominada derivada. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;CLASSPATH&lt;/strong&gt;: Variable de entorno que permite a la máquina  virtual java saber donde localizar sus clases. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;constructor&lt;/strong&gt;: Función especial empleada para inicializar a  los objetos, cada clase posee sus propios constructores.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;derivada&lt;/strong&gt;: Clase que hereda de una clase base. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Excepcion&lt;/strong&gt;: Objeto empleado para representar una situación de  excepción (error) dentro de una aplicación java.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;herencia&lt;/strong&gt;: Característica que permite que una clase posea las  características de otra, sin tener que reescribir el código. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;herencia sencilla y múltiple&lt;/strong&gt;: Dos tipos de herencia, con una  sóla clase base, o con varias. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;instancia&lt;/strong&gt;: Un objeto creado a partir de una clase. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;instanciación&lt;/strong&gt;: Proceso de creación de un objeto a partir de  una clase. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;interfaz&lt;/strong&gt;: Define un tipo de datos, pero sólo indica el  prototipo de sus métodos, nunca la implementación. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JDK&lt;/strong&gt;: Java Development Kit, es el conjunto de herramientas  proporcionadas por sun, que permite compilar y ejecutar código java. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;jerarquía de herencia&lt;/strong&gt;: Árbol construido mediante las  relaciones de herencia en las clases java. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;máquina virtual&lt;/strong&gt;: Es la encargada de ejecutar el código java.  &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;multiplataforma&lt;/strong&gt;: Posibilidad de existir en varias  plataformas (sistemas operativos) &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;package&lt;/strong&gt;: Paquete. Carpeta creada para contener clases java,  y así poder organizarlas.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PATH&lt;/strong&gt;: Variable de entorno, empleada por los sistemas operativos para saber donde localizar sus  programas ejecutables. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sobrescritura&lt;/strong&gt;: Poseer el mismo método, pero con código  distinto, en una clase base y en una clase que deriva de ella.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;transformación de datos&lt;/strong&gt;: Cómo cambiar el tipo de una  información, por ejemplo cambiar el literal &quot;23&quot; al valor numérico 23. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;try/catch/finally&lt;/strong&gt;: Instrucciones empleadas para gestionar  los posibles errores que se puedan provocar en un programa java.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/2655924752308824859/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/2655924752308824859' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2655924752308824859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2655924752308824859'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/glosario-de-java.html' title='Glosario de Java'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-3371958042512988181</id><published>2008-10-11T17:32:00.000-07:00</published><updated>2008-10-11T17:33:18.979-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Excepciones"/><category scheme="http://www.blogger.com/atom/ns#" term="Practicas"/><title type='text'>Prácticas con excepciones</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;Crear el fichero &lt;strong&gt;Try1.java&lt;/strong&gt; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Agregar el siguiente código: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;public class Try1 &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;public static void main(String arg[]) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int [] array = new int[20]; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;array[-3] = 24; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Como podremos comprobar al ejecutar se generará el siguiente error: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Exception in thread &quot;main&quot; java.lang.ArrayIndexOutOfBoundsException &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;at Try1.main(Try1.java:6) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Que indica que se ha generado una excepción del tipo  java.lang.ArrayIndexOutOfBoundsException en la función Try1.main, dentro del  fichero Try1.java y en la línea 6 del código. Esta excepción en particular, se  lanza cuando intentamos acceder a una posición de un array y no existe dicha  posición.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Vamos a gestionar esta interrupción mediante un bloque try/catch, el fichero  crear es &lt;strong&gt;Try2.java&lt;/strong&gt;, con el siguiente código: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;public class Try2&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;public static void main(String arg[]) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int [] array = new int[20]; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;try &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;array[-3] = 24; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;catch(ArrayIndexOutOfBoundsException excepcion) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;System.out.println(&quot; Error de índice en un array&quot;); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;}&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Intentemos provocar también un error de tipo división por cero y pongamos un  catch específico para dicho error (fichero &lt;strong&gt;Try3.java&lt;/strong&gt;): &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;public class Try3 &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;public static void main(String arg[]) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int [] array = new int[20]; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;try &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;// array[-3] = 24; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int b = 0; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int a = 23/b; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;catch(ArrayIndexOutOfBoundsException excepcion) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;System.out.println(&quot; Error de índice en un array&quot;);&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;catch(ArithmeticException excepcion) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;System.out.println(&quot; Error de índice en un array&quot;); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Podemos comprobar que se ejecuta el catch correspondiente al tipo de error  generado. La línea que lanza el error de índice la hemos comentado para que no  lo genere y podamos generar el error de división por cero.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Los tipos de error que se generan, son todos  ellos clases, que heredan de la clase java.lang.Exception, que a su vez hereda  de java.lang.Throwable, por lo tanto podríamos crear nuestros propios errores  personalizados. Al igual que podríamos tener un solo catch que capture todos los  errores, independientemente del tipo del error.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/3371958042512988181/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/3371958042512988181' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/3371958042512988181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/3371958042512988181'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/prcticas-con-excepciones.html' title='Prácticas con excepciones'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-2538350389366177108</id><published>2008-10-11T17:31:00.001-07:00</published><updated>2008-10-11T17:31:53.755-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Excepciones"/><title type='text'>Excepciones</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;strong&gt;Excepcion&lt;/strong&gt; es, o sencillamente problemas. En la programación  siempre se producen errores, más o menos graves, pero que hay que gestionar y  tratar correctamente. Por ello en java disponemos  de un mecanismo consistente en el uso de bloques try/catch/finally . La técnica  básica consiste en colocar las instrucciones que podrían provocar problemas  dentro de un bloque try, y colocar a continuación uno o más bloques catch, de  tal forma que si se provoca un error de un determinado tipo, lo que haremos será  saltar al bloque catch capaz de gestionar ese tipo de error específico. El  bloque catch contendrá el codigo necesario para gestionar ese tipo específico de  error. Suponiendo que no se hubiesen provocado errores en el bloque try, nunca  se ejecutarían los bloques catch. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Veamos ahora la estructura del bloque &lt;strong&gt;try/catch/finally&lt;/strong&gt;:  &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;try &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;//Código que puede provocar errores &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;catch(Tipo1 var1) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;//Gestión del error var1, de tipo Tipo1 &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;[ ... &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;catch(TipoN varN) &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;//Gestión del error varN, de tipo TipoN &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;} ] &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;[ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;finally &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;//Código de finally &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;}&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;]&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Como podemos ver es obligatorio que exista la zona try, o zona de pruebas,  donde pondremos las instrucciones problemáticas. Después vienen una o más zonas  catch, cada una especializada en un tipo de error o excepción. Por último está  la zona finally, encargada de tener un código que se ejecutará siempre,  independientemente de si se produjeron o no errores. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Se puede apreciar que cada catch se parece a una función en la cuál sólo  recibimos un objeto de un determinado tipo, precisamente el tipo del error. Es  decir sólo se llamará al catch cuyo argumento sea coincidente en tipo con el  tipo del error generado.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/2538350389366177108/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/2538350389366177108' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2538350389366177108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2538350389366177108'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/excepciones.html' title='Excepciones'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-2127720343465644248</id><published>2008-10-11T17:30:00.000-07:00</published><updated>2008-10-11T17:31:18.476-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><category scheme="http://www.blogger.com/atom/ns#" term="Practicas"/><title type='text'>Práctica con interfaces</title><content type='html'>&lt;div id=&quot;contenido&quot;&gt; &lt;div class=&quot;fright&quot; id=&quot;textcapitol&quot;&gt;&lt;p&gt;Vamos a definir el interfaz &lt;strong&gt;Cantante&lt;/strong&gt;, un interfaz muy simple  que sólo posee un método: cantar. &lt;/p&gt;  &lt;p&gt;Crear el fichero &lt;strong&gt;Cantante.java&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Agregar el siguiente código: &lt;/p&gt;  &lt;p&gt;public interface Cantante &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;public void cantar(); &lt;/p&gt;  &lt;p&gt;} &lt;/p&gt;  &lt;p&gt;Cojamos la clase Persona y hagamos que implemente el interfaz Cantante: &lt;/p&gt;  &lt;p&gt;public class Persona implements Cantante &lt;/p&gt;  &lt;p&gt;Además agreguemos el código para el método que define el interfaz cantante:  &lt;/p&gt;  &lt;p&gt;public void cantar() &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;System.out.println(&quot;La laa la raa laaa!&quot;); &lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;Construyamos ahora una clase con función main (ArranqueInterfaz.java)para  ejecutar: &lt;/p&gt;  &lt;p&gt;public class ArranqueInterfaz &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;public static void main(String arg[]) &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;Persona p = new Persona(); &lt;/p&gt;  &lt;p&gt;hacerCantar(p); &lt;/p&gt;  &lt;p&gt;} &lt;/p&gt;  &lt;p&gt;public static void hacerCantar(Cantante c) &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;c.cantar(); &lt;/p&gt;  &lt;p&gt;} &lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;   &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/2127720343465644248/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/2127720343465644248' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2127720343465644248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2127720343465644248'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/prctica-con-interfaces.html' title='Práctica con interfaces'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-8477298879808821302</id><published>2008-10-11T17:29:00.002-07:00</published><updated>2008-10-11T17:30:12.840-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><title type='text'>Interfaces III</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot; id=&quot;contenido&quot;&gt; &lt;div class=&quot;fright&quot; id=&quot;textcapitol&quot;&gt;&lt;p&gt;Podemos ver que construimos un objeto (p) de tipo persona y se lo pasamos a  la función hacerCantar. Esta función espera recibir un objeto Cantante, y una  persona lo es, por tanto la recibe y llama al método cantar del objeto recibido. &lt;/p&gt;  &lt;p&gt;Probemos a intentar pasar a la función hacerCantar en lugar del objeto  Persona (p) un objeto String (texto), resultado: error de compilación. &lt;/p&gt;  &lt;p&gt;Contruyamos ahora la clase &lt;strong&gt;Canario&lt;/strong&gt;  (&lt;strong&gt;Canario.java&lt;/strong&gt;), pensando que también sabe cantar: &lt;/p&gt;  &lt;p&gt;public class Canario implements Cantante &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;private int peso; &lt;/p&gt;  &lt;p&gt;/* Aqui vendrían el resto de atributos y funciones propias de un canario */  &lt;/p&gt;  &lt;p&gt;public void cantar() &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;System.out.println(&quot;Pio Pio Pio&quot;); &lt;/p&gt;  &lt;p&gt;} &lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;Y ahora agreguemos en la clase ArranqueInterfaz el siguiente código, para  crear un objeto canario y pasarselo a la función hacerCantar: &lt;/p&gt;  &lt;p&gt;Canario c = new Canario(); &lt;/p&gt;  &lt;p&gt;hacerCantar(c); &lt;/p&gt;  &lt;p&gt;Tras ejecutar comprobaremos que podemos pasar tanto una Persona como un  Canario a la función hacerCantar, de tal manera que dentro de dicha función sólo  accedamos a las funciones del interfaz y no habrá problemas. Por ejemplo, si  pusiéramos: &lt;/p&gt;  &lt;p&gt;c.SetNombre(&quot;Luis&quot;) &lt;/p&gt;  &lt;p&gt;dentro de la función hacerPersona, podría funcionar si pasásemos un objeto  Persona, pero no si pasamos uno de tipo Canario.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/8477298879808821302/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/8477298879808821302' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/8477298879808821302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/8477298879808821302'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/interfaces-iii.html' title='Interfaces III'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-6446091557544416671</id><published>2008-10-11T17:29:00.001-07:00</published><updated>2008-10-11T17:29:26.355-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><title type='text'>Interfaces II</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;Donde modif.visibilidad puede ser public o bien sin especificar, es decir  visibilidad pública (desde cualquier clase se puede emplear el interfaz) o de  paquete (sólo se puede emplear desde clases del mismo paquete).&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;nombreInterfaz por convenio, sigue las mismas reglas de nomenclatura que las  clases, y en muchos casos acaba en able (que podíamos traducir como: &#39;ser capaz  de&#39;). &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;La claúsula opcional extends, se emplea para conseguir que un interfaz herede  las funciones de otro/s interfaces, simplemente listaInterfaces es una lista  separada por coma de interfaces de los que se desea heredar. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En muchas ocasiones un interfaz es empleado para definir un comportamiento,  que posteriormente será implementado por diversas clases, que podrán no tener  nada que ver entre ellas, pero que todas se comportarán igual de cara al  interfaz. Es decir, todas tendrán las funciones indicadas por el interfaz. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cuando varios objetos de distintas clases pueden responder al mismo mensaje  (función), aún realizando cosas distintas se denomina  &lt;strong&gt;polimorfismo&lt;/strong&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/6446091557544416671/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/6446091557544416671' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6446091557544416671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6446091557544416671'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/interfaces-ii.html' title='Interfaces II'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-5480621826867621031</id><published>2008-10-11T17:28:00.001-07:00</published><updated>2008-10-11T17:28:54.514-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><title type='text'>Interfaces I</title><content type='html'>&lt;p&gt;Un &lt;strong&gt;interfaz&lt;/strong&gt; es una lista de acciones que puede llevar a cabo  un determinado objeto. Sorpresa, ¿eso no eran los métodos que se definen en una  clase? Casi, en una clase además de aparecer los métodos aparecía el código para  dichos métodos, en cambio en un interfaz sólo existe el prototipo de una  función, no su código. &lt;/p&gt;  &lt;p&gt;Veámoslo con un ejemplo: Pensemos en un interfaz en el que en su lista de  métodos aparecen los métodos despegar, aterrizar, servirComida y volar. Todos  pensamos en un avión, ¿verdad? El motivo es sencillamente que avión es el  concepto que engloba las acciones que hemos detallado antes, a pesar que existan  muchos objetos avión diferentes entre sí, por ejemplo Boeing 747, Boeing 737,  MacDonell-Douglas. &lt;/p&gt;  &lt;p&gt;Lo realmente interesante es que &lt;a href=&quot;/terminos/todos&quot;&gt;todos&lt;/a&gt; ellos, a  pesar de pertenecer a clases distintas, poseen el interfaz avión, es decir  poseen los métodos detallados en la lista del interfaz avión. &lt;/p&gt;  &lt;p&gt;Esto significa también que a cualquier avión le podemos pedir que vuele, sin  importarnos a que clase real pertenezca el avión, evidentemente cada clase  especificará como volará el avión (porque proporciona el código de la función  volar). &lt;/p&gt;  &lt;p&gt;En &lt;a href=&quot;/terminos/java&quot;&gt;java&lt;/a&gt; un interfaz define la lista de métodos,  pero para que una clase posea un interfaz hay que indicar explícitamente que lo  implementa mediante la claúsula implements. Pero veamos primero la estructura de  un interfaz: &lt;/p&gt;  &lt;p&gt;[modif.visibilidad] interface nombreInterfaz [extends listaInterfaces] &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;prototipo método1; &lt;/p&gt;  &lt;p&gt;..... &lt;/p&gt;  &lt;p&gt;prototipo método1; &lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/5480621826867621031/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/5480621826867621031' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/5480621826867621031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/5480621826867621031'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/interfaces-i.html' title='Interfaces I'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-6305958624189209424</id><published>2008-10-11T17:27:00.002-07:00</published><updated>2008-10-11T17:28:06.089-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tipos de Datos"/><title type='text'>Introducción a la transformación entre tipos de datos (II)</title><content type='html'>&lt;p&gt;En ocasiones nos interesará transformar un tipo, por ejemplo entero, a otro  tipo entero de menos precisión, es decir, transformar de long a int, para ello  habrá que emplear el operador de moldeo: &lt;/p&gt;  &lt;p&gt;(tipo) &lt;/p&gt;  &lt;p style=&quot;text-align: justify;&quot;&gt;para forzar la conversión de un tipo a otro: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;long b =-234; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int a = (int)b; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Funcionará mientras que el valor almacenado en el long esté dentro del rango  permitido al tipo int, si no, se truncará el valor. Lo mismo se puede indicar  para los tipos float y double. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;También se puede emplear el operador de moldeo para objetos. Veamos un  ejemplo: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Coche c = new Coche(); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Vector v = new Vector(); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;v.add(c); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Object o = v.get(0); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Coche recuperado = (Coche) o;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En este ejemplo creamos un objeto de la clase Coche, y un objeto de la clase  Vector. Un Vector en java se emplea como un array  dinámico. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;En este caso agregamos al vector el coche mediante la función add. Para  recuperar el objeto que está en la posición 0 usamos la función get, esta  función devuelve un Object, cuando pensamos que debería devolver un objeto  Coche. En realidad lo que devuelve es una referencia de la clase base Object,  que apunta al objeto de la posición 0, es decir nuestro objeto coche. Pero  necesitamos que nuestro objeto sea apuntado por una referencia de tipo Coche  para poder llamar a las funciones de la clase Coche. Por ello hacemos una  conversión de referencias en la última línea.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;   &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/6305958624189209424/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/6305958624189209424' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6305958624189209424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/6305958624189209424'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/introduccin-la-transformacin-entre_11.html' title='Introducción a la transformación entre tipos de datos (II)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2933929503119362201.post-2772411859487825196</id><published>2008-10-11T17:27:00.001-07:00</published><updated>2008-10-11T17:27:35.712-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tipos de Datos"/><title type='text'>Introducción a la transformación entre tipos de datos (I)</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt;En java será necesario transformar entre tipos  de datos básicos, generalmente entre String hacia cualquier otro tipo tipo  básico, o viceversa. Si es necesario transformar un tipo básico hacia String, la  forma más rápida consiste en concatenar el valor a un objeto String, por  ejemplo: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&quot;&quot; + 34 &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Con ello conseguiremos que se cree el literal &quot;34&quot;. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Si en cambio queremos transformar el literal &quot;2345&quot; a un valor int para poder  operar con el será necesario emplear: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int valor = Integer.parseInt(&quot;2345&quot;); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Integer es una clase empleada para representar al tipo básico int, y para  transformar de String a int, pero puede lanzar excepciones, es por ello que  siempre hay que usarla con try/catch: &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;int valor; &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;try{ &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;valor = Integer.parseInt( &quot;2345&quot;); &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;}catch(Exception e){ e.printStackTrace();} &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;System.out.println(valor*10);&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://aprendiendo-lenguaje-java.blogspot.com/feeds/2772411859487825196/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2933929503119362201/2772411859487825196' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2772411859487825196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2933929503119362201/posts/default/2772411859487825196'/><link rel='alternate' type='text/html' href='http://aprendiendo-lenguaje-java.blogspot.com/2008/10/introduccin-la-transformacin-entre.html' title='Introducción a la transformación entre tipos de datos (I)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>