2. Programas Java – Swing Todos los ejemplos que encontrará en este libro se realizan utilizando el paquete Swing que es parte de la JFC (Java Foundation Classes) en la plataforma Java. La JFC provee facilidades para ayudar al usuario a construir GUIs (Interfaces gráficas de usuarios). Swing abarca componentes como botones, tablas, marcos, etc... Los componentes Swing se identifican porque pertenecen al paquete javax.swing. Swing existe desde la JDK 1.1 (como un agregado). Antes de la existencia de Swing, las interfaces gráficas con el usuario se realizaban a través de awt (Abstract Window Toolkit), de quien Swing hereda todo el manejo de eventos. Usualmente, para todo componente awt existe un componente Swing que lo reemplaza, por ejemplo, la clase Button de awt es reemplazada por la clase JButton de Swing (el nombre de todas las componentes Swing comienza con "J"). Las componentes de Swing utilizan la infraestructura de awt, incluyendo el modelo de eventos awt, el cual rige cómo un componente que reacciona a eventos de teclado, mouse, etc. Es por esto, que la mayoría de los programas Swing necesitan importar dos paquetes awt: java.awt.* y java.awt.event.*. Tabla 2.1. Paquetes de java swing Paquete javax.swing Descripción Es el paquete tal vez más importante de swing, contiene las clases necesarias para crear ventanas y colocar objetos sencillos en una interfaz gráfica. javax.swing.border Contiene clases que permiten especificar bordes personalizados a los diferentes objetos de la interfaz gráfica. Contiene clases que permiten definir, especificar y seleccionar javax.swing.colorchooser colores para diversos objetos. javax.swing.event Este paquete contiene las clases necesarias para crear y manipular eventos sobre los diversos objetos de la interfaz de swing. Es bueno tener en cuenta que los “oidores” se asocian a objetos de la interfaz, pero son implementados gracias a las clases que provee este paquete. javax.swing.filechooser El “FileChooser” es un componente de swing que permite navegar por los archivos de la máquina, tal como lo hace el explorador de Windows. javax.swing.plaf.* Este paquete permite dar una apariencia uniforme a una aplicación. Contiene apariencias estándares de las aplicaciones basadas en Windows y otros sistemas operativos javax.swing.table El componente JTable es uno de los componentes que añadió swing para lograr crear interfaces que muestren datos en una cuadrícula y muchas otras funcionalidades. javax.swing.text Paquete que contiene clases para dar formato a textos y en general para realizar una manipulación gráfica de textos y mostrarla al usuario con algunos efectos. javax.swing.text.html.* Clases que permiten manipular documentos en formato HTML. javax.swing.text.rtf El “RTF” es un visualizador de texto que se puede utilizar haciendo referencia a este paquete. javax.swing.tree El componente JTree es uno de los componentes más sofisticados y completos que incorpora swing. Dicho componente permite entre otras cosas realizar búsquedas en árboles, mostrar árboles con la javax.swing.undo javax.accessibility apariencia de un explorador de archivos y muchas otras cosas. Permite realizar aplicaciones que incorporen la funcionalidad de rehacer y deshacer. Clases que permiten dar funcionalidad a las aplicaciones para que sean utilizadas por personas con discapacidades. 2.1. Creación de un primer programa en Java Java es un lenguaje de programación con el que pueden crearse aplicaciones autónomas y applets (basados en un explorador). Los programas autónomos son parecidos a aquellos que pueden realizarse con C++. Los Applets son independientes del dispositivo, es decir un mismo Applet puede ejecutarse desde un PC con Windows/x, Mac o Linux, ya que el compilador de Java genera código de maquina virtual el cual se puede ejecutar desde cualquier plataforma. Los programas autónomos o applets se pueden digitar en un editor de texto como: Wordpad, Edit, Block de Notas, o editores de programas de java (realj, freejava, jcreator, netbeans, etc.) Estos deben tener la extensión ".java". Todos los programas se digitaron y se compilaron utilizando el programa realj, el cual es un editor para crear programas en java. (Ver anexo A, página 249). En el análisis de cada programa se hacen los respectivos comentarios del código omitiendo en ocasiones aquellos que ya han sido comentados en programas anteriores. 2.2. Ejemplo práctico Realizar un programa que imprima en pantalla el siguiente mensaje: "Hola!... Mi primer programa con Java”. Dicho programa debe realizarse como un programa Autónomo y un Applet. a) Programa Autónomo 1 2 3 import javax.swing.JFrame; import java.awt.Graphics; class BienvenidoAuto extends JFrame { 4 public BienvenidoAuto() { 5 super("programación en Java"); 6 setSize(300,100); 7 setVisible(true); } 8 public void paint(Graphics g) { 9 g.drawString("Hola!... Mi primer programa con Java - Autonomo”,40,40); } 10 public static void main(String args[]) { 11 BienvenidoAuto miprograma = new BienvenidoAuto(); 12 miprograma.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Análisis programa Línea 1: Indica que el programa utiliza la clase JFrame del paquete javax.swing para mostrar un marco. Línea 2: La aplicación utiliza la clase Graphics del paquete java.awt, la cual permite dibujar gráficos, como texto, líneas, etc. Línea 3: Se define el nombre de la clase, en este caso “BienvenidoAuto”. También contiene la palabra clave extends que indica que la clase BienvenidoAuto hereda los atributos (datos) y comportamientos (métodos) existentes de la clase JFrame. Línea 4: Se crea un constructor el cual es un método que tiene el mismo nombre de la clase; esta se inicializa automáticamente cuando se crea un objeto de la clase. Línea 5: La palabra reservada super permite acceder a los datos y métodos de la clase que se está heredando. El uso de esta es opcional, pero en caso de utilizarse debe ser obligatoriamente la primera instrucción del constructor. Para el ejemplo se utilizo super para colocarle un titulo al marco. Línea 6: el método setSize(int, int) permite definir el tamaño de un marco. El primer parámetro es el ancho y el segundo es el alto. Línea 7: el método setVisible(), permite mostrar el marco. Si el parámetro es true, permitirá visualizar el marco, si por el contrario es false se esconderá el marco. Línea 8: se crea un método llamado paint (pintar), el cual se ejecuta automáticamente, y tiene como parámetro un objeto de tipo Graphics, en este caso g, que le sirve al método para dibujar gráficos. Tiene dos palabras clave: public que permite que el método sea llamado desde la clase y void que indica que el método no retorna datos cuando termine su tarea. Línea 9: el método drawString de la clase Graphics que utiliza el parámetro g, permite dibujar una cadena de caracteres en el marco. Dicho método recibe tres parámetros: el primero es la cadena de caracteres que va a dibujar, el segundo es la coordenada x y el tercer es la coordenada y. Línea 10: Se declara el método principal main (todo programa autónomo debe contener dicho método). La declaración debe ser siempre la misma, es decir, siempre que se cree un programa autónomo debe tener como mínimo los siguientes parámetros: public, es el modificador de acceso. El parámetro static indica que la función es estática, por lo cual no puede ser generada ninguna instancia (uso de new) de un elemento static puesto que solo existe una instancia. La palabra clave void se incluye para definir que la función no devuelve ningún valor; main es el nombre de la función y String [] args es un arreglo de tipo String llamado args. Línea 11: Se crea un objeto miprograma al cual se le asigna memoria de tipo BienvenidoAuto () por intermedio del operador new. Línea 12: Se utiliza el método setDefaultCloseOperation() para cerrar la aplicación. Compilación y ejecución del programa autónomo Es necesario guardar el archivo con el nombre definido en la clase, en este caso BienvenidoAuto y con extensión ".java" (se debe tener en cuenta como está escrito el nombre de la clase porque para el compilador de Java "Primero" es diferente de "primero"). Los siguientes pasos se pueden omitir si trabaja con cualquier programa que permita compilar y ejecutar aplicaciones de Java (Ej. RealJ): Para compilarlo, desde el prompt de la interfaz de comandos y ubicado en la carpeta donde se guardo el archivo fuente (.java), se debe digitar: javac <nombre del programa con extensión>< <enter> javac BienvenidoAuto.java <enter> Si el programa no genera ningún error de compilación este creara un archivo del mismo nombre pero con extensión .class (BienvenidoAuto.class) Para ejecutar el programa se debe digitar: java <nombre del programa> <enter> java BienvenidoAuto <enter> Al ejecutarse se visualizara la siguiente pantalla: Figura 2.1. Ejecución programa autónomo “BienvenidoAuto” Nota; también puede compilarlo y ejecutarlo con realj (ver anexo A, página 249). b) Subprograma Applet 1 2 3 4 5 6 import javax.swing.JApplet; import java.awt.Graphics; public class BienvenidoApp extends JApplet { public void paint (Graphics g) { super.paint(g); g.drawString("Hola!... Mi primer programa con Java - Applet ",25,25); } } Análisis programa Línea 1: Indica que el programa utiliza la clase JApplet del paquete javax.swing para mostrar una ventana. Línea 2: La aplicación utiliza la clase Graphics del paquete java.awt, la cual permite dibujar gráficos, como texto, líneas, etc. Línea 3: Se define el nombre de la clase “BienvenidoApp”. También contiene la palabra clave extends que indica que la clase BienvenidoApp hereda los atributos (datos) y comportamientos (métodos) existentes de la clase JApplet. Línea 4: se crea un método llamado paint (pintar), el cual se ejecuta automáticamente, y que tiene como parámetro un objeto de tipo Graphics, en este caso g, que le sirve al método para dibujar gráficos. Tiene dos palabras clave: public que permite que el método sea llamado desde la clase y void que indica que el método no retorna datos cuando termine su tarea. Línea 5: Se hace un llamado al método paint de la superclase JApplet. Línea 6: el método drawString de la clase Graphics que utiliza el parámetros g, permite dibujar una cadena de caracteres en el marco. Dicho método recibe tres parámetros: el primero es la cadena de caracteres que va a dibujar, el segundo es la coordenada x y el tercer es la coordenada y. Compilación y ejecución del subprograma Applet Para compilarlo, desde el prompt de la interfaz de comandos y ubicado en la carpeta donde guardo el archivo fuente (.java), se debe digitar: javac <nombre del programa con extensión< <enter> javac BienvenidoApp.java <enter> Si el programa no genera ningún error de compilación este creara un archivo del mismo nombre pero con extensión .class (BienvenidoApp.class) Luego se debe crear un archivo del mismo nombre pero con extensión html (BienvenidoApp.html) desde cualquier editor de texto, con las siguientes instrucciones: <html> <Applet code="<nombre del programa con extension .class"> width=300 height=200></applet> <html> Donde height y width indican el tamaño de la ventana en pixeles. En el ejemplo sería: <html> <Applet code=" BienvenidoApp.class" width=300 height=200></applet> <html> luego de creado el programa html, para ejecutarlo, se debe digitar: appletviewer <nombre del programa con extensión html> <enter> appletviewer BienvenidoApp.html <enter> Otra forma de ejecutar el Applet, es abrir el archivo “.html” desde un navegador de Internet. Al ejecutarse, se visualizara la siguiente pantalla: Figura 2.2. Ejecución subprograma Applet ”BienvenidoApp” Nota; también puede compilarlo y ejecutarlo con realj (ver anexo A, página 249). 3. Estructuras de Control 3.1. Estructura de alternativa simple if La estructura de alternativa simple if ejecuta una determinada acción cuando se cumple una condición. La selección if evalúa la condición y: Si la condición es verdadera, ejecuta la acción if (o acciones caso de ser S1 una acción compuesta y constar de varias acciones) y continua con el resto del programa. Si la condición es falsa, no entra al if, pero continúa con el resto del programa. if (condición verdadera) { S1 } Resto del programa 3.1.1. Ejemplo práctico if crear un programa autónomo y un applet que capture una nota de un estudiante, si la nota es mayor o igual a tres, deberá imprimir en la ventana “Aprobó la materia... Felicitaciones”. a) Programa Applet 1 2 3 4 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class IfSimple extends JApplet implements ActionListener { 5 JLabel etiqueta; 6 JTextField entrada; 7 float nota; 8 public void init() { 9 Container contenedor=getContentPane(); 10 contenedor.setLayout(new FlowLayout()); 11 etiqueta=new JLabel("Digite nota y pulse Enter:"); 12 entrada=new JTextField(10); 13 contenedor.add(etiqueta); 14 contenedor.add(entrada); 15 entrada.addActionListener(this); } 16 public void paint(Graphics g) { 17 super.paint(g); 18 if(nota>=3.0) 19 g.drawString("Aprobó la materia... Felicitaciones",30,60); } 20 public void actionPerformed(ActionEvent e) { 21 if(e.getSource()==entrada){ 22 nota=Float.parseFloat(entrada.getText()); } 23 repaint(); } } Análisis programa Línea 1: Indica que el programa puede utilizar las clases que pertenecen al paquete javax.swing. Línea 2: La aplicación puede utilizar las clases del paquete java.awt. Línea 3: el paquete awt.event proporciona las clases e interfaces para diversos eventos que se pueden utilizando Listeners (oidores). Línea 4: Se define la clase pública IfSimple. También contiene la palabra clave extends que indica que la clase IfSimple hereda los atributos (datos) y comportamientos (métodos) existentes en la clase JApplet. Además se implementa la interfaz ActionListener utilizando la palabra clave implements. La interfaz ActionListener detecta las acciones que realiza el usuario y las convierte en acciones del programa, por ejemplo: cerrar la ventana al pulsar un botón, al pulsar Enter en una caja de texto, etc. ActionListener es una interface del grupo de los Listeners (oidores). ActionListener tiene un sólo método: void actionPerformed(ActionEvent e) que se usa para detectar y manejar eventos de acción (ActionEvent), los que tienen lugar cuando se produce una acción sobre un elemento del programa. Línea 5: La clase JLabel (etiqueta) permite crear un objeto donde se puede mostrar un texto no editable. Línea 6: La clase JTextField (caja de texto) permite crear un objeto donde un usuario puede introducir datos mediante el teclado. También puede mostrar información. Línea 7: Se crea una variable llamada nota de tipo float. Línea 8: El método init(), el cual se ejecuta automáticamente se utiliza para inicializar los diferentes objetos que serán utilizados por la aplicación. Línea 9: Se crea un objeto llamado contenedor de tipo Container que permite obtener un panel de contenido al que se le pueden adicionar componentes de interfaz gráfica de usuario, en este caso los componentes JLabel y JTextField. A dicho objeto se le asigna el método getContentPane(), el cual devuelve la referencia del panel de contenido. Línea 10: Se utiliza el método setLayout de la clase Container para especificar el administrador de diseño que se va a utilizar en la interfaz de usuario. Se le pasa como argumento un objeto de tipo FlowLayout que permite colocar los diferentes objetos de la interfaz de usuario de izquierda a derecha en el orden que se coloquen utilizando el método add. Línea 11 y 12: Se asigna espacio de memoria utilizando la palabra clave new a los objetos JLabel y JTextField. Al objeto JLabel se le envía como parámetro una cadena de caracteres para que sea mostrada una vez se ejecute el applet. Al objeto JTextField se le envía como parámetro un valor de 10 caracteres de ancho. Línea 13 y 14: Se adiciona al contenedor por medio del método add los objetos JLabel y JTextField. Línea 15: Al objeto entrada se le adiciona un oidor para escuchar los eventos que realice dicho objeto utilizando el método addActionListener. Se le envía como parámetro la palabra clave this para referirse a sí mismo. Línea 18: Se utiliza la instrucción de control if para preguntar si el valor de la variable nota es mayor o igual a 3.0. Si la respuesta es verdadera el programa ingresara al if y realizara las operaciones contenidas en la condición. Línea 19: el método drawString de la clase Graphics que utiliza el parámetros g, permite dibujar una cadena de caracteres en la ventana. Dicho método recibe tres parámetros: el primero es la cadena de caracteres que va a dibujar, el segundo es la coordenada x y el tercero es la coordenada y. Línea 20: el método actionPerformed (ActionEvent e) se invoca cuando se genera un evento de acción (ActionEvent) en este caso en el objeto entrada, y realizara las tareas programadas para este evento. Línea 21: El método getSource() de tipo ActionEvent, pregunta si el objeto que ha realizado un evento es entrada. Si la respuesta es verdadera se realizaran las tareas que se programaron en dicha condición. Línea 22: el método parseFloat de la clase Float, permite convertir un String a número de tipo float, el cual es asignado a la variable nota. Se le envía como parámetro el objeto entrada obteniendo por medio del método getText() el valor que fue digitado por teclado Línea 23: el método repaint() permite realizar un nuevo llamado al método paint (), para actualizar todas los objetos y variables allí contenidas. Compilación y ejecución del subprograma Applet Para compilarlo, desde el prompt de la interfaz de comandos y ubicado en la carpeta donde guardo el archivo fuente (.java), se debe digitar: javac <nombre del programa con extensión< <enter> javac IfSimple.java <enter> Si el programa no genera ningún error de compilación este creara un archivo del mismo nombre con extensión .class (IfSimple.class) Luego se debe crear un archivo del mismo nombre pero con extensión html (PrimeroApp.html) desde cualquier editor de texto, con las siguientes instrucciones: <html> <Applet code="<nombre del programa con extensión .class"> width=300 height=200></applet> <html> Donde height y width indican el tamaño de la ventana en pixeles. En el ejemplo sería: <html> <Applet code=" IfSimple.class" width=300 height=200></applet> <html> luego de creado el programa html, para ejecutarlo, se debe digitar: appletviewer <nombre del programa con extensión html> <enter> appletviewer IfSimple.html <enter> Otra forma de ejecutar el Applet, es abrir el archivo “.html” desde un navegador de Internet. Al ejecutarse el programa y digitar 3.5 en la caja de texto y pulsar enter, se visualizara la siguiente pantalla: Figura 3.1. Ejecución Applet IfSimple b) Programa Autónomo 1 2 3 4 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class IfSimpleAuto extends JFrame implements { 5 JLabel etiqueta; 6 JTextField entrada; 7 float nota; 8 public IfSimpleAuto() { 9 Container contenedor=getContentPane(); 10 contenedor.setLayout(new FlowLayout()); 11 etiqueta=new JLabel("Digite nota y pulse Enter:"); 12 entrada=new JTextField(10); 13 contenedor.add(etiqueta); 14 contenedor.add(entrada); 15 entrada.addActionListener(this); 16 setSize(300,100); 17 setVisible(true); } ActionListener 18 public void paint(Graphics g) { 19 if(nota>=3.0) 20 g.drawString("Aprobó la materia... Felicitaciones",30,60); } 21 public void actionPerformed(ActionEvent e) { 22 if(e.getSource()==entrada){ 23 nota=Float.parseFloat(entrada.getText()); } 24 repaint(); } 25 public static void main(String args[]) { 26 IfSimpleAuto miprograma = new IfSimpleAuto(); 27 miprograma.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Análisis programa Del anterior código solo se explicaran las líneas que fueron modificadas para crear el programa autónomo, las cuales están sombreadas. Las demás líneas fueron explicadas en el ejemplo del Applet. Línea 4: Se define una clase pública con el nombre IfSimpleAuto. También contiene la palabra clave extends que indica que la clase IfSimpleAuto hereda los atributos (datos) y comportamientos (métodos) existentes en la clase JFrame. Además se implemento la interfaz ActionListener utilizando la palabra clave implements. Línea 8: Se crea un constructor el cual es un método que tiene el mismo nombre de la clase; este se inicializa automáticamente cuando se crea un objeto de la clase. Línea 16: el método setSize (int, int) permite definir el tamaño de un marco. El primer parámetro es el ancho y el segundo es el alto. Línea 17: el método setVisible (), permite mostrar el marco. Si el parámetro es true, permitirá visualizar el marco, si por el contrario es false esconderá el marco. Línea 25: Se declara el método principal main (todo programa autónomo debe contener dicho método). La declaración debe ser siempre la misma, es decir, siempre que se cree un programa autónomo debe tener como mínimo los siguientes parámetros: public, es el modificador de acceso. El parámetro static indica que la función es estática, por lo cual no puede ser generada ninguna instancia (uso de new) de un elemento static. La palabra clave void se incluye para definir que la función no devuelve ningún valor; main es el nombre de la función y String [] args es un arreglo de tipo String llamado args Línea 26: Se crea un objeto miprograma al cual se le asigna memoria de tipo IfSimpleAuto (). Línea 27: Se utiliza el método setDefaultCloseOperation () para cerrar la aplicación. Compilación y ejecución del programa autónomo Para compilarlo, desde el prompt de la interfaz de comandos y ubicado en la carpeta donde guardo el archivo fuente (.java), se debe digitar: javac <nombre del programa con extensión>< <enter> javac IfSimpleAuto.java <enter> Si el programa no genera ningún error de compilación este creara un archivo del mismo nombre pero con extensión .class (IfSimpleAuto.class) Para ejecutar el programa se debe digitar: java <nombre del programa> <enter> java IfSimpleAuto <enter> Al ejecutarse y digitar 3.2 en la caja de texto y al pulsar enter, se visualizara la siguiente pantalla: Figura 3.2. Ejecución programa autónomo “IfSimpleAuto” 3.2. Estructura de alternativa compuesta if - else Esta estructura permite elegir entre dos opciones o alternativas posibles, es decir, que realiza una acción S1, si la condición es verdadera y otra acción S2, si la condición es falsa. if (condición verdadera ) { S1} else { S2} Resto del programa 3.2.1. Ejemplo práctico if-else Crear un programa Autónomo y un Applet que capture una nota de un estudiante. Si la nota es mayor o igual a 3.0 deberá mostrar el mensaje ”Aprobó la materia...Felicitaciones", de lo contrario imprimirá el mensaje "Lo siento…Reprobó la materia". a) Programa Applet 1 2 3 import javax.swing.*; import java.awt.*; import java.awt.event.*; 4 public class IfCompuestoApp extends JApplet implements ActionListener { 5 JLabel etiqueta; 6 JTextField entrada; 7 float nota; 8 public void init() { 9 Container contenedor=getContentPane(); 10 contenedor.setLayout(new FlowLayout()); 11 etiqueta=new JLabel("Digite nota y pulse Enter:"); 12 entrada=new JTextField(10); 13 contenedor.add(etiqueta); 14 contenedor.add(entrada); 15 entrada.addActionListener(this); } 16 public void paint(Graphics g) { 17 super.paint(g); 18 if(nota>=3.0) 19 g.drawString("Aprobó la materia... Felicitaciones",30,60); 20 else 21 g.drawString("Lo siento…Reprobó la materia ",30,60); } 22 public void actionPerformed(ActionEvent e) { 23 if(e.getSource()==entrada){ 24 nota=Float.parseFloat(entrada.getText()); } 25 repaint(); } } Al ejecutarse el programa Applet y digitarse el valor de 2 en la caja de texto, se visualizara la siguiente figura: Figura 3.3. Ejecución subprograma IfCompuestoApp b) Programa Autónomo 1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 3 public class IfCompuestoAuto extends JFrame implements 4 { 5 JLabel etiqueta; 6 JTextField entrada; ActionListener 7 float nota; 8 public IfCompuestoAuto() { 9 Container contenedor=getContentPane(); 10 contenedor.setLayout(new FlowLayout()); 11 etiqueta=new JLabel("Digite nota y pulse Enter:"); 12 entrada=new JTextField(10); 13 contenedor.add(etiqueta); 14 contenedor.add(entrada); 15 entrada.addActionListener(this); 16 setSize(300,100); 17 setVisible(true); } 18 public void paint(Graphics g) { 19 if(nota>=3.0) 20 g.drawString("Aprobó la materia... Felicitaciones",30,60); 21 else 22 g.drawString("Lo siento…Reprobó la materia ",30,60); } 23 public void actionPerformed(ActionEvent e) { 24 if(e.getSource()==entrada){ 25 nota=Float.parseFloat(entrada.getText()); } 26 repaint(); } 27 public static void main(String args[]) { 28 IfCompuestoAuto miprograma = new IfCompuestoAuto(); 29 miprograma.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Análisis de los programas Tanto en el programa autónomo como en el Applet se incluyeron solamente dos líneas exactamente iguales. En el autónomo se incluyeron las líneas 21 y 22 y en el applet las líneas 20 y 21. En la primera línea se utiliza la palabra reservada else (sino) que permitirá tomar la decisión si la condición es falsa, donde se visualizara el texto “lo siento…Reprobó la materia”. Al ejecutarse el programa autónomo y digitarse el valor de 2 en la caja de texto, se visualizara la siguiente figura: Figura 3.4. Ejecución programa IfCompuestoAuto 3.3. Estructura de alternativa múltiple switch- case En algunos casos son necesarias más de dos alternativas de solución a un problema. Esto se podría resolver por estructuras alternativas simples o compuestas anidadas; sin embargo, este método si el número de alternativas es demasiado grande puede plantear serios problemas de escritura del algoritmo y naturalmente de legibilidad. La estructura de alternativa múltiple switch – case evalúa una expresión que puede tomar n valores distintos, 1, 2, 3, 4,..., n. Según el valor de la expresión, se realizará una de las n acciones. switch(variable){ case valor1: acciones1; break, case valor2: acciones2; break, case valor3: acciones3; break, ::::::::: ::::::::: default: otras_acciones; } 3.3.1. Ejemplo práctico switch-case Crear un programa autónomo y un applet que permita digitar un carácter n veces e imprima la cantidad de vocales que se digitan. a) Subprograma Applet 1 2 3 4 5 6 7 8 { 9 10 11 12 13 14 15 } 16 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CaseApp extends JApplet implements ActionListener { JLabel etiqueta; JTextField entrada; int ctaa=0,ctae=0,ctai=0,ctao=0,ctau=0; public void init() Container contenedor=getContentPane(); contenedor.setLayout(new FlowLayout()); etiqueta=new JLabel("Digite una letra:"); entrada=new JTextField(10); contenedor.add(etiqueta); contenedor.add(entrada); entrada.addActionListener(this); public void paint (Graphics g) { 17 18 19 20 super.paint(g); g.drawString("Totales para cada vocal:",25,40); g.drawString("A:"+ctaa,25,55); g.drawString("E:"+ctae,25,70); 21 22 23 g.drawString("I:"+ctai,25,85); g.drawString("O:"+ctao,25,100); g.drawString("U:"+ctau,25,115); } 24 public void actionPerformed(ActionEvent e) { 25 if(e.getSource()==entrada){ 26 char vocal=(entrada.getText()).charAt(0); 27 entrada.setText(""); 28 switch(vocal){ 29 case 'A':case 'a': 30 ++ctaa; 31 break; 32 case 'E':case 'e': 33 ++ctae; 34 break; 35 case 'I':case 'i': 36 ++ctai; 37 break; 38 case 'O':case 'o': 39 ++ctao; 40 break; 41 case 'U':case 'u': 42 ++ctau; 43 break; 44 default: 45 showStatus("Vocal no existe. Digite Nuevamente."); 46 break; } 47 repaint(); } } } Análisis programa Línea 7: Se crean y se inicializan las variables ctaa, ctae, ctai, ctao, ctau, con un valor de cero (0), que servirán para llevar el acumulado de cada una de las vocales que el usuario ira digitando. Línea 18 - 23: Se imprime por pantalla la cantidad de cada vocal que el usuario ha digitado. Línea 26: Se crea una variable llamada vocal de tipo char que permitirá almacenar cada una de las vocales que el usuario digitará. Se utiliza el método charAt(n) de la clase String, el cual permite seleccionar un carácter en una posición n de una cadena de caracteres. En el ejemplo se utiliza charAt en la posición 0, lo que permite extraer de la caja de texto entrada el carácter en la posición cero. Línea 27: Se utiliza el método setText(), al cual se le envía como parámetro dobles comillas sin espacio para limpiar la caja de texto entrada. Línea 28 - 46: La palabra reservada switch va seguida de la variable vocal. El valor de la variable se compara con cada uno de los case para determinar que tipo de vocal digitó el usuario. Por cada case debe existir un break para permitir a la estructura switch salir cuando se encuentre el caso especifico. Si no se encuentra el case que cumpla con el valor de la variable vocal, se tomará la alternativa default que en este caso mostrará el mensaje “Vocal no existe. Digite Nuevamente.” Para esto se utiliza el método showStatus que permite visualizar el mensaje en la barra de estado del applet. Al compilar y ejecutar el Applet se visualizara la siguiente figura: Figura 3.5. Ejecución programa CaseApp b) Programa Autónomo 1 2 3 4 5 6 7 8 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CaseAuto extends JFrame implements ActionListener { JLabel etiqueta; JTextField entrada; int ctaa=0,ctae=0,ctai=0,ctao=0,ctau=0; public CaseAuto() { 9 Container contenedor=getContentPane(); 10 contenedor.setLayout(new FlowLayout()); 11 etiqueta=new JLabel("Digite una letra:"); 12 entrada=new JTextField(10); 13 contenedor.add(etiqueta); 14 contenedor.add(entrada); 15 entrada.addActionListener(this); 16 setSize(300,300); 17 setVisible(true); } 18 public void paint (Graphics g) { 19 g.drawString("Totales para cada vocal:",25,80); 20 g.drawString("A:"+ctaa,25,95); 21 g.drawString("E:"+ctae,25,110); 22 g.drawString("I:"+ctai,25,125); 23 g.drawString("O:"+ctao,25,140); 24 g.drawString("U:"+ctau,25,155); } 25 public void actionPerformed(ActionEvent e) { 26 if(e.getSource()==entrada){ 27 char vocal=(entrada.getText()).charAt(0); 28 entrada.setText("");//borra campo de texto 29 switch(vocal){ 30 case 'A':case 'a': 31 ++ctaa; 32 break; 33 case 'E':case 'e': 34 ++ctae; 35 break; 36 case 'I':case 'i': 37 ++ctai; 38 break; 39 case 'O':case 'o': 40 ++ctao; 41 break; 42 case 'U':case 'u': 43 ++ctau; 44 break; 45 default: 46 JOptionPane.showMessageDialog( null, "No es una vocal..","Resultado", JOptionPane.PLAIN_MESSAGE ); 47 System.exit( 0 ); 48 break; } 49 repaint(); } } 50 public static void main(String[] args) { 51 CaseAuto miprograma= new CaseAuto(); 52 miprograma.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Análisis programa Línea 46: Para visualizar un cuadro de dialogo en un programa autónomo se utiliza el método showMessageDialog() de la clase JOptionPane. En este caso al método se le envían cuatro argumentos separados por comas (,): el primero es la palabra reservada null, el segundo argumento que es el mensaje que se va a mostrar, el tercero en el titulo del cuadro de dialogo y el último es el tipo de cuadro de dialogo. Línea 47: Se utiliza el método exit(), de la clase System para terminar la aplicación. Solo se ejecutara cuando el usuario digite una letra que no sea una vocal. Es una buena práctica terminar las aplicaciones de este modo cuando se trabaja con interfaz grafica de usuario. Al compilar y ejecutar el programa Autónomo se visualizara la siguiente figura: Figura 3.6. Ejecución programa CaseAuto 3.4. Estructura de repetición for La estructura de repetición for ejecuta una acción mientras una condición sea verdadera. Su formato es: for(inicialización; condición _ verdadera; incremento ó decremento) { acción; } 3.4.1. Ejemplo práctico for Crear un programa autónomo y un applet que imprima los números pares entre 2 y 30, así como su sumatoria. a) Subprograma Applet 1 2 3 4 5 6 7 8 10 11 12 13 14 15 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CicloFor extends JApplet { int suma=0,numero; public void init() { Container contenedor=getContentPane(); contenedor.setLayout(new FlowLayout()); } public void paint (Graphics g) { int posy=40; super.paint(g); g.drawString("Impresion de los numeros pares entre 2 y 30",25,25); for (numero=2;numero<=30;numero=numero+2) { 16 17 18 g.drawString(Integer.toString(numero),25,posy); posy+=15; suma=suma+numero; } g.drawString("La suma de los números es: "+ suma, 25,posy); 19 } } Análisis Programa Línea 5: Se crean dos variables: suma, la cual es inicializada en cero (0) y servirá para llevar el acumulado de los números pares, y la variable numero que permitirá asignarle el valor de lo capturado en la caja de texto entrada. Línea 12: Se crea una variable posy la cual es inicializada en cuarenta (40) y sirve para mover la posición de impresión de cada uno de los números pares. Línea 15 – 18: Se crea el ciclo for, donde se inicializa la variable numero con un valor de dos (2), se evalúa que la variable numero sea menor o igual a treinta (30). Mientras la condición sea verdadera se imprimirá en pantalla el numero par, además se irá incrementando la variable numero de 2 en 2. En la impresión se utiliza el método toString de la clase Integer para convertir un String a int. En la línea 18 se va llevando la sumatoria de cada uno de los números pares asignándosele a la variable suma. Línea 19: Se realiza la impresión de la sumatoria de los números pares entre 2 y 30. Al ejecutarse, se visualizara la siguiente pantalla: Figura 3.7. Ejecución programa CicloForApp b) ProgramaAutónomo 1 2 3 import java.awt.*; import java.awt.event.*; import javax.swing.*; 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class CicloForAuto extends JFrame { int numero, suma=0; public CicloForAuto() { super("Programa Autonomo"); Container contenedor=getContentPane(); contenedor.setLayout(new FlowLayout()); setSize(400,400); setVisible(true); } public void paint(Graphics g) { int posy=55; g.drawString("Impresion de los numeros pares entre 2 y 30",25,40); for (numero=2;numero<=30;numero=numero+2) { g.drawString(Integer.toString(numero),25,posy); posy+=15; suma=suma+numero; } g.drawString("La suma de los números es: "+ suma, 25,posy); } public static void main(String args[]) { CicloForAuto miprograma = new CicloForAuto(); miprograma.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Análisis Programa Línea 7: Se envía al constructor de la clase JFrame el titulo que se quiere mostrar en el marco. Al ejecutarse, se visualizara la siguiente pantalla: Figura No. 3.8. Ejecución programa CicloForAuto 3.5. Estructura de repetición while La estructura repetitiva while permite repetir una acción mientras la condición sea verdadera. Cuando se ejecuta la instrucción while, si la condición se evalúa como falsa no se realiza ninguna acción y el programa prosigue en la siguiente instrucción después del ciclo. Si la condición es verdadera, se ejecuta las acciones que están en el ciclo. Este proceso se repetirá mientras la condición sea verdadera. while( condición_verdadera) { acción; incremento ó decremento; } 3.5.1. Ejemplo práctico while Realizar un programa tanto autónomo como applet que permita capturar 10 números enteros e imprimir el mayor y el menor de dichos números. Nota: Los números enteros pueden estar en el rango de más infinito hasta menos infinito. a) Subprograma Applet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CicloWhileApp extends JApplet implements ActionListener { JLabel etiqueta; JTextField entrada; int auxiliar=0,numero,mayor,menor; public void init() { Container contenedor=getContentPane(); contenedor.setLayout(new FlowLayout()); etiqueta=new JLabel("Digite un numero:"); entrada=new JTextField(10); contenedor.add(etiqueta); contenedor.add(entrada); entrada.addActionListener(this); } public void paint (Graphics g) { super.paint(g); if (auxiliar==1) { mayor=numero; menor=numero; } if(mayor<numero) mayor=numero; if(menor>numero) 24 25 25 menor=numero; g.drawString("El mayor es:"+mayor,25, 80); g.drawString("El menor es:"+menor,25, 100); } 26 public void actionPerformed(ActionEvent e) { 27 while(auxiliar<10) { 28 if(e.getSource()==entrada) { 29 numero=Integer.parseInt(entrada.getText()); 30 entrada.setText(""); 31 auxiliar++; 32 repaint(); } } 33 entrada.setEditable(false); } } Análisis programa Línea 7: Se crean cuatro variables de tipo int: la primera llamada auxiliar, la cual es inicializada en cero (0) y servirá para llevar la cuenta de los números que se han digitado, la segunda es numero y servirá para guardar cada uno de los valores capturados por teclado, la tercera es mayor que servirá para guardar el mayor de los números capturados y por último menor que servirá para almacenar el menor valor capturado por teclado. Línea 18 – 25: Se tiene una primera condición if que pregunta si la variable auxiliar es igual a 1. Si se cumple la condición se inicializan las variables mayor y menor con el valor que contenga en ese momento la variable numero. Por otro lado se tiene dos condiciones if para ir evaluando el valor de mayor y de menor contra el valor de la variable número. Si se cumple la condición verdadera en alguno de las dos condiciones if se le asignara el valor de numero a la respectiva variable. Por último se hace una impresión de las variables mayor y menor. Al ejecutar el programa e ir digitando los números se irá visualizando el mayor y el menor valor capturado. Línea 27 – 33: Se crea un ciclo while, donde la condición será verdadera mientras que la variable auxiliar sea menor de 10. Se evalúa si el evento ocurrido se ha realizado en la caja de texto entrada, si es verdad, a la variable número se le asigna el valor capturado por teclado. Por otro lado se limpia la caja de texto entrada y se incrementa en uno el valor de la variable auxiliar. Además se llama al método repaint para que actualice los valores de mayor y menor. Por último se utiliza el método setEditable con el parámetro false para que no se puedan digitar mas números cuando se haya terminado el ciclo while. Al ejecutarse el applet y digitarse los números 12, 15, 24, 42, 120, 85, 1,-9, 78, 66, se visualizara la siguiente figura: Figura 3.9. Ejecución programa CicloWhileApp b) Programa Autónomo 1 2 3 4 5 6 7 8 { 9 10 11 12 13 14 15 16 17 18 } 19 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CicloWhileAuto extends JFrame implements ActionListener { JLabel etiqueta; JTextField entrada; int auxiliar=0,numero,mayor,menor; public CicloWhileAuto() super("Programa Autonomo"); Container contenedor=getContentPane(); contenedor.setLayout(new FlowLayout()); etiqueta=new JLabel("Digite un numero:"); entrada=new JTextField(10); contenedor.add(etiqueta); contenedor.add(entrada); entrada.addActionListener(this); setSize(300,300); setVisible(true); public void paint (Graphics g) { 20 super.paint(g); 21 if (auxiliar==1) 22 { 23 mayor=numero; 24 menor=numero; } 25 if(mayor<numero) 26 mayor=numero; 27 if(menor>numero) 28 menor=numero; 29 g.drawString("El mayor es:"+mayor,25, 80); 30 g.drawString("El menor es:"+menor,25, 100); } 31 public void actionPerformed(ActionEvent e) { 32 while(auxiliar<10) 33 { 34 if(e.getSource()==entrada) { 35 numero=Integer.parseInt(entrada.getText()); 36 entrada.setText(""); 37 auxiliar++; 38 repaint(); } } 39 entrada.setEditable(false); } 40 public static void main(String args[]) { 41 42 CicloWhileAuto miprograma = new CicloWhileAuto(); miprograma.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } El anterior programa autónomo realiza las mismas operaciones que realiza el applet. Al ejecutarse el programa autónomo y digitarse los números 12,15,24,42,120,85,1,9,78,66, se visualizara la siguiente figura: Figura 3.10. Ejecución programa CicloWhileAuto 3.6. Estructura de repetición do - while En ocasiones es necesario que un ciclo de repetición se ejecute por lo menos una vez antes de evaluar la condición. La estructura do - while ejecuta una acción hasta que se cumpla una condición determinada que se comprueba al final del ciclo. La estructura de repetición do - while se repite mientras el valor de la condición sea falso. do { acción; incremento ó decremento }while(condición_falsa); 3.6.1. Ejemplo práctico do-while Crear un programa autónomo y un applet que imprima los números pares entre 1 y 30, así como su sumatoria. a) Subprograma Applet 1 2 3 4 5 6 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CicloDoWhileApp extends JApplet { int suma=0,numero; public void init() { 7 8 Container contenedor=getContentPane(); contenedor.setLayout(new FlowLayout()); } 9 public void paint (Graphics g) 10 {int posy=40; 11 int numero=2; 12 super.paint(g); 13 g.drawString("Impresión de los números pares entre 2 y 30",25,25); 14 do { 15 g.drawString(Integer.toString(numero),25,posy); 16 posy+=15; 17 suma=suma+numero; 18 numero=numero+2; 19 }while(numero<=30); 20 g.drawString("La suma de los números es: "+ suma, 25,posy); } } Análisis programa Línea 11: Se crean una variable llamada numero, la cual es inicializada con el valor de dos (2) y servirá para incrementar dicha variable en dos unidades hasta que se cumpla la condición del ciclo. Línea 14 – 19 : Se inicia la estructura do-while; se hace la impresión del valor de la variable numero y se le asigna a la variable suma el valor que contiene dicha variable mas el nuevo valor de la variable numero, además se incrementa la variable numero en .dos unidades. Por último se evalúa la condición del ciclo. Si el valor de la variable numero es menor o igual a treinta (30) se volverá al ciclo, sino se saldrá del ciclo y se imprimirá la suma de los números pares entre 1 y 30. Figura 3.11. programa Ejecución CicloDoWhileApp b) Programa Autónomo 1 2 3 4 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CicloDoWhileAuto extends JFrame { 5 int numero, suma=0; 6 public CicloDoWhileAuto() 7 { 8 super("Programa Autonomo"); 9 Container contenedor=getContentPane(); 10 contenedor.setLayout(new FlowLayout()); 11 setSize(400,400); 12 setVisible(true); } 13 public void paint(Graphics g) { 14 int posy=55; 15 int numero=2; 16 g.drawString("Impresión de los numeros pares entre 2 y 30",25,40); 17 do { 18 g.drawString(Integer.toString(numero),25,posy); 19 posy+=15; 20 suma=suma+numero; 21 numero=numero+2; 22 }while(numero<=30); 23 g.drawString("La suma de los números es: "+ suma, 25,posy); } 24 public static void main(String args[]) { 25 CicloDoWhileAuto miprograma = new CicloDoWhileAuto(); 26 miprograma.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } En el anterior programa autónomo, se realizan las mismas instrucciones que se utilizaron en el subprograma applet. Figura 3.12. Ejecución programa CicloDoWhileAuto 3.7. Ejercicios propuestos Realizar los siguientes programas tanto en applet como en autónomo. 1. Hacer un programa que capture un numero por tecleado e imprima si es par o impar. 2. Hacer un programa que capture tres números e imprima cual es el mayor, el del medio y el menor. 3. Escribir un programa que capture un número e imprima si es menor de 15, si es mayor de 50 o sí está entre 16 y 49. 4. Hacer un programa que capture dos números e imprima la suma, la resta, la división, la multiplicación y el residuo de la división. 5. Hacer un programa que pida al usuario digitar en hora militar la hora, los minutos, los segundos e imprima la hora, los minutos y los segundos un segundo después. 6. Escribir un programa que sume los números enteros de 1 a 100, utilizando las estructura de repetición for, while, do while. 7. Escribir un programa que capture un número e imprima si dicho numero es primo o no. 8. Escribir un programa que permita leer una cadena de caracteres e imprimir cuantas vocales existen de cada una. 9. Escribir un programa que permita imprimir todos los números primos entre 3 y 999 inclusive. 10. Escribir un programa para imprimir la suma de los números impares menores o iguales que n. donde n es un número digitado por teclado.