Вы находитесь на странице: 1из 607

EJERCICIO GUIADO.

JAVA: CUADROS DE VERIFICACIN

1. Realiza un nuevo proyecto. 2. En la ventana principal debes aadir lo siguiente: a. Un botn Aceptar llamado btnAceptar. b. Una etiqueta con borde llamada etiResultado. 3. Aade tambin tres cuadros de verificacin. Estos cuadros son objetos del tipo JCheckBox.

4. Aade tres JCheckBox y cambia el texto de ellos, de forma que aparezca Perro, Gato y Ratn. 5. Debe cambiar el nombre de cada uno de ellos. Se llamarn: chkPerro, chkGato, chkRaton. 6. La ventana tendr el siguiente aspecto cuando termine:

7. El programa debe funcionar de la siguiente forma: Cuando el usuario pulse aceptar, en la etiqueta aparecer un mensaje indicando qu animales han sido seleccionados. Para ello hay que programar el evento actionPerformed del botn Aceptar. En ese evento aada el siguiente cdigo:
String mensaje="Animales elegidos: "; if (chkPerro.isSelected()) { mensaje=mensaje+"Perro "; } if (chkGato.isSelected()) { mensaje=mensaje+"Gato "; } if (chkRaton.isSelected()) { mensaje=mensaje+"Raton "; } etiResultado.setText(mensaje);

8. Observa el cdigo. En l se hace lo siguiente: a. Se crea una variable de cadena llamada mensaje. b. En esa variable se introduce el texto Animales elegidos: c. Luego, compruebo si est seleccionada la casilla de verificacin chkPerro. Si es as concateno a la cadena mensaje la palabra Perro. d. Luego compruebo si est seleccionada la casilla de verificacin chkGato y hago lo mismo. e. Lo mismo con la casilla chkRaton. f. Finalmente presento la cadena mensaje en la etiqueta etiResultado. 9. Observa el mtodo isSelected() propio de las casillas de verificacin, permiten saber si una casilla est activada o no. 10. Ejecute el programa. Seleccione por ejemplo las casillas Gato y Ratn. Al pulsar Aceptar el resultado debe ser el siguiente:

CONCLUSIN Los cuadros de verificacin (JCheckBox) se usan cuando quieres seleccionar varias opciones.

EJERCICIO GUIADO. JAVA: BOTONES DE OPCIN


1. Realiza un nuevo proyecto. 2. En la ventana principal debes aadir lo siguiente: a. Un botn Aceptar llamado btnAceptar. b. Una etiqueta con borde llamada etiResultado. 3. Aade un panel. Un panel es una zona rectangular que puede contener elementos (botones, etiquetas, etc) La forma de poner un panel es a travs del objeto JPanel.

4. Una vez aadido el panel en el JFrame, le pondremos un borde para poder localizarlo fcilmente. Debes hacer lo siguiente: a. Selecciona el panel que has aadido. b. Activa la propiedad Border (botn con tres puntos) c. Busca el tipo de borde llamado TitledBorder (borde con ttulo) y pon el ttulo colores.

5. Tu ventana debe quedar ms o menos as:

6. Ahora debes aadir tres botones de opcin (botones de radio) dentro del panel. Estos botones son objetos del tipo JRadioButton.

7. Aade tres JRadioButton y cambia el texto de ellos, de forma que aparezca Rojo, Verde y Azul. 8. Debe cambiar el nombre de cada uno de ellos. Se llamarn: optRojo, optVerde, optAzul. 9. La ventana tendr el siguiente aspecto cuando termine:

10. Si ejecuta el programa, observar que pueden seleccionarse varios colores a la vez. Esto no es interesante, ya que los botones de opcin se usan para activar solo una opcin entre varias.

11. Hay que hacer que solo un botn de opcin pueda estar seleccionado a la vez. Para ello, debe aadir un nuevo objeto. Realice los siguientes pasos: a. Aada un objeto del tipo ButtonGroup al formulario. Atencin! Este objeto es invisible, y no se ver en el formulario, sin embargo, lo podris ver en el Inspector, en la parte de Otros Componentes:

b. Tienes que darle un nombre al ButtonGroup. El nombre ser grupoColores. c. Ahora, hay que conseguir que los tres botones pertenezcan al mismo grupo. Es decir, que pertenezcan al grupo grupoColores. d. Selecciona el botn de opcin optRojo y cambia su propiedad buttonGroup, indicando que pertenece al grupo colores (observa la imagen):

e. Haz lo mismo con los botones optVerde y optAzul.

12. Acabas de asociar los tres botones de opcin a un mismo grupo. Esto produce que solo una de las tres opciones pueda estar activada. Prubelo ejecutando el programa.

13. Ahora interesa que la opcin Rojo salga activada desde el principio. Una forma de hacer esto es programando en el Constructor lo siguiente: optRojo.setSelected(true); El mtodo setSelected hace que se pueda activar o desactivar un botn de opcin. Prueba el programa. Observa como la opcin Rojo est activada inicialmente.

14. El programa no est terminado an. Interesa que cuando el usuario pulse el botn Aceptar, en la etiqueta aparezca el color elegido. Para ello, en el actionPerformed del botn Aceptar programe lo siguiente: String mensaje="Color elegido: "; if (optRojo.isSelected()) { mensaje=mensaje+"Rojo"; } else if (optVerde.isSelected()) { mensaje=mensaje+"Verde"; } else if (optAzul.isSelected()) { mensaje=mensaje+"Azul"; } etiResultado.setText(mensaje);

15. Observa el cdigo. En l se hace lo siguiente: a. Se crea una variable de cadena llamada mensaje. b. En esa variable se introduce el texto Color elegido: c. Luego se comprueba que opcin est seleccionada, usando el mtodo isSelected de los botones de opcin. Este mtodo te dice si un botn est seleccionado o no. d. Segn la opcin que est seleccionada, se aade un texto u otro a la cadena mensaje. e. Finalmente se muestra la cadena mensaje en la etiqueta etiResultado.

16. Ejecute el programa. Seleccione por ejemplo la Verde. Al pulsar Aceptar el resultado debe ser el siguiente:

CONCLUSIN Los botones de opcin, tambin llamados botones de radio (JRadioButton) se usan cuando quieres que el usuario pueda elegir una opcin de entre varias. Es interesante que los botones de radio aparezcan dentro de un panel JPanel. Se recomienda colocar un borde al panel. Es totalmente necesario aadir un objeto del tipo ButtonGroup, y hacer que los botones de radio pertenezcan a dicho grupo. En caso contrario, ser posible activar varios botones de opcin a la vez.

EJERCICIO GUIADO. JAVA: CUADROS DE LISTA


1. Realiza un nuevo proyecto. 2. En la ventana principal debes aadir lo siguiente: a. Un botn Aceptar llamado btnAceptar. b. Una etiqueta con borde llamada etiResultado. 3. Aade un cuadro de lista. Los cuadros de listas son objetos JList.

4. Cmbiale el nombre al JList. Ten cuidado, ya que en los JList aparecen siempre dentro de otro objeto llamado jScrollPane. Si miras en el Inspector, vers que al pulsar en el botn + del jScrollPane aparecer tu JList:

5. Aprovecha para cambiarle el nombre al JList. El nuevo nombre ser lstColores. 6. Si te fijas en el JList, consiste en un cuadro que contiene una serie de Items. Estos elementos pueden ser cambiados a travs de la propiedad Model del JList. 7. Busca la propiedad Model y haz clic en el botn de los tres puntos. Aparecer un cuadro de dilogo parecido al siguiente. Solo tienes que seleccionar los elementos que quieras y pulsar el botn Borrar (Remove) para eliminarlos de la lista. 8. Puedes aadir elementos escribindolos en el cuadro Artculo y luego pulsando el botn Aadir (Add).

9. Debes hacer que la lista sea la siguiente: Rojo Verde Azul 10. Ahora programaremos el actionPerformed del botn Aceptar. Debes introducir el siguiente cdigo:
String mensaje; mensaje="El color seleccionado es: "+lstColores.getSelectedValue().toString(); etiResultado.setText(mensaje);

11. Observa el cdigo: a. Se crea una variable de cadena llamada mensaje. b. Y dentro de esta variable se introduce una concatenacin de cadenas. c. Observa la parte: lstColores.getSelectedValue(), esta parte devuelve el valor seleccionado de la lista. d. Hay que tener en cuenta que este valor no es una cadena, por eso hay que convertirla a cadena aadiendo .toString(). e. De esta manera puedes extraer el elemento seleccionado de un cuadro de lista. f. Luego simplemente ponemos la cadena mensaje dentro de la etiqueta. 12. Ejecuta el programa y observa su funcionamiento. Por ejemplo, si seleccionas el color verde y pulsas aceptar el resultado ser el siguiente:

13. Vamos a mejorar el programa. Puede suceder que el usuario no seleccione ningn valor del cuadro de lista, y sera interesante en este caso que el programa avisara de ello. Cambie el cdigo del botn Aceptar por este otro cdigo:
String mensaje; if (lstColores.getSelectedIndex()==-1) { mensaje="No hay un color seleccionado."; } else { mensaje="El color seleccionado es: "+lstColores.getSelectedValue().toString(); } etiResultado.setText(mensaje);

14. Observa el cdigo: a. El mtodo getSelectedIndex me dice el ndice del elemento que est seleccionado.

b. Por ejemplo, si est seleccionado el primero el ndice es 0, si est seleccionado el segundo el ndice es 1, etc. c. Si este mtodo devuelve -1, entonces es seal de que no hay ningn elemento seleccionado. d. Aprovecho esto para mostrar un mensaje indicando lo sucedido. 15. Si ejecuta el programa y pulsa el botn Aceptar sin seleccionar nada el resultado debera ser el siguiente:

16. Se podra haber prescindido del botn aceptar si el cdigo anterior se hubiera puesto en el evento mouseClicked del cuadro de lista en vez de en el actionPerformed del botn Aceptar. En este caso, cada vez que se seleccionara un elemento de la lista, automticamente aparecera el mensaje en la etiqueta. Se anima a que realice esta modificacin.

CONCLUSIN El objeto JList permite crear cuadros de lista. Estos objetos contienen una serie de elementos que pueden ser seleccionados. A travs del mtodo getSelectedValue se puede obtener el elemento que est seleccionado. (Recuerda convertirlo a cadena con toString) A travs del mtodo getSelectedIndex se puede saber la posicin del elemento seleccionado. Si este ndice es -1, entonces sabremos que no hay ningn elemento seleccionado.

EJERCICIO GUIADO. JAVA: CUADROS COMBINADOS


1. Realiza un nuevo proyecto. 2. En la ventana principal debes aadir lo siguiente: a. Una etiqueta con borde llamada etiResultado. 3. Aade un cuadro combinado (combo). Los cuadros combinados son objetos del tipo JComboBox. Bsicamente, un combo es una lista desplegable.

4. Cmbiale el nombre al JComboBox. El nombre ser cboColores. Tu programa debe tener ms o menos este aspecto.

5. Los elementos del cboColores pueden ser cambiados a travs de la propiedad Model. Selecciona el combo y activa la propiedad Model (el botoncito con los tres puntos) Aparecer lo siguiente:

6. Al igual que pasaba con los cuadros de lista, se pueden eliminar los elementos que contiene el combo y aadir elementos propios. Use los botones Aadir y Eliminar para aadir la siguiente lista de elementos: Rojo Verde Azul 7. Ejecuta el programa y observa el funcionamiento del desplegable...

8. Vamos a hacer que cuando se elija un elemento del desplegable, en la etiqueta aparezca un mensaje indicando el color elegido. Para ello, debes programar el evento actionPerformed del combo y aadir el siguiente cdigo:
String mensaje="El color elegido es "; mensaje=mensaje+cboColores.getSelectedItem().toString(); etiResultado.setText(mensaje);

9. Este cdigo hace lo siguiente: a. Crea una variable de cadena. b. Concatena dentro de ella el mensaje El color elegido es con el color seleccionado. c. Observa el mtodo getSelectedItem, se usa para saber el elemento seleccionado del combo. Es necesario convertirlo a texto con toString. d. Finalmente se coloca el mensaje en la etiqueta. 10. Ejecuta el programa y comprueba su funcionamiento. Por ejemplo, si elegimos el color verde, el aspecto del programa ser el siguiente:

11. Los cuadros combinados pueden funcionar tambin como cuadros de texto. Es decir, pueden permitir que se escriba texto dentro de ellos. Para hacer esto, basta con cambiar su propiedad editable y activarla.

12. Ejecuta el programa y observa como se puede escribir dentro del combo. Al pulsar Enter, el programa funciona igualmente con el texto escrito.

Se escribe aqu y se pulsa enter

CONCLUSIN Los combos son listas desplegables donde se puede elegir una de las opciones propuestas. Los combos pueden funcionar tambin como cuadros de textos, si se activa la opcin editable. A travs del mtodo getSelectedItem se puede extraer la opcin seleccionada o el texto escrito en el combo.

EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA


1. Realiza un nuevo proyecto. 2. En la ventana principal debes aadir lo siguiente: a. Una etiqueta con borde llamada etiResultado. 3. Aade un cuadro de lista al formulario (JList).

4. Borra todo el contenido de la lista (propiedad model) y cmbiale el nombre a la lista. La lista se llamar lstNombres. Recuerda que las listas aparecen dentro de un objeto del tipo JScrollPane.

5. Aade dos botones al formulario. Uno de ellos tendr el texto Curso 1 y se llamar btnCurso1 y el otro tendr el texto Curso 2 y se llamar btnCurso2.

6. En el evento actionPerformed del botn Curso 1 programa lo siguiente: DefaultListModel modelo = new DefaultListModel(); modelo.addElement("Juan"); modelo.addElement("Mara"); modelo.addElement("Luis"); lstNombres.setModel(modelo);

7. En el evento actionPerformed del botn Curso 2 programa lo siguiente: DefaultListModel modelo = new DefaultListModel(); modelo.addElement("Ana"); modelo.addElement("Marta"); modelo.addElement("Jose"); lstNombres.setModel(modelo);

8. Explicacin de los cdigos anteriores: a. Lo que hace cada botn es rellenar el cuadro de lista con una serie de nombres. En el caso del botn Curso 1, la lista se rellena con los nombres Juan, Mara y Luis, mientras que en el caso del botn Curso 2, la lista se rellena con los nombres Ana, Marta y Jose. b. El contenido de un cuadro de lista es lo que se denomina un modelo. El modelo es un objeto que contiene el listado de elementos de la lista. c. Los modelos de las listas son objetos del tipo DefaultListModel. d. Lo que hace el programa es crear un modelo. Luego rellena el modelo con datos, y finalmente asocia el modelo al cuadro de lista. Veamos como se hace todo esto.

e. Primero se crea el modelo, a travs de la siguiente instruccin (ser necesario aadir el import correspondiente, atento a la bombillita): DefaultListModel modelo = new DefaultListModel(); f. El modelo tiene un mtodo llamado addElement que permite introducir datos dentro de l. As pues usamos este mtodo para aadir los datos al modelo.

modelo.addElement("Ana"); modelo.addElement("Marta"); modelo.addElement("Jose"); g. Finalmente asociamos el modelo creado al cuadro de lista de la siguiente forma: lstNombres.setModel(modelo); h. As pues, aqu tienes una forma de cambiar el contenido de un cuadro de lista desde el propio programa.

9. Prueba a ejecutar el programa. Observa como cuando pulsas cada botn cambia el contenido de la lista:

Click y cambia el listado.

10. Ahora aade el siguiente cdigo al evento mouseClicked del cuadro de lista:
etiResultado.setText(lstNombres.getSelectedValue().toString());

Esta instruccin hace que al seleccionar un elemento del cuadro de lista ste aparezca en la etiqueta etiResultado. Recuerda que el mtodo getSelectedValue permite recoger el elemento seleccionado (hay que convertirlo a cadena con toString)

11. Ejecuta el programa:

Click y aparece el elemento seleccionado en la etiqueta.

12. Una propuesta. Aada un botn Vaciar llamado btnVaciar. Este botn vaciar el contenido de la lista. Para esto lo nico que tiene que hacer es crear un modelo y, sin introducir ningn valor en l, asociarlo al cuadro de lista.

CONCLUSIN Un cuadro de lista es un objeto que contiene a su vez otro objeto denominado modelo. El objeto modelo es el que realmente contiene los datos de la lista. Cuadro de lista Modelo Datos Se puede crear un modelo y luego introducir datos en l. Luego se puede asociar ese modelo a la lista. De esta manera se puede cambiar el contenido de la lista en cualquier momento.

EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA


1. Realiza un nuevo proyecto. 2. En la ventana principal debes aadir lo siguiente: a. b. c. d. Un combo llamado cboNumeros. Un botn Pares llamado btnPares. Un botn Impares llamado btnImpares. Una etiqueta con borde llamada etiResultado.

3. Elimina todos los elementos que contenga el combo. Recuerda, debes usar la propiedad model del combo para cambiar sus elementos. 4. Despus de haber hecho todo esto, tu ventana debe quedar ms o menos as:

5. En el evento actionPerformed del botn Pares, programa lo siguiente:


int i; DefaultComboBoxModel modelo = new DefaultComboBoxModel(); for (i=0;i<10;i+=2) { modelo.addElement("N "+i); } cboNumeros.setModel(modelo);

6. Observa lo que hace este cdigo: a. Crea un objeto modelo para el combo. Al igual que pasa con los cuadros de lista, los combos tienen un objeto modelo que es el que realmente contiene los datos. En el caso de los combos, para crear un objeto modelo se usar esta instruccin:
DefaultComboBoxModel modelo = new DefaultComboBoxModel();

b. A continuacin, se usa el objeto modelo creado y se rellena de datos. Concretamente, se rellena con los nmeros pares comprendidos entre 0 y 10. c. Observa el uso de la propiedad addElement para aadir un elemento al modelo del combo. d. Se ha usado un bucle for para hacer la introduccin de datos en el modelo ms fcil. e. Finalmente, se asocia el modelo al combo a travs de la siguiente lnea, con lo que el combo aparece relleno con los elementos del modelo:
cboNumeros.setModel(modelo);

7. Ejecuta el programa y observa el funcionamiento del botn Pares.

Se pulsa y se rellena automticamente

8. El botn Impares es similar. Programa su actionPerformed como sigue:


int i; DefaultComboBoxModel modelo = new DefaultComboBoxModel(); for (i=1;i<10;i+=2) { modelo.addElement("N "+i); } cboNumeros.setModel(modelo);

9. La nica diferencia de este cdigo es el for, que est diseado para que se introduzcan los nmeros impares comprendidos entre 0 y 10 dentro del modelo.

10. Finalmente se programar el actionPerformed del combo para que al seleccionar un elemento este aparezca en la etiqueta. Esto se hace con una simple instruccin:

etiResultado.setText(cboNumeros.getSelectedItem().toString());

Recuerda el uso de getSelectedItem() para recoger el elemento seleccionado, y el uso de toString() para convertirlo a texto.

11. Prueba el programa. Prueba los botones Pares e Impares y prueba el combo.

12. Sera interesante aadir un botn Vaciar llamado btnVaciar que vaciara el contenido del combo. Esto se hara simplemente creando un modelo vaco y asignarlo al combo. Se anima al alumno a que realice esta mejora.

CONCLUSIN Un combo, al igual que los cuadros de lista, es un objeto que contiene a su vez otro objeto denominado modelo. El objeto modelo es el que realmente contiene los datos del combo. Combo Modelo Datos Se puede crear un modelo y luego introducir datos en l. Luego se puede asociar ese modelo al combo. De esta manera se puede cambiar el contenido del combo en cualquier momento.

EJERCICIO GUIADO. JAVA: TOGGLEBUTTONS


1. Realiza un nuevo proyecto. 2. Crears una ventana como la que sigue teniendo en cuenta lo siguiente: a. Se aadir una etiqueta con el texto Precio Base. No hace falta cambiarle su nombre. b. Se aadir un cuadro de texto llamado txtPrecioBase. c. Se crear un botn Calcular, llamado btnCalcular. d. Se crear una etiqueta vaca y con borde llamada etiTotal. Use la propiedad font de esta etiqueta para hacer que el texto tenga un mayor tamao.

e. Debes aadir tambin tres botones, con el texto Instalacin, Formacin y Alimentacin BD respectivamente. Estos botones no son botones normales, son botones del tipo JToggleButton. Usa este tipo de objeto para crearlos. Estos botones, se diferencian de los botones normales en que se quedan pulsados cuando se hace un clic sobre ellos, y no vuelven a su estado normal hasta que no se vuelve a hacer clic sobre ellos. Los tres botones se llamarn respectivamente: tbtnInstalacion, tbtnFormacion, tbtnAlimentacionBD.

f.

Aade finalmente tres etiquetas conteniendo los nmeros 40, 200, 200. La primera se llamar etiPrecioInstalacion, la segunda etiPrecioFormacion y la tercera etiPrecioAlimentacionBD.

3. Prueba el programa y comprueba el funcionamiento de los botones JToggleButton:

Observa como al pulsar los JToggledButton estos se quedan pulsados. Si se vuelven a activar se despulsan.

4. Se pretende que el programa funcione de la siguiente forma: El usuario introducir un precio base para el servicio que se vende. A continuacin, si el cliente quiere la instalacin, activar el botn Instalacin. Si el cliente quiere la formacin, activar el botn Formacin. Si el cliente quiere la Alimentacin de Base de Datos, activar el botn Alimentacin BD. e. Ten en cuenta que el cliente puede querer una o varias de las opciones indicadas. f. Finalmente se pulsar el botn calcular y se calcular el precio total. Este precio se calcula de la siguiente forma: Precio Total = Precio Base + Precio Extras. El precio de los Extras depender de las opciones elegidas por el usuario. Por ejemplo, si el usuario quiere Instalacin y Formacin, los extras costarn 240 euros. a. b. c. d.

5. As pues, se programar el actionPerformed del botn Calcular de la siguiente forma:

double double double double

precio_base; precio_instal; //precio instalacin precio_for; //precio formacion precio_ali; //precio alimentacion

//Recojo datos desde la ventana: precio_base = Double.parseDouble(txtPrecioBase.getText()); precio_instal = Double.parseDouble(etiPrecioInstalacion.getText()); precio_for = Double.parseDouble(etiPrecioFormacion.getText()); precio_ali = Double.parseDouble(etiPrecioAlimentacionBD.getText()); //Ahora que tengo los datos, puedo hacer clculos. //Al precio base se le van aadiendo precio de extras //segn estn o no activados los JToggleButtons double precio_total; precio_total = precio_base; if (tbtnInstalacion.isSelected()) { //Si se seleccion instalacin precio_total = precio_total+precio_instal; } if (tbtnFormacion.isSelected()) { //Si se seleccion formacin precio_total = precio_total+precio_for; } if (tbtnAlimentacionBD.isSelected()) { //Si se seleccion Alimentacin BD precio_total = precio_total+precio_ali; }

//Finalmente pongo el resultado en la etiqueta etiTotal.setText(precio_total+" ");

6. Veamos una explicacin del cdigo: a. Primero se crean variables doubles (ya que se admitirn decimales) para poder hacer los clculos. b. Se extraern los datos de la ventana y se almacenarn en dichas variables. Para ello, hay que convertir desde cadena a double:
precio_base = Double.parseDouble(txtPrecioBase.getText()); precio_instal = Double.parseDouble(etiPrecioInstalacion.getText()); precio_for = Double.parseDouble(etiPrecioFormacion.getText()); precio_ali = Double.parseDouble(etiPrecioAlimentacionBD.getText());

c. Una vez obtenidos los datos en forma numrica, ya se pueden hacer clculos con ellos. El programa declara una nueva variable precio_total donde se introducir el resultado. En primer lugar se introduce en esta variable el precio base.
double precio_total; precio_total = precio_base;

d. A continuacin se le suma al precio_total los precios de los extras si el botn correspondiente est seleccionado. Esto se hace a travs de if. Por ejemplo, para sumar el extra por instalacin:
if (tbtnInstalacion.isSelected()) { //Si se seleccion instalacin precio_total = precio_total+precio_instal; }

Esto significa: Si el botn instalacin est seleccionado, aade al precio total el precio por instalacin Observa el uso del mtodo isSelected para saber si el botn tbtnInstalacion ha sido seleccionado. e. Finalmente el resultado se muestra en la etiqueta de total.

7. Comprueba el funcionamiento del programa


Introduce una cantidad (usa el punto para los decimales) Selecciona los extras que desees. Pulsa Calcular y obtendrs el resultado.

8. Supongamos que normalmente (en el 90 por ciento de los casos) la instalacin es solicitada por el usuario. Podra ser interesante que el botn Instalacin ya saliera activado al ejecutarse el programa. Para ello, aade en el Constructor la siguiente lnea.
tbtnInstalacion.setSelected(true);

Esta lnea usa el mtodo setSelected para activar al botn tbtnInstalacin. Comprueba esto ejecutando el programa.

CONCLUSIN Los JToggleButton son botones que pueden quedarse pulsados. A travs del mtodo isSelected podemos saber si un JToggleButton est seleccionado. Tambin puedes usar el mtodo setSelected para seleccionar o no un botn de este tipo. Realmente, estos botones no suelen ser muy usados, ya que pueden ser sustituidos por Cuadros de Verificacin (JCheckBox) que son ms conocidos.

EJERCICIO GUIADO. JAVA: SLIDERS

Introduccin a los JSliders


La clase JSlider permite crear objetos como el siguiente:

Estos elementos tienen un pequeo recuadro que se puede arrastrar a derecha o izquierda. Segn la posicin del recuadro, el JSlider tendr un valor concreto. El JSlider se puede configurar para que muestre los distintos valores que puede tomar:

Tambin se puede configurar de forma que los valores mnimo y mximo sean distintos:

El valor que tiene un JSlider es el valor al que apunta el recuadro del JSlider. En la imagen anterior, el JSlider tiene un valor de 85. Se ver a continuacin las caractersticas ms interesantes de los JSlider y como programarlos.

Ejercicio guiado 1. Crea un nuevo proyecto. 2. Aade en l un JSLider. Su nombre ser slDeslizador.

3. Aade una etiqueta con borde. Su nombre ser etiValor. 4. La ventana tendr el siguiente aspecto:

5. Un JSlider tiene un valor mnimo y un valor mximo. El valor mnimo es el valor que tiene cuando el recuadro est pegado a la parte izquierda, mientras que el valor mximo es el valor que tiene cuando el recuadro est pegado a la parte derecha. El valor mnimo y mximo del JSlider se puede cambiar. Busca las propiedades maximum y minimum del JSlider y asigna los siguientes valores: Mximo: 500 Mnimo: 100

6. Se puede asignar un valor inicial al JSlider a travs de su propiedad value. Busque esta propiedad y asigne un valor de 400. Observe donde se sita el recuadro del JSlider.

7. Se puede mejorar el JSlider definiendo unas divisiones (medidas) Por ejemplo, haremos que cada 50 unidades aparezca una divisin. Para ello use la propiedad majorTickSpacing y asigne un 50.

8. Esto, en realidad, no produce ningn cambio en el JSlider. Para que las divisiones se vean, es necesario que active tambin la propiedad paintTicks. Esta propiedad pintar divisiones en el JSlider:

Medidas cada 50 unidades

9. An se puede mejorar la presentacin del JSlider, si hacemos que aparezca el valor de cada divisin. Para ello debes activar la propiedad paintLabel.

10. Ejecuta el programa para ver el funcionamiento del Deslizador y su aspecto. Debe ser parecido al siguiente:

11. Bien. Ahora se pretende que cuando el usuario arrastre el deslizador, en la etiqueta aparezca el valor correspondiente. Para ello tendr que programar el evento stateChanged del JSlider. El evento stateChanged sucede cuando el usuario arrastra el recuadro del deslizador. En este evento programe lo siguiente: etiValor.setText("El valor es: "+slDeslizador.getValue());

12. Ejecute el programa y observe lo que sucede cuando arrastra el deslizador. 13. La explicacin del cdigo es la siguiente: a. El mtodo getValue del deslizador nos devuelve el valor que tiene actualmente el deslizador. b. Este valor es concatenado a la cadena El valor es: y es mostrado en la etiqueta a travs del conocido setText.

Movemos aqu. Y aparece el valor correspondiente aqu.

14. A continuacin se mencionan otras propiedades interesantes de los JSlider que puedes probar por tu cuenta: orientation Permite cambiar la orientacin del JSlider. Podras por ejemplo hacer que el JSlider estuviera en vertical. minorTickSpacing Permite asignar subdivisiones a las divisiones ya asignadas. Prueba por ejemplo a asignar un 10 a esta propiedad y ejecuta el programa. Observa las divisiones del JSlider. snapToTicks Cuando esta propiedad est activada, no podrs colocar el deslizador entre dos divisiones. Es decir, el deslizador siempre estar situado sobre una de las divisiones. Prueba a activarla.

paintTrack Esta propiedad permite pintar o no la lnea sobre la que se desliza el JSlider. Prueba a desactivarla.

CONCLUSIN Los JSliders son objetos deslizadores. Permiten elegir un valor arrastrando un pequeo recuadro de derecha a izquierda o viceversa. El valor de un JSliders puede ser obtenido a travs de su mtodo getValue. Si quieres programar el cambio (el arrastre) en el deslizador, tienes que programar el evento llamado stateChanged.

EJERCICIO GUIADO. JAVA: SPINNER

Introduccin a los JSpinner


La clase JSpinner permite crear cuadros como el siguiente:

Son elementos muy comunes en los programas. A travs de los dos botones triangulares se puede hacer que el valor del cuadro aumente o disminuya. Tambin se puede escribir directamente un valor dentro del cuadro.

Ejercicio guiado 1. Crea un nuevo proyecto. 2. Aade en l un JSpinner. Su nombre ser spiValor.

3. Aade una etiqueta con borde. Su nombre ser etiValor. 4. La ventana tendr el siguiente aspecto:

5. Interesa que cuando cambie el JSpinner (ya sea porque se pulsaron los botones triangulares o porque se escribi dentro) aparezca el valor correspondiente dentro de la etiqueta. Para ello, tendr que programar el evento stateChanged del JSpinner. En el evento stateChanged introduzca el siguiente cdigo:
etiValor.setText("El valor es: "+spiValor.getValue().toString());

6. Como puedes observar, lo que hace el programa es recoger el valor que tiene el JSpinner a travs del mtodo getValue y luego se lo asigna a la etiqueta con el clsico setText. (Es muy parecido a los deslizadores) Debes tener en cuenta que el valor devuelto no es un nmero ni una cadena, as que en el ejemplo se ha usado el mtodo toString() para convertirlo a una cadena.

7. Prueba el programa y observa su funcionamiento:


El usuario modifica el valor del JSpinner...

Y aqu aparece el valor seleccionado.

8. Observa como los valores del JSpinner aumentan o disminuyen en 1. Por otro lado, no parece haber un lmite para los valores del JSpinner. La pregunta ahora es: Se puede modificar el contenido del JSpinner de forma que tenga unos valores concretos? La respuesta es s. Veamos como hacerlo.

9. Entra dentro del cdigo del programa y, dentro del constructor, aade este cdigo debajo de initComponents:
SpinnerNumberModel nm = new SpinnerNumberModel(); nm.setMaximum(10); nm.setMinimum(0); spiValor.setModel(nm);

10. Este cdigo hace lo siguiente: a. El JSpinner, al igual que los JList y los JComboBox, es un objeto que contiene otro objeto modelo, y es el objeto modelo el que contiene los nmeros visualizados en el JSpinner. b. En el cdigo anterior se crea un modelo para el JSpinner, se definen los valores que contendr, y luego se asigna al JSpinner. Estudiemos las lneas del cdigo. c. La primera lnea crea un modelo llamado nm. Los modelos de los JSpinner son del tipo SpinnerNumberModel. Necesitars incluir el import correspondiente (atento a la bombilla)

d. En la segunda lnea se define como valor mximo del modelo el 10, a travs de un mtodo llamado setMaximum. e. En la tercera lnea se define como valor mnimo del modelo el 0, a travs de un mtodo llamado setMinimum. f. Finalmente se asigna el modelo creado al JSpinner.

g. Este cdigo, en definitiva, har que el JSpinner muestre los valores comprendidos entre 0 y 10.

11. Prueba el programa y observa los valores que puede tomar el JSpinner.

Ahora los valores estn comprendidos entre 0 y 10

12. Vamos a aadir otra mejora. Cambie el cdigo del constructor por este otro. (Observa que solo se ha aadido una lnea):
SpinnerNumberModel nm = new SpinnerNumberModel(); nm.setMaximum(10); nm.setMinimum(0); nm.setStepSize(2); spiValor.setModel(nm);

13. La lnea aadida es:


nm.setStepSize(2);

Esta lnea usa un mtodo del modelo del JSpinner que permite definir el valor de cambio del JSPinner. Dicho de otra forma, esta lnea hace que los valores del JSpinner salten de 2 en 2. 14. Ejecuta el programa de nuevo y observa como cambian los valores del JSpinner.

15. El modelo del JSpinner tiene tambin un mtodo llamado setValue que permite asignar un valor inicial al modelo. Pruebe a usar este mtodo para hacer que el JSpinner muestre desde el principio el valor 4.

CONCLUSIN Los JSpinners son objetos que permiten seleccionar un nmero, ya sea escribindolo en el recuadro, o bien a travs de dos botones triangulares que permiten aumentar o disminuir el valor actual. Los JSpinners son objetos con modelo. Es decir, este objeto contiene a su vez otro objeto modelo que es el que realmente contiene los datos. Datos Modelo JSpinner Para definir el contenido del JSpinner es necesario crear un modelo del tipo SpinnerNumberModel. Se le asigna al modelo los nmeros deseados, y finalmente se une el modelo con el JSpinner. El objeto modelo del JSpinner permite definir el valor mnimo y el valor mximo, as como el intervalo de aumento de los valores.

EJERCICIO GUIADO. JAVA: SCROLLBARS

Introduccin a las JscrollBars (Barras de desplazamiento)


La clase JScrollBar permite crear barras de desplazamiento independientes, como la que se muestra a continuacin:

La barra tiene un valor mnimo, que se consigue haciendo que el recuadro de la barra de desplazamiento est pegado a la parte izquierda.

Valor mnimo

Cuando se pulsa algunos de los botones de la barra de desplazamiento, el valor de la barra se incrementa / decrementa poco a poco. A este incremento / decremento lo llamaremos incremento unitario.

Decrementa el valor poco a poco (incremento unitario)

Incrementa el valor poco a poco (incremento unitario)

Cuando se pulsa directamente sobre la barra, el valor de la barra se incrementa / decrementa en mayor cantidad. A este incremento / decremento lo llamaremos incremento en bloque.

Al pulsar directamente sobre la barra se decrementa en mayor cantidad (incremento en bloque)

Al pulsar directamente sobre la barra se incremente en mayor cantidad (incremento en bloque)

Ejercicio guiado 1. Para comprender mejor el funcionamiento de las barras de desplazamiento se crear un proyecto nuevo. 2. Aade en el proyecto una barra de desplazamiento (JScrollBar) y llmala desValor.

3. La barra de desplazamiento aparecer en vertical. Use la propiedad de la barra llamada Orientation para hacer que la barra aparezca en posicin horizontal.

4. Aade tambin una etiqueta con borde y llmala etiValor. 5. La ventana debe quedar ms o menos as:

6. Interesa que cuando el usuario cambie de alguna manera la barra de desplazamiento, en la etiqueta aparezca el valor de la barra. Para ello, se debe programar el evento AdjustmentValueChanged de la barra de desplazamiento. En este evento programa lo siguiente:
etiValor.setText("El valor es: "+desValor.getValue());

7. Como ves, se coloca en la etiqueta el valor de la barra. El valor de la barra se obtiene con el mtodo getValue. Ejecuta el programa para ver su funcionamiento.
Pulsa aqu y observa como el valor cambia poco a poco

Pero si pulsas aqu el valor cambia en mayor cantidad

8. Sigamos estudiando el programa. Se pide que cambies las siguientes propiedades de tu barra: Minimum Permite asignar el valor mnimo de la barra. Escribe un 50 Maximum Permite asignar el valor mximo de la barra. Escribe un 150

UnitIncrement Permite cambiar el incremento unitario. Escribe un 2.

BlockIncrement Permite cambiar el incremento en bloque. Escribe un 20.

VisibleAmount Permite cambiar el ancho del recuadro de la barra. Escribe un 5.

9. Ejecuta ahora el programa y comprueba su funcionamiento:


Si pulsas aqu, el valor se incrementa de 2 en 2, ya que el incremento unitario se configur en 2.

Si pulsas aqu, el valor se incrementa de 20 en 20, ya que el incremento en bloque es de 20.

Si llevas la barra de desplazamiento al mnimo, su valor ser de 50, ya que se configur as con la propiedad minimum

Observa lo que sucede cuando llevas la barra de desplazamiento al mximo: aparece un valor de 145, cuando el valor mximo que asignamos fue de 150 por qu?

10. Tal como se ha indicado anteriormente, pasa algo raro con la barra de desplazamiento cuando esta est al mximo. Se esperaba que alcanzara el valor 150, y sin embargo, el valor mximo alcanzado fue de 145. La explicacin es la siguiente:
Valor mximo (150) *

5 Valor de la barra (145) **

***

* Nuestra barra tiene un valor mximo de 150. ** Sin embargo, el valor de la barra viene indicado por el lado izquierdo del recuadro interno. *** Como el recuadro interno tiene un ancho definido a travs de la propiedad VisibleAmount, el valor mximo que la barra puede alcanzar es de: Valor = ValorMximo Ancho del recuadro. Es decir, Valor alcanzable = 150 5 = 145

11. A travs del mtodo setValue de la barra de desplazamiento se puede asignar un valor inicial a la barra. Programe en el constructor de su programa lo necesario para que la barra de desplazamiento tenga un valor de 70 al empezar el programa.

CONCLUSIN Las JScrollBars son barras de desplazamiento independientes. Al igual que los JSliders, las JScrollBars tienen un valor concreto, que puede ser obtenido a travs del mtodo getValue. Entre las caractersticas programables de una barra de desplazamiento, tenemos las siguientes: - Valor mnimo (propiedad Minimum) - Valor mximo (propiedad Maximum) - Incremento unitario (propiedad UnitIncrement) - Incremento en bloque (propiedad BlockIncrement) - Tamao del recuadro de la barra (propiedad VisibleAmount)

EJERCICIO GUIADO. JAVA: BARRA DE MENUS

Barras de Mens
La barra de mens nos permitir acceder a las opciones ms importantes del programa. Todo programa de gran envergadura suele tener una barra de mens.

Ejercicio guiado 1. Veamos como aadir una barra de mens a nuestras aplicaciones. En primer lugar, crea un proyecto con el NetBeans. 2. Aade a tu ventana un objeto JMenuBar

3. En la parte superior de tu ventana aparecer esto:

4. En el inspector (parte inferior izquierda) observars como aparece un objeto JMenuBar, y, dentro de l, un objeto del tipo JMenu. Los objetos JMenu representan las opciones principales contenidas dentro de la barra de mens.

5. Aprovecha el Inspector para cambiar el nombre al objeto JMenuBar. Llmalo barraMenus. 6. Cambia tambin el nombre al objeto JMenu. Asgnale el nombre menuArchivo. El Inspector tendr el siguiente aspecto:

7. Ahora, la nica opcin de la barra de mens muestra el texto Menu. Esto se puede cambiar seleccionndola y cambiando su propiedad text. Asgnale el texto Archivo a la opcin del men:

8. Ahora el aspecto de la barra de mens ser el siguiente:

9. Puedes aadir ms opciones principales a la barra de mens haciendo clic con el derecho sobre el objeto de la barra de mens y activando la opcin Aadir JMenu.

10. Aada dos opciones ms a la barra de mens. El inspector debe tener ahora el siguiente aspecto:

11. Y la barra de mens presentar este otro aspecto:

12. Cambia los nombres de las dos nuevas opciones. Sus nombres sern: menuEdicion y menuInsertar.

13. Cambia los textos de ambas opciones. Sus textos sern: Edicin e Insertar.

14. Ya tenemos creada la barra de mens (JMenuBar) con sus opciones principales (JMenu). Ahora se tendrn que definir las opciones contenidas en cada opcin principal. Por ejemplo, crearemos las opciones contenidas en el men Archivo. 15. Haz clic con el botn derecho sobre el objeto menuArchivo y activa la opcin Aadir JMenuItem.

Los JMenuItem son objetos que representan las opciones contenidas en los mens desplegables de la barra de mens.

16. Aade un JMenuItem ms al menuArchivo y luego cambia el nombre a ambos. Sus nombres sern menuItemAbrir y menuItemGuardar. El aspecto del Inspector ser el siguiente:

17. Usa ahora la propiedad Text de ambos JMenuItem para asignarles un texto. El primero tendr el texto Abrir y el segundo el texto Guardar. 18. Ya podemos ejecutar el programa para ver que es lo que se ha conseguido. Use el men:

Observa como la opcin Archivo se despliega mostrando dos submens: Abrir y Guardar.

19. Seguiremos aadiendo elementos al men. Ahora haga clic con el derecho sobre el elemento menuArchivo y aada un JSeparator.

Los JSeparator son objetos que definen una separacin entre las opciones de un men. Cmbiele el nombre y llmelo separador1:

20. Aada un nuevo JMenuItem al men Archivo y ponle el nombre menuSalir. El texto de esta opcin ser Salir (use su propiedad text) El aspecto del Inspector ser el siguiente:

21. Ejecuta el programa y observa el contenido de la opcin Archivo del men:

Observa el efecto que produce el separador.

22. Un JMenu representa las opciones principales de la barra de mens. A su vez, un JMenu contiene JMenuItem, que son las opciones contenidas en cada opcin principal, y que se ven cuando se despliega el men. Sin embargo, un JMenu puede contener a otros JMenu, que a su vez contendrn varios JMenuItem. Usando el botn derecho del ratn y la opcin Aadir, aade un JMenu dentro de menuEdicion:

23. Llama al nuevo JMenu menuColores y asignale el texto Colores.

24. Ahora aade dentro del menuColores tres JMenuItem llamados respectivamente: menuItemRojo, menuItemVerde, menuItemAzul. Sus textos sern Rojo, Verde y Azul.

25. Ejecuta el programa y observa como ha quedado el men Edicin:

La opcin Edicin (JMenu) contiene una opcin Colores (JMenu) que a su vez contiene las opciones Rojo, Verde y Azul (JMenuItems)

26. De nada sirve crear un men si luego este no reacciona a las pulsaciones del ratn. Cada objeto del men tiene un evento ActionPerformed que permite programar lo que debe suceder cuando se active dicha opcin del men.

27. Marque en el inspector el objeto menuItemRojo y acceda a su evento ActionPerformed. Dentro de l programe este sencillo cdigo: this.getContentPane().setBackground(Color.RED); Este cdigo cambia el color de fondo de la ventana a rojo. 28. Compruebe el funcionamiento de la opcin Rojo del men ejecutando el programa. 29. Programa tu mismo las opciones Verde y Azul.

CONCLUSIN Las barras de mens son un conjunto de objetos de distinto tipo que se contienen unos a los otros: La barra en s est representada por un objeto del tipo JMenuBar. La barra contiene opciones principales, representadas por objetos JMenu. Las opciones principales contienen opciones que aparecen al desplegarse el men. Esta opciones son objetos del tipo JMenuItem. Un JMenu tambin puede contener otros JMenu, que a su vez contendrn JMenuItems. Tambin puede aadir separadores (JSeparator) que permiten visualizar mejor las opciones dentro de un men.

EJERCICIO GUIADO. JAVA: BARRA DE HERRAMIENTAS

Barras de herramientas
Una barra de herramientas es bsicamente un contenedor de botones y otros elementos propios de la ventana. A travs de estos botones se pueden activar de forma rpida las opciones del programa, las cuales suelen estar tambin incluidas dentro de la barra de mens.

Ejercicio guiado 1. Veamos como aadir una barra de herramientas a nuestras aplicaciones. En primer lugar, crea un proyecto con el NetBeans. 2. Aade a tu ventana un objeto JmenuBar (una barra de mens) 3. En la parte superior de tu ventana aparecer esto:

4. Debajo de la barra de mens colocaremos una barra de herramientas, as que aade un objeto del tipo JToolBar. Haz que la barra se coloque debajo de la barra de mens y que alcance desde la parte izquierda de la ventana a la parte derecha. La ventana quedar as:

5. Las barras de herramientas son simples contenedoras de objetos. Dentro de ellas se pueden colocar botones, combos, etiquetas, etc. Normalmente, las barras de herramientas contienen botones. As que aade cuatro botones (JButton) dentro de la barra. Solo tienes que colocarlos dentro de ella.

6. Puedes ver si los botones estn bien colocados observando el Inspector: Observa como los botones colocados se encuentran dentro de la barra.

7. Aprovecharemos el inspector para cambiar el nombre a la barra y a cada botn. A la barra la llamaremos barraHerramientas, y a los botones los llamaremos btnUno, btnDos, btnTres y btnCuatro:

8. Cambia el texto de los botones. Estos contendrn el texto: Uno, Dos, Tres y Cuatro. 9. Ejecuta el programa y observa el resultado.

10. La forma de programar cada botn no vara, aunque estos se encuentren dentro de la barra herramientas. Solo hay que seleccionar el botn y acceder a su evento actionPerformed.

11. Solo como demostracin de esto ltimo, entra en el actionPerformed del primer botn y programa esto:
JOptionPane.showMessageDialog(null,"Activaste el botn uno");

Luego ejecuta el programa y comprueba el funcionamiento del botn.

12. Los botones de la barra de herramientas normalmente no contienen texto, sino que contienen un icono que representa la funcin que realiza. La forma de colocar un icono dentro de un botn es a travs de su propiedad icon. 13. A travs de la propiedad icon de un botn podr seleccionar un fichero de imagen que contenga la imagen a mostrar en el botn. 14. Activa la propiedad icon del primer botn. Luego elige la opcin Fichero y pulsa el botn Seleccionar Fichero para buscar un fichero con imagen. Nota: Busca un fichero de imagen que sea del tipo .gif o .jpg. Nota: Procura que la imagen sea pequea. Nota: Se recomienda buscar imgenes .gif en Internet para practicar.

15. Una vez colocadas las imgenes a los botones, se puede quitar el texto de estos. Un ejemplo de cmo podra quedar la barra de herramientas es este:

CONCLUSIN Las barras de herramientas son simplemente contenedores de objetos. Normalmente botones. Los elementos de la barra de herramientas se manejan de la misma forma que si no estuvieran dentro de la barra. Lo normal es hacer que los botones de la barra no tengan texto y tengan iconos asociados.

EJERCICIO GUIADO. JAVA: MENUS EMERGENTES

El evento mouseClicked
El evento mouseClicked es capaz de capturar un clic del ratn sobre un determinado elemento de la ventana. Este evento recibe como parmetro un objeto del tipo MouseEvent, y gracias a l se puede conseguir informacin como la siguiente: Qu botn del ratn fue pulsado. Cuantas veces (clic, doble clic, etc) En qu coordenadas fue pulsado el botn. Etc.

Se puede usar esta informacin para saber por ejemplo si se puls el botn derecho del ratn, y sacar en este caso un men contextual en pantalla. En este ejercicio guiado se estudiarn las posibilidades del evento mouseClicked y se aplicarn a la creacin y visualizacin de mens contextuales (o emergentes)

Ejercicio guiado 1. Crea un nuevo proyecto. 2. No hace falta que aada nada a la ventana. 3. Programaremos la pulsacin del ratn sobre el formulario, as que haga clic sobre el formulario y active el evento mouseClicked. 4. Observe el cdigo del evento:
private void formMouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: }

Este evento recibe como parmetro un objeto llamado evt del tipo MouseEvent (en rojo en el cdigo) que nos permite saber en qu condiciones se hizo clic.

5. Dentro del evento programe lo siguiente:


if (evt.getButton()==1) { JOptionPane.showMessageDialog(null,"Pulso el izquierdo"); } else if (evt.getButton()==2) { JOptionPane.showMessageDialog(null,"Pulso el central"); } else if (evt.getButton()==3) { JOptionPane.showMessageDialog(null,"Pulso el derecho"); }

6. Ejecuta el programa y haz clic sobre el formulario con el botn derecho, con el izquierdo y con el central. Observa el resultado. 7. Ahora quizs puedas comprender el cdigo anterior. En l, se usa el mtodo getButton del objeto evt para saber qu botn se puls. El mtodo getButton devuelve un entero que puede ser 1, 2 o 3 segn el botn pulsado.

8. Se puede aprovechar el mtodo getButton para controlar la pulsacin del botn derecho del ratn y as sacar un men contextual. Pero antes, es necesario crear el men. 9. Agrega a tu formulario un objeto del tipo JPopupMenu. Estos objetos definen mens emergentes. 10. Los objetos JPopupMenu no se muestran en el formulario, pero puedes verlo en el Inspector dentro de la rama de Otros Componentes:

11. Aprovecharemos el inspector para cambiar el nombre al men. Llmalo menuEmergente. 12. Los mens emergentes se crean igual que las opciones de mens normales, aadiendo con el botn derecho del ratn objetos JMenuItem. 13. Aada al men emergente tres JMenuItem, y asgneles los siguientes nombres a cada uno: menuRojo, menuVerde, menuAzul. El inspector debera tener el siguiente aspecto:

14. Tienes que cambiar la propiedad text de cada opcin del men. Recuerda que esta propiedad define lo que aparece en el men. Asignars los siguientes textos: Rojo, Verde y Azul. 15. El men emergente ya est construido. Ahora tenemos que hacer que aparezca cuando el usuario pulse el botn derecho del ratn sobre el formulario. Para ello, entraremos de nuevo en el evento mouseClicked del formulario y cambiaremos su cdigo por el siguiente:
menuEmergente.show(this,evt.getX(),evt.getY());

16. Este cdigo significa lo siguiente: El mtodo show le da la orden al menuEmergente para que se muestre. El mtodo show recibe tres elementos: por un lado la ventana donde acta (this) Por otro lado la posicin x donde debe mostrarse el men. Esta posicin es aquella donde se puls el ratn, y se puede conseguir gracias al mtodo getX del objeto evt. Por ltimo se necesita la posicin y. Esta posicin se puede conseguir gracias al mtodo getY del objeto evt. Es decir, decidimos mostrar el men emergente justo en las coordenadas donde se hizo clic.

17. Ejecuta el programa y observa el resultado.

Al hacer clic con el derecho se mostrar el men contextual. 18. Para hacer que al pulsarse una opcin suceda algo, solo hay que activar el mtodo actionPerformed del JMenuItem correspondiente. Por ejemplo, active el actionPerformed del menuRojo y dentro programe lo siguiente:
this.getContentPane().setBackground(Color.RED);

19. Ejecuta el programa y comprueba lo que sucede al pulsar la opcin Rojo del men contextual.

CONCLUSIN Los mens contextuales son objetos del tipo JPopupMenu. Estos objetos contienen JMenuItem al igual que las opciones de men normales. Cuando se asigna un JPopupMenu a un formulario, no aparece sobre la ventana, pero s en el inspector. Para hacer que aparezca el men emergente, es necesario programar el evento mouseClicked del objeto sobre el que quiera que aparezca el me. Tendr que usar el mtodo show del men emergente para mostrar dicho men.

EJERCICIO GUIADO. JAVA: FILECHOOSER

Cuadros de dilogo Abrir y Guardar


Las opciones Abrir y Guardar son opciones muy comunes en las aplicaciones. Estas opciones permiten buscar en el rbol de carpetas del sistema un fichero en concreto y abrirlo, o bien guardar una informacin dentro de un fichero en alguna carpeta. Java proporciona una clase llamada JFileChooser (elegir fichero) que permite mostrar la ventana tpica de Abrir o Guardar: Ventana Abrir fichero:

(La ventana de guardar es la misma, solo que muestra en su barra de ttulo la palabra Guardar) El objeto JFileChooser nos facilita la labor de elegir el fichero, pero no realiza la apertura o la accin de guardar la informacin en l. Esto tendr que ser programado.

Ejercicio guiado 1. Vamos a practicar con el JFileChooser. Para ello, crea un nuevo proyecto. 2. Aade en el proyecto los siguientes elementos: a. Una barra de mens. Llmala barraMenus. b. Dentro de ella una opcin Archivo llamada menuArchivo. c. Dentro de la opcin Archivo, introduce los siguientes elementos: - Una opcin Abrir, llamada menuAbrir. - Un separador (llmalo como quieras) - Una opcin Salir, llamada menuSalir. 3. Una vez hecho esto tu formulario tendr la siguiente forma:

4. Si ejecutas el programa el men se ver as:

5. Si observas el Inspector, tendr un aspecto parecido al siguiente:

6. Para que al pulsar la opcin Abrir de nuestro programa aparezca el dilogo de apertura de ficheros, es necesario aadir a nuestro programa un objeto del tipo JFileChooser. Los objetos JFileChooser se aadirn el la zona de Otros Componentes del inspector.

7. Haz clic con el derecho sobre la zona de otros componentes y activa la opcin Agregar desde Paleta Swing JFileChooser:

8. Aparecer entonces un objeto JFileChooser dentro de Otros Componentes. Aprovecha para cambiarle el nombre a este objeto. Su nombre ser elegirFichero. El inspector quedar as:

9. Una vez hecho esto, ya podemos programar la opcin Abrir del men. Activa el evento actionPerformed de la opcin Abrir y programa dentro de l lo siguiente:

int resp; resp=elegirFichero.showOpenDialog(this); if (resp==JFileChooser.APPROVE_OPTION) { JOptionPane.showMessageDialog(null,elegirFichero.getSelectedFile().toString()); } else if (resp==JFileChooser.CANCEL_OPTION) { JOptionPane.showMessageDialog(null,"Se puls la opcin Cancelar"); }

10. Ejecuta el cdigo y prueba la opcin Abrir del men. Prueba a elegir algn fichero y abrirlo. Prueba a cancelar la ventana de apertura. Etc 11. Analicemos el cdigo anterior:
int resp; resp=elegirFichero.showOpenDialog(this);

Estas dos lneas crean una variable entera resp (respuesta) y a continuacin hacen que se muestre la ventana Abrir Fichero. Observa que para conseguirlo hay que usar el mtodo showOpenDialog del objeto elegirFichero. Este mtodo lleva como parmetro la ventana actual (this) El mtodo showOpenDialog no solo muestra la ventana Abrir Fichero sino que tambin devuelve un valor entero segn el botn pulsado por el usuario en esta ventana. Esto es: botn Abrir o botn Calcelar. Se pueden usar dos if para controlar lo que sucede si el usuario puls el botn Abrir o el botn Calcelar de la ventana Abrir Fichero:

if (resp==JFileChooser.APPROVE_OPTION) { JOptionPane.showMessageDialog(null,elegirFichero.getSelectedFile().toString()); } else if (resp==JFileChooser.CANCEL_OPTION) { JOptionPane.showMessageDialog(null,"Se puls la opcin Cancelar"); }

En el primer if se compara la variable resp con la constante JFileChooser.APPROVE_OPTION, para saber si el usuario puls Abrir. En el segundo if se compara la variable resp con la constante JFileChooser.CANCEL_OPTION, para saber si el usuario puls Calcelar. En el caso de que el usuario pulsara Abrir, el programa usa el mtodo getSelectedFile del objeto elegirFichero para recoger el camino del fichero elegido. Este camino debe ser convertido a cadena con el mtodo toString. El programa aprovecha esto para mostrar dicho camino en pantalla gracias al tpico JOptionPane. En el caso del que el usuario pulsara el botn Cancelar el programa muestra un mensaje indicndolo.

12. Hay que volver a dejar claro que el cuadro de dilogo Abrir realmente no abre ningn fichero, sino que devuelve el camino del fichero elegido usando el cdigo:
elegirFichero.getSelectedFile().toString()

Luego queda en manos del programador el trabajar con el fichero correspondiente de la forma que desee.

CONCLUSIN Los objetos JFileChooser permiten mostrar el cuadro de dilogo Abrir Fichero o Guardar Fichero. Estos objetos no abren ni guardan ficheros, solo permiten al usuario elegir el fichero a abrir o guardar de forma sencilla. El JFileChooser devuelve el camino del fichero elegido, y luego el programador trabajar con dicho fichero como mejor le interese.

EJERCICIO GUIADO. JAVA: PANELES DE DESPLAZAMIENTO

Paneles de Desplazamiento
Llamaremos paneles de desplazamiento a paneles que contienen elementos tan grandes que no pueden ser mostrados en su totalidad. Estos paneles contienen entonces dos barras de desplazamiento que permiten visualizar el interior del panel de desplazamiento correctamente. Por ejemplo, un panel de desplazamiento podra contener una imagen tan grande que no se viera entera: Los paneles de desplazamiento son objetos del tipo JScrollPane.

Ejercicio guiado 1 1. Vamos a practicar con los JScrollPane. Para ello, crea un nuevo proyecto. 2. Aade en el proyecto un JScrollPane. 3. Un JScrollPane, por s mismo, no contiene nada. Es necesario aadir dentro de l el objeto que contendr. Para nuestro ejemplo aadiremos dentro de l una etiqueta (JLabel) 4. El formulario debe tener ahora este aspecto:

5. Si observas el Inspector vers claramente la distribucin de los objetos:

Observa como tienes un JScrollPane que contiene una etiqueta.

6. Aprovechemos el Inspector para cambiar el nombre a cada objeto. Al JScrollPane le llamaremos scpImagen y a la etiqueta etiImagen.

7. Elimina el texto contenido en la etiqueta etiImagen. Solo tienes que borrar el contenido de la propiedad text. 8. Luego introduciremos una imagen dentro de la etiqueta, a travs de la propiedad icon. La imagen la introduciremos desde fichero, y elegiremos la siguiente imagen de tu disco duro: Mis Documentos / Mis Imgenes / Imgenes de Muestra / Nenfares.jpg 9. Esta imagen es tan grande que no se podr ver entera dentro del panel de desplazamiento. Ejecuta el programa y observars el uso de las barras de desplazamiento dentro del panel.

10. Puedes mejorar el programa si agrandas el panel de desplazamiento de forma que ocupe todo el formulario:

De esta forma, cuando ejecutes el programa, al agrandar la ventana, se agrandar el panel de desplazamiento, vindose mejor la imagen contenida.

11. Ejecuta el programa y comprubalo.

Ejercicio guiado 2 Los JScrollPane no solo estn diseados para contener imgenes. Pueden contener cualquier otro elemento. Vamos a ver, con otro proyecto de ejemplo, otro uso de los JScrollPane.

1. Crea un nuevo proyecto. 2. Aade a la ventana una etiqueta con el texto Ejemplo 2 de JScrollPane y un JScrollPane de forma que est asociado a los lmites de la ventana. Observa la imagen:

3. Ahora aade dentro del JScrollPane un panel normal (JPanel). En la ventana no notars ninguna diferencia, pero en el Inspector debera aparecer esto:

4. Como ves, el JScrollPane contiene a un objeto JPanel. 5. Aprovechemos para cambiar el nombre a ambos objetos. Al JScrollPane lo llamaremos scpDatos y al JPanel lo llamaremos panelDatos.

6. Los JPanel son objetos contenedores. Es decir, pueden contener otros objetos como por ejemplo botones, etiquetas, cuadros de texto, etc. Adems, los JPanel pueden ser diseados independientemente de la ventana. Haz doble clic sobre el panelDatos en el Inspector y observa lo que ocurre:

7. En la pantalla aparecer nicamente el JPanel, para que puede ser diseado aparte de la ventana completa:

8. Para distinguirlo de lo que es en s la ventana, haremos las siguientes cosas con el panel: Cambia el color de fondo y asgnale un color verde. Aade en l una etiqueta con el texto Panel de Datos. Aade varias etiquetas y cuadros de textos correspondientes a los das de la semana. Agranda el panel. El panel debera quedar as. Toma como referencia esta imagen:

Es muy interesante que observes el Inspector. En l podrs observar la distribucin de los objetos en la ventana. Podrs ver como el JFrame contiene un JScrollPane (scpDatos) que a su vez contiene un JPanel (panelDatos) que a su vez contiene una serie de etiquetas y cuadros de textos a los que an no les hemos asignado un nombre:

9. Haz doble clic sobre el JFrame (en el Inspector) para poder ver globalmente la ventana. En la pantalla debera aparecer esto:

Como ves, el JPanel contenido en el JScrollPane es ms grande que l, por lo que no se podr visualizar completamente. Ser necesario usar las barras de desplazamiento del JScrollPane. 10. Ejecuta el programa para entender esto ltimo.

CONCLUSIN Los objetos JScrollPane son paneles de desplazamiento. Estos paneles pueden contener objetos mayores que el propio panel de desplazamiento. Cuando esto sucede, el panel muestra barras de desplazamiento para poder visualizar todo el contenido del panel. Los JScrollPane son ideales para mostrar imgenes, paneles y otros elementos cuyo tamao pueda ser mayor que la propia ventana.

EJERCICIO GUIADO. JAVA: VARIABLES GLOBALES

Variables Globales / Propiedades de la Clase


Las propiedades de la clase en java es el equivalente a las variables globales en lenguajes estructurados como el C. Una propiedad es una variable que puede ser accedida desde cualquier evento programado. Esta variable se inicializa a un valor cuando se ejecuta el programa y los distintos eventos pueden ir cambiando su valor segn se necesite. Veamos un ejemplo para entender el funcionamiento de las propiedades de la clase / variables globales.

Ejercicio guiado 1 1. Crea un nuevo proyecto llamado ProyectoParking. Dentro de l aade un paquete llamado paqueteParking. Y finalmente aade un JFrame llamado Parking. El aspecto de tu proyecto ser el siguiente:

Clase Principal

2. Tu clase principal es la clase Parking. 3. Se pretende hacer un pequeo programa que controle los coches que van entrando y van saliendo de un parking. En todo momento el programa debe decir cuantos coches hay dentro del parking. Para ello debes crear una ventana como la que sigue:

4. Esta ventana contiene lo siguiente: Un botn Entr un coche llamado btnEntro. Un botn Sali un coche llamado btnSalio. Un botn Reiniciar llamado btnReiniciar. Una etiqueta con el texto Coches en el Parking. Una etiqueta con borde llamada etiCoches que contenga un 0.

5. Se pretende que el programa funcione de la siguiente forma: a. Cuando el usuario pulse el botn Entr un coche, el nmero de coches del parking aumenta en 1, mostrndose en la etiqueta etiCoches. b. Si el usuario pulsa el botn Sali un coche, el nmero de coches del parking disminuye en 1, mostrndose en la etiqueta etiCoches. c. El botn Reiniciar coloca el nmero de coches del parking a 0.

6. Para poder controlar el nmero de coches en el Parking, es necesario que nuestra clase principal Parking tenga una propiedad (variable global) a la que llamaremos coches. Esta variable ser entera (int). Esta variable contendr en todo momento los coches que hay actualmente en el Parking. Esta variable podr ser usada desde cualquier evento. 7. Para crear una variable global haz clic en el botn Origen para acceder al cdigo:

8. Luego busca, al comienzo del cdigo una lnea que comenzar por public class Seguida del nombre de tu clase principal Parking. Debajo de dicha lnea es donde se programarn las propiedades de la clase (las variables globales)
Aqu se declaran las variables globales, tambin llamadas propiedades de la clase.

9. En dicho lugar declarars la variable coches de tipo int:

Declaracin de una variable global int llamada coches.

10. Cuando el programa arranque, ser necesario que la variable global coches tenga un valor inicial. O dicho de otra forma, ser necesario inicializar la variable. Para inicializar la variable iremos al constructor. Aade lo siguiente al cdigo:

Inicializacin de la propiedad coches.

Inicializamos a cero ya que se supone que cuando arranca el programa no hay ningn coche dentro del parking.

11. Ahora que ya tenemos declarada e inicializada la variable global coches, esta puede ser usada sin problemas desde cualquier evento que programemos. Por ejemplo, empezaremos programando la pulsacin del botn Entr un coche. Acceda a su evento actionPerformed y programe esto:
coches=coches+1; etiCoches.setText(+coches);

Como ves, se le aade a la variable coches uno ms y luego se coloca su valor actual en la etiqueta. 12. Ejecuta el programa y prueba este botn varias veces.

Pulsas, y aparece aqu el valor de la propiedad coches.

13. Ahora programaremos el botn Sali un coche de la siguiente forma:

if (coches>0) { coches=coches-1; etiCoches.setText(+coches); }

Como ves, se accede igualmente a la propiedad coches pero esta vez para restarle una unidad. Luego se muestra el valor actual de coches en la etiqueta correspondiente. Se usa un if para controlar que no pueda restarse un coche cuando el parking est vaco. (Si hay cero coches en el parking no se puede restar uno)

14. Ejecuta el programa y prueba los dos botones. Observa como la cantidad de coches del parking aumenta o disminuye.

Al pulsar aqu aumentas en uno la propiedad coches. Al pulsar aqu disminuyes en uno la propiedad coches.

Lo realmente interesante de esto es que desde dos eventos distintos (desde dos botones) se puede usar la variable coches. Esto es as gracias a que ha sido creada como variable global, o dicho de otro modo, ha sido creada como propiedad de la clase Parking.

15. Finalmente se programar el botn Reiniciar. Este botn, al ser pulsado, debe colocar la propiedad coches a cero. Programa dentro de su actionPerformed lo siguiente:
coches=0; etiCoches.setText(0);

Simplemente introduzco el valor cero en la variable global y actualizo la etiqueta. 16. Ejecuta el programa y comprueba el funcionamiento de este botn.

CONCLUSIN Las variables globales, tambin llamadas propiedades de la clase, son variables que pueden ser usadas desde cualquier evento del programa. Estas variables mantienen su valor hasta que otro evento lo modifique. Las variables globales se declaran justo despus de la lnea public class. La inicializacin de estas variables se realiza en el constructor.

EJERCICIO GUIADO. JAVA: CENTRALIZAR CDIGO

El problema de la repeticin de cdigo


Es muy habitual en Java que varios eventos tengan que ejecutar el mismo cdigo. En este caso se plantea la necesidad de copiar y pegar ese cdigo en los distintos eventos a programar:

Evento 1 Evento 2

Cdigo A Cdigo A Cdigo A

Evento 3

Esta es una mala forma de programacin, ya que se necesitara modificar el cdigo, sera necesario realizar la modificacin en cada copia del cdigo. Es muy fcil que haya olvidos y aparezcan errores en el programa que luego son muy difciles de localizar. Lo mejor es que el cdigo que tenga que ser ejecutado desde distintos eventos aparezca solo una vez, y sea llamado desde cada evento:

Evento 1 Evento 2 Evento 3 Cdigo A

Veamos algunos ejemplos en los que el cdigo se puede repetir y como evitar esta repeticin.

Ejercicio guiado 1 1. Crea un nuevo proyecto en java que se llame ProyectoCalculos. Este proyecto tendr un paquete llamado PaqueteCalculos. Y dentro de l crear un JFrame llamado VentanaCalculos. El proyecto tendr el siguiente aspecto:

2. La VentanaCalculos debe estar diseada de la siguiente forma:

Esta ventana contiene los siguientes elementos: Una barra de mens a la que puede llamar menuBarra. La barra de mens contiene un JMenu con el texto Calcular y que se puede llamar menuCalcular El menuCalcular contendr tres JMenuItem, llamados respectivamente: menuSumar, menuRestar, menuBorrar y con los textos Sumar, Restar y Borrar. Una etiqueta con el texto Nmero 1. (no importa su nombre) Una etiqueta con el texto Nmero 2. (no importa su nombre) Un cuadro de texto con un 0 y con el nombre txtNumero1. Un cuadro de texto con un 0 y con el nombre txtNumero2. Una etiqueta con el nombre etiResultado. Un botn Sumar con el nombre btnSumar. Un botn Restar con el nombre btnRestar. Un botn Borrar con el nombre btnBorrar.

3. Aqu puedes ver la ventana en ejecucin con el men Calcular desplegado:

4. El objetivo de programa es el siguiente: a. b. c. d. e. f. g. El usuario introducir dos nmeros en los cuadros de texto. Si pulsa el botn Sumar, se calcular la suma. Si pulsa el botn Restar, se calcular la resta. Si pulsa el botn Borrar, se borrarn ambos cuadros de texto. Si elige la opcin del men Calcular-Sumar entonces se calcular la suma. Si elige la opcin del men Calcular-Restar entonces se calcular la resta. Si elige la opcin del men Calcular-Borrar entonces se borrarn ambos cuadros de texto. h. Si se pulsa enter en alguno de los dos cuadros de texto se debera calcular la suma.

5. Este es un ejemplo en el que al activarse uno de varios eventos distintos se tiene que ejecutar el mismo cdigo. Observa el caso de la suma:
Pulsar Botn Sumar Activar Calcular Sumar en el men Pulsar enter en el primer cuadro de texto Calcular la suma y mostrarla en la etiqueta de resultado

Pulsar enter en el segundo cuadro de texto

6. Para que el cdigo est centralizado, es decir, que aparezca solo una vez, ser necesario construir en la clase un mtodo. Un mtodo en java es el equivalente de una funcin o procedimiento en C. Veamos como hacerlo:

7. Accede al cdigo de tu programa a travs del botn Origen.

8. Un buen sitio para programar tus procedimientos puede ser debajo del constructor. Puedes distinguir fcilmente al constructor porque tiene el mismo nombre que la clase que ests programando, o dicho de otro modo, tiene el mismo nombre que la ventana que ests programando: VentanaCalculos.

Este es el constructor Este es un buen sitio para crear tus propios procedimientos

9. Se va a programar un procedimiento que se encargue de recoger los valores de los cuadros de texto. Calcular la suma de dichos valores, y luego mostrar la suma en la etiqueta de resultados. Los procedimientos en java tienen prcticamente la misma estructura que en C. Programe lo siguiente:

Este es el procedimiento que tienes que introducir en el programa.

10. Si observas el cdigo, es el tpico procedimiento de C, cuya cabecera comienza con void y el nombre que le hayas asignado (en nuestro caso Sumar) void Sumar() { .... } Si estudias las lneas del cdigo, vers que lo que hace es recoger el contenido de los dos cuadros de texto en dos variables de cadena llamadas cad1 y cad2. Luego convierte dichas cadenas en nmeros que almacena en dos variables enteras llamadas a y b. Finalmente calcula la suma en una variable s y presenta el resultado en la etiqueta etiResultado. 11. Hay que destacar que este cdigo no pertenece ahora mismo a ningn evento en concreto, por lo que no tiene efecto ninguno sobre el programa. Ser necesario pues asociar los eventos correspondientes con este procedimiento. 12. Interesa que al pulsar el botn Sumar se ejecute la suma, as pues entre en el evento actionPerformed del botn Sumar y aada la siguiente lnea:
Sumar();

13. Como tambin interesa que al pulsar la opcin del men Calcular-Sumar se ejecute la suma, entre en el evento actionPerformed de la opcin del men Sumar y aade de nuevo la siguiente lnea:
Sumar();

14. Tambin se quiere que al pulsar la tecla enter en el cuadro de texto del nmero 1 se ejecute la suma. Por lo tanto, en el evento actionPerformed del cuadro de texto txtNumero1 hay que aadir la siguiente lnea:
Sumar();

15. Y como tambin se quiere que al pulsar la tecla enter en el cuadro de texto del nmero 2 se ejecute la suma, tambin habr que introducir en su actionPerformed la siguiente lnea:
Sumar();

16. Antes de continuar, ejecute el programa, introduzca dos nmeros, y compruebe como se calcula la suma al pulsar el botn Sumar, o al activar la opcin del men Calcular Sumar, o al pulsar Enter en el primer cuadro de texto, o al pulsar Enter en el segundo cuadro de texto. En cada uno de los eventos hay una llamada al procedimiento Sumar, que es el que se encarga de realizar la suma.

actionPerformed btnSumar Procedimiento actionPerformed menuSumar Sumar() actionPerformed txtNumero1

actionPerformed txtNumero2

17. En el caso de la resta sucede igual. Tenemos que varios eventos distintos deben provocar que se realice una misma operacin. En este caso tenemos lo siguiente:

Pulsar Botn Restar Activar Calcular Restar en el men Calcular la resta y mostrar el resultado.

18. Para centralizar el cdigo, crearemos un mtodo Restar que se encargar de hacer la resta de los nmeros introducidos en los cuadros de texto. Este mtodo se puede colocar debajo del anterior mtodo Sumar:

Programa este procedimiento.

19. El cdigo de este procedimiento es prcticamente idntico al del procedimiento Sumar, as que no se comentar. 20. Ahora, es necesario que cuando se activen los eventos indicados antes, estos hagan una llamada al procedimiento Restar para que se efecte la resta. As pues, entre en el evento actionPerformed del botn Restar y aada esta lnea de cdigo: Restar(); 21. Igualmente, entre en el evento actionPerformed de la opcin del men Calcular Restar y aada la misma llamada: Restar();

22. Ejecute el programa y compruebe como funciona el clculo de la resta, da igual que lo haga pulsando el botn Restar o la opcin del men Restar. Ambos eventos llaman al mismo mtodo:

actionPerformed btnRestar Procedimiento actionPerformed menuRestar Restar()

23. Finalmente se programar el borrado de los cuadros de texto a travs del botn Borrar y de la opcin del men Borrar. En primer lugar, programa el siguiente mtodo (puedes hacerlo debajo del mtodo Restar):

Programa el procedimiento Borrar...

24. Ahora programa las llamadas al procedimiento borrar desde los distintos eventos. En el evento actionPerformed del botn Borrar y en el evento actionPerformed de la opcin del men Borrar programa la siguiente llamada: Borrar();

25. Ejecuta el programa y prueba su funcionamiento.

CONCLUSIN En java se pueden programar procedimientos al igual que en C. Normalmente, estos procedimientos se programarn debajo del constructor, y tienen la misma estructura que en C. Se puede llamar a un mismo procedimiento desde distintos eventos, evitando as la repeticin de cdigo.

EJERCICIO GUIADO. JAVA: LAYOUTS

El problema de la distribucin de elementos en las ventanas


Uno de los problemas que ms quebraderos de cabeza da al programador es el diseo de las ventanas y la situacin de los distintos componentes en ellas. Para disear ms cmodamente las ventanas, Java proporciona una serie de objetos denominados Layouts, que definen la forma que tendrn los elementos de situarse en las ventanas. As pues, un Layout define de qu forma se colocarn las etiquetas, botones, cuadros de textos y dems componentes en la ventana que diseamos.

Ejercicio guiado Diseo Libre 1. Crea un nuevo proyecto en java. 2. Aade una etiqueta y un botn. Muvelos a la posicin que se indica en la imagen. Deben aparecer las lneas gua de color azul que se muestran:

3. Las lneas azules que aparecen indican con qu otro elemento est relacionado un componente de la ventana. La situacin de un elemento depender siempre de la situacin del otro. Dicho de otra forma, las lneas azules indican las distancias que siempre se respetarn. Observa la siguiente imagen:

Tanto el botn como la etiqueta estarn siempre a esta distancia del borde derecho de la ventana

El botn siempre estar a esta distancia de la etiqueta

El botn siempre estar a esta distancia del borde inferior de la ventana

4. Ejecuta el programa y prueba a ensanchar (o achicar) la ventana por el lado derecho y por el lado inferior. Debes observar como la etiqueta y el botn mantienen sus distancias relativas entre s y con los bordes derecho e inferior de la ventana.

Siempre se mantienen las distancias relativas definidas en el diseo aunque el tamao de la ventana cambie.

5. Este comportamiento de los elementos en la ventana viene dado por una opcin del NetBeans llamada Diseo Libre (Free Design) El Diseo Libre permite que los elementos de una ventana mantengan una distribucin relativa da igual el tamao que tenga la ventana. Dicho de otra forma, los elementos se redistribuyen al cambiar el tamao de la ventana. El problema del Diseo Libre es el poco control que se tiene sobre los elementos que se aaden a la ventana. Se puede observar como a veces los elementos no se colocan en la posicin que deseamos o como cambian de tamao de forma inesperada. Todo esto es debido a la necesidad de dichos elementos de mantener unas distancias relativas con otros elementos de la ventana. Cuantos ms elementos tengamos en una ventana, ms difcil ser el colocarlos usando el Diseo Libre.

AboluteLayout. Posiciones Absolutas

6. El Diseo Libre es la opcin que est activada por defecto cuando se crea un proyecto en NetBeans. Sin embargo, esta opcin se puede cambiar por distintos Layouts o Distribuciones. 7. En el Inspector de tu proyecto pulsa el botn derecho del ratn sobre el objeto JFrame y activa la opcin Establecer Disposicin AbsoluteLayout.

8. El Inspector tendr la siguiente forma ahora:

Como ves, aparece un objeto dentro del JFrame llamado AbsoluteLayout. Este objeto define otra forma de situar los elementos en la ventana. Concretamente, la distribucin AbsoluteLayout permite al programador colocar cada elemento donde l quiera, sin restricciones, sin tener en cuenta distancias relativas.

9. Sita la etiqueta y el botn donde quieras. Observa que no aparece ninguna lnea gua que defina distancias relativas:

10. La ventana de definir una distribucin AbsoluteLayout es la facilidad para colocar cada elemento en la ventana (no tendrs los problemas del Diseo Libre). Sin embargo, la desventaja es que los elementos no mantienen una distribucin relativa respecto al tamao de la ventana. 11. Ejecuta el programa y reduce su ancho. Observa lo que ocurre:

Vers que los elementos de la ventana son inamovibles aunque la ventana cambie de tamao. En cambio, en el Diseo Libre los elementos intentaban siempre estar dentro de la ventana.

Distribucin en lnea. FlowLayout 12. Practiquemos ahora con otro tipo de distribucin. Accede al Inspector y pulsa el botn derecho del ratn sobre el objeto JFrame. Activa la opcin Establecer Disposicin FlowLayout.

13. Observa como el layout AbsoluteLayout es sustituido por la distribucin FlowLayout. Una elemento solo puede tener un tipo de distribucin a la vez.

14. Observa la ventana. Los elementos se han colocado uno detrs de otro. Se han colocado en lnea. Esto es lo que hace el FlowLayout. Fuerza a los distintos elementos a que se coloquen en fila.

15. Si seleccionas el FlowLayout en el Inspector, podrs acceder a sus propiedades (los layout son objetos como los dems) Una de las propiedades del FlowLayout se llama alineacin y permite que los elementos estn alineados a la izquierda, derecha o centro. El FlowLayout tiene una alineacin centro por defecto.

16. El FlowLayout no permite controlar la posicin de los elementos en la ventana, pero s procura que los elementos estn siempre visibles aunque la ventana se cambie de tamao. Ejecuta el programa y observa el comportamiento del FlowLayout al agrandar o achicar la ventana:
En el FlowLayout, los elementos intentan siempre estar dentro de la ventana, aunque esta se cambie de tamao

Distribucin en rejilla. GridLayout

17. Otra distribucin que se puede usar es la distribucin GridLayout. Esta distribucin coloca a los elementos en filas y columnas, como si formaran parte de una tabla. Al aadir esta distribucin es necesario indicar cuantas filas y columnas tendr la rejilla. 18. Cambia el layout del JFrame por un GridLayout:

19. Marca el GridLayout y cambia sus propiedades Filas y Columnas. Asigna a la propiedad Filas un 2 y a la propiedad Columnas un 3.

20. Al asignar 2 filas y 3 columnas al GridLayout, conseguiremos que los elementos de la ventana se distribuyan en una tabla como la siguiente:

Los distintos elementos se adaptarn al espacio que tienen asignado, y cambiarn de tamao. 21. Ya que solo tienes dos elementos en la ventana (una etiqueta y un botn), aade otros cuatro elementos ms (cuatro botones) para observar como se distribuyen en la cuadrcula.

22. En un GridLayout, los elementos estarn situados siempre en una casilla de la rejilla, ocupando todo su espacio. El programador no tiene mucho control sobre la disposicin de los elementos. 23. Ejecuta el programa y agranda y achica la ventana. Observa como los elementos siempre mantienen su disposicin en rejilla y siempre aparecen dentro de la ventana aunque el tamao de esta vare.

Con un GridLayout los elementos aparecen en filas y columnas. Siempre aparecen dentro de la ventana aunque el tamao de esta cambie.

BorderLayout

24. Otra de las distribuciones posibles es la llamada BorderLayout. Esta distribucin coloca los elementos de la ventana en cinco zonas: Zona norte (parte superior de la ventana) Zona sur (parte inferior de la ventana) Zona este (parte derecha de la ventana) Zona oeste (parte izquierda de la ventana) Zona centro.

25. Haz clic con el derecho sobre el JFrame y asigna una distribucin BorderLayout.

26. Para poder entender el funcionamiento del BorderLayout, se recomienda que el JFrame contenga nicamente 5 botones (elimine los elementos que tiene ahora y aada cinco botones) La ventana tendr un aspecto parecido al siguiente:

27. Como se puede observar, cada botn se ha colocado en una zona, y su tamao ha variado hasta ocupar la zona entera. Tenemos un botn en el norte, otro al sur, uno al este, otro al oeste y uno en el centro. El programador no tiene mucho control sobre la disposicin de los elementos en la ventana al usar esta distribucin.

28. Ejecuta el programa y observa como los elementos siempre se mantienen dentro de la ventana aunque esta cambie de tamao.

Con un GridLayout los elementos aparecen zonas. Siempre aparecen dentro de la ventana aunque el tamao de esta cambie.

CONCLUSIN El diseo de la ventana viene definido por los Layouts o distribuciones. Diseo Libre Esta distribucin viene activada por defecto en el NetBeans, y define una distribucin de componentes en la que se respetan las distancias entre ellos cuando la ventana cambia de tamao. AbsoluteLayout En esta distribucin el programador puede colocar cada elemento en la posicin que desee de la ventana. Los distintos elementos mantienen su posicin aunque la ventana cambie de tamao, lo que puede hacer que si la ventana se reduce de tamao algunos elementos no se vean. FlowLayout En esta distribucin los elementos se colocan uno detrs de otro. Los elementos intentarn estar dentro de la ventana aunque esta se reduzca de tamao. GridLayout Esta distribucin coloca a los elementos en filas y columnas. Los elementos siempre estarn dentro de la ventana aunque esta se reduzca de tamao. BorderLayout Esta distribucin coloca a los elementos en zonas. Los elementos siempre estarn dentro de la ventana aunque esta se reduzca de tamao.

EJERCICIO GUIADO. JAVA: LAYOUTS Y PANELES

Tcnicas de distribucin de elementos en las ventanas


A la hora de disear una ventana se tienen en cuenta dos cosas: La facilidad a la hora de colocar muchos componentes en la ventana. Que dichos componentes estn siempre visibles independientemente del tamao de la ventana.

La distribucin AbsoluteLayout por ejemplo nos da mucha facilidad a la hora de colocar los elementos en la ventana, pero sin embargo los componentes no se adaptan a los cambios de tamao. El Diseo Libre en cambio permite crear ventanas en las que sus componentes se recolocan segn el tamao de estas pero a cambio crece la dificultad del diseo. Para aprovechar las ventajas de los distintos layouts y minimizar sus inconvenientes, es habitual en java crear una estructura de paneles cada uno de ellos con un layout distinto, segn nuestras necesidades. Normalmente, al JFrame se le asigna un layout que lo divida en zonas, como puede ser el BorderLayout o el GridLayout. Luego, dentro de cada una de estas zonas se introduce un panel (objeto JPanel). Y a cada uno de estos paneles se le asigna el layout que ms le convenga al programador (FlowLayout, Diseo Libre, AbsoluteLayout, etc) Finalmente, dentro de cada panel se aaden los componentes de la ventana.
JFrame (BorderLayout o GridLayout)

JPanel 1 (Diseo Libre, AbsoluteLayout o FlowLayout)

JPanel 2 (Diseo Libre, AbsoluteLayout o FlowLayout)

etc

Componentes

Componentes

Ejercicio guiado

1. Crea un nuevo proyecto en java. Se pretende crear un proyecto con una ventana de diseo complejo. Para ello sigue los siguiente pasos: 2. En primer lugar, asigna un BorderLayout al JFrame:

3. El BorderLayout divide la ventana principal en zonas. Ahora aade un panel (JPanel) a la zona norte de la ventana.

Panel en la zona norte.

4. Cambia el nombre a este panel y llmalo panelTitulo, ya que contendr el nombre del programa.

5. Aade otro panel, esta vez a la parte central. El panel se llamar panelDatos:

6. Aade un nuevo panel en la parte sur de la ventana. Su nombre ser panelEstado.

NOTA. A veces resulta complicado agregar un panel en una zona de la ventana cuando tenemos un BorderLayout. Puedes entonces hacer clic con el derecho sobre JFrame en el Inspector y activar la opcin Agregar desde paleta Swing JPanel.

7. Si el panel no se coloca en el sitio deseado, se puede seleccionar en el Inspector y activar su propiedad Direccin, e indicar la zona donde se quiere colocar:

El panel debera estar situado finalmente en el sur de la ventana:

8. El Inspector tendr la siguiente forma ahora:

9. Aade ahora tu solo un panel en la zona oeste llamado panelBotonera y otro en la zona esta llamado panelVerificacion. El Inspector debera tener la siguiente forma al finalizar:

10. Cada panel puede ser diseado de forma individual, simplemente haciendo doble clic sobre l. As pues, empezaremos diseando el panel panelBotonera. Haz doble clic sobre l.

11. En la parte izquierda del NetBeans aparecer nicamente el panelBotonera. Agrndalo para que tenga la siguiente forma:

12. A cada panel se le puede asignar un Layout distinto. A este panel le asignaremos un AbsoluteLayout para poder colocar cada elemento donde quiera. Asigna un AbsoluteLayout al panel haciendo clic con el derecho sobre l en el Inspector. El Inspector debera quedar as:

13. Ahora aade cuatro botones al panel. Observa como tienes libertad total para colocar cada botn donde quieras. Procura que el panel quede as:

(No nos vamos a preocupar en este ejercicio de los nombres de los componentes)

14. Ahora disea el panel panelVerificacin haciendo doble clic sobre l. 15. Asgnale tambin un layout AbsoluteLayout. 16. Coloca en l cuatro casillas de verificacin. El aspecto del panel al terminar debe ser parecido al siguiente:

Y el Inspector debe tener un estado similar a este:

17. Ahora se disear el panelTitulo. Haz doble clic sobre l. 18. En este caso se le aadir un FlowLayout. Recuerda que este layout hace que cada elemento se coloque uno detrs de otro. 19. Aade al panel dos etiquetas como las que siguen. Ponle un borde a cada una:

El Inspector tendr este aspecto en lo que se refiere al panelTitulo...

20. El panelEstado lo disearemos sin asignar ningn layout, es decir, usando el Diseo Libre. En l aadiremos tres etiquetas de forma que estas mantengan una distancia relativa con respecto al lmite derecho del panel. Dicho de otra forma, que siempre estn pegadas a la parte derecha del panel:

Observa las lneas gua. Indican que las etiquetas dependen de la parte derecha del panel. A su vez cada una depende de la otra. Es como si estuvieran enganchadas, como los vagones de un tren.

21. El panelDatos lo vamos a complicar un poco. Haz doble clic sobre l para disearlo y asgnale un GridLayout.

22. Marca el GridLayout y asgnale 2 filas y 2 columnas, para que interiormente tenga forma de una rejilla como esta:

23. A cada una de las divisiones del GridLayout del panelDatos le asignaremos un nuevo panel. Aade al panelDatos cuatro paneles. Esto lo puedes hacer fcilmente haciendo clic con el botn derecho del ratn sobre el panelDatos en el Inspector y eligiendo la opcin Aadir desde paleta Swing JPanel. El aspecto del inspector debera ser como el que sigue, en lo que se refiere al panelDatos:

24. Asignaremos a cada uno de los cuatro paneles los siguientes nombres: panelEtiqueta1, panelCuadro1, panelEtiqueta2, panelCuadro2. El panel quedar as en el Inspector.

As pues, el panel panelDatos tiene forma de rejilla con cuatro celdas, y en cada celda hay un panel. Puede imaginarse el panelDatos as: panelDatos

PanelEtiqueta1 PanelCuadro1 PanelEtiqueta2 PanelCuadro2

25. Ahora aada al panelEtiqueta1 y al panelEtiqueta2 sendas etiquetas. Y al panelCuadro1 y panelCuadro2 sendos cuadros de textos. El panel panelDatos debe quedar as:

26. Finalmente ejecuta el programa y comprueba como se comportan los elementos segn el panel donde se encuentre y el layout asignado a cada uno.

CONCLUSIN Para el diseo de ventanas muy complejas, ser suelen definir layouts que dividan en zonas el JFrame, como por ejemplo el BorderLayout o el GridLayout. Dentro de cada una de dichas zonas se aade un JPanel, al que se le asigna un AbsoluteLayout, un FlowLayout o se mantiene el Diseo Libre. Es posible asignar a un panel un layout de zonas, como el GridLayout, y, a su vez, introducir en l nuevos paneles, y as sucesivamente.

EJERCICIO GUIADO. JAVA: DILOGOS

Cuadros de Dilogo
Un cuadro de dilogo es un cuadro con opciones que aparece normalmente cuando se activa una opcin del men principal del programa. Los cuadros de dilogo tienen forma de ventana aunque no poseen algunas caractersticas de estas. Por ejemplo, no pueden ser minimizados ni maximizados. Los cuadros de dilogo, aparte de las opciones que muestran, suelen contener dos botones tpicos: el botn Aceptar y el botn Cancelar. El primero de ellos da por vlidas las opciones elegidas y cierra el cuadro de dilogo. El segundo simplemente cierra el cuadro de dilogo sin hacer ninguna modificacin. He aqu algunos ejemplos de cuadros de dilogo del programa Word:

Para crear cuadros de dilogo en Java, se usa un tipo de objetos llamado JDialog. Estos objetos pueden ser diseados como si fueran ventanas, aunque representan realmente cuadros de dilogo.

Ejercicio guiado

1. Crea un nuevo proyecto en java. 2. Disea el JFrame de forma que la ventana tenga el siguiente aspecto:

Los elementos de la ventana tendrn los siguientes nombres: Cuadro de texto de unidades: txtUnidades. Cuadro de texto de precio: txtPrecio. Etiqueta con borde del total: etiTotal. Botn Calcular: btnCalcular. Botn Configuracin: btnConfiguracion.

3. Se pretende que cuando se pulse el botn Calcular se calcule el total de la venta (esto se har luego) Para hacer el clculo se tendrn en cuenta el IVA y el Descuento a aplicar. Estos dos valores sern variables globales, ya que se usarn en distintos lugares del programa. 4. As pues entra en el cdigo y declara una variable global iva y otra descuento tal como se indica a continuacin (recuerda que las variables globales se colocan justo despus de la lnea donde se define la clase principal public class):

Variables globales

5. Cuando el programa arranque, interesar que el iva por defecto sea 0, y que el descuento por defecto sea 0 tambin, as que en el constructor, inicializaremos las variables globales iva y descuento a 0:

Inicializacin de variables globales

6. Estamos ya preparados para programar el botn btnCalcular. Entra en su actionPerformed y all se programar la realizacin del clculo de la siguiente forma:
double double double double double double unidades; precio; total; //total cantiva; //cantidad iva cantdes; //cantidad descuento totalsiniva; //total sin iva

//Recojo los datos de los cuadros de textos (convirtiendolos a nmeros) unidades = Double.parseDouble(txtUnidades.getText()); precio = Double.parseDouble(txtPrecio.getText()); //Calculo el total sin iva, la cantidad de iva y la cantidad de descuento totalsiniva=precio*unidades; cantiva=totalsiniva*iva/100; cantdes=totalsiniva*descuento/100; //Ahora calculo el precio total: total = totalsiniva+cantiva-cantdes; //Coloco el total en la etiqueta: etiTotal.setText(""+total);

7. Puedes ya ejecutar el programa y comprobar que el botn Calcular funciona, aunque el clculo que realiza lo hace con un iva 0 y un descuento 0. 8. A continuacin se programar el botn Configuracin de forma que nos permita decidir qu iva y qu descuento queremos aplicar. Este botn mostrar un CUADRO DE DILOGO que permita al usuario configurar estos datos.

9. Para aadir un cuadro de dilogo al proyecto, se tiene que aadir un objeto del tipo JDialog sobre el JFrame.

10. Los JDialog son objetos ocultos, es decir, objetos que se colocan en la parte del Inspector llamada Otros Componentes, al igual que sucede con los mens contextuales o los JFileChooser. Observa tu inspector, all vers el JDialog que has aadido:

11. Cmbiale el nombre. Lo llamaremos dialogoConfiguracion. 12. Los dilogos normalmente traen por defecto el layout BorderLayout. Para nuestro ejemplo cambiaremos el layout del JDialog por el Diseo Libre:

13. Los JDialog se pueden disear independientemente, al igual que los JPanel. Solo tienes que hacer doble clic sobre el dialogoConfiguracion (en el inspector) y este aparecer en el centro de la ventana.

14. As pues debes disear el dialogoConfiguracion para que quede de la siguiente forma:

Los elementos del cuadro de dilogo tienen los siguientes nombres: El cuadro de texto del Iva: txtIva. El cuadro de texto del Descuento: txtDescuento. El botn Aceptar: btnAceptar. El botn Cancelar: btnCancelar. Si observas el Inspector debe tener el siguiente aspecto:

15. Se ha dicho que cuando se pulse el botn Configuracin en la ventana principal, debe aparecer el cuadro de dilogo dialogoConfiguracion, que acabas de disear:

Haces clic sobre Configuracin y aparece el dilogo

16. Para conseguir esto, debes programar el actionPerformed del botn btnConfiguracion de la siguiente forma:
dialogoConfiguracion.setSize(250,200); dialogoConfiguracion.setLocation(100,100); dialogoConfiguracion.setVisible(true);

17. El cdigo anterior hace lo siguiente: A travs del mtodo setSize se asigna un tamao de 250 x 200 al cuadro de dilogo. A travs del mtodo setLocation se determina que el cuadro de dilogo aparecer en la posicin (100, 100) de la pantalla. A travs del mtodo setVisible hacemos que el cuadro de dilogo se muestre.

18. Ejecuta el programa y observa lo que sucede cuando pulsas el botn Configurar. Debera aparecer el cuadro de dilogo en la posicin programada y con el tamao programado:

19. Los botones Aceptar y Cancelar del cuadro de dilogo an no hacen nada. As que los programaremos. Empezaremos por el ms sencillo, el botn Cancelar. 20. El botn Cancelar de un cuadro de dilogo simplemente cierra dicho cuadro de dilogo. Para ello, debes aadir el siguiente cdigo en el actionPerformed del botn Cancelar del dilogo:
dialogoConfiguracion.dispose();

El mtodo dispose se usa para cerrar un cuadro de dilogo. Tambin se puede usar con un JFrame para cerrarlo. 21. Ejecuta el programa de nuevo y comprueba el funcionamiento del botn Cancelar del cuadro de dilogo. 22. Ahora se programar el botn Aceptar. Cuando el usuario pulse este botn, se confirmar el valor del iva y del descuento que haya introducido. Es decir, se traspasarn los valores introducidos en los cuadros de texto txtIva y txtDescuento a las variables globales iva y descuento. Una vez que se haya hecho esto, el cuadro de dilogo se debe cerrar. 23. Este es el cdigo que hace lo anterior. Debe programarlo en el actionPerformed del botn Aceptar:
iva = Double.parseDouble(txtIva.getText()); descuento=Double.parseDouble(txtDescuento.getText()); dialogoConfiguracion.dispose();

24. Observe el cdigo. Primero se traspasa los valores de los cuadros de texto a las variables globales y luego se cierra el cuadro de dilogo.

25. Compruebe el funcionamiento del programa de la siguiente forma: a. Ejecute el programa. b. Introduzca 5 unidades y 20 de precio. c. Si pulsa calcular, el total ser 100. (No hay ni iva ni descuento al empezar el programa) d. Ahora pulse el botn Configuracin, e introduzca un iva del 16. El descuento djelo a 0. Acepte. e. Ahora vuelva a calcular. Observe como ahora el total es 116, ya que se tiene en cuenta el iva configurado. f. Pruebe a configurar un descuento y vuelva a calcular.

26. Se pretende ahora mejorar un poco el cuadro de dilogo, aadindole un ttulo. Seleccione el cuadro de dilogo en el Inspector y luego busque su propiedad title. En ella escriba Configuracin de iva y descuento. 27. Vuelva a ejecutar el programa. Observe la barra de ttulo del cuadro de dilogo:

28. Ahora se estudiar el concepto de cuadro de dilogo modal y cuadro de dilogo no modal. Un cuadro de dilogo no modal. Es aquel que permite activar la ventana desde la que apareci. Los cuadros de dilogo aadidos a un proyecto son por defecto no modales.

29. Ejecuta el programa y prueba a hacer lo siguiente: a. Pulsa el botn Configurar. Aparecer el cuadro de dilogo. b. Pulsa sobre la ventana.

Pulsa sobre la ventana.

c. Observars que la ventana se activa, colocndose sobre el cuadro de dilogo.

La ventana se activa colocndose por encima del cuadro de dilogo.

d. Esto es posible gracias a que el cuadro de dilogo es no modal. e. A veces, puede ser interesante que se active la ventana pero que el cuadro de dilogo siga delante de ella. Para conseguir esto, es necesario activar la propiedad del cuadro de dilogo llamada alwaysOnTop. Activa esta propiedad:

f.

Ahora ejecuta el programa de nuevo y haz que se visualice el cuadro de dilogo de configuracin. Podrs comprobar que se puede activar la ventana e incluso escribir en sus cuadros de textos, y que el cuadro de dilogo sigue visible:

Se puede activar la ventana trasera, e incluso escribir en ella. Esto es gracias a que el cuadro de dilogo es no modal. Por otro lado, el cuadro de dilogo sigue mostrndose delante de la ventana. Esto es gracias a la propiedad alwaysOnTop

g. Es muy comn, cuando tenemos un cuadro de dilogo no modal, usar la propiedad alwaysOnTop, para que siempre aparezca delante de la ventana.

30. Ahora se estudiar el concepto de cuadro de dilogo modal. Un cuadro de dilogo modal es aquel que no permite que se active otra ventana hasta que este no se haya cerrado.

31. Para convertir nuestro cuadro de dilogo en modal, ser necesario que lo selecciones en el inspector y busques la propiedad modal. Debes activar esta propiedad.

32. Ahora ejecuta el programa comprueba lo siguiente: a. Haz que se visualice el cuadro de dilogo de configuracin. b. A continuacin intenta activar la ventana haciendo clic sobre ella. Vers como no es posible activarla. Es ms, intenta escribir en sus cuadros de texto. No ser posible hacerlo. (Incluso observars un parpadeo en el cuadro de dilogo avisndote de ello). Esto es debido a que ahora nuestro cuadro de dilogo es modal.

Aunque intentes activar la ventana o escribir en ella, no podrs, ya que el cuadro de dilogo es modal. Incluso vers un parpadeo en el cuadro de dilogo cuando intentas activar la otra ventana. Se podra decir que un cuadro de dilogo modal es un acaparador, y que no te deja usar otro elemento hasta que no acabes con l. Solo cuando cierres el cuadro de dilogo podrs seguir trabajando con la ventana.

c. Solo cuando pulses, Aceptar, o Cancelar, o cierres el cuadro de dilogo, podrs seguir trabajando con tu ventana.

CONCLUSIN Los Cuadros de Dilogo son ventanas simplificadas que muestran distintas opciones al usuario. Los objetos JDialog son los que permiten la creacin y uso de cuadros de dilogo en un proyecto java. Para visualizar un JDialog ser necesario llamar a su mtodo setVisible. Tambin son interesantes los mtodos setSize para asignarles un tamao y setLocation para situar el cuadro de dilogo en la pantalla. Para cerrar un JDialog ser necesario invocar a su mtodo dispose. Existen dos tipos de cuadros de dilogo: los modales y no modales. Los cuadros de dilogo modales no permiten que se active otra ventana hasta que el cuadro de dilogo no se haya cerrado. Los cuadros de dilogo no modales permiten trabajar con otra ventana a pesar de que el propio cuadro de dilogo no haya sido cerrado.

EJERCICIO GUIADO. JAVA: DISEO DE FORMULARIOS DESDE CDIGO

La Ventana de Diseo
La ventana de diseo es una gran herramienta que nos permite disear formularios de forma relativamente sencilla. Simplemente tenemos que aadir los componentes del formulario: botones, etiquetas, cuadros de textos, etc, y cambiar sus propiedades segn nos interese. Todo esto tiene un cdigo asociado que se genera de forma automtica, y del que no nos hemos preocupado hasta el momento. Por ejemplo, cada vez que aades un botn o una etiqueta, se generan automticamente las instrucciones de cdigo que permiten crear dicho botn o dicha etiqueta. Tambin se genera el cdigo que permite cambiar el texto del botn, o cambiar el texto de la etiqueta. Un buen ejercicio para comprobar esto puede ser el siguiente: Ejercicio guiado 1. 1. Crea un proyecto y aade en su ventana un botn (JButton), una etiqueta (JLabel) y un cuadro de texto (JTextField). 2. El nombre del botn ser btnBoton, el de la etiqueta etiEtiqueta y el del cuadro de texto txtCuadroTexto. 3. A continuacin asigna un texto a cada elemento. La ventana final podra tener un aspecto como el que sigue:

4. Todas estas operaciones que has realizado tienen asociado unas instrucciones de cdigo que se han generado automticamente. Para estudiar estas instrucciones, activa el botn Origen en la parte superior de la pantalla:

5. En el cdigo, observars una lnea llamada Cdigo Generado. Esta lnea est sealada en color azul (al igual que todas las instrucciones generadas automticamente) Observars que tiene un + en la parte izquierda. Si haces clic sobre el signo + aparecer el cdigo generado automticamente:

Haz clic en el + para ver el cdigo generado.

6. El cdigo generado (sealado en azul) no puede ser modificado, sin embargo es interesante estudiarlo para entenderlo. En l puedes encontrar como se crean los componentes, como se asigna el texto a stos etc.
Aqu se crea el botn, la etiqueta y el cuadro de texto

Aqu se asigna el texto a cada elemento

ETC

En esta explicacin guiada, se disear el formulario entero directamente desde cdigo, sin usar la ventana de diseo. De esta forma, se podr entender mejor la generacin de cdigo del NetBeans y se tendr ms control sobre los componentes.

Ejercicio guiado 2 A. CREACIN DEL PROYECTO 1. Crear un nuevo proyecto con las siguientes caractersticas: a. El nombre del proyecto ser OPERACIONES. b. El nombre del paquete ser VENTANAS. c. El nombre del formulario ser VENTANAPRINCIPAL. El aspecto que tendr la ventana de proyectos debe ser el siguiente:
Nombre del proyecto. Nombre del paquete. Nombre del formulario.

2. Una vez creado el proyecto, iremos directamente a la ventana de cdigo, pulsando el botn Origen. No usaremos la ventana de diseo en este proyecto.

B. ESTRUCTURA DEL CDIGO (estructura de una clase)

3. Analizaremos el cdigo del programa ahora. Empezaremos por arriba:


En la parte superior del cdigo vers un comentario. En este comentario aparece el nombre del fichero que contiene el cdigo, que como puedes observar tiene el mismo que el del JFrame. Tambin aparece la fecha de creacin del fichero.

Observars tambin una instruccin que indica que este fichero (ventanaprincipal.java) pertenece al paquete ventanas.

Tambin vers otro comentario donde aparece el nombre del autor. Este comentario se puede cambiar para que aparezca tu nombre.

4. Un proyecto en java est formado por mdulos denominados CLASES. El proyecto que acabamos de crear tiene un solo mdulo: el JFrame que define la ventana principal, llamado precisamente ventanaprincipal. Por tanto, se puede decir que nuestro proyecto tiene una clase llamada ventanaprincipal.

El proyecto operaciones tiene una clase llamada ventanaprincipal, que pertenece al paquete ventanas.

5. Para programar una clase se sigue la siguiente sintaxis: public class nombredelaclase { programacin de la clase }

6. Esto lo puedes observar claramente en el cdigo de tu proyecto:

Programacin de la clase ventanaprincipal

7. Dentro de la clase, tenemos una serie de funciones y procedimientos llamados MTODOS. Es en los mtodos donde se programan los eventos que pueden suceder sobre el formulario. 8. Hay un mtodo especial muy importante denominado CONSTRUCTOR. Dentro de este mtodo se programa el diseo de la ventana y las caractersticas iniciales de la ventana. El constructor se puede distinguir fcilmente porque tiene el mismo nombre que la clase. En nuestro ejemplo, ventanaprincipal.

Observars que el constructor contiene una llamada a un mtodo llamado initComponents. El mtodo initComponents define caractersticas iniciales de la ventana, y es cdigo generado automticamente. Si quieres verlo, solo tienes que desplegar la parte de Cdigo Generado:

Clic aqu para ocultar el cdigo generado

El mtodo initComponents al que hace referencia el constructor es un mtodo generado automticamente, y no puede ser modificado. Puedes verlo dentro de la seccin de Cdigo Generado. Este mtodo define algunas caractersticas iniciales de la ventana.

El contenido del mtodo initComponents no resulta interesante para el ejercicio que estamos realizando, as que puedes ocultar de nuevo el Cdigo Generado, haciendo clic en el smbolo menos -

9. Otro mtodo importante que hay que mencionar es el mtodo main. Este mtodo es el que se ejecuta cuando arranca el programa. Se puede decir que el programa parte de aqu. La tarea que desempea este mtodo es la de generar la ventana principal y mostrarla en pantalla. El mtodo main, es similar a la funcin main del lenguaje C. En el caso del java, el NetBeans genera automticamente el mtodo main, de forma que no tendremos que hacer cambios en l.

C. DISEO DE LA VENTANA DESDE CDIGO

Vamos ahora a disear la ventana de nuestro programa (sin usar la ventana de diseo, solo a partir de cdigo). Al final de esta explicacin, la ventana del proyecto tendr el siguiente aspecto:

Para conseguir esto, sigue los siguientes pasos:

10. Para realizar el diseo de la ventana, crearemos un mtodo propio al que llamaremos por ejemplo CreacionVentana. Un buen sitio para colocar este mtodo puede ser debajo del constructor:

El mtodo donde disearemos nuestra ventana

11. Lo primero que se va a hacer es definir caractersticas propias de la ventana, como por ejemplo su ttulo, tamao, etc. Recuerda que la forma de hacer referencia a la propia ventana es a travs de la palabra reservada this. As pues, programa lo siguiente dentro del mtodo CreacionVentana:

Este cdigo hace lo siguiente: Usa el mtodo setTitle de la ventana para definir el texto de la barra de ttulo. Usa el mtodo setSize de la ventana para definir un tamao de 500x300. Usa el mtodo setLocation de la ventana para definir la posicin de la ventana en la posicin (100,100) de la pantalla.

Con setLocation decides la posicin de la ventana

Con setTitle cambias la barra de ttulo

Con setSize defines el ancho y alto de la ventana

12. Para que esto tenga efecto, es necesario que el mtodo CrearVentana sea llamado desde el constructor, al igual que sucede con el mtodo initComponents:

13. Ya puedes ejecutar el programa. En el momento en que se ejecuta el programa, el constructor llama al mtodo CreacionVentana y se definen las caractersticas programadas.

14. Ahora vamos a empezar a aadir componentes a la ventana. Concretamente, empezaremos creando la etiqueta que contiene el texto Nmero 1: y luego definiremos algunas caractersticas propias para finalmente situarla en la ventana. Al comienzo de la clase, despus del public class, donde se suelen definir las variables globales, aade el siguiente cdigo:

Este cdigo declara una variable de tipo JLabel (etiqueta) y le da el nombre etiNum1. 15. Al escribir este cdigo, aparecer un error en la lnea, ya que ser necesario importar la librera donde se encuentra el tipo de objeto JLabel. Podrs usar la bombilla del NetBeans para agregar el import correspondiente automticamente. 16. Los imports aparecern en la parte superior del cdigo. Puedes observarlo:

Importacin de la librera para el objeto JLabel, que define las etiquetas. (Agregada automticamente al pulsar la bombilla del NetBeans)

17. Ahora agrega este cdigo a tu mtodo CreacionVentana:

18. La explicacin del cdigo es la siguiente: La primera lnea construye la etiqueta llamada etiNum1 que fue delarada antes. etiNum1 = new JLabel(); Generalizando: para crear un objeto llamado xxx del tipo tipoobjeto, se tendr que hacer lo siguiente:

En la zona de las variables globales se declarar la variable del objeto de la siguiente forma: tipoobjeto xxx;

Luego, dentro de la clase, se construye el objeto siguiendo la siguiente sintaxis: xxx = new tipoobjeto();

En el ejemplo, la etiqueta creada, cuyo nombre es etiNum1, tiene que contener el texto Nmero 1:. Esto lo hacemos con el tpico mtodo setText: etiNum1.setText(Nmero 1: );

Hay que definir la posicin que tendr el objeto y el tamao. Para ello, se usar el mtodo setBounds. Este mtodo recibe la posicin (x, y) del objeto y el ancho y el alto. En el ejemplo, la etiqueta est situada en la posicin (10,10) de la ventana y tiene un ancho de 100 y un alto de 20: etiNum1.setBounds(10,10,100,20);

Finalmente, hay que colocar la etiqueta en el panel de contenidos de la ventana. Para ello, se usa el mtodo add del panel de contenidos. Recuerda que para obtener este panel se usa el mtodo getContentPane: this.getContentPane().add(etiNum1);

19. Es buena idea que ejecutes el programa para ver el aspecto de la ventana ahora.

20. Hemos aadido una etiqueta. Ahora aadiremos la siguiente. Para ello, primero tienes que declarar la etiqueta en la zona de las variables globales:

21. Luego, en el mtodo ConstruirVentana, aadiremos el siguiente cdigo:

22. Este cdigo es prcticamente igual al anterior. En l se constuye la etiqueta declarada antes con el nombre etiNum2. Luego se le asigna el texto Nmero 2:, luego se usa el mtodo setBounds para situarla en la posicin (10, 60) y asignarle un ancho de 100 y un alto de 20. Finalmente se aade la etiqueta al panel de contenidos de la ventana. 23. Ejecuta el programa y observa el aspecto de la ventana ahora:

24. Sigamos aadiendo elementos. Ahora aadiremos un cuadro de texto llamado txtNum1. Primero declara la variable del cuadro de dilogo en la zona de variables globales:

Tendrs que agregar el import correspondiente para el tipo de objeto JTextField. 25. Luego aade el siguiente cdigo en el mtodo CreacionVentana:

26. Este cdigo realiza lo siguiente: La primera lnea construye el cuadro de texto llamado txtNum1. Los JTextField son objetos del tipo cuadro de texto.

Esta lnea se subrayar en rojo ya que ser necesario aadir el import para la librera de los JTextField. La siguiente lnea introduce la cadena 0 dentro del cuadro de texto. La siguiente lnea asigna la posicin y el tamao a travs del mtodo setBounds. Y finalmente, la ltima lnea aade el cuadro de texto al panel de contenidos de la ventana.

27. Ejecuta el programa y comprueba el funcionamiento de este cdigo. 28. Ahora se aadir un nuevo cuadro de texto llamado txtNum2. El cdigo es similar. Declara la variable global:

29. Y ahora aade el cdigo que construye el objeto en el mtodo ConstruirVentana. Este cdigo es similar al del cuadro de texto anterior. Solo cambia el nombre del objeto y la posicin donde se colocar:

30. Ejecuta el programa y comprueba como va el diseo de la ventana:

31. Ahora le toca el turno a los botones. Primero declararemos una variable del tipo JButton en la zona de variables globales (ser necesario aadir el import correspondiente a la clase JButton a travs de la bombilla). El botn se llamar btnSumar:

32. Y a continuacin construiremos y le daremos forma al botn, aadiendo el siguiente cdigo en el mtodo ConstruirVentana:

33. La explicacin del cdigo anterior es similar a los anteriores: La primera lnea construye el botn btnSumar. A continuacin se asigna el texto Sumar al botn. Luego se asigna la posicin y el tamao del botn con el mtodo setBounds. Finalmente se aade el botn al panel de contenido de la ventana.

34. Ejecuta el programa y observa el aspecto de la ventana. 35. Ahora se aadir otro botn llamado btnRestar. Declara la variable JButton:

36. Tienes que escribir el siguiente cdigo:

37. El cdigo es prcticamente igual que el del primer botn. Solo cambia el nombre del botn, el texto y la posicin y tamao del botn. 38. Ejecuta el programa para ver como queda la ventana.

CONCLUSIN La ventana de diseo de NetBeans es una herramienta que nos permite disear las ventanas sin tener que programar cdigo. Es posible prescindir de la ventana de diseo y realizar todo el diseo de la ventana programando. El diseo de la ventana se tiene que hacer en el constructor de la clase. Los componentes de una ventana son variables globales cuyo tipo se corresponde a distintas clases de objetos: JLabel, JTextField, JButton, etc... Para construir un objeto hay que declararlo como una variable global: TipoObjeto NombreObjeto; Y luego, dentro de la clase, construirlo, usando la siguiente sintaxis: NombreObjeto = new TipoObjeto(); Luego se pueden usar distintos mtodos del objeto para trabajar con l.

EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO

Eventos desde cdigo


La ventana de diseo de NetBeans nos permite crear cada componente, colocarlo en la ventana y acceder a los eventos que necesitemos fcilmente para programar en ellos las acciones que se tengan que realizar. Sin embargo, si el diseo de la ventana se ha realizado directamente desde cdigo, ser necesario crear tambin desde cdigo los distintos eventos a usar, y asociarlos al componente correspondiente. Para programar eventos hay que tener en cuenta lo siguiente: Un evento pertenece a un objeto Oyente (Listener) o a un objeto Adaptador (Adapter) El objeto oyente/adaptador hay que asociarlo al elemento sobre el que sucede el evento.

Por ejemplo: Programar la pulsacin de un botn btnSumar. La pulsacin de un botn es un evento actionPerformed como ya se sabe. El evento actionPerformed pertenece a un objeto llamado ActionListener. El objeto ActionListener es lo que se denomina un oyente. El objeto ActionListener se asociar al botn btnSumar

Programacin de eventos La programacin de eventos es compleja, ya que cada evento pertenece a un oyente/adaptador, y a su vez, hay que asociar cada oyente/adaptador al componente que responde al evento. Por otro lado, la sintaxis de programacin para los eventos es distinta a lo que se ha visto hasta ahora, por lo que puede resultar bastante oscura, aunque por otro lado, siempre sigue el mismo patrn. Para simplificar el estudio de la programacin de eventos, nos limitaremos a los eventos ms usados, los cuales pueden clasificarse en los siguientes grupos: Eventos de Accin: o actionPerformed Activar un componente (pulsacin de botn, enter en un cuadro de texto)

Eventos de Teclado: o keyPressed Se puls una tecla, pero no se solt.

o o

keyReleased Se solt una tecla. keyTyped Se puls y solt una tecla.

Eventos de Ratn: o mousePressed Se puls un botn del ratn. o mouseReleased Se solt un botn del ratn. o mousePressed Se puls y solt un botn del ratn. o mouseEntered El ratn entr en la superficie del control. o mouseExited El ratn sali de la superficie del control. Eventos de Ventana: o o o o windowOpened Se abri la ventana windowClosing Se cerr la ventana windowActivated Se activ la ventana windowDeactivated Se desactiv la ventana

En esta explicacin guiada nos limitaremos a estudiar los eventos de accin.

PROGRAMACIN DE EVENTOS DE ACCIN Un evento de accin hace referencia a la activacin de un objeto (un botn, un cuadro de texto, un combo, etc...) Solo existe un tipo de evento de accin, llamado actionPerformed. El evento actionPerformed pertenece a un objeto oyente llamado ActionListener. Eventos de Accin Eventos actionPerformed Se programan dentro de... Oyente/Adaptador ActionListener

La forma de programar el evento actionPerformed de un componente xxx es la siguiente: xxx.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { xxxActionPerformed(evt); } }); Para entender la sintaxis de la programacin de un evento de accin, supongamos el siguiente ejemplo:

Se quiere programar el evento de un botn llamado btnSumar desde cdigo. He aqu el cdigo para crear el evento:

btnSumar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { btnSumarActionPerformed(evt); } });

Una explicacin del cdigo:


El componente cuyo evento se quiere programar. En este ejemplo, el botn btnSumar El mtodo addActionListener permite asignar el oyente al botn. El evento actionPerformed pertenece a un objeto oyente llamado ActionListener.

btnSumar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { btnSumarActionPerformed(evt); } }); El evento actionPerformed, es en
Dentro del procedimiento actionPerformed se hace una llamada a otro procedimiento. El nombre de este otro procedimiento puede ser cualquiera, pero usaremos el nombre del componente seguido de ActionPerformed realidad un procedimiento, que tiene como parmetro un objeto del tipo ActionEvent al que llamaremos evt por convencin.

El cdigo anterior permite crear y asignar el evento actionPerformed al botn btnSumar, pero no programa el evento. Para programar el evento es necesario crear el procedimiento cuya llamada se incluye dentro del evento actionPerformed:
public void btnSumarActionPerformed(ActionEvent evt) { aqu se programa el evento actionPerformed del botn btnSumar }

A pesar de lo complicado que resulta, hay que tener en cuenta que siempre se programa de la misma forma. Solo hay que cambiar el componente que se quiere programar y asignar un nombre a la funcin donde se programar el evento. Hay que tener en cuenta que en el cdigo expuesto antes participan nuevas clases como son ActionEvent y ActionListener, y se tendrn que agregar los import correspondientes.

EJERCICIO GUIADO 1. Abra el proyecto Operaciones que se hizo en el ejercicio guiado de la hoja anterior. 2. En el ejercicio guiado anterior se dise desde cdigo la ventana de dicho proyecto. Esta ventana tiene el siguiente aspecto (Se indica tambin el nombre de los distintos componentes):

txtNum1 y txtNum2 son los cuadros de texto.

btnSumar es el botn Sumar

btnRestar es el botn Restar

3. El objetivo del ejercicio es programar la pulsacin del botn btnSumar para que aparezca un JOptionPane con la suma calculada. Luego haremos lo mismo con el botn btnRestar. Todo esto se har desde cdigo.

4. Para recordar, he aqu el cdigo programado hasta ahora. Tenemos una llamada desde el constructor a un mtodo CreacionVentana donde diseamos cada uno de los elementos de la ventana:
/** Creates new form ventanaprincipal */ public ventanaprincipal() { initComponents(); CreacionVentana(); } public void CreacionVentana() { this.setTitle("Programa Operaciones"); this.setSize(500,300); this.setLocation(100,100); etiNum1 = new JLabel(); etiNum1.setText("Nmero 1:"); etiNum1.setBounds(10,10,100,20); this.getContentPane().add(etiNum1); etiNum2 = new JLabel(); etiNum2.setText("Nmero 2:"); etiNum2.setBounds(10,60,100,20); this.getContentPane().add(etiNum2); txtNum1 = new JTextField(); txtNum1.setText("0"); txtNum1.setBounds(110,10,100,20); this.getContentPane().add(txtNum1); txtNum2 = new JTextField(); txtNum2.setText("0"); txtNum2.setBounds(110,60,100,20); this.getContentPane().add(txtNum2); btnSumar = new JButton(); btnSumar.setText("Sumar"); btnSumar.setBounds(10,120,100,20); this.getContentPane().add(btnSumar); btnRestar = new JButton(); btnRestar.setText("Restar"); btnRestar.setBounds(150,120,100,20); this.getContentPane().add(btnRestar); } Programamos algunos detalles de la ventana principal En el constructor hacemos una llamada a nuestro mtodo CreacionVentana

Creamos la etiqueta Nmero 1

Creamos la etiqueta Nmero 2

Creamos el primer cuadro de texto

Creamos el segundo

Creamos el botn Sumar

Creamos el botn Restar

5. Ahora asignaremos un evento actionPerformed al botn btnSumar. Esto lo haremos al final del mtodo CreacionVentana, El cdigo que debe aadir para el evento actionPerformed del botn btnSumar es el siguiente:

btnSumar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { btnSumarActionPerformed(evt); } });

(Recuerda que el cdigo es siempre igual, solo hay que indicar el nombre del botn y el nombre del procedimiento al que se llama)

6. Ser necesario aadir un import para el objeto oyente ActionListener y para la clase ActionEvent. 7. Ahora que se ha definido un evento actionPerformed para el botn btnSumar, ser necesario programarlo. Esto se hace creando el procedimiento al que llama el cdigo del actionPerformed. A este procedimiento le hemos dado de nombre btnSumarActionPerformed. As pues, aade el siguiente procedimiento a la clase. (No te vayas a equivocar, el siguiente cdigo est fuera del mtodo CreacionVentana)

Este es el final del mtodo CreacionVentana

Hay que programar el mtodo al que llama el evento

Este es el cdigo que tienes que aadir

8. Es precisamente en este nuevo procedimiento que hemos creado donde se programa el evento actionPerformed del botn btnSumar. Lo que se pretende que haga el programa es que aparezca un JOptionPane con la suma de los nmeros introducidos. Para ello, aade el siguiente cdigo:

Programa el cdigo de lo que tiene que hacer el evento.

9. Bien, hemos programado la pulsacin del botn Sumar. Hemos seguido dos pasos: a. Primero hemos creado el evento actionPerformed y se lo hemos asignado al botn. Esto lo hemos hecho dentro del mtodo CreacionVentana. Este evento hace una llamada al procedimiento donde se programar la respuesta al evento. b. Luego hemos creado ese procedimiento y hemos programado en l el cdigo correspondiente a la pulsacin del botn. Ejecuta el programa y comprueba el funcionamiento del botn Sumar.

10. Ahora programaremos el botn btnRestar. Primero se tendr que definir el evento actionPerformed y asignrselo al botn. Esto se hace aadiendo el cdigo de creacin del evento al final del mtodo CreacionVentana.
btnRestar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { btnRestarActionPerformed(evt); } });

(Observa que es idntico al cdigo de asignacin del evento del botn btnSumar, solo cambia el nombre del botn y el nombre del procedimiento al que se llama)

11. Y ahora, hay que programar el procedimiento al que llama el evento actionPerformed. Es aqu donde se programa la respuesta al evento. En nuestro ejemplo, queremos que al pulsar el botn Restar se resten los nmeros introducidos.

public void btnRestarActionPerformed(ActionEvent evt) { double a,b,r; a=Double.parseDouble(txtNum1.getText()); b=Double.parseDouble(txtNum2.getText()); r=a-b; JOptionPane.showMessageDialog(null,"La resta es "+r); }

12. Ejecuta el programa y comprueba el funcionamiento del botn Restar. 13. Resumiendo una vez ms. Para programar un evento sobre un componente, primero hay que enlazar el oyente del evento con el componente, y luego programar el mtodo al que llama el evento. Observa el cdigo que hemos programado:
Asignacin de un actionPerformed al botn btnSumar. (Se hace una llamada al mtodo btnSumarActionPerformed)

Asignacin de un actionPerformed al botn btnRestar. (Se hace una llamada al mtodo btnRestarActionPerformed)

Programacin del mtodo btnSumarActionPerformed (respuesta a la pulsacin del botn btnSumar)

Programacin del mtodo btnRestarActionPerformed (respuesta a la pulsacin del botn btnRestar)

CONCLUSIN Cada evento pertenece a un objeto oyente, y es el oyente el que se asigna al componente de la ventana que se quiere programar. El evento actionPerformed pertenece al oyente ActionListener. Para enlazar el oyente ActionListener a un componente XXX hay que usar el siguiente cdigo: XXX.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { XXXActionPerformed(evt); } }); El enlace de un evento a un componente se hace en el constructor. Esta asignacin hace una llamada a un procedimiento XXXActionPerformed, (donde XXX representa el nombre del componente que se programa) Es en este procedimiento donde realmente se programa el evento.

EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO. EVENTOS DE RATN

Eventos desde cdigo


Se estudi en la hoja de teora anterior la forma de programar eventos desde cdigo. Concretamente se estudi como programar eventos de accin. En esta hoja se estudiar como programar eventos de ratn. Los eventos de ratn son los siguientes: mouseEntered o Indica que el ratn entr en la superficie del elemento (etiqueta, botn, etc) mouseExited o Indica que el ratn sali de la superficie del elemento (etiqueta, botn, etc) mousePressed o Indica que un botn del ratn ha sido presionado sobre el elemento. mouseReleased o Indica que un botn del ratn ha sido soltado sobre el elemento. mouseClicked o Indica que se ha pulsado/soltado un botn del ratn.

Como se dijo en la hoja anterior, todos los eventos pertenecen a un objeto oyente o adaptador. En este caso concreto, todos los eventos del ratn pertenecen a un objeto adaptador llamado MouseAdapter. Cada uno de los eventos se programar dentro del adaptador MouseAdapter. Cada evento es en realidad un procedimiento que recibe un parmetro con informacin sobre el evento. Este parmetro, en el caso de los eventos del ratn, es del tipo MouseEvent. Cada evento a su vez hace una llamada a un procedimiento, y es en este procedimiento donde realmente se programa la respuesta al evento. Todo esto resulta complicado al principio, pero vers que en realidad siempre es igual. Solo hay que conocer el nombre de cada evento, el adaptador u oyente al que pertenece y el tipo de parmetro que recibe cada evento.

Como enlazar eventos de ratn con un componente Supongamos que tenemos un componente (botn, etiqueta, etc...) llamado XXX. Si queremos asociarle eventos de ratn, tendremos que aadir el siguiente cdigo dentro del constructor:
XXX.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent evt) { XXXMouseEntered(evt); } public void mouseExited(MouseEvent evt) { XXXMouseExited(evt); } public void mousePressed(MouseEvent evt) { XXXMousePressed(evt); } public void mouseReleased(MouseEvent evt) { XXXMouseReleased(evt); } public void mouseClicked(MouseEvent evt) { XXXMouseClicked(evt); } });

Veamos este mismo cdigo comentado:


Para asignar el adaptador al elemento XXX se usa el mtodo addMouseListener XXX.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent evt) { XXXMouseEntered(evt); } public void mouseExited(MouseEvent evt) { XXXMouseExited(evt); } public void mousePressed(MouseEvent evt) { XXXMousePressed(evt); } public void mouseReleased(MouseEvent evt) { XXXMouseReleased(evt); } public void mouseClicked(MouseEvent evt) { XXXMouseClicked(evt); } }); Cada evento hace una llamada a un procedimiento, cuyo nombre puede ser cualquiera, aunque suele construirse uniendo el nombre del componente XXX junto con el nombre del evento. Es luego en estos procedimientos donde se programa la respuesta a cada evento. Cada evento recibe como parmetro un objeto del tipo MouseEvent al que por convencin se le suele llamar evt. Este objeto suele contener informacin sobre la pulsacin del ratn (qu botn se ha pulsado, cuantas veces, etc...) Estos son los eventos de ratn que pertenecen al adaptador MouseAdapter. En realidad no hay que ponerlos todos, solo hay que aadir los que necesites. Los eventos de ratn pertenecen al adaptador llamado MouseAdapter

EJERCICIO GUIADO 1. Crea un nuevo proyecto. 2. Accede al cdigo del proyecto.

3. Inserta una llamada dentro del constructor a un procedimiento CreacionVentana de la siguiente forma:
La llamada...

Y el procedimiento.

4. La ventana va a contener dos etiquetas, que tendremos que declarar en la zona de variables globales:

5. Ahora vamos a disear la ventana. Introduce el siguiente cdigo dentro del procedimiento CreacionVentana:

Detalles de la ventana

Se disea la primera etiqueta

Se disea la segunda etiqueta

6. Ejecuta ya el programa para observar el resultado de nuestro diseo. El aspecto debe ser el siguiente:

7. El objetivo del programa es simple. Queremos que al entrar el ratn dentro de la superficie de la etiqueta roja, aparezca un mensaje en la otra etiqueta indicndolo. Tambin queremos que aparezca un mensaje al salir el ratn de la etiqueta. Y tambin al pulsar un botn del ratn sobre la etiqueta. 8. Para hacer esto, necesitamos crear un MouseAdapter que contenga los siguientes eventos: mouseEntered, mouseExited y mousePressed. Observa que no es necesario que contenga el mouseReleased ni el mouseClicked. Luego, el MouseAdapter se asignar a la etiqueta roja etiZona. 9. Primero programaremos el enlace del adaptador MouseAdapter con la etiqueta etiZona. Programa al final del mtodo CreacionVentana lo siguiente:

10. Observa el cdigo: a. Se aade un MouseAdapter al objeto etiZona. b. El MouseAdapter que se aade solo contiene los tres eventos que necesitamos: mouseEntered, mouseExited y mousePressed. c. Ser necesario aadir imports para las clases MouseAdapter y MouseEvent. d. Es normal que las llamadas a los procedimientos de cada evento den error ya que todava no han sido programadas. 11. Ahora se programar cada procedimiento que es llamado desde cada evento. Recuerda que esto debe hacerse fuera del mtodo CreacinVentana. Aqu tienes lo que debes programar:
(Llave del mtodo CreacionVentana)

Debes programar este cdigo

12. Ahora ya puedes ejecutar el programa y comprobar lo que sucede cuando interactas con el ratn sobre la etiqueta de color rojo.

13. Vamos a aadir una pequea mejora que nos servir para estudiar ese objeto llamado evt del tipo MouseEvent que llevan todos los eventos de ratn como parmetro. Se dijo antes que este parmetro contiene informacin sobre la accin del ratn. Por ejemplo, nos puede servir para saber cuantas veces se puls el ratn, con qu botn, etc. Aprovecharemos este parmetro para indicar qu botn del ratn es el que se ha pulsado sobre la etiqueta. Cambia el procedimiento etiZonaMousePressed y djalo de la siguiente forma:

14. En el cdigo anterior aprovechamos los mtodos que tiene el objeto MouseEvent para averiguar que botn se ha pulsado. Usamos el mtodo getButton que nos dice el botn pulsado. Aprovechamos las constantes de la clase MouseEvent para saber si se puls el botn izquierdo, central o derecho. 15. Ejecuta el programa y comprueba el funcionamiento.

CONCLUSIN Hay grupos de eventos que pertenecen a un mismo oyente o adaptador. Por ejemplo, los eventos de ratn pertenecen al adaptador llamado MouseAdapter. Si se quiere asignar eventos de ratn a un componente XXX, hay que usar el siguiente cdigo: XXX.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent evt) { XXXMouseEvent(evt); } ... otros eventos de ratn... }); Ten en cuenta que solo aades al adaptador aquellos eventos que necesites. Cada evento de ratn lleva como parmetro un objeto evt del tipo MouseEvent que contiene informacin sobre el evento: qu botn del ratn se puls, cuantas veces, etc.

EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO. IDEAS GENERALES

Eventos desde cdigo. Consideraciones Generales


Se finalizar el estudio de los eventos desde cdigo, planteando de forma general el cdigo necesario para programarlos. A la hora de programar eventos sobre un componente concreto, ser necesario tener en cuenta lo siguiente: Primero hay que enlazar el componente con el oyente o adaptador correspondiente al evento. El oyente o adaptador contendr aquellos eventos que interesen programar. Cada evento tiene un parmetro asociado con informacin sobre el evento. Cada evento realiza una llamada a un procedimiento y es en este procedimiento donde se programa la respuesta al evento.

La sintaxis general de programacin de eventos es la siguiente:

Componente.MetodoParaAadirOyente(new TipoOyente() { public void evento1(TipoEvento evt) { LlamadaAProcedimiento1(evt); } public void evento2(TipoEvento evt) { LlamadaAProcedimiento2(evt); } ...otros eventos... });

Para poder programar un evento es necesario conocer lo siguiente: El componente sobre el que se programar. El tipo oyente o adaptador al que pertenece el evento. El mtodo usado para asignar el oyente al componente. El nombre del evento. El tipo de evento para el parmetro.

Ejemplo 1. Eventos del Ratn Los eventos de ratn son: mouseEntered, mouseExited, mousePressed, mouseReleased, mouseClicked. Pertenecen al adaptador MouseAdapter. El adaptador se asigna al componente con el mtodo addMouseListener. Los mtodos llevan como parmetro un objeto del tipo MouseEvent. Conociendo esto, si queremos programar los eventos del ratn de una etiqueta llamada etiTexto, solo tenemos que hacer lo siguiente:

etiTexto.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent evt) { etiTextoMouseEntered(evt); } public void mouseExited(MouseEvent evt) { etiTextoMouseExited(evt); } public void mousePressed(MouseEvent evt) { etiTextoMousePressed(evt); } public void mouseReleased(MouseEvent evt) { etiTextoMouseReleased(evt); } public void mouseClicked(MouseEvent evt) { etiTextoMouseClicked(evt); } });

Ejemplo 2. Eventos del teclado Los eventos de teclado controlan las pulsaciones de tecla. Entre ellos, podemos mencionar a los siguientes: keyPressed, que define la pulsacin de una tecla. keyReleased, que define el momento en que se suelta una tecla. keyTyped, que define el pulsar-soltar una tecla.

Los eventos de teclado pertenecen al adaptador KeyAdapter. El adaptador anterior se asigna a un componente a travs del mtodo addKeyListener. Los eventos de teclado llevan como parmetro un objeto del tipo KeyEvent.

Sabiendo lo anterior, si se quisieran programar los eventos de teclado de un cuadro de texto llamado txtDato el cdigo necesario sera el siguiente:
txtDato.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent evt) { txtDatoKeyPressed(evt); } public void keyReleased(KeyEvent evt) { txtDatoKeyReleased(evt); } public void keyTyped(KeyEvent evt) { txtDatoKeyTyped(evt); } });

Como puedes observar, la programacin de eventos siempre se hace de la misma forma, solo tienes que conocer el adaptador/oyente, el mtodo para asignar dicho adaptador/oyente, el nombre de los eventos, y el tipo de objeto que llevan como parmetro. Sabiendo estos datos, la programacin siempre se hace igual. El problema que se plantea en cambio es el siguiente: Si surge un nuevo evento X el cual quiero usar desde cdigo, cmo puedo saber cual es su adaptador/oyente, el mtodo para asignar dicho adaptador/oyente al componente, y el tipo de datos del parmetro? Para este caso, se aconseja crear un proyecto de prueba desde la ventana de diseo y asignar el evento X que se quiere estudiar a un componente. Luego simplemente hay que analizar el cdigo generado por el NetBeans.

--- NO HAY EJERCICIO GUIADO EN ESTA HOJA ---

CONCLUSIN Para programar desde cdigo un evento es necesario conocer lo siguiente: * El nombre del evento / eventos del mismo grupo. * El oyente/adaptador al que pertenece el evento / eventos. * El mtodo para asignar el oyente/adaptador al componente sobre el que acta el evento. * El tipo de datos de objeto recibido como parmetro por el evento. Conociendo estos datos, la programacin siempre se hace igual: Componente.MetodoParaAadirOyente(new NombreOyenteAdaptador() { public void nombreEvento1(TipoDatoParametro evt) { LlamadaAProcedimientoEvento1(evt); } public void nombreEvento2(TipoDatoParametro evt) { LlamadaAProcedimientoEvento2(evt); } });

Se puede aprender mucho sobre los eventos asocindolos desde diseo y luego mirando en el cdigo generado.

EJERCICIO GUIADO. JAVA: VECTORES

Vectores en Java
El manejo de vectores en Java es similar al manejo de vectores en C. Solo hay que tener en cuenta que un vector en Java se tiene primero que declarar, y luego se tiene que construir, ya que los vectores son, al igual que todo en Java, objetos. Declaracin de un vector Para declarar un vector se seguir la siguiente sintaxis:
tipodatos nombrevector[];

tipodatos es el tipo de datos de los elementos del vector (int, double, String, etc.) nombrevector es el nombre que tu quieras darle a tu vector.

Por ejemplo, supongamos que queremos crear un vector de enteros llamado v. La declaracin ser la siguiente: int v[];

Como puedes ver, en la declaracin de un vector no se indica la dimensin, de ste, es decir, el nmero de elementos que tiene. Esto se hace en la construccin del vector.

Construccin de un vector Para construir un vector que ya haya sido declarado se sigue la siguiente sintaxis:
nombrevector = new tipodatos[dim];

nombrevector es el nombre del vector a construir. tipodatos es el tipo de datos del vector. dim es la dimensin del vector (el nmero de elementos)

Por ejemplo, si queremos que el vector v declarado antes tenga 10 elementos, tendremos que hacer lo siguiente: v = int[10]; En el momento de la construccin del vector, podemos usar una variable entera para asignar el nmero de elementos que se quiera. Por ejemplo, en el siguiente caso el nmero de elementos del vector v viene dado por la variable num: v = int[num];

Acceso a los elementos de un vector Una vez declarado el vector y construido, este se puede usar de la misma manera que en C. Se puede acceder a un elemento del vector escribiendo el nombre del vector y entre corchetes el ndice del elemento que quieres usar. Recuerda que los ndices comienzan a numerarse en 0. Ejemplo 1:
etiResultado.setText(El resultado es: +v[3]);

Aqu se coloca en una etiqueta el valor contenido en el elemento de la posicin cuarta del vector v. Ejemplo 2:
for (i=0;i<10;i++) { v[i]=0; }

Este cdigo recorre un vector de 10 elementos y almacena en dichos 10 elementos un 0.

Longitud de un vector Una forma rpida de saber la longitud que tiene un vector es usar lo siguiente: nombrevector.length Por ejemplo, si el vector se llama v, su longitud (el nmero de elementos que tiene) sera: v.length

El siguiente cdigo rellena el vector v con ceros, da igual el nmero de elementos que tenga:
for (i=0;i<v.length;i++) { v[i]=0; }

Creacin de un vector e inicializacin con datos al mismo tiempo Es posible crear un vector e introducir datos directamente en l al mismo tiempo. La forma general de hacerlo sera la siguiente:
tipodatos nombrevector[] = {elemento1, elemento2, elemento3, , elemento n};

Por ejemplo:
int v[] = {5, 2, 7, 6};

Este cdigo crea un vector con cuatro nmeros enteros: 5, 2, 7, 6. Ejemplo 2:


String dias[] = {Lunes, Martes, Mircoles, Jueves, Viernes, Sbado, Domingo};

Este cdigo crea un vector que contiene 7 cadenas, correspondientes a los das de la semana.

VECTORES DE COMPONENTES En Java, se pueden crear vectores de etiquetas, botones, cuadros de textos, etc. Esto es tremendamente til cuando se tienen que definir muchos componentes con una funcin parecida, y que tengan que ser tratados en conjunto. Por otro lado, nos ahorra mucho tiempo ya que no se tienen que disear estos elementos en la misma ventana de diseo. Los vectores de componentes se usan igual que se ha indicado antes. Observa el siguiente ejemplo:
JLabel veti[]; //aqu se crea un vector de etiquetas llamado veti

veti=new JLabel[3]; //aqu se construye el vector, asignando 3 etiquetas //ahora trabajamos con las etiquetas del vector //usando el tpico for for (i=0;i<veti.length;i++) { veti[i]= new JLabel(); //se construye cada etiqueta veti[i].setBounds(10,10+i*30,100,20); //se asigna posicin y tamao veti[i].setText(Etiqueta +i); //se asigna un texto this.getContentPane().add(veti[i]); //se coloca en la ventana }

Realiza el siguiente ejercicio guiado para entender el ejemplo:

Ejercicio guiado

1. Crea un nuevo proyecto en java. 2. Empecemos definiendo desde cdigo las caractersticas de la ventana. Crearemos el mtodo CreacionVentana, y lo llamaremos desde el constructor del proyecto:

3. Vamos a situar en la ventana 10 cuadros de verificacin (JCheckBox). Para ello, usaremos un vector de 10 JCheckBox. Este vector se declarar en la zona de variables globales (ser necesario aadir el tpico import):

4. La construccin de los vectores de componentes, se realiza en el mismo constructor (en nuestro caso en el mtodo CreacinVentana, que es llamado desde el constructor). Construiremos el vector de forma que contenga 10 JCheckBox:

5. Se acaba de construir un vector con 10 cuadros de verificacin. Ahora, es necesario construir cada uno de los cuadros del vector y asignarle ciertas propiedades. Esto se hace con un for que recorre los elementos del vector. (Aade el siguiente cdigo dentro de CreacionVentana):

6. Analiza este cdigo que se acaba de aadir: a. Observa como cada elemento del vector debe ser construido:
vcuadros[i] = new JCheckBox();

b. El texto que tendr cada elemento ser: Opcin 0, Opcin 1, etc


vcuadros[i].setText(Opcin +i);

c. Los cuadros de verificacin se colocan uno debajo de otro. Estudia la lnea siguiente y observa como vara la posicin vertical de cada cuadro:
vcuadros[i].setBounds(10, 10+30*i, 100, 20);

7. Ejecuta el programa y observa el resultado:

8. Mejoremos la presentacin de los cuadros cambiando los rtulos de cada uno. Para ello, ser necesario usar otro vector auxiliar que contenga los textos de cada uno de los cuadros. Modifica el cdigo anterior de forma que quede as:

9. En este cdigo puedes observar como se usa un vector de String que se crea conteniendo 10 colores. Luego, ese vector se usa para asignar cada color al texto de cada cuadro. Si ahora ejecutas el programa, vers que cada cuadro tiene su texto correspondiente a un color.

10. Ahora aade un botn con su evento actionPerformed. Aade en la zona de variables globales lo siguiente: JButton btnAceptar;

Y luego, dentro de CreacionVentana, aade el siguiente cdigo:

11. Ahora programaremos la respuesta al evento actionPerformed de forma que el programa diga cuantos cuadros hay seleccionados. Para ello, se tendr que programar el procedimiento btnAceptarActionPerformed, cuya llamada se encuentra en el cdigo anterior (la lnea que da error): As pues, fuera de CreacionVentana, programa el siguiente procedimiento:

12. En este cdigo se puede observar como se usa un for para recorrer fcilmente el vector de cuadros y averiguar cuales de ellos est activado. Aumentamos un contador y lo dems es sencillo. Si este programa se hubiera hecho desde diseo, el cdigo para contar el nmero de cuadros activados sera mucho ms engorroso. Pinsalo.

13. Ejecuta el programa. Selecciona varios cuadros y pulsa el botn Aceptar. Observa el resultado:

CONCLUSIN En Java, los vectores debe declararse y luego construirse. Es en la construccin del vector cuando a este se le asigna un nmero de elementos. Los vectores en Java pueden ser usados de la misma forma que en C. En Java se pueden crear vectores de componentes: etiquetas, botones, etc, facilitando luego el trabajo con todos estos elementos en conjunto y facilitando las labores de diseo.

EJERCICIO GUIADO. JAVA: VECTORES Y EVENTOS

Asignacin de eventos a los elementos de un vector de componentes


En Java se pueden crear vectores de componentes, como ya se vio en la hoja guiada anterior. Estos vectores pueden contener un grupo de etiquetas, o botones, cuadros de textos, etc. Gracias a los vectores de componentes se pueden crear rpidamente por cdigo estos componentes y trabajar sobre ellos sin tener que usar muchas lneas de cdigo. En esta hoja se ver como se pueden asignar eventos a los componentes de un vector.

Ejercicio guiado

1. Crea un nuevo proyecto en java. 2. Empecemos definiendo desde cdigo las caractersticas de la ventana. Crearemos el mtodo CreacionVentana, y lo llamaremos desde el constructor del proyecto:

3. Vamos a situar en la ventana 5 botones, y para ello usaremos un vector de botones, que tendremos que declarar en la zona de variables globales:

4. Dentro del procedimiento CreacionVentana construiremos el vector y construiremos cada uno de los botones que contiene, asignando las distintas caractersticas de cada uno. Debes aadir el siguiente cdigo a CreacionVentana:

5. En el cdigo anterior se crea un vector de cadenas (String) con el texto de cada botn. Luego se construye el vector de botones, asignndole 5 botones. A continuacin, usando un for, construimos cada botn del vector, le asignamos el texto correspondiente, le asignamos su posicin y su tamao, y lo colocamos en el panel de contenido de la ventana.

6. Ejecuta el programa para observar su aspecto hasta ahora:

7. Ahora, interesara asignar un evento actionPerformed a cada botn. Esto se har aprovechando el que todos los botones pertenezcan a un vector, usando un bucle for. Aade el siguiente cdigo al final de CreacionVentana:

Este cdigo asigna a cada botn un evento actionPerformed que hace una llamada a un procedimiento al que se le ha llamado botonesActionPerformed. (Esta llamada da error porque an no ha sido programado el procedimiento. Esto se har a continuacin.) Hay que tener en cuenta que cuando se pulse cualquiera de los botones, se ejecutar el procedimiento botonesActionPerformed. Programa este procedimiento (fuera de CreacionVentana, por supuesto) de la siguiente forma:

8. Ejecuta el programa y observa el resultado. Cuando pulsas cualquiera de los botones, se ejecuta la respuesta al evento y esta lo que hace es mostrar un mensaje a travs de un JOptionPane donde aparece el texto Has pulsado uno de los botones. El procedimiento botonesActionPerformed sirve como respuesta para todos los botones. El problema que plantea esto es, cmo saber qu botn se ha pulsado? Es aqu donde entra en funcionamiento el parmetro evt que suelen llevar todos los eventos. 9. Modifica el procedimiento botonesActionPerformed de forma que quede as:

Este cdigo resulta muy interesante. El parmetro evt tiene siempre un mtodo llamado getSource que devuelve el componente de la ventana sobre el que ha sucedido el evento. De esta manera obtenemos el botn que ha sido pulsado. (Observa que es necesario hacer un cast) Aprovechamos esto para introducir el botn en una variable auxiliar que hemos llamado botonPulsado. Luego solo hay que usar la variable botonPulsado como un botn normal y corriente. Por ejemplo, la usamos en el JOptionPane mostrando el texto que contiene el botn pulsado con el mtodo getText. 10. Ejecuta el programa y observa el resultado.

CONCLUSIN Se pueden asignar eventos a los elementos de un vector a travs de un for que recorra los distintos elementos del vector y le asigne el evento o eventos necesarios. Cuando se asigna un mismo procedimiento de respuesta a eventos a varios componentes, es necesario usar el parmetro evt junto con el mtodo getSource para averiguar el componente sobre el que ha sucedido el evento. La forma general de acceder al elemento sobre el que sucedi el evento es la siguiente: TipoComponente variable = (TipoComponente) evt.getSource(); La variable variable contendr el componente activado.

EJERCICIO GUIADO. JAVA: INTRODUCCIN A LA POO

Introduccin a la Programacin Orientada a Objetos


La programacin orientada a objetos es una nueva forma de entender la creacin de programas. Esta filosofa de programacin se basa en el concepto de objeto. Objeto Un objeto se define como un elemento que tiene unas propiedades y mtodos. Un objeto posee unas caractersticas (ancho, alto, color, etc) A las caractersticas de un objeto se les llama propiedades. Un objeto es un elemento inteligente. A un objeto se le puede dar rdenes y l obedecer. A estas rdenes se les llama mtodos. Con los mtodos podemos cambiar las caractersticas del objeto, pedirle informacin, o hacer que el objeto reaccione de alguna forma. En Java todo son objetos. Veamos algunos ejemplos de uso de objetos en Java:

Ejemplo 1
Supongamos que tenemos una etiqueta llamada etiTexto. Esta etiqueta es un objeto. Como objeto que es, la etiqueta etiTexto tiene una serie de caractersticas, como por ejemplo: el color de fondo, el tamao, la posicin que ocupa en la ventana, el ser opaca o no, el ser invisible o no, etc Son las propiedades de la etiqueta. A una etiqueta le podemos dar rdenes, a travs de mtodos. A travs de los mtodos podemos por ejemplo cambiar las caractersticas del objeto. Por ejemplo, se puede cambiar el tamao y posicin de la etiqueta usando el mtodo setBounds: etiTexto.setBounds(10,20,100,20); Normalmente, los mtodos que permiten cambiar las caractersticas del objeto son mtodos cuyo nombre empieza por set. Los mtodos tambin permiten pedirle al objeto que me de informacin. Por ejemplo, podramos usar el conocido mtodo getText para recoger el texto que contenga la etiqueta y almacenarlo en una variable: String texto; texto = etiTexto.getText();

Los mtodos que le piden informacin al objeto suelen tener un nombre que empieza por get. Los mtodos tambin sirven para ordenarle al objeto que haga cosas. Por ejemplo, podemos ordenar a la etiqueta etiTexto que se vuelva a pintar en la ventana usando el mtodo repaint: etiTexto.repaint();

Ejemplo 2 Supongamos que tenemos un cuadro de texto llamado txtCuadro. Como todo en Java, un cuadro de texto es un objeto. Un objeto tiene propiedades, es decir, caractersticas. Nuestro cuadro de texto txtCuadro tiene caractersticas propias: un color de fondo, un ancho, un alto, una posicin en la ventana, el estar activado o no, el estar visible o no, etc A un objeto se le puede dar rdenes, llamadas mtodos. Estas rdenes nos permiten cambiar las caractersticas del objeto, pedirle informacin, o simplemente pedirle al objeto que haga algo. Por ejemplo, podemos cambiar el color de fondo del cuadro de texto txtCuadro usando el mtodo llamado setBackground: txtCuadro.setBackground(Color.RED); Otros mtodos que permiten cambiar las propiedades del objeto txtCuadro son: setVisible setEnabled setEditable setText setBounds setToolTipText etc - permite poner visible / invisible el cuadro de texto - permite activar / desactivar el cuadro de texto - permite hacer que se pueda escribir o no en el cuadro de texto - permite introducir un texto en el cuadro de texto - permite cambiar el tamao y posicin del objeto - permite asociar un texto de ayuda al cuadro de texto

Un objeto nos da informacin sobre l. Para pedirle informacin a un objeto usaremos mtodos del tipo get. Por ejemplo, para pedirle al cuadro de texto el texto que contiene, usaremos el mtodo getText: String cadena = txtCuadro.getText(); Otros mtodos que le piden informacin al cuadro de texto son: getWidth getHeight getSelectedText getToolTipText etc - te dice la anchura que tiene el cuadro de texto - te dice el alto que tiene el cuadro de texto - te devuelve el texto que est seleccionado dentro del cuadro de texto - te dice el texto de ayuda que tiene asociado el cuadro de texto

Tambin se le puede dar al objeto simplemente rdenes para que haga algo. Por ejemplo, podemos ordenar al cuadro de texto txtCuadro que seleccione todo el texto que contiene en su interior a travs del mtodo selectAll: txtCuadro.selectAll(); Otros mtodos que ordenan al cuadro de texto son: repaint copy cut paste etc - le ordena al cuadro de texto que se vuelva a pintar - le ordena al cuadro de texto que copie el texto que tenga seleccionado - le ordena al cuadro de texto que corte el texto que tenga seleccionado - le ordena al cuadro que pegue el texto que se hubiera copiado o cortado

Clase Todo objeto es de una clase determinada, o dicho de otra forma, tiene un tipo de datos determinado. Por ejemplo, las etiquetas que se usan en las ventanas son objetos que pertenecen a la clase JLabel. Los cuadros de texto en cambio son objetos de la clase JTextField. Para poder usar un objeto hay que declararlo y construirlo. Declarar un Objeto La declaracin de un objeto es algo similar a la declaracin de una variable. Es en este momento cuando se le da un nombre al objeto. Para declarar un objeto se sigue la siguiente sintaxis: Clase nombreobjeto;

Por ejemplo, para declarar la etiqueta del ejemplo 1, se usara el siguiente cdigo: JLabel etiTexto; Para declarar, en cambio, el cuadro de texto del ejemplo 2, se usara el siguiente cdigo: JTextField txtCuadro;

Construir un Objeto En el momento de la construccin de un objeto, se le asignan a este una serie de propiedades iniciales. Es decir, unas caractersticas por defecto. Se puede decir que es el momento en que nace el objeto, y este nace ya con una forma predeterminada, que luego el programador podr cambiar usando los mtodos del objeto. Es necesario construir el objeto para poder usarlo. La construccin del objeto se hace a travs del siguiente cdigo general: nombreobjeto = new Clase(); Por ejemplo, para construir la etiqueta del ejemplo 1, se hara lo siguiente: etiTexto = new JLabel(); Para construir el cuadro de texto del ejemplo 2, se hara lo siguiente: txtCuadro = new JTextField();

NOTA. En algunos casos, la sintaxis de la declaracin y la construccin se une en una sola lnea. Por ejemplo, supongamos que queremos declarar la etiqueta etiTexto y construirla todo en una lnea, entonces se puede hacer lo siguiente: JLabel etiTexto = new JLabel(); En general, para declarar y construir un objeto en una sola lnea se sigue la siguiente sintaxis: Clase nombreobjeto = new Clase();

La Clase como generadora de objetos Conociendo la Clase, se pueden crear tantos objetos de dicha Clase como se quiera. Es decir, la Clase de un objeto funciona como si fuera una plantilla a partir de la cual fabricamos objetos iguales. Todos los objetos creados a partir de una clase son iguales en un primer momento (cuando se construyen) aunque luego el programador puede dar forma a cada objeto cambiando sus propiedades. Por ejemplo, la Clase JLabel define etiquetas. Esto quiere decir que podemos crear muchas etiquetas usando esta clase: JLabel etiTexto = new JLabel(); JLabel etiResultado = new JLabel(); JLabel etiDato = new JLabel(); En el ejemplo se han declarado y construido tres etiquetas llamadas etiTexto, etiResultado y etiDato. Las tres etiquetas en este momento son iguales, pero a travs de los distintos mtodos podemos dar forma a cada una: etiTexto.setBackground(Color.RED); etiTexto.setText(Hola); etiResultado.setBackground(Color.GREEN); etiResultado.setText(Error); etiDato.setBackground(Color.BLUE); etiDato.setText(Cadena);

En el ejemplo se le ha dado, usando el mtodo setBackground, un color a cada etiqueta. Y se ha cambiado el texto de cada una. Se le da forma a cada etiqueta.

EJERCICIO Hasta ahora ha usado objetos aunque no tenga mucha conciencia de ello. Por ejemplo ha usado botones. Como ejercicio se propone lo siguiente: Cul es el nombre de la clase de los botones normales que usa en sus ventanas? Cmo declarara un botn llamado btnAceptar, y otro llamado btnCancelar? Cmo construira dichos botones? Indique algunos mtodos para cambiar propiedades de dichos botones (mtodos set) Indique algunos mtodos para pedirle informacin a dichos botones (mtodos get) Indique algn mtodo para dar rdenes a dichos botones (algn mtodo que no sea ni set ni get)

CONCLUSIN Un Objeto es un elemento que tiene una serie de caractersticas llamadas PROPIEDADES. Por otro lado, al objeto se le pueden dar rdenes que cumplir de inmediato. A dichas rdenes se les denomina MTODOS. Los mtodos se pueden dividir bsicamente en tres tipos: Para cambiar las propiedades del objeto (Mtodos set) Para pedir informacin al objeto (Mtodos get) Para dar rdenes al objeto. Todo objeto pertenece a una CLASE. La CLASE nos permite declarar objetos y construirlos: Declaracin: CLASE nombreobjeto; Construccin: nombreobjeto = new CLASE(); Declaracin y Construccin en una misma lnea CLASE nombreobjeto = new CLASE(), En la construccin de un objeto se asignan unas propiedades (caractersticas) por defecto al objeto que se construye, aunque luego, estas caractersticas pueden ser cambiadas por el programador.

EJERCICIO GUIADO. JAVA: POO. CLASES PROPIAS

Objetos propios del lenguaje


Hasta el momento, todos los objetos que ha usado a la hora de programar en Java, han sido objetos incluidos en el propio lenguaje, que se encuentran disponibles para que el programador los use en sus programas. Estos objetos son: las etiquetas (JLabel), botones (JButton), los cuadros de texto (JTextField), cuadros de verificacin (JCheckBox), botones de opcin (JRadioButton), colores (Color), imgenes de icono (ImageIcon), modelos de lista (DefaultListModel), etc, etc. Todos estos objetos, por supuesto, pertenecen cada uno de ellos a una Clase: Las etiquetas son objetos de la clase JLabel, los botones son objetos de la clase JButton, etc. Todos estos objetos tienen propiedades que pueden ser cambiadas en la ventana de diseo: Ancho, alto, color, alineacin, etc. Aunque tambin poseen mtodos que nos permiten cambiar estas propiedades durante la ejecucin del programa: setText cambia el texto del objeto, setBackground cambia el color de fondo del objeto, setVisible hace visible o invisible al objeto, setBounds cambia el tamao y la posicin del objeto, etc. En cualquier momento le podemos pedir a un objeto que nos de informacin sobre s mismo usando los mtodos get: getText obtenemos el texto que tenga el objeto, getWidth obtenemos la anchura del objeto, getHeight obtenemos la altura del objeto, etc. Los objetos son como pequeos robots a los que se les puede dar rdenes, usando los mtodos que tienen disponible. Por ejemplo, le podemos decir a un objeto que se pinte de nuevo usando el mtodo repaint, podemos ordenarle a un cuadro de texto que coja el cursor, con el mtodo requestFocus, etc. Todos estos objetos, con sus propiedades y mtodos, nos facilitan la creacin de nuestros programas. Pero a medida que nos vamos introduciendo en el mundo de la programacin y nos especializamos en un tipo de programa en concreto, puede ser necesaria la creacin de objetos propios, programados por nosotros mismos, de forma que puedan ser usados en nuestros futuros programas.

Objetos propios
A la hora de disear un objeto de creacin propia, tendremos que pensar qu propiedades debe tener dicho objeto, y mtodos sern necesarios para poder trabajar con l. Dicho de otra forma, debemos pensar en qu caractersticas debe tener el objeto y qu rdenes le podr dar. Para crear objetos propios hay que programar la Clase del objeto. Una vez programada la Clase, ya podremos generar objetos de dicha clase, declarndolos y construyndolos como si de cualquier otro objeto se tratara. A continuacin se propondr un caso prctico de creacin de objetos propios, con el que trabajaremos en las prximas hojas. Lo que viene a continuacin es un planteamiento terico de diseo de una Clase de Objetos.

CASO PRCTICO: MULTICINES AVENIDA

Planteamiento Los Multicines Avenida nos encargan un programa para facilitar las distintas gestiones que se realizan en dichos multicines. El multicine cuenta con varias salas, y cada una de ellas genera una serie de informacin. Para facilitar el control de la informacin de cada sala programaremos una Clase de objeto a la que llamaremos SalaCine.

La Clase SalaCine La Clase SalaCine definir caractersticas de una sala de cine, y permitir crear objetos que representen salas de cine. Cuando la Clase SalaCine est programada, se podrn hacer cosas como las que sigue:

Los Multicines Avenida tienen una sala central donde se proyectan normalmente los estrenos. Se podra crear un objeto llamado central de la clase SalaCine de la siguiente forma: SalaCine central; Por supuesto, este objeto puede ser construido como cualquier otro: central = new SalaCine(); El objeto central representar a la sala de cine central de los Multicines Avenida.

Otro ejemplo. Los Multicines Avenida tienen una sala donde proyectan versiones originales. Se podra crear un objeto llamado salaVO de la clase SalaCine de la siguiente forma: SalaCine salaVO; //declaracin

salaVO = new SalaCine(); //construccin

Propiedades de los objetos de la clase SalaCine A la hora de decidir las propiedades de un objeto de creacin propia, tenemos que preguntarnos, qu informacin me interesa almacenar del objeto? Trasladando esta idea a nuestro caso prctico, qu informacin me interesara tener de cada sala de cine? Para este ejemplo supondremos que de cada sala de cine nos interesa tener conocimiento de las siguientes caractersticas (propiedades): Aforo: define el nmero de butacas de la sala (un nmero entero). Ocupadas: define el nmero de butacas ocupadas (un nmero entero). Pelcula: define la pelcula que se est proyectando en el momento en la sala (una cadena de texto) Entrada: define el precio de la entrada (un nmero double)

Valores por defecto de los objetos SalaCine Cuando se construye un objeto, se asignan unos valores por defecto a sus propiedades. Por ejemplo, cuando se construye una etiqueta (Clase JLabel), esta tiene un tamao inicial definido, un color, etc. Lo mismo se tiene que hacer con los objetos propios que definimos. Es necesario decidir qu valores tendr las propiedades del objeto al construirse. En nuestro caso, las caractersticas de un objeto SalaCine en el momento de construirse sern las siguientes: Aforo: 100 Ocupadas: 0 Pelcula: Entrada: 5,00

(la cadena vaca)

Observa este cdigo, en l construimos el objeto correspondiente a la sala central del multicine: SalaCine central; central = new SalaCine(); En este momento (en el que el objeto central est recin construido) este objeto tiene asignado un aforo de 100, el nmero de butacas ocupadas es 0, la pelcula que se proyecta en la sala central es y la entrada para esta sala es de 5 euros. Los valores por defecto que se asignan a los objetos de una clase son valores arbitrarios que el programador decidir segn su conveniencia.

Mtodos de los objetos SalaCine Para comunicarnos con los objetos de la Clase SalaCine que construyamos, tendremos que disponer de un conjunto de mtodos que nos permitan asignar valores a las propiedades de los objetos, recoger informacin de dichos objetos y que le den rdenes al objeto. Ser el programador el que decida qu mtodos le interesar que posea los objetos de la Clase que est programando. Para nuestro caso particular, supondremos que los objetos de la Clase SalaCine debern tener los siguientes mtodos:

Mtodos de cambio de propiedades (Mtodos set) setAforo setOcupadas setLibres setPelicula setEntrada - asignar un aforo a la sala de cine - asignar una cantidad de butacas ocupadas a la sala de cine - asignar una cantidad de butacas libres a la sala de cine - asignar un ttulo de pelcula a la sala de cine - fijar el precio de las entradas a la sala de cine

Gracias a estos mtodos podemos dar forma a un objeto SalaCine recin creado. Por ejemplo, supongamos que queremos crear el objeto que representa la sala de versiones originales. Resulta que esta sala tiene de aforo 50 localidades, que se est proyectando la pelcula Metrpolis y que la entrada para ver la pelcula es de 3 euros. La sala est vaca de momento.

Para crear el objeto, se usara el siguiente cdigo: //Se construye el objeto SalaCine salaVO; salaVO = new SalaCine(); //Se le asignan caractersticas salaVO.setAforo(50); salaVO.setPelicula(Metrpolis); salaVO.setEntrada(3);

//aforo 50 //la pelcula que se proyecta //entrada a 3 euros

Al construir el objeto salaVO tiene por defecto los valores siguientes en sus propiedades: Aforo: 100 Ocupadas: 0 Pelcula: Entrada: 5,00 Gracias a los mtodos disponibles hemos asignados estos nuevos valores: Aforo: 50 Ocupadas: 0 Pelcula: Metrpolis Entrada: 3,00

Mtodos para pedirle informacin al objeto (Mtodos get) Se programarn los siguientes mtodos get en la clase SalaCine: getAforo getOcupadas getLibres getPorcentaje getIngresos getPelicula getEntrada - devuelve el aforo que tiene el objeto - devuelve el nmero de butacas ocupadas que tiene el objeto - devuelve el nmero de butacas que tiene libres el objeto - devolver el porcentaje de ocupacin de la sala - devolver los ingresos producidos por la sala (entradas vendidas por precio) - devolver el ttulo de la pelcula que se est proyectando - devolver el precio de la entrada asignado al objeto

Estos mtodos nos permitirn obtener informacin de un objeto del tipo SalaCine. Por ejemplo, supongamos que tenemos el objeto llamado central (correspondiente a la sala principal del multicine), para obtener la pelcula que se est proyectando en dicha sala solo habra que usar este cdigo: String peli; //una variable de cadena peli = central.getPelicula(); O, por ejemplo, para saber los ingresos producidos por la sala central double ingresos; ingresos = central.getIngresos();

Mtodos para dar rdenes al objeto Se programarn los siguientes mtodos para dar rdenes a los objetos de la clase SalaCine. vaciar Este mtodo pondr el nmero de plazas ocupadas a cero y le asignar a la pelcula la cadena vaca.

entraUno Este mtodo le dice al objeto que ha entrado una nueva persona en la sala. (Esto debe producir que el nmero de plazas ocupadas aumente en uno)

RESUMEN SALACINE He aqu un resumen de la Clase de objetos SalaCine, la cual se programar en la prxima hoja: Clase de objetos: SalaCine Propiedades de los objetos SalaCine: Aforo Ocupadas Pelcula Entrada - nmero entero (int) - nmero entero (int) - cadena (String) - nmero decimal (double)

Valores por defecto de los objetos del tipo SalaCine: Aforo: 100 Ocupadas: 0 Pelcula: (cadena vaca) Entrada: 5 Mtodos de los objetos del tipo SalaCine: Mtodos de asignacin de propiedades (set) setAforo setOcupadas setLibres setPelicula setEntrada - modifica la propiedad Aforo - modifica la propiedad Ocupadas - modifica la propiedad Ocupadas tambin - modifica la propiedad Pelcula - modifica la propiedad Entrada

Mtodos de peticin de informacin (get) getAforo getOcupadas getLibres getPorcentaje getIngresos getPelicula getEntrada - devuelve el valor de la propiedad Aforo - devuelve el valor de la propiedad Ocupadas - devuelve el nmero de butacas libres - devuelve el porcentaje de ocupacin de la sala - devuelve los ingresos obtenidos por la venta de entradas - devuelve el valor de la propiedad Pelcula - devuelve el valor de la propiedad Entrada

Mtodos de orden Vaciar entraUno - vaca la ocupacin de la sala y borra la pelcula - le indica al objeto que ha entrado una persona ms en la sala

EJERCICIO PRCTICO

Supongamos que programamos una Clase de objetos llamada Rectangulo, la cual permitir construir objetos que representen a rectngulos. 1. Cmo declarara y construira un objeto llamado suelo del tipo Rectangulo?

2. Supongamos que las propiedades de los objetos de la clase Rectangulo sean las siguientes: a. Base (double) b. Altura (double) Qu mtodos de tipo set programara para cambiar las propiedades de los objetos del tipo Rectangulo?

3. Como ejemplo de los mtodos anteriores, suponga que quiere asignar al objeto suelo una base de 30 y una altura de 50. Qu cdigo usara?

4. Teniendo en cuenta que nos puede interesar conocer el rea de un objeto Rectangulo y su permetro, y teniendo en cuenta que los objetos Rectangulo tienen dos propiedades (Base y Altura), qu cuatro mtodos get seran interesantes de programar para los objetos del tipo Rectangulo?

5. Teniendo en cuenta los mtodos del punto 4. Supongamos que quiero almacenar en una variable double llamada area el rea del objeto suelo. Qu cdigo usara? Y si quiero almacenar el permetro del objeto suelo en una variable llamada peri?

CONCLUSIN Para crear un objeto propio, necesita tener claro lo siguiente: Nombre de la Clase del objeto. Propiedades que tendrn los objetos de dicha clase. Valores iniciales que tendrn las propiedades cuando se construya cada objeto. Mtodos que sern interesantes de programar: Mtodos de ajuste de propiedades (set) Mtodos de peticin de informacin (get) Mtodos de orden Una vez que se tenga claro lo anterior, se podr empezar la programacin de la Clase de objetos.

EJERCICIO GUIADO. JAVA: POO. PROGRAMACIN DE UNA CLASE

Programacin de una Clase


En este ejercicio guiado, crearemos la Clase SalaCine, que hemos descrito en la hoja anterior. Luego, a partir de esta clase, fabricaremos objetos representando salas de cine, y los usaremos en un proyecto Java. Recuerda las caractersticas que hemos decidido para la Clase SalaCine en la hoja anterior:

CLASE SALACINE Nombre de la Clase: SalaCine Propiedades de los objetos SalaCine: Aforo Ocupadas Pelcula Entrada - nmero entero (int) - nmero entero (int) - cadena (String) - nmero decimal (double)

Valores por defecto de los objetos del tipo SalaCine: Aforo: 100 Ocupadas: 0 Pelcula: (cadena vaca) Entrada: 5 Mtodos de los objetos del tipo SalaCine: Mtodos de asignacin de propiedades (set) setAforo setOcupadas setLibres setPelicula setEntrada - modifica la propiedad Aforo - modifica la propiedad Ocupadas - modifica la propiedad Ocupadas tambin - modifica la propiedad Pelcula - modifica la propiedad Entrada

Mtodos de peticin de informacin (get) getAforo getOcupadas getLibres getPorcentaje getIngresos getPelicula getEntrada - devuelve el valor de la propiedad Aforo - devuelve el valor de la propiedad Ocupadas - devuelve el nmero de butacas libres - devuelve el porcentaje de ocupacin de la sala - devuelve los ingresos obtenidos por la venta de entradas - devuelve el valor de la propiedad Pelcula - devuelve el valor de la propiedad Entrada

Mtodos de orden Vaciar entraUno - vaca la ocupacin de la sala y borra la pelcula - le indica al objeto que ha entrado una persona ms en la sala

PROGRAMACIN DE UNA CLASE

Fichero de la Clase La programacin de una clase de objetos se realiza en un fichero aparte, cuyo nombre es exactamente el mismo que el de la propia clase, y cuya extensin es .java. Por ejemplo, si queremos programar la clase SalaCine, esto se debe hacer en un fichero llamado: SalaCine.java Cuando programemos esta clase dentro de NetBeans, veremos las facilidades que nos proporciona este para la creacin de la clase. De momento, solo veremos de forma terica como hay que programar la clase. (No tiene que introducir lo que viene a continuacin en ningn sitio)

Estructura bsica de la Clase Dentro del fichero de la clase, comenzar la programacin de esta de la siguiente forma: public class SalaCine {

} La programacin de una clase comienza siempre con una lnea de cdigo como la que sigue: public class NombreDeLaClase {

} Toda la programacin de la clase se introducir dentro de las dos llaves.

Propiedades de la Clase Lo primero que se debe introducir en la clase que se est programando son las propiedades. Las propiedades de una clase son bsicamente variables globales de sta. Si introducimos las propiedades de la clase SalaCine, esta nos quedara as: public class SalaCine { int Aforo; int Ocupadas; String Pelcula; double Entrada; }

Constructor de la Clase Cuando se plante la clase SalaCine, se tuvo que decidir qu valores iniciales deberan tener las propiedades de la clase. Para asignar estos valores iniciales, es necesario programar lo que se denomina el Constructor.

El Constructor de una clase es un mtodo (un procedimiento para entendernos) un poco especial, ya que debe tener el mismo nombre de la clase y no devuelve nada, pero no lleva la palabra void. Dentro del constructor se inicializan las propiedades de la clase. En general, la programacin del constructor sigue la siguiente sintaxis: public NombreDeLaClase() { propiedad1 = valor; propiedad2 = valor; etc } La clase SalaCine, aadiendo el Constructor, tendr el siguiente aspecto: public class SalaCine { int Aforo; int Ocupadas; String Pelcula; double Entrada; //Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ; Entrada = 5.0; } } Observa como usamos el constructor de la clase SalaCine para asignar a cada propiedad los valores por defecto decididos en el diseo de la clase que se hizo en la hoja anterior.

Constructor

Mtodos del tipo set Todas las clases suelen contener mtodos del tipo set. Recuerda que estos mtodos permiten asignar valores a las propiedades de la clase. Debes tener en cuenta tambin que cuando se habla de mtodo de una clase, en realidad se est hablando de un procedimiento o funcin, que puede recibir como parmetro determinadas variables y que puede devolver valores. Los mtodos del tipo set son bsicamente procedimientos que reciben valores como parmetros que introducimos en las propiedades. Estos mtodos no devuelven nada, as que son void. Se recomienda, que el parmetro del procedimiento se llame de forma distinta a la propiedad que se asigna. Veamos la programacin del mtodo setAforo, de la clase SalaCine: public void setAforo(int afo) { Aforo = afo; } Observa este mtodo: Es void, es decir, no devuelve nada (el significado de la palabra public se ver ms adelante)

El mtodo recibe como parmetro una variable del mismo tipo que la propiedad que queremos modificar (en este caso int) y un nombre que se recomienda que no sea igual al de la propiedad (en nuestro caso, afo, de aforo) Puedes observar que lo que se hace simplemente en el mtodo es asignar la variable pasada como parmetro a la propiedad.

La mayora de los procedimientos set usados para introducir valores en las propiedades tienen la misma forma. Aqu tienes la programacin de los dems procedimientos set de la clase SalaCine. //Mtodo setOcupadas public void setOcupadas(int ocu) { Ocupadas = ocu; } //Mtodo setPelicula public void setPelicula(String peli) { Pelicula = peli; } //Mtodo setEntrada public void setEntrada(double entra) { Entrada = entra; } Hay un mtodo set de la clase SalaCine llamado setLibres cuya misin es asignar el nmero de localidades libres del cine. Sin embargo la clase SalaCine no tiene una propiedad Libres. En realidad, este mtodo debe modificar el nmero de localidades ocupadas. Observa su programacin: //Mtodo setLibres public void setLibres(int lib) { int ocu; ocu = Aforo lib; Ocupadas = ocu; }

Al asignar un nmero de localidades ocupadas, estamos asignando indirectamente el nmero de localidades libres. Como puedes observar en el mtodo, lo que se hace es calcular el nmero de localidades ocupadas a partir de las libres, y asignar este valor a la propiedad Ocupadas. No se pens en crear una propiedad de la clase llamada Libres ya que en todo momento se puede saber cuantas localidades libres hay restando el Aforo menos las localidades Ocupadas. La clase SalaCine, aadiendo los mtodos set, quedara de la siguiente forma:

public class SalaCine { int Aforo; int Ocupadas; String Pelcula; double Entrada; //Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ; Entrada = 5.0; } //Mtodos set //Mtodo setAforo public void setAforo(int afo) { Aforo = afo; } //Mtodo setOcupadas public void setOcupadas(int ocu) { Ocupadas = ocu; } //Mtodo setPelicula public void setPelicula(String peli) { Pelicula = peli; } //Mtodo setEntrada public void setEntrada(double entra) { Entrada = entra; } //Mtodo setLibres public void setLibres(int lib) { int ocu; ocu = Aforo lib; Ocupadas = ocu; }

Mtodos Set

Mtodos del tipo get Al igual que los mtodos set, los mtodos get son muy fciles de programar ya que suelen tener siempre la misma forma. Estos mtodos no suelen llevar parmetros y devuelven el valor de la propiedad correspondiente usando la tpica instruccin return usada tanto en las funciones. Por tanto, un mtodo get nunca es void. Siempre ser del mismo tipo de datos que la propiedad que devuelve. Veamos la programacin del mtodo getAforo:

//Mtodo getAforo public int getAforo() { return Aforo; } Como puedes ver el mtodo simplemente devuelve el valor de la propiedad Aforo. Como esta propiedad es int, el mtodo es int. Los mtodos que devuelven el resto de las propiedades son igual de sencillos de programar: //Mtodo getOcupadas public int getOcupadas() { return Ocupadas; } //Mtodo getPelicula public String getPelicula() { return Pelcula; } //Mtodo getEntrada public double getEntrada() { return Entrada; } Todos estos mtodos son iguales. Solo tienes que fijarte en el tipo de datos de la propiedad que devuelven. Existen otros mtodos get que devuelven clculos realizados con las propiedades. Estos mtodos realizan algn clculo y luego devuelven el resultado. Observa el siguiente mtodo get: //Mtodo getLibres public int getLibres() { int lib; lib = Aforo Ocupadas; return lib; } No existe una propiedad Libres, por lo que este valor debe ser calculado a partir del Aforo y el nmero de localidades Ocupadas. Para ello restamos y almacenamos el valor en una variable a la que hemos llamado lib. Luego devolvemos dicha variable. Los dos mtodos get que quedan por programar de la clase SalaCine son parecidos: //Mtodo getPorcentaje public double getPorcentaje() { double por; por = (double) Ocupadas / (double) Aforo * 100.0; return por; } Este mtodo calcula el porcentaje de ocupacin de la sala (es un valor double) //Mtodo getIngresos public double getIngresos() { double ingre; ingre = Ocupadas * Entrada; return ingre; } Los ingresos se calculan multiplicando el nmero de entradas por lo que vale una entrada.

La clase SalaCine una vez introducidos los mtodos get quedara de la siguiente forma: public class SalaCine { int Aforo; int Ocupadas; String Pelcula; double Entrada; //Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ; Entrada = 5.0; } //Mtodos set //Mtodo setAforo public void setAforo(int afo) { Aforo = afo; } //Mtodo setOcupadas public void setOcupadas(int ocu) { Ocupadas = ocu; } //Mtodo setPelicula public void setPelicula(String peli) { Pelicula = peli; } //Mtodo setEntrada public void setEntrada(double entra) { Entrada = entra; } //Mtodo setLibres public void setLibres(int lib) { int ocu; ocu = Aforo lib; Ocupadas = ocu; }

//Mtodos get //Mtodo getAforo public int getAforo() { return Aforo; } //Mtodo getOcupadas public int getOcupadas() { return Ocupadas; }

Mtodos Get

//Mtodo getPelicula public String getPelicula() { return Pelcula; } //Mtodo getEntrada public double getEntrada() { return Entrada; } //Mtodo getLibres public int getLibres() { int lib; lib = Aforo Ocupadas; return lib; }

Mtodos Get

//Mtodo getPorcentaje public double getPorcentaje() { double por; por = (double) Ocupadas / (double) Aforo * 100.0; return por; }

//Mtodo getIngresos public double getIngresos() { double ingre; ingre = Ocupadas * Entrada; return ingre; }

Mtodos de orden Para finalizar la programacin de la clase SalaCine, se programarn los dos mtodos de orden que hemos indicado en el planteamiento de la clase. Estos mtodos suelen realizar alguna tarea que involucra a las propiedades de la clase, modificndola internamente. No suelen devolver ningn valor, aunque pueden recibir parmetros. Veamos la programacin del mtodo Vaciar, cuyo objetivo es vaciar la sala y quitar la pelcula en proyeccin: //Mtodo Vaciar public void Vaciar() { Ocupadas = 0; Pelcula = ; } Como se puede observar, es un mtodo muy sencillo, ya que simplemente cambia algunas propiedades de la clase.

El mtodo entraUno es tambin muy sencillo de programar. Este mtodo le indica al objeto que ha entrado un nuevo espectador. Sabiendo esto, el objeto debe aumentar en uno el nmero de localidades ocupadas: //Mtodo entraUno public void entraUno() { Ocupadas++; } Aadiendo estos dos ltimos mtodos, la programacin de la clase SalaCine quedara finalmente como sigue: public class SalaCine { int Aforo; int Ocupadas; String Pelcula; double Entrada; //Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ; Entrada = 5.0; } //Mtodos set //Mtodo setAforo public void setAforo(int afo) { Aforo = afo; } //Mtodo setOcupadas public void setOcupadas(int ocu) { Ocupadas = ocu; } //Mtodo setPelicula public void setPelicula(String peli) { Pelicula = peli; } //Mtodo setEntrada public void setEntrada(double entra) { Entrada = entra; } //Mtodo setLibres public void setLibres(int lib) { int ocu; ocu = Aforo lib; Ocupadas = ocu; }

Propiedades (variables globales)

Constructor

Mtodos Set

//Mtodos get //Mtodo getAforo public int getAforo() { return Aforo; } //Mtodo getOcupadas public int getOcupadas() { return Ocupadas; }

Mtodos Get

//Mtodo getPelicula public String getPelicula() { return Pelcula; } //Mtodo getEntrada public double getEntrada() { return Entrada; } //Mtodo getLibres public int getLibres() { int lib; lib = Aforo Ocupadas; return lib; }

//Mtodo getPorcentaje public double getPorcentaje() { double por; por = (double) Ocupadas / (double) Aforo * 100.0; return por; } //Mtodo getIngresos public double getIngresos() { double ingre; ingre = Ocupadas * Entrada; return ingre; } //Mtodos de orden //Mtodo Vaciar public void Vaciar() { Ocupadas = 0; Pelcula = ; } //Mtodo entraUno public void entraUno() { Ocupadas++; }

Mtodos de orden y otros mtodos.

EJERCICIOS RECOMENDADOS

Supongamos que tenemos una clase llamada Rectangulo que nos permitir generar objetos de tipo rectngulo. Sea el planteamiento de la clase Rectangulo el que sigue:

CLASE RECTANGULO Nombre de la clase: Rectangulo Propiedades de los objetos de la clase Rectangulo: Base (double) Altura (double) Valores iniciales de las propiedades de los objetos de la clase Rectangulo: Base 100 Altura 50 Mtodos: Mtodos set: setBase permite asignar un valor a la propiedad Base. setAltura permite asignar un valor a la propiedad Altura. Mtodos get: getBase devuelve el valor de la propiedad Base getAltura devuelve el valor de la propiedad Altura getArea devuelve el rea del rectngulo getPermetro devuelve el permetro del rectngulo Otros mtodos: Cuadrar este mtodo debe hacer que la Altura tenga el valor de la Base.

SE PIDE: Realiza (en papel) la programacin de la clase Rectangulo a partir del planteamiento anterior.

CONCLUSIN La programacin de una clase se realiza en un fichero que tiene el mismo nombre que la clase y extensin .java La estructura general de una clase es la siguiente: public class NombreClase { Propiedades (variables globales) Constructor Mtodos set Mtodos get Mtodos de orden y otros mtodos }

El Constructor es un procedimiento que no devuelve nada pero que no es void. El constructor debe llamarse igual que la clase y se usa para asignar los valores iniciales a las propiedades. Los mtodos set son void y reciben como parmetro un valor que se asigna a la propiedad correspondiente. Los mtodos get no tienen parmetros y devuelven el valor de una propiedad de la clase, aunque tambin pueden realizar clculos y devolver sus resultados. Los mtodos de orden realizan alguna tarea especfica y a veces modifican las propiedades de la clase de alguna forma.

EJERCICIO GUIADO. JAVA: POO. USAR CLASES PROPIAS EN UN PROYECTO Aplicacin de una Clase Propia
Una vez programada una Clase de creacin propia, podremos usar esta en uno de nuestros proyectos para crear objetos de dicha clase. En este ejercicio guiado veremos un ejemplo sobre cmo usar de forma prctica la clase SalaCine en un proyecto java hecho con NetBeans.

EJERCICIO GUIADO El Multicines Avenida nos encarga un programa para gestionar el funcionamiento de las dos salas con las que cuenta este pequeo multicines. La primera de las salas es la sala central. En ella se proyectan los estrenos. Es una sala grande, con 500 localidades. El precio para ver una pelcula en esta sala es de 8.00 euros. La segunda de las salas es la sala de versiones originales. En esta sala se proyectan pelculas clsicas en versin original. Es una sala con un aforo ms pequeo, concretamente, de 80 localidades. El precio para ver una pelcula en esta sala es de 6.00 euros. Se crear un programa que nos permita controlar la entrada de personas en las salas y podremos saber en todo momento el porcentaje de ocupacin de cada sala y los ingresos obtenidos.

1. Crear un nuevo proyecto. Este proyecto se llamar multicines, contendr un paquete llamado paqueteprincipal y este a su vez contendr un JFrame llamado ventanaprincipal. El aspecto de la estructura del proyecto al crearlo ser la siguiente:

2. Disear la ventana principal de forma que quede parecida a la siguiente. Usa la ventana de diseo para hacer el diseo del formulario. Los nombres de los componentes se indica a continuacin.

Botones: btnCentralNueva btnCentralOcupacion btnCentralVaciar btnCentralIngresos btnCentralCambiar Etiqueta: etiCentralPelicula

Panel: panelCentral

Panel: panelVOriginal

Botones: btnOriginalNueva btnOriginalOcupacion btnOriginalVaciar btnOriginalIngresos btnOriginalCambiar Botn btnIngresosTotales

Etiqueta: etiOriginalPelicula

3. Antes de empezar la programacin de cada botn del programa, incluiremos en el proyecto la clase SalaCine, para as poder generar objetos del tipo sala de cine y aprovecharlos en nuestro programa. 4. Para aadir un fichero de clase propio en un proyecto Java con NetBeans, debes hacer clic con el botn derecho sobre el paquete donde quieras introducir la clase. En nuestro caso, haremos clic con el botn derecho sobre el paqueteprincipal, que es el nico que tenemos:

5. Elegiremos la opcin Nuevo / Clase Java

6. Entonces tendremos que darle un nombre a nuestro fichero de clase. Recuerda que el nombre debe ser el mismo que el de la clase que queremos programar. En nuestro caso, SalaCine. Luego se pulsa el botn Terminar.

7. Si vuelves a observar el esquema del proyecto, vers que dentro del paquete principal ha aparecido un nuevo elemento, llamado SalaCine. Este es el fichero donde programaremos nuestra clase SalaCine.

El fichero de la clase SalaCine

8. Si haces doble clic sobre el fichero SalaCine.java, podrs ver en el centro de la ventana de NetBeans el cdigo de dicha clase. NetBeans aade cierto cdigo a la clase para ahorrarnos trabajo, por eso ya tendremos programado la instruccin inicial de la clase junto con el comienzo del constructor y algunos comentarios que se aaden automticamente:

Esta instruccin, generada por NetBeans, indica que la clase SalaCine est programada dentro del paqueteprincipal

Inicio de la clase

Preparacin del constructor

9. Ahora ya solo tendremos que completar la programacin de la clase, aadiendo las propiedades, completando el constructor, y aadiendo los distintos mtodos que programamos en la hoja anterior. Debes modificar el fichero SalaCine para que quede as:

/* * SalaCine.java * * Created on 2 de agosto de 2007, 12:14 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package paqueteprincipal; /** * * @author didact */ public class SalaCine { //propiedades int Aforo; int Ocupadas; String Pelicula; double Entrada;

/** Creates a new instance of SalaCine */ //Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ""; Entrada = 5.0; } //Mtodos set //Mtodo setAforo public void setAforo(int afo) { Aforo = afo; } //Mtodo setOcupadas public void setOcupadas(int ocu) { Ocupadas = ocu; } //Mtodo setPelicula public void setPelicula(String peli) { Pelicula = peli; } //Mtodo setEntrada public void setEntrada(double entra) { Entrada = entra; } //Mtodo setLibres public void setLibres(int lib) { int ocu; ocu = Aforo - lib; Ocupadas = ocu; }

//Mtodos get //Mtodo getAforo public int getAforo() { return Aforo; } //Mtodo getOcupadas public int getOcupadas() { return Ocupadas; } //Mtodo getPelicula public String getPelicula() { return Pelicula; } //Mtodo getEntrada public double getEntrada() { return Entrada; } //Mtodo getLibres public int getLibres() { int lib; lib = Aforo Ocupadas; return lib; } //Mtodo getPorcentaje public double getPorcentaje() { double por; por = (double) Ocupadas / (double) Aforo * 100.0; return por; } //Mtodo getIngresos public double getIngresos() { double ingre; ingre = Ocupadas * Entrada; return ingre; } //Mtodos de orden //Mtodo Vaciar public void Vaciar() { Ocupadas = 0; Pelicula = ""; } //Mtodo entraUno public void entraUno() { Ocupadas++; } }

10. Ya hemos incluido la clase SalaCine en nuestro proyecto. A partir de ahora podremos crear objetos del tipo SalaCine y aprovechar sus caractersticas en nuestro programa.

11. Empezaremos a programar la ventana principal de nuestro programa. Haz doble clic sobre el fichero ventanaprincipal.java en la ventana de proyectos para pasar al diseo de la ventana principal:

12. Nuestro programa principal, gestiona el funcionamiento de dos salas de cine: la sala central y la sala de versiones originales. Para facilitar nuestro trabajo, sera interesante crear dos objetos globales del tipo SalaCine. Uno de ellos representar la sala central, y el otro la sala de versiones originales. 13. Para ello, acude a la ventana de cdigo de la ventana principal:

14. En la zona de variables globales de la ventana principal declararemos dos objetos del tipo SalaCine:

Creamos dos objetos sala de cine

15. Es en el constructor de nuestra ventana principal donde construiremos nuestros objetos de tipo sala. (Recuerda que el constructor de tu ventana principal se suele usar para construir los objetos que vas a usar en tu programa y asignarle las caractersticas que tendrn dichos objetos al inicio)

Construimos los objetos.

16. Recuerda que cuando se construyen objetos, estos tienen por defecto unos valores iniciales. En el caso de los objetos tipo SalaCine, sus valores son los siguientes: Aforo 100, Ocupacin 0, Pelcula (cadena vaca) y Entrada 5.0 Ser necesario modificar las caractersticas de ambas salas ya que no tienen ahora mismo los valores correctos. Se dijo al comenzar el ejercicio que la sala central tena las siguientes caractersticas: Aforo: 500 y un precio de entrada de 8 euros. Por lo tanto, modificamos las caractersticas del objeto en el constructor de la siguiente forma:

Modificamos las caractersticas del objeto central (sala central)

17. En el caso de la sala de versin original sucede lo mismo. Sus caractersticas son la siguientes: Aforo: 80. Precio entrada: 6.0 euros. Por tanto ser necesario modificar el objeto vo para asignar estos valores:

Modificamos las caractersticas del objeto vo (sala versin original)

18. Ya hemos incluido dos objetos del tipo SalaCine en nuestro proyecto. Los hemos declarado en la ventana principal como globales y los hemos construido dndoles las caractersticas apropiadas. A partir de ahora, usaremos esos objetos en la programacin de cada botn de la ventana. 19. Empezaremos programando el botn btnCentralCambiar. El objetivo de este botn es asignar a la sala central un ttulo de pelcula. Ese ttulo se debe mostrar tambin en la etiqueta etiCentralPelicula:

Cambia el ttulo de la pelcula de la sala central.

20. Entra en el actionPerformed del botn btnCentralCambiar y programa lo siguiente:

El cdigo de este botn hace lo siguiente: Le pide al usuario que introduzca un ttulo para la pelcula, usando un JOptionPane.showInputDialog. El ttulo introducido se recoge en una variable de cadena llamada titulo. Luego se asigna dicho ttulo a la sala central del multicines. Esta lnea es interesante, ya que se usa el mtodo setPelicula del objeto central para asignar el ttulo de la pelcula. Y finalmente se coloca el ttulo en la etiqueta para que el usuario pueda verlo.

21. Ejecuta el programa y observa el funcionamiento del botn. 22. Ahora se programar el botn btnCentralNueva:

Cada vez que un espectador compre una entrada para la sala central, el usuario del programa deber pulsar este botn. Internamente, el programa debe decirle al objeto central que ha entrado una nueva persona en la sala. Esto se hace con el mtodo entraUno. As pues, programe el actionPerformed del botn btnCentralNueva de la siguiente forma:

Como puedes ver, simplemente se le informa al objeto central (sala central) que ha entrado una nueva persona usando el mtodo entraUno.

23. Programaremos ahora el botn btnCentralOcupacion. Este botn nos mostrar informacin sobre la sala central. Concretamente, este botn debe mostrar lo siguiente: Pelcula que se est proyectando. Aforo total de la sala. Butacas Ocupadas. Butacas Libres. Porcentaje de ocupacin. Para mostrar toda esta informacin, ser necesario pedirle al objeto central (sala central) que nos de informacin de la sala. Esto lo conseguiremos usando los distintos mtodos get del objeto. Estudia atentamente la programacin del botn btnCentralOcupacion:

Observa el cdigo: Primero se crea una variable de cadena llamada info (informacin) A continuacin, se van concatenando textos a la variable de cadena. Recuerda que los \n permiten aadir saltos de lnea. Observa como se va pidiendo informacin al objeto a travs de mtodos get y se va concatenando esta informacin a la variable info. Finalmente se presenta el texto de la variable info en un JOptionPane.

24. Ejecuta el programa para observar el funcionamiento de los tres botones que se han programado. Asigna una pelcula a la sala central, luego pulsa varias veces el botn Nueva Venta y pulsa el botn %Ocupacin para ver informacin sobre la sala:

Cambia el ttulo de la pelcula asignada a la sala central

Pulsa este botn varias veces, para simular la venta de varias entradas.

Pulsa aqu para ver informacin actualizada sobre la ocupacin de la

25. A continuacin se programar el botn Vaciar de correspondiente a la sala central (btnCentralVaciar) Este botn debe situar la ocupacin de la sala a cero y quitar la pelcula asignada a la sala central. Programa en el actionPerformed del botn lo siguiente:

Como puedes observar, el cdigo es muy simple. Solo tengo que ordenar al objeto central (sala central) que se vace. Debido a que ya no hay pelcula asignada a la sala central, es conveniente tambin borrar el contenido de la etiqueta que muestra el ttulo de la pelcula.

26. Programaremos ahora el botn Ingresos del panel de la sala central. Este botn nos debe dar informacin sobre los ingresos producidos por la sala en el momento en que se pulsa. Esta informacin la mostraremos en un JOptionPane. Programa el actionPerformed de este botn como sigue:

Como puedes ver, la programacin es bastante sencilla. Solo hay que pedirle al objeto central (sala central) que nos diga los ingresos correspondientes. Observa la ventaja de usar objetos. No tenemos que hacer ningn clculo aqu. Solo tenemos que pedirle al objeto que haga el clculo necesario por nosotros. Dicho de otra forma, hacemos que ellos hagan el trabajo por nosotros.

27. Ejecuta el programa para comprobar el funcionamiento de estos botones. Asigna una pelcula a la sala central, vende algunas entradas, comprueba el porcentaje de ocupacin y luego comprueba los ingresos. Vaca la sala central, y vuelve a comprobar el porcentaje de ocupacin y los ingresos actuales.

Asigna una pelcula y vende varias entradas

luego comprueba el % de ocupacin y los ingresos

prueba a vaciar la sala y luego vuelve a comprobar la ocupacin y los ingresos

EJERCICIO El segundo de los paneles hace referencia a la sala de versiones originales. Su funcionamiento es el mismo que el de la sala central. Se pide que programe todos los botones correspondientes a la sala de versiones originales. La programacin es prcticamente igual, solo hay que actuar sobre el objeto vo en vez del objeto central.

EJERCICIO El botn IngresosTotales de la ventana, debera mostrar en un JOptionPane la suma de los ingresos actuales de ambas salas. Programe dicho botn. Solo tiene que pedirle a cada objeto: central y vo que le de sus ingresos, y sumar ambos.

CONCLUSIN Se pueden aadir a un proyecto Java clases programadas por uno mismo. Al hacer esto, en el mismo proyecto podemos crear objetos de dichas clases y usarlos para hacer el programa. En general, un proyecto java est constituido por un grupo de clases, algunas de las cuales sern de creacin propia. En el programa usaremos objetos derivados de dichas clases.

EJERCICIO GUIADO. JAVA: POO. HERENCIA Concepto de Herencia


El concepto de Herencia consiste en crear una nueva Clase a partir de otra. La nueva Clase es una mejora de la anterior. O dicho de otra manera, es una especializacin de la primera Clase. Concretamente, la Herencia consiste en tomar una Clase inicial, y, a partir de ella, crear otra Clase que posee las mismas propiedades y mtodos que la Clase inicial, adems de unas nuevas propiedades y mtodos que la Clase inicial no posea. La nueva Clase creada puede incluso redefinir mtodos de la Clase inicial.

CLASE BASE
Herencia

CLASE DERIVADA
La Clase inicial se denomina Clase Base, la Clase creada a partir de la clase base se denomina Clase Derivada. La Clase Derivada contiene propiedades y mtodos de la Clase Base ms unas propiedades y mtodos aadidos.

La Herencia es una tcnica muy til que nos permite reutilizar cdigo, es decir, que nos permite usar de nuevo lo que ya tenamos programado aadiendo simplemente algunos cambios adecuar el cdigo al proyecto actual. La Herencia se puede aplicar tanto a Clases Propias, como a Clases propias del lenguaje de programacin Java.

En esta explicacin guiada, veremos un ejemplo de uso de la Herencia con clases propias del lenguaje Java.

EJERCICIO GUIADO

Planteamiento Inicial

Botones Contadores Supongamos que en los proyectos cotidianos se plantea la necesidad de usar botones que guarden el nmero de veces que son pulsados. Estos botones funcionaran exactamente igual que los botones normales (JButton) y tendran su mismo aspecto, pero sera interesante que adems tuvieran los siguientes mtodos: Mtodo setPulsaciones. Permitir asignar un nmero de pulsaciones al botn. btnContar.setPulsaciones(3); //Se asignan 3 pulsaciones al botn btnContar

Mtodo getPulsaciones. Permitir saber cuantas pulsaciones tiene un botn. int p = btnContar.getPulsaciones(3); //Se recoge el nmero de pulsaciones del botn btnContar //en la variable p Mtodo incrementa. Permite incrementar en uno las pulsaciones que tiene un botn. btnContar.incrementa(); //Incrementa en uno las pulsaciones del botn btnContar Mtodo decrementa. Permite decrementar en uno las pulsaciones que tiene un botn btnContar.decrementa(); //Decrementa en uno las pulsaciones del botn btnContar Mtodo reiniciar. Permite colocar las pulsaciones de un botn a cero. btnContar.reiniciar(); //Sita a cero las pulsaciones del botn btnContar Mtodo aumentar. Permite aumentar en una determinada cantidad las pulsaciones del botn. btnContar.aumentar(4); //Aumenta en cuatro las pulsaciones del botn btnContar Mtodo disminuir. Permite disminuir en una determinada cantidad las pulsaciones del botn. btnContar.disminuir(6); //Disminuye en 6 las pulsaciones del botn btnContar

Los botones de este tipo tendran una propiedad llamada pulsaciones de tipo entera que se inicializara a cero en el momento de construir el botn.

Desgraciadamente no existe un botn de este tipo en Java, as que no podemos acudir a la ventana de diseo y aadir un botn como este. Una posibilidad sera la de programar la clase correspondiente a un botn de este tipo desde cero, pero esto es un trabajo tremendamente complejo. La solucin a este problema es la Herencia. Bsicamente, lo que necesitamos es mejorar la Clase JButton, la cual define botones normales y corrientes, de forma que estos botones admitan tambin los mtodos indicados antes. La idea es crear una nueva clase a partir de la clase JButton. A esta nueva clase la llamaremos BotonContador y haremos que herede de la clase JButton. Por tanto, la clase BotonContador tendr todas las caractersticas de los JButton y adems le aadiremos los mtodos mencionados antes.

JButton
Herencia

BotonContador

Gracias a la herencia, nuestra clase BotonContador poseer todos los mtodos de los JButton (setText, getText, setForeground, setToolTipText, etc.) sin que tengamos que programar estos mtodos. Por otro lado, aadiremos a la clase BotonContador nuestros propios mtodos (setPulsaciones, getPulsaciones, etc) y propiedades para que la clase est preparada para nuestras necesidades. Resumiendo: programaremos un botn propio, con caractersticas necesarias para nuestro trabajo, aprovechando las caractersticas de un botn JButton.

Programacin de la Clase BotonContador

Creacin de la clase derivada La programacin de la clase derivada BotonContador se har en un fichero aparte, al igual que la programacin de las clases de creacin propia. Se comenzar definiendo el comienzo de la clase y aadiendo las llaves que limitan su contenido:

public class BotonContador extends JButton {

Observa el cdigo aadido: extends JButton antes de la llave de apertura. Este es el cdigo que le permite indicar a Java que nuestra clase BotonContador derivar de la clase JButton.

Creacin de las propiedades de la clase derivada La clase BotonContador es una clase derivada de la clase JButton, y tendr las mismas propiedades que la clase JButton, pero a nosostros nos interesa aadir nuestras propias propiedades. En nuestro caso, necesitaremos una variable que contenga el nmero de pulsaciones del botn en todo momento. public class BotonContador extends JButton { int pulsaciones;

} Inicializacin de las propiedades de la clase derivada Nuestra propiedad pulsaciones debe ser inicializada en el constructor de la clase. Para ello crea el constructor de la clase:

public class BotonContador extends JButton { int pulsaciones; public BotonContador() { pulsaciones=0; } } Aadir mtodos propios a la clase derivada Se aadirn los nuevos mtodos que queremos que la clase BotonContador posea. Estos son los siguientes: setPulsaciones getPulsaciones incrementa decrementa reiniciar aumentar disminuir - asigna un nmero de pulsaciones al botn. - devuelve el nmero de pulsaciones del botn. - suma uno a las pulsaciones del botn - resta uno a las pulsaciones del botn - pone a cero las pulsaciones del botn - aumenta en una cantidad las pulsaciones del botn. - disminuye en una cantidad las pulsaciones del botn.

Estos mtodos trabajan con la propiedad pulsaciones. Una vez programados estos mtodos, la clase quedar de la siguiente forma (observa la programacin de los distintos mtodos para entenderlos):

public class BotonContador extends JButton { //propiedades int pulsaciones; //constructor public BotonContador() { pulsaciones=0; } //mtodos //asigna una cantidad de pulsaciones public void setPulsaciones(int p) { pulsaciones=p; } //devuelve las pulsaciones del botn public int getPulsaciones() { return pulsaciones; } //incrementa en uno las pulsaciones public void incrementa() { pulsaciones++; } //decrementa en uno las pulsaciones public void decrementa() { pulsaciones--; } //pone las pulsaciones a cero public void reiniciar() { pulsaciones=0; } //aumenta las pulsaciones en una cantidad c public void aumenta(int c) { pulsaciones=pulsaciones+c; } //disminuye las pulsaciones en una cantidad c public void disminuye(int c) { pulsaciones=pulsaciones-c; } }

Como has podido observar, la creacin de una clase heredada es exactamente igual que la creacin de una clase propia. La nica diferencia es que hacemos que dicha clase herede de otra clase ya existente, dndole ms posibilidades sin necesidad de programar nada: public class BotonContador extends JButton {

Uso de la clase BotonContador

Usaremos la clase BotonContador en un simple proyecto de prueba para que puedas observar sus posibilidades.

Para ello, sigue los pasos que se indican a continuacin:

1. Crea un proyecto llamado Contadores, que tenga un paquete principal llamado paqueteprincipal y un JFrame llamado ventanaprincipal:

2. Aadiremos la Clase BotonContador. Para ello debes hacer clic con el botn derecho sobre el paqueteprincipal y activar la opcin Nuevo Clase Java. El nombre de la clase es BotonContador:

3. Antes de empezar con el diseo de la ventana principal programa la clase BotonContador. Debes hacer doble clic sobre el fichero BotonContador.java e introducir en l la clase BotonContador que hemos diseado anteriormente usando herencia. El fichero BotonContador.java debera quedar as:

/* * BotonContador.java * * Created on 6 de agosto de 2007, 10:59 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package paqueteprincipal; import javax.swing.JButton; /** * * @author didact */ public class BotonContador extends JButton { //propiedades int pulsaciones; //constructor public BotonContador() { pulsaciones=0; } //asigna una cantidad de pulsaciones public void setPulsaciones(int p) { pulsaciones=p; } //devuelve las pulsaciones del botn public int getPulsaciones() { return pulsaciones; } //incrementa en uno las pulsaciones public void incrementa() { pulsaciones++; } //decrementa en uno las pulsaciones public void decrementa() { pulsaciones--; } //pone las pulsaciones a cero public void reiniciar() { pulsaciones=0; } //aumenta las pulsaciones en una cantidad c public void aumenta(int c) { pulsaciones=pulsaciones+c; } //disminuye las pulsaciones en una cantidad c public void disminuye(int c) { pulsaciones=pulsaciones-c; } }

4. Ahora programaremos el diseo de la ventana. Lo haremos desde cdigo. Entra en el mdulo ventanaprincipal.java y pasa a la zona de cdigo:

5. En la zona de cdigo programaremos el tpico mtodo CreacionVentana, llamado desde el constructor, donde se programar el diseo de la ventana:

6. Nuestro programa tendr dos botones del tipo BotonContador. Declara estos botones como variables globales de la clase:

7. En el mtodo CreacionVentana definiremos caractersticas de la ventana y construiremos estos botones y los situaremos en la ventana:

8. Como puedes ver, los botones contadores se construyen igual que los JButton, y, de hecho, tienen los mismos mtodos que los JButton, ya que derivan de ellos. As pues, un botn contador tiene un mtodo setText, setBounds, etc 9. Ejecuta el programa y observa el resultado. Vers que en la ventana aparecen los dos botones contadores, sin embargo, observars que tienen el mismo aspecto que los JButton. Se vuelve a insistir que esto es debido a que la clase BotonContador deriva de la clase JButton.

10. Ahora se aadir un actionPerformed a cada botn contador, para controlar sus pulsaciones. Aade al final de CreacionVentana el siguiente cdigo ya conocido, para la asignacin de eventos actionPerformed a los botones:

11. Se tendrn que programar los procedimientos de respuesta a los eventos, que aqu se han llamado PulsacionBotonA y PulsacionBotonB. Progrmalos (fuera de CreacionVentana, claro est) de la siguiente forma:

12. Cada vez que se pulse el botn A, debera aumentar su contador interno de pulsaciones en uno. Lo mismo debera pasar con el botn B. Esto se hace fcilmente usando el mtodo incrementa, propio de los botones contadores:

13. Resumiendo, cada vez que se pulsa el botn A, se le da la orden al botn A de que se incremente su contador interno. Lo mismo sucede con el botn B. 14. Ahora programaremos dos botones ms en la ventana, pero estos sern botones normales y los crearemos desde la ventana de diseo, para facilitar la tarea. Estos botones se llamarn btnVerPulsaciones y btnReiniciar.

15. Cuando se pulse el botn Ver Pulsaciones debera aparecer un JOptionPane indicando cuantas veces se ha pulsado el botn A y cuantas el B. Esto se har simplemente pidiendo a cada botn su nmero de pulsaciones almacenadas. Accede al actionPerformed del botn Ver Pulsaciones y programa lo siguiente:

En este botn le pedimos al Botn A que nos diga cuantas pulsaciones tiene anotadas (a travs del mtodo getPulsaciones) y lo mismo hacemos con el Botn B. Esto es posible ya que ambos botones son del tipo BotonContador, la clase heredada que hemos programado.

16. Ejecuta el programa y prueba lo siguiente: Pulsa varias veces el botn A y el B. Vers que no sucede nada (aunque internamente cada uno de los botones est guardando el nmero de pulsaciones en su propiedad pulsaciones) Pulsa ahora el botn Ver Pulsaciones y comprobars como este botn te muestra las veces que pulsaste cada botn.

Pulsa los botones varias veces

y luego pulsa el botn Ver Pulsaciones. Aparecer un JOptionPane informando sobre las pulsaciones realizadas.

17. Ahora programaremos el botn Reiniciar de forma que los contadores internos de ambos botones A y B se pongan a cero. 18. Accede al actionPerformed del botn Reiniciar y programa lo siguiente:

19. Puedes comprobar el funcionamiento de este botn ejecutando el programa y pulsando varias veces los botones A y B. Luego mira las pulsaciones almacenadas en ambos botones. Pulsa el botn Reiniciar y comprueba las pulsaciones de nuevo. Deberan ser cero en ambos botones.

Despus de pulsar los botones A y B si se pulsa el botn Reiniciar al ver las pulsaciones, estas deben ser cero

EJERCICIO

Se propone al alumno que aada las siguientes modificaciones al programa: Aade desde cdigo un nuevo botn Botn C (de tipo BotonContador) que al pulsarse aumente su nmero de pulsaciones interno en 2 (usa el mtodo aumentar propio de la clase BotonContador). Cuando se pulse el botn Ver Pulsaciones tambin debera verse el nmero de pulsaciones del botn C. Cuando se pulse Reiniciar, el nmero de pulsaciones del Botn C debera situarse a cero tambin. Aade desde diseo un cuadro de texto y un botn normal (JButton) llamado Iniciar. En el cuadro de texto se introducir un nmero, y al pulsar el botn Iniciar, los valores internos de los tres botones A, B y C se inicializarn al nmero introducido:

Se introduce un nmero Y al pulsar iniciar, los contadores internos de los botones se inicializan al valor introducido

CONCLUSIN La Herencia consiste en crear una clase que obtenga todas las caractersticas de otra. Esta clase a su vez tendr tambin caractersticas propias. La clase inicial se denomina clase Base y la clase nueva creada a partir de la clase base se llama clase Derivada:

CLASE BASE
Herencia

CLASE DERIVADA

Se puede hacer que una clase de creacin propia derive o herede de otra ya existente aadiendo: extends NombreClaseBase en la lnea de creacin de la clase. La clase creada as obtendr caractersticas de la clase de la que hereda. Aparte, esta clase tendr mtodos propios aadidos por el programador.

EJERCICIO GUIADO. JAVA: POO. HERENCIA. DIALOGOS PROPIOS Reutilizacin de cdigo


La gran ventaja de la Herencia es la posibilidad de aprovechar Clases ya creadas (bien sea por nosotros mismos o por otros programadores) para crear nuevas Clases. De esta forma, no tenemos que crear la nueva Clase desde el principio, y solo tenemos que aadir algunos cambios a la Clase original, sin que esta se vea afectada. De esta manera, podemos tomar Clases de las libreras de Java y crear a partir de ellas nuevas Clases para nuestras necesidades especficas. Estas clases luego pueden ser incluidas fcilmente en futuros proyectos.

Cuadro de Dilogo Propio Como ejemplo de todo esto, crearemos un cuadro de dilogo propio que puede ser usado muy a menudo en nuestros proyectos. Concretamente, ser un cuadro de dilogo que nos permita introducir una fecha (dia / mes / ao) Debes tener en cuenta que los cuadros de dilogo son objetos de la clase JDialog, por lo que este cuadro de dilogo propio tendr que derivar (heredar) de la clase JDialog. La clase JDialog se comporta como una ventana (un JFrame) as que su programacin es relativamente sencilla. Veremos el caso concreto de programar un Cuadro de Dilogo Propio a travs del ejercicio guiado que viene a continuacin.

EJERCICIO GUIADO

1. Crea un proyecto llamado Fecha, que tenga un paquete principal llamado paqueteprincipal y un JFrame llamado ventanaprincipal:

2. Para crear un cuadro de dilogo propio, debes hacer clic con el botn derecho del ratn sobre el paquete principal y activar la opcin Nuevo Archivo/Carpeta. A travs de esta opcin accedemos a un men desde donde podemos aadir a nuestro proyecto distintos tipos de clases.

3. En la ventana que aparece, escogeremos en la parte izquierda la opcin Formularios GUI Java, y en la parte derecha escogeremos la opcin Formulario JDialog. Luego activa el botn Siguiente.

4. A continuacin tendremos que indicar el nombre que tendr la clase correspondiente a nuestro cuadro de dilogo propio. En nuestro caso llamaremos a esta clase dialogoFecha.

5. Y pulsa el botn Terminar. Observars que se ha creado una nueva Clase dentro del proyecto llamada dialogoFecha.

6. Es interesante que veas el cdigo de esta clase. Haz doble clic sobre ella:

Si observas el cdigo vers que es muy similar al de las Clases JFrame, es decir, a la de la clase de la ventana principal. Debes observar que la clase dialogoFecha que vas a crear es heredada de JDialog, y tambin vers que hay un constructor similar al de los JFrame, aunque con parmetros: Hereda de JDialog

Constructor

7. Adems, tenemos la ventaja de poder usar la ventana de diseo para crear nuestro cuadro de dilogo dialogoFecha:

8. Usaremos la ventana de diseo para darle forma a nuestro cuadro de dilogo. Recuerda que la finalidad de este cuadro de dilogo ser la de permitirle al usuario introducir una fecha. Disalo para que quede as:

9. Asigna nombre a cada elemento: El cuadro de texto para el da se llamar: txtDia El cuadro de texto para el mes se llamar: txtMes El cuadro de texto para el ao se llamar: txtAnio El botn Aceptar se llamar btnAceptar El botn Cancelar se llamar btnCancelar

10. Como ves, hasta ahora la creacin de un cuadro de dilogo propio es algo muy sencillo, ya que es muy similar a la creacin de una ventana. En este proceso (al igual que en la creacin de una ventana) participa el concepto de herencia. 11. Ahora hay que dotar a nuestro cuadro de dilogo de las propiedades y los mtodos necesarios para que sea fcil de usar. Antes de programar todo esto, aqu tienes una descripcin de lo que queremos aadir al cuadro de dilogo:

Propiedades: Dia - entero Mes - entero Anio - entero BotonPulsado - entero Mtodos: getFecha() Este mtodo devolver una cadena (String) con la fecha en este formato: dia/mes/ao

getFechaLarga() Este mtodo devolver una cadena con la fecha en el siguiente formato: Dia de Mes(en letras) de Ao

getBotonPulsado() Este mtodo devolver el valor de la propiedad BotonPulsado. Esta propiedad podr tener un 0 o un 1. Tendr un 0 si se pulsa el botn Aceptar, y un 1 si se pulsa el botn Cancelar.

12. Bien, empecemos. Programar las propiedades es algo sencillo, ya que son simplemente variables globales a la clase dialogoFecha:

Propiedades de la clase dialogoFecha

13. Cuando el usuario pulse el botn Cancelar, el cuadro de dilogo de fecha debe introducir el valor 1 dentro de su propiedad BotonPulsado, y el cuadro de dilogo se cerrar. Para programar esto, acude a la ventana de diseo y entra en el actionPerformed del botn btnCancelar.

Como puedes observar en el cdigo, asigno el 1 a la propiedad BotonPulsado y luego uso el mtodo dispose para cerrar el cuadro de dilogo.

14. Cuando el usuario pulse el botn Aceptar, el cuadro de dilogo de fecha debe introducir el valor de los JTextField txtDia, txtMes y txtAnio en sus respectivas propiedades: Dia, Mes y Anio. Luego, se debe introducir un 0 en la propiedad BotonPulsado, y finalmente se cerrar el cuadro de dilogo. Accede al actionPerformed del botn btnAceptar y programa lo siguiente

15. Ya hemos programado las acciones a realizar cuando se pulse el botn Aceptar y Cancelar. Ahora programaremos el resto de los mtodos. Empezaremos por el mtodo getFecha. El mtodo getFecha devolver una cadena con la fecha en formato dia/mes/ao. Por tanto, este mtodo tendr la siguiente forma. Debes escribir este cdigo dentro de la clase dialogoFecha. El mejor sitio puede ser debajo del constructor.

Observa el cdigo. Se unen las propiedades dia, mes y ao en una cadena, separadas por el smbolo /. Luego se devuelve la cadena.

16. Ahora programaremos el mtodo getFechaCompleta. Este mtodo devuelve la fecha con formato largo, usando el mes en letras. El mtodo getFechaCompleta tendr el siguiente aspecto. Puedes programarlo a continuacin del mtodo del punto anterior:

Como puedes observar, se concatena el da en una cadena y luego, dependiendo del valor de la propiedad Mes, se concatena un mes en letras. Finalmente se concatena la propiedad Anio y se devuelve la cadena.

17. Y ya para terminar con la programacin de nuestro dialogoFecha, programaremos el mtodo getBotonPulsado, que bsicamente devuelve la propiedad BotonPulsado, la cual contiene un

0 si se puls Aceptar y un 1 si se puls Cancelar. La programacin de este mtodo es muy sencilla:

La clase dialogoFecha est terminada. Gracias a ella podremos crear cuadros de dilogo en nuestros proyectos para introducir fechas. Para probar esta clase, usaremos nuestra ventana principal.

18. Acude a la ventana principal, haciendo doble clic sobre ella en la ventana de proyectos:

19. Disea esta ventana para que tenga la siguiente forma:

El botn se llamar btnFechaNacimiento y la etiqueta con borde se llamar etiFechaNacimiento.

20. El programa funcionar de la siguiente forma: Al pulsar el botn Introducir Fecha Nacimiento aparecer un cuadro de dilogo del tipo dialogoFecha, donde el usuario introducir la fecha de nacimiento. Al pulsar Aceptar, dicha fecha aparecer en la etiqueta etiFechaNacimiento. Al pulsar Cancelar, la etiqueta etiFechaNacimiento se borrar.

21. Nuestro programa necesitar un cuadro de dilogo del tipo dialogoFecha. Este cuadro lo declararemos en la zona de variables globales de la ventana principal y lo llamaremos nacimiento

22. El objeto nacimiento es del tipo dialogoFecha. Recuerda que los objetos que declaras de forma global, luego debes construirlos en el constructor. As pues construiremos el objeto nacimiento. Para construir un objeto que sea un cuadro de dilogo hay que aadir dos parmetros: null, y luego indicar true o false, segn quieras que el cuadro de dialogo sea modal o no. En nuestro caso, queremos que el cuadro de dilogo nacimiento sea modal, por lo que indicaremos true:

Se construye el cuadro de dilogo nacimiento. Ser modal (true)

23. Programa el actionPerformed del botn btnFechaNacimiento. Este botn mostrar al cuadro de dilogo nacimiento, donde el usuario introducir una fecha. Luego, comprobaremos si el usuario puls Aceptar o Cancelar. En el caso de que pulsara Aceptar, el programa introducir en la etiqueta etiFechaNacimiento la fecha escrita por el usuario. Todo esto se hace preguntando al objeto nacimiento a travs de los mtodos programados. Observa el cdigo:

24. Ejecuta el programa y observa el funcionamiento del botn btnFechaNacimiento y del cuadro de dilogo nacimiento

1) Al pulsar el botn aparece el cuadro de dilogo diseado por nosotros

3) El programa le pide informacin al cuadro de dilogo para saber que debe colocar en la etiqueta.

2) Al pulsar Aceptar o Cancelar, el cuadro de dilogo modifica sus propiedades internas (dia, mes, ao y botn pulsado) y se cierra

EJERCICIO

Aade otra etiqueta a la ventana principal. Modifica el cdigo del botn btnFechaNacimiento de forma que tambin aparezca en esta etiqueta la fecha elegida por el usuario en formato largo. Esto debe suceder solo si el usuario Acepta el cuadro de dilogo. En caso de que el usuario cancele el cuadro de dilogo esta etiqueta se borrar.

CONCLUSIN Es posible crear cuadros de dilogos propios, con las caractersticas que ms nos interesen. Estos cuadros de dilogo son clases que derivan de la clase JDialog. Los cuadros de dilogo se comportan y manejan bsicamente igual que las ventanas. La gran ventaja de crear cuadros de dilogos propios, es que luego se podrn usar en otros proyectos.

EJERCICIO GUIADO. JAVA: POO. REUTILIZACIN DE CDIGO Reutilizacin de cdigo


La reutilizacin de cdigo consiste en aprovechar lo que ya tenemos programado (as como aprovechar lo que han programado otros) para as poder finalizar los proyectos en menos tiempo. La filosofa de esto es: por qu programar lo que ya est programado? A lo largo de la vida profesional de un programador, este se va haciendo con un conjunto de Clases que son capaces de generar objetos que pueden ser usados en los nuevos proyectos que el programador realice. Cuantas ms clases coleccione, ms herramientas dispondr para crear los nuevos proyectos. En esta hoja guiada veremos algunos ejemplos de como podemos aprovechar una Clase ya creada en un nuevo proyecto.

EJERCICIO GUIADO 1

1. Crea un nuevo proyecto. El nombre del proyecto ser Reutilizacion. Contendr un paquete llamado paqueteprincipal y dentro de l introducirs un JFrame al que llamaremos ventanaprincipal:

2. Supongamos que en este proyecto queremos utilizar cuadros de dilogo para introducir fechas. Podemos aprovechar la clase dialogoFecha creada en la hoja guiada anterior. Para ello, abre el proyecto llamado Fecha que hicimos en la hoja anterior. Si despliegas el proyecto Fecha, tu ventana de proyectos tendr un aspecto similar al siguiente:

Proyecto Fecha

Proyecto Reutilizacion

Observars que el proyecto Fecha incluye la clase dialogoFecha dentro de su paquete principal.

3. Para poder aprovechar la clase dialogoFecha en el proyecto Reutilizacin, solo hay que copiar el fichero de la clase desde un proyecto a otro. As pues Copia dialogoFecha

4. Y luego Pega en el paquete principal del proyecto Reutilizacion.

4. Observars como se aade una copia de dialogoFecha al paquete principal del proyecto Reutilizacion.

A partir de ahora, podrs crear objetos de tipo dialogoFecha dentro del proyecto Reutilizacion y aprovechar sus caractersticas, sin tener que programar ningn cdigo adicional.

5. Cierra el paquete Fecha para despejar un poco la ventana de Proyectos (Botn derecho cerrar proyecto)

6. Supongamos que necesitamos tambin la clase BotonContador creada en la hoja guiada n 31. Solo tendremos que abrir el proyecto llamado Contadores, que se program en dicha hoja

7. Y luego copiar la clase BotonContador desde Contadores a Reutilizacion. Hgalo y luego cierre la clase Contadores. Su ventana de proyectos debera quedar as:

8. A partir de este momento, puede crear botones contadores y cuadros de dilogo de introduccin de fechas en el proyecto Reutilizacion sin tener que haber programado ni una lnea de cdigo. 9. Cuando tenemos proyectos de gran envergadura, es normal tener gran cantidad de ficheros de clases. Se hace necesario entonces organizarlos de alguna manera. Esto se hace a travs de la creacin de paquetes. 10. Para ver esta idea en nuestro proyecto Reutilizacion, crearemos un nuevo paquete (botn derecho sobre Paquetes de origen y luego Nuevo Paquete Java)

11. El nombre del paquete ser elementosventana. Su proyecto quedar as:

12. En el nuevo paquete que hemos creado, introduciremos las clases BotonContador y dialogoFecha. De esta forma, tendremos organizadas nuestras clases. Por un lado la clase de la ventana principal, en el paqueteprincipal, y por otro lado, los elementos de las ventanas de creacin propia en el paquete elementosventana. Para introducir las clases en el paquete elementosventana puede hacerlo cortando y pegando. Cuando intente pegar una clase en otro paquete aparecer un cuadro de opciones como el siguiente:

Desactiva la opcin Previsualizar todos los cambios y pulsa Siguiente. 13. Una vez movidas las dos clases al paquete elementosventana, su proyecto debe quedar as:

Ahora tiene mejor clasificadas sus clases en su proyecto. 14. Guarde el proyecto, pero no lo cierre, ya que se usar a continuacin.

EJERCICIO GUIADO 2

En el ejercicio guiado 1 hemos visto como podemos aadir a nuestro proyecto clases que se hayan programado en otros proyectos, de forma que no tengamos que volverlas a programar. El problema que plantea lo anterior, es que tenemos que acordarnos de donde fue programada la clase que quiero aadir al proyecto. Es decir, tengo que acordarme del proyecto que contiene la clase. Sera muy interesante que nuestras clases las tengamos reunidas en un solo proyecto, para no tener que estar luego buscndolas por distintos proyectos. Una Biblioteca en Java es un proyecto que contiene una serie de paquetes que a su vez contienen distintas clases que son normalmente usadas en nuestros proyectos. Al estar reunidas estas clases en un mismo sitio, son ms fciles de encontrar. Veremos en este ejercicio guiado como crear una Biblioteca. 1. Para crear una Biblioteca activa la opcin Archivo Nuevo Proyecto, y en la ventana de opciones que aparece elige General y Biblioteca de clases java.

2. Pulsa el botn Siguiente y asigna a la biblioteca el nombre MisClases. Pulsa Terminar.

Observars que ha aparecido un nuevo proyecto, llamado MisClases.

3. A este nuevo proyecto le agregaremos el paquete elementosventana que tenemos en el proyecto Reutilizacion. Solo hay que copiar:

4. Y luego Pegar

5. Y el resultado es que hemos aadido un paquete a la biblioteca MisClases:

6. Se podra agregar ms paquetes de clases a la biblioteca. A medida que vayamos programando clases tiles para nuestro trabajo, deberamos incluirlas en la biblioteca. Se consigue as tener todas las clases reunidas en un solo proyecto.

7. Cierre el proyecto Reutilizacion, pero no el proyecto MisClases porque lo usaremos a continuacin.

EJERCICIO GUIADO 3

1. Para facilitar la inclusin de una biblioteca en un proyecto, se suele compactar la biblioteca en un fichero de tipo JAR. Para conseguir esto, configura el proyecto MisClases como proyecto principal.

2. A continuacin pulsa el botn de la barra de herramientas Limpiar y Construir proyecto principal:

3. Al pulsar este botn, NetBeans compilar las distintas clases y buscar errores en ellas. Si no encuentra ninguno mostrar un mensaje en la parte inferior de la pantalla donde se indicar que la generacin ha sido correcta:

4. Si todo ha ido bien, se debe haber generado un fichero llamado MisClases.JAR que contiene toda la librera. Este fichero se encuentra en una carpeta llamada DIST que a su vez se encuentra dentro de la carpeta del proyecto. 5. Entra en MiPC y busca la carpeta DIST, que se encontrar dentro de la carpeta del proyecto MisClases. Dentro de esa carpeta vers el fichero MisClases.JAR. Copia el fichero MisClases.JAR al escritorio. Un programador ordenado guardar todos sus ficheros JAR de biblioteca en una carpeta que tendr a mano. Para este ejemplo, hemos copiado el fichero MisClases.JAR en el escritorio. 6. Dentro del NetBeans, cierre el proyecto MisClases. 7. Crea un nuevo proyecto, que se llamar UsoLibreria. Dentro de l aade un paqueteprincipal y dentro del paquete principal un JFrame llamado ventanaprincipal. El aspecto de su ventana de proyecto ser el siguiente:

8. Imagine que queremos usar en este proyecto la librera anteriormente creada y compactada. Para ello, haz clic con el botn derecho sobre el elemento del proyecto llamado Bibliotecas y activa la opcin Agregar Archivo JAR / Carpeta.

9. Busca en el escritorio el fichero MisClases.JAR y brelo.

10. En este momento, la librera de clases llamada MisClases ha sido aadida a tu proyecto, y esto significa que podrs usar cualquier clase que contenga MisClases. Es decir, podrs usar la clase BotonContador y dialogoFecha para crear tus objetos, as como cualquier otra clase que estuviera incluida en MisClases.

11. Resumiendo: Un programador crea muchas clases propias a lo largo de su trabajo. Estas clases pueden ser usadas en otros proyectos. Es conveniente reunir las clases en paquetes, y reunir paquetes en bibliotecas (tambin llamadas libreras) Las bibliotecas se pueden compactar en un solo fichero .JAR Al incluir un fichero de biblioteca en un proyecto, puedes usar las clases que estn contenidas en dicha biblioteca.

CONCLUSIN En NetBeans puedes abrir varios proyectos y copiar los ficheros de clases de uno a otro. Si un proyecto tiene muchas clases, interesa clasificarlas en paquetes. Es interesante reunir las clases que ms uses en un solo proyecto de tipo biblioteca, para poder acceder a ellas fcilmente. Una biblioteca se puede compactar en un solo fichero de tipo .JAR Al asociar un fichero de biblioteca .JAR a un proyecto, hacemos que en dicho proyecto se puedan usar las clases contenidas en dicha biblioteca. Todas estas ideas hacen efectiva la reutilizacin de cdigo, es decir, el aprovechar lo ya programado, para no tener que volverlo a programar.

EJERCICIO GUIADO. JAVA: PROGRAMACIN MDI Programacin SDI y Programacin MDI


Todo programa tiene una interfaz grfica de usuario (gui) la cual permite a este manejar el programa de forma sencilla. La interfaz grfica de usuario consta de la ventana principal, cuadros de dilogo, botones, cuadros de texto, etc Segn el tipo de interfaz que tenga el programa, las aplicaciones se suelen dividir en dos tipos: Aplicaciones SDI y Aplicaciones MDI. Aplicaciones SDI (Single Document Interface) SDI se puede traducir como interfaz de documento nico. Esto quiere decir que las aplicaciones SDI solo pueden mostrar el contenido de un documento a la vez. Un ejemplo prctico de aplicacin SDI es el bloc de notas de Windows. Si en el bloc de notas quieres escribir un nuevo documento, tienes que cerrar antes el documento con el que ests trabajando, ya que este programa no admite el manipular varios escritos a la vez. Hasta el momento, las aplicaciones de manejo de documentos que hemos realizado hasta ahora han sido de tipo SDI. Aplicaciones MDI (Multiple Documento Interface) MDI se puede traducir como interfaz de mltiples documentos. Esto quiere decir que las aplicaciones MDI pueden mostrar varios documentos a la vez. Un ejemplo prctico de aplicacin MDI es el programa de retoque fotogrfico Photoshop. En l, el usuario puede abrir varias fotos y trabajar con todas ellas. Las aplicaciones MDI normalmente constan de una ventana principal, la cual, puede contener otras ventanas interiores. Cada documento que se abre aparece en una ventana interior. En este ejercicio guiado, se explicarn las nociones bsicas para crear una aplicacin MDI en Java con NetBeans.

EJERCICIO GUIADO 1

Se pretende crear un visor de imgenes MDI, es decir, que permita la visualizacin de varias imgenes a la vez. El programa constar de una ventana principal con un men. Las opciones de este men permitirn al usuario abrir varias imgenes y cerrarlas a su gusto. Al ser un proyecto MDI, las imgenes se abrirn en ventanas internas. Estas ventanas internas tendrn que ser diseadas de forma adecuada. Para crear este proyecto, tendremos que seguir tres pasos generales: Diseo de la ventana principal. Diseo de las ventanas internas. Programacin de la ventana principal / internas.

Diseo de la ventana principal

1. Crea un nuevo proyecto. El nombre del proyecto ser VisorFotos. Aade un paquete llamado paqueteprincipal. Dentro de dicho paquete aade un JFrame llamado ventanaprincipal.

2. Aade a la ventana principal una barra de mens, con una nica opcin Archivo, que contenga a su vez las siguiente opciones:

Asigna los siguientes nombres a cada elemento del men:

3. Establece un layout de tipo BorderLayout al JFrame. Recuerda que este tipo de distribucin divide la ventana en cinco zonas: norte, sur, este, oeste y centro.

4. En la zona central de la ventana principal colocaremos un panel, pero no ser un JPanel, como siempre, sino otro tipo de panel. Debes colocar un panel del tipo JDesktopPane:

Este tipo de panel es usado como contenedor de las ventanas internas de una aplicacin MDI. En NetBeans este tipo de panel se muestra de color azul, para distinguirlo de los paneles normales, por eso, cuando aadas el panel al JFrame este quedar as:

5. Cmbiale el nombre al JDesktopPane y asgnale el nombre panelInterno:

6. Si ejecutas el programa ahora, vers que la ventana sale reducida al mnimo tamao posible. Esto lo vamos a evitar haciendo que la ventana aparezca maximizada al ejecutarse el programa. Tambin le asignaremos un tamao inicial. Para ello, acude al constructor del JFrame y programa lo siguiente:

Llamada a un mtodo ConfiguracionVentana

Programacin de dicho mtodo.

Como ves, en el constructor se llama a un mtodo ConfiguracionVentana y en este mtodo se asigna un tamao por defecto a la ventana de 800x600 y se maximiza.

Diseo de las ventanas internas Se pretende que cuando se abra una imagen, el programa muestre una ventana interna que contenga la imagen y nada ms. La barra de ttulo de esta ventana interna contendr el camino de la imagen. Para disear la ventana interna de la aplicacin, sigue los pasos que se indican a continuacin:

7. Una ventana interna de una aplicacin MDI es un objeto de la clase JInternalFrame. Ser necesario aadir esta clase al proyecto. Para ello, haz clic con el derecho sobre el paqueteprincipal y elige Nuevo Archivo/Carpeta.

8. Luego elige Formularios GUI Java y dentro de esta categora Formulario JInternalFrame.

9. El nombre que le pondremos a este tipo de formulario ser el de ventanainterna.

10. Si observas la ventana de proyecto, vers que ahora tenemos dos clases: la ventana principal, y la ventana interna. Ahora disearemos la ventana interna, para ello, haz doble clic sobre ventanainterna.

11. Como se dijo anteriormente, las ventanas internas mostrarn simplemente la imagen que se abra. Para ello, solo hace falta introducir una etiqueta (JLabel) que ser la que contenga la imagen. Esta etiqueta debe ocupar toda la ventana, no tendr ningn texto dentro, y su nombre ser etiImagen.

La etiqueta se llamar etiImagen

Y ocupar todo el JInternalFrame

12. En las hojas guiadas anteriores, se ha hablado de la programacin orientada a objetos, y se ha comentado que los objetos poseen propiedades. Estas propiedades son bsicamente variables globales internas. Para poder acceder a estas propiedades, es necesario programar mtodos set. Pues bien, la etiqueta etiImagen de la clase ventanainterna, no es mas que una propiedad de la ventana interna, y para poder trabajar con ella, ser necesario programar un mtodo set que permita modificar la etiqueta a nuestro antojo. Bsicamente, este mtodo set debe ser capaz de introducir en la etiqueta una imagen. Haremos que este mtodo reciba como parmetro el camino de la imagen a mostrar. 13. As pues, entra en la zona de cdigo de la ventanainterna y aade despus del constructor el siguiente mtodo:

Mtodo para acceder a la etiqueta etiImagen

14. En la programacin MDI, ser habitual crear mtodos para poder acceder a los distintos elementos de la ventana interna (etiquetas, cuadros de texto, etc) En otras ocasiones, tendremos que crear mtodos get para obtener informacin de las ventanas internas. Es algo muy similar a la programacin de dilogos propios que se vio en hojas anteriores.

15. Bien, con la programacin de este mtodo de acceso a la etiqueta de la ventana interna, hemos terminado con el diseo de esta ventana, ahora empezaremos a programar la ventana principal. Vuelve a ella haciendo doble clic sobre la ventanaprincipal en la zona de proyectos:

Programacin de la ventana principal Se pretende ahora programar la opcin Abrir del men de forma que se elija el fichero de imagen a mostrar y se muestre este en una ventana interna. La opcin Cerrar del men permitir cerrar la ventana interna activa en un momento determinado. Sigue los pasos que se describen a continuacin:

16. Ya estamos preparados para programar las opciones del men. Empezaremos por la opcin Abrir. Accede al actionPerformed de la opcin Abrir y programa lo siguiente:

La opcin Abrir se encargar de abrir un fichero de imagen y mostrarlo en una ventana interna del programa. Lo primero que hace esta opcin es mostrar el cuadro de dilogo Abrir, que se usa para indicar el fichero que se quiere abrir. Se crea un objeto del tipo JFileChooser a travs de la lnea: JFileChooser abrir = new JFileChooser(); Luego se le da la orden de que muestre el cuadro de dilogo Abrir. La variable boton recoge el botn pulsado por el usuario (Aceptar / Cancelar) int boton = abrir.showOpenDialog(null); Luego, a travs de un if, compruebo si se ha pulsado el botn Aceptar if (boton==JFileChooser.APPROVE_OPTION) { } Dentro de este if tendremos que programar la accin correspondiente a abrir la imagen y mostrarla en pantalla. Vamos a ello.

17. Programa dentro del if anterior lo siguiente. El cdigo se comentar a continuacin.

Atento a este cdigo, porque define la creacin de ventanas internas, conteniendo la imagen elegida para mostrar. Es el corazn del programa La primera instruccin, crea una ventana interna llamada vi. Como puedes observar, es la creacin de un objeto vi de la clase ventanainterna. ventanainterna vi = new ventanainterna(); Lo siguiente que se hace con el objeto vi creado, es definir sus caractersticas como ventana. Concretamente se decide que sea una ventana con posibilidad de cambiar de tamao (setResizable), una ventana que pueda ser maximizada (setMaximizable), una ventana que pueda ser minimizada (setIconifiable) y finalmente que pueda ser cerrada (setClosable) vi.setResizable(true); vi.setMaximizable(true); vi.setIconifiable(true); vi.setClosable(true); Una vez definidas dichas caractersticas de la ventana interna, esta se aade al panel interno de la ventana principal, al que le dimos el nombre panelInterno. panelInterno.add(vi); Ahora hay que introducir la imagen elegida dentro de la etiqueta de la ventana. Primero hay que recoger el camino del fichero de imagen elegido en el cuadro de dilogo abrir. String camino = abrir.getSelectedFile().toString(); Ahora aprovechamos el mtodo setImagen que programamos oportunamente dentro de la clase ventanainterna para situar dicha imagen dentro de la etiqueta. vi.setImagen(camino);

Colocamos el camino de la imagen en la barra de ttulo de la ventana interna: vi.setTitle(camino); Finalmente hacemos visible la ventana interna. vi.setVisible(true);

18. Ejecuta el programa y prueba a abrir varios ficheros de imagen. Observa la creacin de las ventanas internas. Observa como todas tienen el mismo aspecto (una etiqueta nica en la ventana conteniendo la imagen) Observa la posibilidad de moverlas, cambiarlas de tamao, maximizarlas, minimizarlas y cerrarlas. Observa como todas las ventanas internas estn encerradas dentro de los lmites del panel interno de la ventana principal:

19. Este proyecto se usar en las prximas hojas. Gurdalo.

CONCLUSIN La programacin MDI consiste en crear aplicaciones capaces de abrir varios ficheros y mostrarlos en distintas ventanas internas. Una aplicacin MDI cuenta con dos elementos bsicos: - Un panel interno JDesktopPane, el cual contendr las ventanas internas. - Una clase del tipo JInternalFrame, la cual definir el diseo de las ventanas internas.

La clase JInternalFrame que aadamos, tendr el nombre que queramos asignarle y nos servir de plantilla para crear las ventanas internas de nuestro proyecto. Esta clase podr tener mtodos internos para acceder a los elementos de las ventanas internas. Desde la ventana principal, se crearn objetos de la clase ventana interna, y se definirn opciones relativas a la posibilidad de maximizar, cerrar, minimizar, etc, dichas ventanas. Desde la ventana principal se usarn los mtodos programados en la ventana interna para poder manejarla con facilidad.

EJERCICIO GUIADO. JAVA: PROGRAMACIN MDI CONTINUACIN Ventanas Internas


Tal como se explic en la hoja guiada anterior, una aplicacin MDI contiene un panel del tipo JDesktopPane, dentro del cual se depositan objetos del tipo JInternalFrame. Los objetos JInternalFrame son ventanas internas. El programador debe aadir a su proyecto una clase heredada de JInternalFrame. Esta clase ser la ventana interna. El programador disea el aspecto de esta ventana y aade los mtodos que considere necesarios para el manejo de dichas ventanas internas. En la hoja anterior se cre un pequeo proyecto Visor de Fotos donde hicimos todo esto. Este programa es capaz de abrir varias fotos en sus correspondientes ventanas internas. En esta hoja guiada veremos como podemos actuar sobre las distintas ventanas internas que han sido abiertas en el JDesktopPane, y para ello usaremos de nuevo el proyecto Visor de Fotos.

EJERCICIO GUIADO 1 En este ejercicio guiado inicial, programaremos la opcin Cerrar del proyecto Visor de Fotos. Esta opcin debe ser capaz de cerrar la ventana interna que est activa en ese momento. Se sabe cual es la ventana interna activa porque aparece por encima de las dems, y porque tiene su barra de ttulo de color azul, mientras que las dems aparecen en gris. La forma de seleccionar una ventana interna es simplemente hacer clic sobre ella.

Ventana interna activa

1. Abre el proyecto VisorFotos que realiz en la hoja anterior. 2. Accede a la ventana principal del proyecto, haciendo doble clic sobre la clase ventanaprincipal. 3. Accede al evento actionPerformed de la opcin del men Cerrar y programa lo siguiente:

4. Ejecuta el programa y comprueba el funcionamiento de la opcin Cerrar. Se recomienda que abra varias imgenes en su programa y luego seleccione una de ellas. Active la opcin Cerrar y observe como la ventana interna se cierra. 5. El funcionamiento del cdigo que acaba de programar es el siguiente: El panel interno panelInterno es un objeto del tipo JDesktopPane. Estos paneles son paneles especiales preparados para contener ventanas internas (JInternalFrame) y poseen algunos mtodos muy tiles para manipular las ventanas internas que contienen. Uno de los mtodos que ms usaremos ser getSelectedFrame. Este mtodo devuelve la ventana interna seleccionada ahora mismo, o null si no hay ninguna seleccionada. En el cdigo anterior, observars que creamos un objeto vactiva del tipo ventanainterna, y dentro de l metemos la ventana interna seleccionada en este momento, ejecutando el mtodo getSelectedFrame:
ventanainterna vactiva = (ventanainterna) panelInterno.getSelectedFrame();

Ahora ya podemos trabajar con vactiva sabiendo que se refiere a la ventana activa. Lo que se hace a continuacin es cerrar la ventana activa vactiva usando el mtodo dispose tpico de los objetos de ventana. Esto se hace, claro est suponiendo que haya alguna ventana activa, por eso se comprueba que getSelectedFrame no haya devuelto null, porque en ese caso es que no hay ventana interna activada y por tanto no se puede cerrar.

6. Este cdigo es muy comn a la hora de trabajar en aplicaciones MDI. Primero se comprueba cual es la ventana activa y luego se acta sobre ella. Veamos ahora otro ejemplo. Aade al men la opcin Info:

7. Accede al evento actionPerformed de esta nueva opcin y programa lo siguiente:

8. Este cdigo muestra el camino del fichero de la imagen que est seleccionada en este momento. Observa que el proceso es el mismo. Primero se extrae la ventana activa, usando el mtodo getSelectedFrame, almacenndola en una variable llamada vactiva.
ventanainterna vactiva = (ventanainterna) panelInterno.getSelectedFrame();

Si esta variable es null, entonces es que no hay ninguna ventana activa. Si es distinta de null, se trabaja con ella. En el ejemplo anterior extraemos el texto de la barra de ttulo de la ventana y lo mostramos en un JOptionPane. (Recuerda que hemos programado la apertura de las ventanas internas de forma que en la barra de ttulo aparezca el camino de la imagen)

9. Ejecuta el programa y comprueba el funcionamiento de la opcin del men Info. 10. Se ha visto que a travs del mtodo getSelectedFrame propio de los JDesktopPane se puede acceder a la ventana activa. Pero, cmo puedo acceder a otra ventana interna aunque no est activa? Para hacer esto, la clase JDesktopPane posee un mtodo llamado getAllFrames la cual devuelve un vector conteniendo todas las ventanas internas que hay actualmente en el JDesktopPane.

11. Para practicar con el mtodo indicado en el punto anterior, aade al men Archivo una nueva opcin llamada Cerrar Todo:

12. Accede al evento actionPerformed de la nueva opcin y programa lo siguiente:

13. Analicemos el cdigo anterior. Lo primero que tienes que observar es el uso de getAllFrames. Este mtodo devuelve un vector conteniendo todas las ventanas internas actuales. En nuestro cdigo, almacenamos estas ventanas en un vector llamado v. JInternalFrame v[] = panelInterno.getAllFrames(); A continuacin, recorremos todo el vector y vamos cerrando cada ventana almacenada en el vector. Como puedes observar, este cdigo hace que se cierren todas las ventanas de imagen abiertas.

14. Ejecuta el programa y comprueba el funcionamiento de la opcin Cerrar Todo. 15. Este cdigo es un ejemplo de actuacin sobre todas las ventanas internas abiertas. A continuacin usaremos esta misma idea para organizar las ventanas dentro del panel interno. Aade las siguientes opciones al men:

16. La opcin Cascada organizar las ventanas internas abiertas en cascada. Para ello entra en el evento actionPerformed de la opcin y programa lo siguiente:

17. Analicemos el cdigo. Observa de nuevo el uso de getAllFrames para almacenar todas las ventanas internas abiertas en un vector v: JInternalFrame v[] = panelInterno.getAllFrames(); A continuacin se recorre el vector y se asigna a cada ventana interna (cada elemento del vector) un tamao con el mtodo setSize y una posicin con el mtodo setLocation. Las posiciones de cada ventana van variando para situar cada ventana una encima de la otra. El vector se recorre al revs, desde la ltima ventana a la primera para mejorar la visualizacin de dichas ventanas.

18. Ejecuta el programa y prueba el funcionamiento de la opcin Cascada. Se recomienda que primero abra varias ventanas y luego pulse esta opcin.

CONCLUSIN En la programacin MDI siempre actan dos elementos: - Un panel interno JDesktopPane, el cual contendr las ventanas internas. - Una clase del tipo JInternalFrame, la cual definir el diseo de las ventanas internas. El panel interno posee diversos mtodos que permiten acceder a las ventanas actualmente abiertas dentro de l. Entre estos mtodos podemos destacar: - getSelectedFrame, que devuelve la ventana interna activa en el momento actual. - getAllFrames, que devuelve un vector de JDesktopPane, conteniendo todas las ventanas internas abiertas en el panel interno. Gracias a estos dos mtodos podemos acceder a las ventanas internas y actuar sobre ellas.

EJERCICIO GUIADO. BASES DE DATOS

Recapitulando GUI y PROCESO DE DATOS


Un programa bsicamente recibe una serie de datos, que introduce el usuario, luego realiza una serie de clculos con ellos, y finalmente presenta los resultados en pantalla. El usuario usa una serie de elementos para introducir los datos en el programa y para darle las rdenes al programa para que realice los clculos. Estos elementos son las ventanas con todos sus componentes: botones, cuadros de dilogos, etiquetas, listas desplegables, etc El programa realiza los clculos con dichos datos y los resultados los presenta en elementos de la ventana para que el usuario pueda verlos de forma cmoda. Estos elementos donde aparecen resultados pueden ser etiquetas, cuadros de mensaje, etc Hay que distinguir por tanto entre el GUI y el Proceso de Datos. El GUI (interfaz grfica de usuario) es el conjunto de elementos que permiten al usuario comunicarse con el programa. Estos elementos le permiten al usuario introducir datos, dar rdenes al programa y visualizar los resultados obtenidos. Para entendernos, el GUI es bsicamente el diseo de las ventanas del programa. Un buen diseo del GUI es vital. La interfaz de usuario debe hacer que el programa sea intuitivo, fcil de usar. Un programa incmodo, por muy bueno que sea, ser rechazado por el usuario. Aparte del GUI, internamente el programa debe realizar una serie de clculos para obtener los resultados pedidos por el usuario. No hace falta decir que la programacin de estos clculos debe ser precisa y correcta, ya que en caso contrario el programa no servira para nada, por muy buena que fuera la interfaz de usuario. Todo lo anterior se puede representar grficamente de la siguiente forma:

Datos, rdenes

Datos, rdenes

Clculos, procesos, acciones

Resultados Usuario GUI Interfaz de usuario Ventanas, botones, mens, etc

Resultados

Programacin interna: Procedimientos, funciones, clases, etc

BASES DE DATOS
Ahora se va a dar una vuelta de tuerca ms a lo indicado anteriormente aadiendo a todo este entorno el concepto de Base de Datos. Hay que tener en cuenta que la mayora de las aplicaciones que solicitan las empresas son programas cuya funcin principal es la de mantener datos de la propia empresa. Estos programas suelen tener siempre las mismas funciones bsicas. Deben ser capaces de: Almacenar datos producidos por la empresa: facturas, datos de clientes, productos, gastos, ingresos, trabajadores, etc Visualizar dichos datos. Modificar / Eliminar dichos datos. Consultar dichos datos. Es decir, visualizar solo aquellos datos que cumplan una condicin. Por ejemplo: visualizar las facturas del mes de enero, o mostrar los productos que estn en stock, mostrar los trabajadores que hayan trabajado ms de 100 horas, etc Realizar clculos con los datos. Por ejemplo, calcular el total de ingresos entre dos fechas, calcular lo que hay que declarar de iva, etc

As pues, la mayor parte de las aplicaciones que encarga una empresa son aplicaciones que deben gestionar una serie de datos. Estos datos deben estar guardados en un fichero o ficheros. A este conjunto de datos que debe manipular el programa se le denomina BASE DE DATOS. Una Base de Datos no es solamente un conjunto de datos almacenados en un mismo sitio. Hay que tener en cuenta que para que estos datos sean fciles de manipular, es necesario que tengan una organizacin determinada. Una Base de Datos mal organizada se convierte simplemente en un cajn de sastre donde resulta imposible encontrar lo que se busca. As pues, es necesario tener en cuenta la forma en que se organizarn los datos dentro de la base de datos, o dicho de otra forma, el diseo de la base de datos. En las prximas hojas guiadas se vern conceptos bsicos para el diseo y creacin de una base de datos, as como un lenguaje de consulta llamado SQL que nos permitir acceder a los datos de una base de datos y realizar determinadas acciones sobre la base de datos.

Acceso a la BASE DE DATOS desde la aplicacin


Aadiendo el concepto de Base de Datos a la idea de usuario, GUI y Proceso de Datos, podemos representar grficamente un programa como sigue:

Datos, rdenes, consultas a la base de datos

Datos, rdenes, consultas a la base de datos

Clculos, procesos, acciones, Acceso a la base de datos

Resultados Usuario GUI Interfaz de usuario Ventanas, botones, mens, etc

Resultados

Programacin interna: Procedimientos, funciones, clases, etc

Resultados de la consulta a la base de datos

SQL

Consultar la base de datos. Aadir, modificar, eliminar datos.

BASE DE DATOS

Analicemos el grfico anterior: 1. El usuario le pide algo al programa. Por ejemplo el usuario quiere obtener un listado de clientes, o quiere saber cuanto se ha ingresado el ltimo mes 2. Para ello, el usuario activa los elementos del GUI necesarios. Es decir, activar la opcin del men que corresponda, o el botn de la barra de herramientas, etc. Dicho de otra manera, el usuario da una orden. 3. Es posible que el usuario tenga que introducir algn dato. Por ejemplo, si quiere saber los ingresos del mes de enero, tendr que introducir enero para que el programa sepa de que mes hay que calcular los ingresos. Para ello el usuario usar un cuadro de texto del GUI, o un desplegable, etc 4. Hay que tener en cuenta que para obtener un listado de clientes, o el total de ingresos de un mes, hay que consultar la base de datos. El usuario no se preocupar de eso ya que ser el programa el que haga el trabajo. 5. El GUI traspasa la peticin del usuario al mdulo de Proceso de Datos. Este mdulo es el corazn del programa, el que se encarga de ejecutar las rdenes. Esta parte del

programa analizar la orden y acto seguido buscar los datos necesarios en la base de datos. 6. Para acceder a la base de datos, el mdulo de Proceso de Datos usar un lenguaje ideado para el acceso a bases de datos llamado SQL. 7. Gracias al lenguaje SQL, el mdulo de Proceso de Datos obtendr los datos necesarios que peda el usuario (por ejemplo el listado de clientes) o bien los datos necesarios para realizar el clculo (los ingresos de cada da del mes) 8. Una vez obtenido los resultados, el mdulo de Proceso de Datos se los enviar al GUI y los presentar de forma agradable para el usuario. 9. El usuario mirar su pantalla, y ver aparecer en la ventana del programa (en el GUI) el resultado que haba pedido.

Teniendo en cuenta lo visto, para la creacin de un programa hay que: Disear un GUI agradable, cmodo y fcil de usar. Disear la base de datos de forma que el acceso a datos sea rpido. Hacer el programa de forma que responda a las peticiones del usuario transmitidas por el GUI accediendo a la base de datos y obteniendo informacin de ella, o bien realizando acciones en ella.

GESTOR DE BASE DE DATOS Un gestor de base de datos es un programa que nos permite crear bases de datos, mantenerlas, realizar consultas en ellas, etc A travs de un gestor de base de datos podemos crear la base de datos que usar nuestro programa. Existen diversos programas gestores de base de datos, pero el que se usar ser el programa Microsoft Access.

DISEO DE BASE DE DATOS. MODELO ENTIDAD - RELACIN Antes de empezar a crear la base de datos usando el programa Access (o cualquier otro gestor de base de datos que vaya a usar) es necesario pensar en el diseo que tendr dicha base de datos. O dicho de otro modo, como se organizarn los datos en la base de datos. Para facilitar la tarea de organizar los datos en una base de datos, se usa una representacin grfica llamada Modelo Entidad Relacin, o simplemente Modelo E-R. Podramos comparar el Modelo E-R a los Diagramas de Flujo. El Modelo E-R nos facilita el diseo de bases de datos mientras que los Diagramas de Flujo nos facilitan el diseo de algoritmos.

EJERCICIO GUIADO N 1

Veremos en este ejercicio guiado como disear una base de datos a partir de la informacin aportada por una empresa, y un ejemplo de como representar dicha base de datos usando el Modelo E-R.

Supuesto Inicial La empresa MANEMPSA (Mantenimiento de empresas S.A.) se encarga de realizar todo tipo de reparaciones y limpieza en los locales de sus clientes. A esta empresa le interesa almacenar los datos de sus clientes. Concretamente le interesa almacenar el CIF de la empresa del cliente, el nombre de dicha empresa, la direccin y dos telfonos de contacto. Por otro lado, MANEMPSA quiere guardar los datos de los trabajadores que estn en plantilla. Le interesa saber el nombre y apellidos de dichos trabajadores, el DNI, el sueldo y la fecha en que entraron en la empresa. MANEMPSA quiere controlar los servicios que realiza cada trabajador. Concretamente, MANEMPSA quiere almacenar la fecha en que se hizo el servicio, el tipo de servicio que se hizo (fontanera, limpieza, electricidad, etc) La cantidad cobrada por el servicio y un comentario donde se indique qu acciones se realizaron. Hay que indicar que cada servicio lo realiza un solo trabajador, y que cada servicio se realiza a una sola empresa. Cada trabajador tiene asignado un coche de la empresa. Hay un coche por cada trabajador y cada trabajador siempre usa el mismo coche. A MANEMPSA le interesa almacenar informacin de cada coche. Le interesa almacenar la matrcula, la marca, el modelo y el ao de compra. MANEMPSA le encarga un programa para gestionar toda esta informacin. Se pide que disee la base de datos correspondiente que se usar en el programa. Represente dicha base de datos usando el Modelo E-R.

1. Concepto de Entidad. Entidad. Una entidad es un objeto que se quiere representar a travs de una serie de caractersticas. Las entidades son aquellos elementos que juegan un papel importante en la base de datos. Son los elementos sobre los que queremos almacenar informacin.

2. Lo primero que hay que hacer es distinguir las entidades del supuesto. Es decir, averiguar los elementos que se quieren almacenar en la base de datos. En el supuesto, las entidades son: los clientes, los trabajadores, los servicios que realizan los trabajadores y los coches de los trabajadores.

3. Atributos de una Entidad. A la empresa le interesa almacenar informacin sobre las entidades. Es decir, le interesa almacenar informacin sobre los clientes, los trabajadores, los servicios y los coches. La informacin que se quiere almacenar de cada entidad se denomina atributos de una Entidad. Por ejemplo, de los clientes, se quiere almacenar las siguientes propiedades: el CIF de la empresa, el nombre, etc... A continuacin se indican los atributos que se almacenarn de cada entidad, teniendo en cuenta el supuesto: Entidad Clientes Atributos: CIF, nombre empresa, direccin, telfono1, telfono2. Entidad Trabajadores Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada. Entidad Servicios Atributos: fecha, tipo, cantidad, comentario. Entidad Coches Atributos: matrcula, marca, modelo, ao de compra.

4. Atributos clave. Un Atributo Clave es aquel atributo cuyo valor no se repite y no puede estar vaco para todos los elementos de una entidad. Los Atributos Clave distinguen a cada elemento de una entidad. Por ejemplo, en el caso de la entidad Clientes, el atributo clave ser el CIF, ya que no puede haber dos clientes con CIF iguales, y todos los clientes tendrn CIF. El CIF permite distinguir a un cliente de otro. Es conveniente asignar un atributo clave para cada entidad. En algunos casos podemos elegir uno de los atributos de la entidad como atributo clave, en otros casos ninguno de los atributos de la entidad podr ser atributo clave y entonces tendremos que aadir uno nosotros. Veamos los atributos clave de cada entidad: Entidad Clientes: El atributo clave ser el CIF. Entidad Trabajadores: Se puede elegir como atributo clave el DNI. Entidad Coches: Se puede elegir como atributo clave la matrcula.

Entidad Servicios. En el caso de la entidad Servicios, tenemos que ninguno de los atributos que posee puede ser atributo clave. Observa: Dos servicios distintos pueden ser realizados en la misma fecha, por lo que dos servicios pueden tener fechas repetidas: la fecha no puede ser atributo clave. Dos servicios distintos pueden ser del mismo tipo, por los que dos servicios pueden tener el mismo tipo: el atributo tipo no puede ser atributo clave. Dos servicios distintos podran tener el mismo comentario, o no tener comentario en absoluto: el atributo comentario no puede ser atributo clave. Dos servicios distintos podran haber costado lo mismo, por lo que el atributo cantidad no puede ser atributo clave. No existe para la entidad Servicios un atributo que identifique cada servicio. En estos casos se suele aadir un atributo que sea atributo clave, es decir, un cdigo o identificador. En nuestro ejemplo, aadiremos un atributo nmero que ser el nmero de servicio realizado. Cada servicio tendr un nmero distinto, por lo que el atributo nmero ser el atributo clave. As pues, los atributos de la entidad Servicios sern los siguientes: Entidad Servicios Atributos: fecha, tipo, cantidad, comentario, nmero. Y el atributo nmero ser su atributo clave.

5. Relaciones entre entidades. Las entidades se relacionan entre s. Es necesario distinguir en el supuesto cuales son estas relaciones. Veamos: Un Trabajador realiza Servicios. Por lo tanto, las entidades Trabajadores y Servicios ser relacionan. Un Servicio se realiza a un Cliente. Por lo tanto las entidades Servicios y Clientes se relacionan. Un Coche lo usa un Trabajador. Por lo tanto las entidades Coche y Trabajadores se relacionan. Estas son las relaciones: Coches --- Trabajador --- Servicios --- Clientes

6. Cuando se establecen las relaciones, hay relaciones que estn implcitas. Por ejemplo, no se ha establecido una relacin entre Trabajadores y Clientes: Un Trabajador hace trabajos a Clientes. No est establecida una relacin directa entre ambas entidades, pero s se relacionan a travs de la entidad Servicios: Trabajador --- Servicios --- Clientes As pues, en realidad, trabajadores y clientes se relacionan, a travs de la entidad servicios.

7. Cardinalidad de las relaciones o Tipo de relaciones. Segn la forma en que se relacionen dos entidades, tenemos tres tipos de relaciones: Relaciones 1 a 1 En este tipo de relacin, un elemento de la primera entidad se relaciona con un elemento de la segunda entidad, y viceversa. En nuestro ejemplo, la relacin entre Coches y Trabajadores es del tipo 1 a 1, ya que un coche pertenece a un solo trabajador, y ese trabajador solo usa ese coche. Relaciones 1 a Muchos En este tipo de relacin, un elemento de la primera entidad se relaciona con muchos elementos de la segunda, pero un elemento de la segunda, se relaciona con uno solo de la primera. En nuestro ejemplo, la relacin Trabajadores Servicios es del tipo 1 a Muchos. Observa: un trabajador realiza a lo largo de su vida laboral muchos servicios, pero un servicio es realizado solo por un trabajador (por lo que nos dice el supuesto). La relacin entre Clientes y Servicios es tambin del tipo 1 a Muchos. Observa: un cliente solicita a lo largo de su existencia muchos servicios a la empresa, pero cada servicio se realiza a un solo cliente (por lo que nos dice el supuesto). Relaciones Muchos a 1 Este tipo de relacin es el mismo que el anterior. Basta con darle la vuelta a la relacin. Por ejemplo, se ha visto que la relacin Trabajadores Servicios es del tipo 1 a Muchos. Por tanto, la relacin Servicios Trabajadores es del tipo Muchos a 1. Relaciones Muchos a Muchos En este tipo de relacin un elemento de la primera entidad se relaciona con muchos elementos de la segunda entidad, y viceversa. En nuestro supuesto no tenemos ninguna relacin de este tipo, pero supongamos la siguiente relacin entre Profesores y Cursos:

Un profesor puede dar varios cursos, y un curso es impartido por varios profesores Esta relacin sera del tipo Muchos a Muchos.

8. Averiguar el tipo de relaciones. Para averiguar el tipo de cada relacin, es necesario estudiar bien el enunciado del supuesto, y pedir informacin al cliente que nos encarga el programa, de lo contrario, tendremos que hacer suposiciones para asignar un tipo a cada relacin. En nuestro supuesto, las relaciones tienen el siguiente tipo: Coches -1---1- Trabajadores -1---M- Servicios -M---1- Clientes Relacin Coches Trabajadores. Tipo 1 a 1. Relacin Trabajadores Servicios. Tipo 1 a Muchos. Relacin Servicios Clientes. Tipo Muchos a 1.

9. Intercambio de atributos clave entre entidades relacionadas. Para hacer efectivas las relaciones de la base de datos, es necesario intercambiar los atributos claves entre las entidades relacionadas siguiendo ciertas reglas. Las reglas son las siguientes: Primera Regla. Si dos entidades se relacionan de forma 1 1, entonces debe pasarse el atributo clave de una de ellas a la otra, y viceversa. En nuestro ejemplo, las entidades Coches y Trabajadores se relacionan de forma 1 a 1. Esto implica que es necesario aadir el atributo clave de Coches a Trabajadores, y viceversa. As pues, ser necesario aadir el atributo matrcula a Trabajadores, y el atributo DNI a Coches. Por tanto, las entidades Trabajadores y Coches quedarn as: Entidad Trabajadores Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula Entidad Coches Atributos: matrcula, marca, modelo, ao de compra, DNI

Segunda Regla. Si dos entidades se relacionan de forma 1 Muchas, entonces, se debe pasar el atributo clave de la entidad de la parte de la relacin 1, a la entidad de la parte de la relacin Muchas.

En nuestro ejemplo, las entidades Trabajadores --- Servicios se relacionan de forma 1 a Muchas, por tanto, ser necesario traspasar el atributo clave de la entidad Trabajadores a la entidad Servicios, con lo que quedarn as:

Entidad Trabajadores Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula Entidad Servicios Atributos: fecha, tipo, cantidad, comentario, nmero, DNI. Por otro lado, las entidades Servicios --- Clientes se relacionan de forma Muchas a 1. Por tanto, ser necesario traspasar el atributo clave de la entidad Clientes a la entidad Servicios, con lo que quedarn as: Entidad Servicios Atributos: fecha, tipo, cantidad, comentario, nmero, DNI, CIF. Entidad Clientes Atributos: CIF, nombre empresa, direccin, telfono1, telfono2.

10. Claves Forneas. La razn de traspasar el atributo clave de una entidad a otra es que exista un elemento de unin, en ambas entidades relacionadas. Cuando una entidad posee un atributo clave de otra entidad, se dice que ese atributo es una clave fornea. Despus de realizar estos traspasos, nuestras entidades quedan con los siguientes atributos. Nota: se subraya con lnea continua el atributo clave en cada entidad, y se subraya con lnea de puntos las claves forneas de cada entidad.

Entidad Coches Atributos: matrcula, marca, modelo, ao de compra, DNI Entidad Trabajadores Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula Entidad Servicios Atributos: fecha, tipo, cantidad, comentario, nmero, DNI, CIF.

Entidad Clientes Atributos: CIF, nombre empresa, direccin, telfono1, telfono2.

No confundas el concepto de atributo clave, con el concepto de clave fornea.

11. Modelo E-R. Una vez definidas las entidades, los atributos, atributos claves, relaciones, tipos de relaciones, y claves forneas, todo esto se puede representar de forma grfica como sigue:

apellidos nombre DNI sueldo tipo fecha fecha matrcula nmero DNI comentario cantidad

Trabajadores 1 1 M

Servicios M
CIF

1 Coches
DNI ao modelo CIF

1 Clientes
Tfno2

matrcula marca

nombre direccin

Tfno1

El grfico anterior es lo que se llama un Modelo Entidad Relacin y es una representacin de la base de datos que acabamos de disear. En este grfico observars lo siguiente: Las entidades se representan en recuadros. Los atributos de cada entidad se representan en valos. El atributo clave de cada entidad se subraya. Las relaciones entre entidades se representan usando lneas con rombos. Se indica el tipo de relacin (1 a 1, o 1 a Muchos) aadiendo a la lnea de la relacin un 1 o una M para indicar el tipo de relacin.

CONCLUSIN Las Bases de Datos son elementos vitales en la creacin de aplicaciones para empresas. Para disear una Base de Datos hay que especificar los siguientes elementos: - Entidades cuya informacin queremos almacenar. - Atributos de dichas entidades. - Atributos claves para dichas entidades. - Relaciones entre entidades. - Definir el tipo de relaciones. - Asignar las claves forneas segn el tipo de relacin. Una vez especificados estos elementos, todo el diseo se puede representar grficamente a travs de un modelo grfico llamado Modelo Entidad-Relacin.

EJERCICIO GUIADO. BASES DE DATOS. Traspaso a tablas del Modelo E-R

Bases de Datos Relacionales


Como se ha comentado en la hoja anterior, una base de datos consiste en un conjunto de datos bien organizados. La forma de organizar estos datos es a travs de tablas. Estas tablas contendrn la informacin que se desea almacenar. Estas tablas se relacionan entre s, de forma que podamos extraer ms informacin uniendo las tablas. A las bases de datos que se organizan a travs de tablas que se relacionan entre s se las denomina Bases de Datos Relacionales, y son las bases de datos que ms se usan.

Traspaso a Tablas de un Modelo E-R


El Modelo E-R representa el diseo de una base de datos. Este modelo es ideal para tomarlo como base a la hora de crear las tablas que formarn parte de la base de datos. En esta hoja guiada se ver como crear las tablas de una base de datos tomando como referencia el Modelo E-R . Una vez que tenemos la base de datos representada en forma de tablas, solo tendremos que introducirlas en un programa Gestor de Bases de Datos como por ejemplo Access.

EJERCICIO GUIADO N 1 Dado el Modelo E-R creado en la hoja anterior y que se muestra a continuacin, crearemos las tablas necesarias que formarn parte de la base de datos:

apellidos nombre DNI sueldo tipo fecha fecha matrcula nmero DNI comentario cantidad

Trabajadores 1 1 M

Servicios M
CIF

1 Coches
DNI ao modelo CIF

1 Clientes
Tfno2

matrcula marca

nombre direccin

Tfno1

1. Tablas de la base de datos. Primero hay que tener en cuenta que existirn tantas tablas en la base de datos como entidades haya en el Modelo E-R. Por tanto, podemos decir que la base de datos del supuesto tendr cuatro tablas: Tabla Coches, Tabla Trabajadores, Tabla Servicios, Tabla Clientes. 2. Cabecera de la tabla. Campos. Toda tabla tendr una cabecera. La cabecera de una tabla define la informacin que guardamos de cada elemento. A esta informacin que se guarda de cada elemento se la denomina Campo. Los Campos se corresponden con las distintas columnas de la tabla. En un Modelo E-R los campos vienen representados por los atributos de las entidades. Al igual que existe un atributo clave para cada entidad, tambin existe un campo clave para cada tabla.

3. Teniendo en cuenta lo anterior, las tablas de la base de datos tendrn las siguientes cabeceras (se subraya el campo clave) :

Tabla Coches Matrcula Marca Modelo Ao DNI

Tabla Trabajadores DNI Nombre Apellidos Sueldo Fecha Matrcula

Tabla Servicios Nmero Fecha Tipo Cantidad Comentario DNI CIF

Tabla Clientes CIF Nombre Direccin Tfno 1 Tfno 2

4. Estas tablas ya se pueden relacionar gracias a que contienen las distintas claves forneas, las cuales aadimos en el momento de analizar las relaciones en el Modelo E-R. Sin embargo, de momento, no es necesario hacer nada ms.

5. Veamos un ejemplo del aspecto que podra tener la base de datos en un momento dado. Como podrs observar, las tablas estarn rellenas de informacin:

Tabla Coches Matrcula 3322-ASR 4433-ABB Marca SEAT CITROEN Modelo Ibiza Saxo Ao 2000 2001 DNI 21.123.123-A 12.321.567-B

Tabla Trabajadores DNI Nombre 21.123.123-A Ana 12.321.567-B Juan Tabla Servicios Nmero
1 2 3 4

Apellidos Ruiz Prez

Sueldo 1200 1120

Fecha 02-03-2002 04-05-2002

Matrcula 3322-ASR 4433-ABB

Fecha
12-04-2004 22-05-2005 21-12-2005 10-11-2006

Tipo
Limpieza Fontanera Electricidad Fontanera

Cantidad
300 238 130 250

Comentario DNI
Arreglo tuberas Revisin cableado 21.123.123-A 12.321.567-B 21.123.123-A 12.321.567-B

CIF
B11223212 B22334466 B33221111 B11223212

Tabla Clientes CIF B11223212 B22334466 B33221111 Nombre Seguros Segasa Academia La Plata Papelera Cuatro Direccin C/Ancha 2 C/La Plata 10 C/Larga 8 Tfno 1 956344334 956302323 956305060 Tfno 2 629234323

Si observas las tablas y sus claves forneas, puedes llegar a conclusiones que afectan a varias tablas. Por ejemplo: Observando las tablas Coches y Trabajadores, puedes llegar a la conclusin de que Ana conduce el SEAT y Juan el Citroen. Observando las tablas Servicios, Clientes y Trabajadores, puedes llegar a la conclusin de que el servicio de Fontanera realizado el 22 de mayo de 2005 lo realiz el trabajador Juan a la empresa Academia La Plata. Etc. Estas conclusiones se producen al relacionar las tablas gracias a la existencia de campos de unin entre ellas (claves forneas)

CONCLUSIN Las Bases de Datos que se usarn son del tipo Relacional. Una Base de Datos Relacional est formada por tablas, que son los elementos que contienen la informacin. Una vez realizado el Modelo E-R, resulta muy sencillo hacer el traspaso a tablas. Solo se debe tener en cuenta lo siguiente: - Cada entidad se corresponde con una tabla. - Los atributos de una entidad son los campos de una tabla. - La existencia de claves forneas en las tablas garantizan que se puedan relacionar.

EJERCICIO GUIADO. BASES DE DATOS. Relaciones Muchas a Muchas

El problema de las relaciones Muchas a Muchas


En las hojas anteriores se ha visto que entre las entidades se pueden establecer relaciones de tres tipos: Relaciones 1 a 1. Relaciones 1 a Muchas (o Muchas a 1). Relaciones Muchas a Muchas.

De forma premeditada, se ha evitado tanto en las explicaciones como en los ejercicios la aparicin de relaciones Muchas a Muchas, ya que estas relaciones presentan muchos problemas a la hora de realizar su traspaso a tablas para luego crear la base de datos e introducirla en un programa gestor de bases de datos. As pues las relaciones Muchas a Muchas se consideran relaciones prohibidas que deben ser evitadas a toda costa. Bsicamente, las relaciones Muchas a Muchas pueden ser anuladas convirtindolas en relaciones 1 a Muchas (o Muchas a 1) De hecho, una buena base de datos solo contendr relaciones 1 a 1 o 1 a Muchas, y se considera que ha sido mal diseada si aparece alguna relacin Muchas a Muchas. En esta hoja guiada se ver qu hacer cuando aparezca una relacin Muchas a Muchas

EJERCICIO GUIADO N 1

SUPUESTO ACADEMIA Interesa almacenar cierta informacin sobre una academia. Concretamente se quiere almacenar la siguiente informacin: Interesa almacenar informacin sobre los alumnos de la academia. Interesa almacenar el nombre del alumno, los apellidos, el DNI y la fecha de nacimiento. Interesa almacenar informacin sobre los cursos que se da en la academia. Interesa almacenar el cdigo del curso, el nombre del curso, el nmero de horas y el nombre del profesor que lo imparte. En la academia hay una pequea biblioteca. Interesa almacenar informacin sobre los libros de esta biblioteca. Se almacenar el cdigo del libro, el ttulo, el autor y el tema del libro. Hay que tener en cuenta que la biblioteca est abierta a los alumnos de la academia y se les puede hacer prstamos.

PASO A MODELO ENTIDAD RELACIN 1. Entidades participantes: Estudiando el supuesto anterior, se ve claro que existen tres entidades claras: alumnos, cursos y libros. 2. Atributos de cada entidad y Atributo clave: No es complicado deducir los atributos de cada entidad. Son los siguientes (subrayado el atributo clave): Alumnos Nombre Apellidos DNI Fecha de nacimiento Cursos Cdigo del curso Nombre del curso Nmero de horas Nombre del profesor Libros Cdigo del libro Ttulo Autor Tema

3. Relaciones: Veamos las relaciones: Los alumnos hacen cursos por lo que la entidad Alumnos est relacionada con Cursos. Por otro lado los libros se prestan a los alumnos por lo que la entidad Alumnos est relacionada con la entidad Libros. Y no hay ms relaciones en la base de datos.

4. Tipos de relaciones.

Veamos la relacin los alumnos hacen cursos: Un alumno puede apuntarse a muchos cursos. Por otro lado, en un curso se apuntan muchos alumnos. Es una relacin Muchas a Muchas:

Alumnos

Cursos

Veamos ahora la relacin los libros se prestan a los alumnos: Un alumno puede pedir prestado varios libros mientras est en la academia, por otro lado, un mismo libro puede ser prestado a varios alumnos (No a la vez, claro est. El libro es prestado a un alumno, y cuando es devuelto se le presta a otro alumno) Por tanto tenemos tambin relacin Muchas a Muchas:

Alumnos

Libros

5. Prohibicin de las relaciones Muchas a Muchas. Tal como se ha explicado al principio de la hoja guiada, las relaciones Muchas a Muchas estn prohibidas y tienen que ser eliminadas del Modelo Entidad Relacin. En nuestro caso tenemos dos relaciones Muchas a Muchas que sern reconvertidas a relaciones Muchas a 1 (o 1 a Muchas) para hacerlas desaparecer.

6. Existencia de entidad intermedia. La aparicin de una relacin Muchas a Muchas suele ser debido a un mal diseo de la base de datos. Este mal diseo viene dado por la falta de informacin proporcionada por el enunciado del supuesto. Esto ser habitual, ya que el cliente que nos encarga el programa no siempre se explica con la claridad que desearamos. La aparicin de relaciones Muchas a Muchas es debido a la existencia de una entidad intermedia que no hemos tenido en cuenta, ya sea por la falta de informacin del enunciado, o bien porque se ha dado por sabida. Esta entidad intermedia est entre las dos entidades que se relacionan de forma Muchas a Muchas. Al no tener en cuenta esta entidad intermedia, el resultado producido es la aparicin de la relacin Muchas a Muchas:

Entidad 1

M Entidad Intermedia (ignorada)

Entidad 2

As pues, cuando aparezca una relacin Muchas a Muchas, tendremos que averiguar cual es la entidad intermedia que sin querer hemos ignorado, y aadirla al modelo. Al hacer esto la relacin Muchas a Muchas se sustituir por dos relaciones 1 a Muchas. Por otro lado, la entidad intermedia puede contener atributos muy interesantes para la base de datos, que igualmente hayamos ignorado.

7. Eliminacin de la relacin Muchas a Muchas los alumnos hacen cursos. Cada vez que un alumno se apunta a un curso, se matricula, o dicho de otra forma, rellena una matrcula, o dicho de otra forma, hace una reserva de plaza para el curso. Estas reservas o matrculas (o como quiera llamarlo) es la entidad intermedia que habamos pasado por alto, y que nos resuelve el problema de la relacin Muchas a Muchas. Veamos que sucede si ponemos la entidad matrculas entre las entidades alumnos y cursos.

Alumnos

Matrculas

Cursos

Aparecen dos nuevas relaciones: los alumnos se matriculan, y una matrcula es para un curso.

8. Estudio de las nuevas relaciones. Cuando aadimos la entidad intermedia a la relacin Muchas a Muchas, aparecen dos relaciones nuevas que suelen ser del tipo 1 a Muchas. Veamos: Relacin los alumnos se matriculan. Un alumno puede matricularse muchas veces (se puede apuntar a muchos cursos). As pues un alumno realiza o rellena varias matrculas. Sin embargo, una matrcula pertenece a un solo alumno. Por tanto es una relacin 1 a Muchas:
1

Alumnos

Matrculas

Cursos

Relacin una matrcula es para un curso. Cada vez que se rellena una matrcula es para un solo curso. (Si pudieras leer el formulario que rellena el alumno, veras que en el papel se indica el curso al que se apunta, y solo es uno) Por otro lado, para un curso se rellenan varias matrculas (tantas como alumnos quieren apuntarse al curso) Por tanto es una relacin 1 a Muchas:
1

Alumnos

Matrculas

Cursos

9. Solucin del problema Muchas a Muchas: Finalmente, al descubrir la entidad intermedia de la relacin Muchas a Muchas, esta relacin ha desaparecido y se ha convertido en dos relaciones 1 a Muchas, solucionndose el problema.

10. Atributos de la Entidad Intermedia. Habr que asignar primero un atributo clave a la entidad intermedia. En el ejemplo, ser interesante asignar un nmero de matrcula, de forma que no haya dos matrculas con el mismo nmero. En la entidad matrculas se puede almacenar otras informaciones, como por ejemplo lo que paga el alumno por hacer el curso.

Tambin se podra almacenar la nota final obtenida por el alumno. Finalmente, tambin hay que asignar a la entidad intermedia las claves forneas. Recuerda que en las relaciones 1 a Muchas, hay que pasar la clave de la parte 1 a la parte Muchas. Si observas la relacin
1

Alumnos

Matrculas

Cursos

tendremos que pasar el campo DNI desde la entidad alumnos a matrculas, y el campo cdigo curso desde la entidad cursos a matrculas, debido a la regla correspondiente a las relaciones 1 a Muchas. Por lo tanto, la entidad Matrculas del ejemplo quedar con los siguientes atributos:

Matrculas Nmero (atributo clave) Pago Nota final DNI (clave fornea de alumnos) Cdigo Curso (clave fornea de cursos)

11. Solucin de la relacin libros son prestados a alumnos Veamos la solucin de la otra relacin problemtica Muchas a Muchas:

Alumnos

Libros

12. Entidad intermedia Si estudiamos bien la relacin entre alumnos y libros de la biblioteca, nos daremos cuenta que existe una entidad intermedia que hace referencia a cada prstamo del libro. Es decir, la entidad intermedia que hemos pasado por alto es Prstamos, la cual guardar informacin sobre los prstamos de los libros. Con esta entidad, la relacin queda as:

Alumnos

Prstamos

Libros

13. Estudio de las nuevas relaciones Relacin Alumnos Prstamos: Los alumnos piden prstamos de libros Un alumno puede solicitar varios prstamos mientras est en la academia. Pero cada prstamo en concreto se hace a un alumno: Relacin 1 a Muchas. Relacin Prstamos Libros: Un prstamo es de un libro Un libro puede participar en muchos prstamos (realizados a distintos alumnos en momentos diferentes), pero cada prstamo en concreto hace referencia a un libro solamente. Relacin 1 a Muchas.

Alumnos

Prstamos

Libros

Para entender estas relaciones, imagine que cada vez que se solicita un prstamo se tiene que rellenar una ficha. En esta ficha se escribe el nombre del alumno y el nombre del libro prestado. Un alumno tendr muchas fichas (si ha pedido prestado muchos libros), pero una ficha concreta solo tiene el nombre de un alumno. Por otro lado, un libro aparecer en muchas fichas (ya que el libro es prestado muchas veces), pero en una ficha concreta solo aparece el nombre de un libro. La idea de ficha es equivalente a la idea de prstamo. O aun mejor, se podra hablar de ficha de prstamos.

14. Atributos de la nueva entidad. As pues, con la creacin de la entidad prstamos se ha solucionado el problema de la relacin Muchas a Muchas. Ahora hay que determinar los atributos que tendr la nueva entidad prstamos. Atributo clave. Se puede asignar un nmero de prstamo a cada prstamo para distinguirlos entre s. Claves forneas. Hay que aadir a la entidad prstamos los atributos DNI y cdigo de libro, debido a las reglas de claves forneas de las relaciones 1 a Muchas (recuerde que hay que pasar el atributo clave desde la parte 1 a la parte Muchas en estas relaciones) Otros atributos interesantes. Se puede aadir a esta entidad atributos como fecha de prstamo, fecha de devolucin para controlar an mejor la informacin de cada prstamo en concreto.

Por lo tanto, la entidad Prstamos del ejemplo quedar con los siguientes atributos:

Prstamos Nmero (atributo clave) Fecha prstamo Fecha devolucin DNI (clave fornea de alumnos) Cdigo Libro (clave fornea de libros)

15. Despus de ha ver resuelto las dos relaciones problemticas Muchas a Muchas, el Modelo Entidad Relacin resultante ser el siguiente (subrayados con lnea continua los atributos clave, subrayados con rayas los atributos claves forneas):

horas nota pago nmero cdigo curso profesor

1 M

Cursos
cdigo curso

DNI

Matrculas M

nombre

autor fecha DNI nombre apellidos nmero DNI fecha prstamo fecha devolucin cdigo libro ttulo

tema

1 1 Alumnos M Prstamos M 1 Libros

cdigo libro

Se puede observar que ya no hay relaciones Muchas a Muchas, y que han aparecido dos nuevas entidades que no estaban contempladas en un principio en el enunciado.

CONCLUSIN Al realizar el diseo de una Base de Datos pueden aparecer relaciones Muchas a Muchas. Las Relaciones Muchas a Muchas estn prohibidas ya que pueden causar muchos problemas. Una relacin Muchas a Muchas aparece debido a que hay una entidad intermedia que no ha sido identificada. Al aadir la entidad intermedia, desaparece la relacin Muchas a Muchas y aparecen dos relaciones 1 a Muchas, solucionndose el problema. Ser necesario aadir a la nueva entidad su atributo clave y las claves forneas debidas a las relaciones 1 a Muchas. Tambin puede ser interesante aadir a la nueva entidad atributos que aporten ms informacin a la base de datos.

EJERCICIO GUIADO. BASES DE DATOS. ACCESS

Gestor de Base de Datos.


En las hojas guiadas anteriores se ha explicado como disear una base de datos. Disear una base de datos consiste en organizar la informacin, en cierta manera catica, que nos proporciona el cliente que nos encarga el programa. Para organizar dicha informacin usamos una representacin grfica denominada Modelo Entidad Relacin en la que representamos cada uno de los elementos que participan en la base de datos (entidades), sus caractersticas principales (atributos) y las relaciones que existen entre ellos. Una vez finalizado el esquema Entidad Relacin de la base de datos, se realiza una representacin en forma de tablas a partir de l. As pues, disear una base de datos consiste en tomar la informacin catica proporcionada por el cliente y organizar esta informacin en tablas. El objetivo de esto, es facilitar la creacin de la base de datos en el programa gestor de base de datos que se vaya a usar. Un programa gestor de base de datos permite crear una base de datos a partir de sus tablas. Y adems permite el mantenimiento de dichas tablas (aadir datos, eliminar datos, modificar datos, realizar consultas, etc) Es necesario tener claro el diseo (organizacin en tablas) de la base de datos antes de poder crear esta usando el programa gestor de base de datos elegido.

Microsoft Access
Existen mltiples programas gestores de bases de datos que se pueden usar para crear las bases de datos de sus aplicaciones. En los ejercicios guiados que vendrn a continuacin se usar el gestor Microsoft Access, el cual permitir la creacin de forma sencilla de bases de datos adecuadas para las aplicaciones de base de datos que se realizarn en java. Este programa permite la definicin de las tablas, la creacin de consultas y el acceso a la base de datos usando el lenguaje SQL, vital para el manejo de la base de datos desde la aplicacin. Por otro lado facilita mucho el manejo de la base de datos, la instalacin de sta en el ordenador del cliente y las modificaciones posteriores, adems de ser un gestor de base de datos muy extendido y conocido. En los ejemplos que vendrn a continuacin, se usar la versin 2003 de Microsoft Access.

EJERCICIO GUIADO N 1

En hojas anteriores se cre la base de datos de la empresa MANEMPSA, una empresa encargada de proporcionar servicios de mantenimiento a otras empresas. Despus de realizar el Modelo Entidad Relacin y de hacer el traspaso a tablas, el resultado fue el siguiente:

Tabla Coches Matrcula Marca Modelo Ao DNI

Tabla Trabajadores DNI Nombre Apellidos Sueldo Fecha Matrcula

Tabla Servicios Nmero Fecha Tipo Cantidad Comentario DNI CIF

Tabla Clientes CIF Nombre Direccin Tfno 1 Tfno 2

En este ejercicio guiado se crear la base de datos MANEMPSA formada por las tablas anteriores usando el programa Access. Para ello, siga los pasos que se indican a continuacin: 1. Abra el programa Access.

2. Para crear una base de datos nueva, active la opcin del men Archivo Nuevo. Y en la parte derecha de la ventana Base de Datos en Blanco.

3. Lo primero que tendr que hacer es decidir el lugar donde guardar la base de datos y el nombre que le dar al fichero. Para nuestro ejemplo, elija la carpeta Mis Documentos para guardar la base de datos y el nombre que le asignaremos ser MANEMPSA.

4. La Base de Datos MANEMPSA debe contener cuatro tablas, las cuales crearemos a continuacin. Para crear una tabla active la opcin Crear Tabla en Vista Diseo en la ventana principal de Access:

5. La ventana que aparece a continuacin nos permitir definir los campos de la tabla que vamos a crear. Empezaremos creando la tabla Coches (que se muestra a continuacin). Tabla Coches Matrcula Marca Modelo Ao DNI

Para ello, haga lo siguiente:

6. Introduzca el nombre del primer campo: Matricula, y a continuacin elija el tipo de datos Texto. En la zona de comentarios no escriba nada. El tipo de datos Texto define un dato que contendr letras o caracteres no numricos, como espacios, guiones, etc. Una matrcula es texto ya que contendr letras, y puede ser representada con guiones, espacios, etc.

7. En la parte inferior puede indicar el tamao que asignar para introducir una matrcula. Por defecto aparece un valor de 50, pero este tamao es exageradamente grande para una matrcula que no suele tener ms de 10 caracteres, segn la representemos. As pues cambia el valor 50 por 10.

8. El siguiente campo de la tabla es la Marca. Este campo ser de tipo Texto, ya que contiene letras y como tamao dejaremos 50.

9. El siguiente campo es Modelo. Igualmente este campo ser de tipo Texto debido a que contiene letras y dejaremos como tamao 50.

10. El siguiente campo es Ao. Este campo hace referencia al ao de compra del coche, por lo que es un nmero. As pues, elige en el tipo de datos la opcin Nmero, que define aquellos campos que contendrn nmeros vlidos desde un punto de vista matemtico. En la parte inferior estar definido el tipo Entero largo, que indica que los nmeros que se introduzcan en este campo sern de tipo entero y no tendrn decimales.

11. El siguiente campo es el DNI. Se recuerda que este campo es una clave fornea, y hace referencia al DNI del trabajador que conduce este coche. Es habitual confundirse y asignar el tipo de datos Numrico a un DNI, pero tenga en cuenta que un DNI contiene una letra, y puede contener espacios o guiones segn la forma en que lo represente. Esto hace que un DNI no sea un nmero vlido desde un punto de vista matemtico. El DNI en realidad es del tipo de datos Texto. No ponga DNI con puntos, ya que los nombres de campos en Access no admiten puntos. El tamao del DNI ser de 15:

12. Ya estn aadidos todos los campos de la tabla, ahora hay que indicar cual de ellos es el campo clave. El campo clave de la tabla es la matrcula, tal como se defini a la hora de crear el modelo e-r. As pues, haz clic sobre matrcula y pulsa el botn con forma de llave amarilla, llamado Clave Principal. Aparecer una llave pequea al lado del campo y de esta forma el campo matrcula quedar marcado como campo clave.

13. El diseo de la tabla Coches est casi terminado, solo hay que darle el nombre y guardarla. Para ello, cierra la ventana de diseo de la tabla e indica que quieres guardar los cambios.

14. Introduce el nombre de la tabla: Coches.

15. Acabas de crear la primera tabla de la base de datos. En la ventana principal de Access vers en el listado de tablas la tabla que acabas de crear.

16. Incluso, puedes hacer doble clic sobre la tabla para ver su contenido. Por supuesto, ahora est vaca, ya que acaba de ser creada. No introduzcas nada en la tabla.

17. Cierra la ventana que muestra el contenido de la tabla para volver a la ventana principal.

18. Ahora crearemos la siguiente tabla de la base de datos: Trabajadores, cuyo diseo se muestra a continuacin: Tabla Trabajadores DNI Nombre Apellidos Sueldo Fecha Matrcula

19. Active la opcin Crear Tabla en Vista Diseo. 20. Introduzca el campo DNI. Su tipo de datos ser Texto y pondremos un tamao de 15:

21. Introduzca los campos Nombre y Apellidos. El tipo de datos ser claramente Texto y el tamao de cada uno lo dejaremos en 50.

22. Introduzca el campo Sueldo. El tipo de datos que usaremos para este campo ser Nmero, pero cambiaremos en la parte inferior el tipo de nmero de Entero Largo a Doble. El tipo de nmero Doble permitir representar nmeros con decimales:

Nota: Existe en Access un tipo de datos propio de aquellos campos que almacenarn cantidades monetarias. Este tipo de datos se denomina Moneda, pero no ser usado en los ejemplos. En sustitucin, se usar el tipo Nmero que cumple perfectamente con el mismo cometido. 23. Aade ahora el campo Fecha, el cual hace referencia a la fecha de entrada en la empresa del trabajador. Para los campos que indiquen fecha, existe un tipo de datos llamado Fecha / Hora. Ser interesante poner un comentario a este campo para indicar que se refiere a la fecha de entrada en la empresa y no a la fecha de nacimiento del trabajador, por ejemplo:

24. Aade ahora el campo Matrcula. Se recuerda que este campo es una clave fornea y hace referencia a la matrcula del coche que conduce el trabajador. Este campo tambin se encuentra en la tabla Coches (es el campo clave de la tabla Coches), as pues se definir aqu de la misma forma que est definido en la tabla Coches: tipo texto y 10 de tamao:

25. Haz que el campo DNI sea el campo clave:

26. Cierra la ventana de diseo y guarda la tabla con el nombre Trabajadores:

27. Ya tenemos creadas dos de las cuatro tablas de la base de datos:

28. Ahora le toca el turno a la tabla Clientes, la cual se muestra a continuacin: Tabla Clientes CIF Nombre Direccin Tfno 1 Tfno 2

29. Activa la opcin Crear Tabla en Vista Diseo. 30. Aade el campo CIF. Su tipo de datos ser Texto (recuerda que lleva una letra) y asignaremos un tamao de 15.

31. Aade los campos Nombre y Direccin. Ambos campos sern claramente de tipo Texto. Asignaremos a ambos un tamao de 100 caracteres.

32. Aade el campo Tfno1 y asgnale el tipo de datos Texto y un tamao de 15. Haz lo mismo con el campo Tfno2:

Nota: Los campos Telfonos suelen causar mucha confusin, ya que se pueden definir con el tipo de datos Nmero o Texto. Tenga en cuenta que si quiere almacenar un telfono de esta forma: 956 30 30 30 o de esta otra: (956) 30-30-30 Tendra que definirlo como Texto, ya que contiene caracteres no numricos (los espacios, los parntesis, los guiones) Si, en cambio, define el telfono como Nmero, solo podr almacenar nmeros as: 956303030 Sin poder usar ni espacios, ni guiones, ni otro carcter que no sea un dgito. En el ejemplo se han definido como Texto para permitir el uso de caracteres no numricos.

33. Defina como campo clave el CIF:

34. Cierre y guarde la tabla con el nombre Clientes. Ya tiene tres de las cuatro tablas de la base de datos.

35. Queda por aadir la tabla Servicios a la base de datos. Se muestra esta tabla a continuacin: Tabla Servicios Nmero Fecha Tipo Cantidad Comentario DNI CIF

36. Activa la opcin Crear Tabla en Vista Diseo.

37. Aade el campo Nmero. Su tipo de datos ser Autonumrico: El tipo de datos Autonumrico hace que cada elemento que se aada a la tabla tenga un nmero correlativo. Este tipo de datos nos ahorra el tener que estar asignando un nmero cada vez que se aada un servicio, ya que el nmero es asignado automticamente. El problema es que no podemos controlar el nmero que se asigna a cada servicio. Por ejemplo, si el siguiente servicio debe tener el nmero 54 y queremos asignarle el nmero 100, no podremos hacerlo. Para nuestro ejemplo, el tipo de datos Autonumrico ser suficiente.

38. Aade el campo Fecha. Su tipo de datos ser Fecha / Hora, evidentemente.

39. Aade el campo Tipo. El tipo de la reparacin es un texto, as que asigna el tipo de datos Texto. Su tamao ser de 50.

40. Aade el campo Cantidad. Este campo hace referencia al coste de la reparacin. Ser un campo Numrico de tipo Doble, ya que puede llevar decimales.

41. El campo Comentario contendr un texto donde se explicar el servicio realizado. Debes tener en cuenta aqu que no se puede asignar una longitud mayor de 255 caracteres a un campo de tipo Texto. Por lo tanto, si est previsto que se escriba mucho texto en el campo Comentario, este tipo de datos no ser el adecuado. Existe otro tipo de datos mucho mejor para aquellos campos que vayan a contener grandes cantidades de texto. Este tipo de datos se denomina Memo, y ser as como definamos el campo Comentario:

42. Ahora hay que aadir los dos ltimos campos, los cuales son claves forneas que permitirn relacionar la tabla Servicios con las tablas Clientes y Trabajadores. Estos campos son el DNI y el CIF. 43. Aade el DNI. Tendr que ser de tipo Texto y un tamao de 15:

44. Ahora aade el CIF. Ser tambin de tipo Texto y tendr un tamao de 15:

45. Los campos estn ya definidos. Ahora activa la opcin campo clave para el campo Numero.

46. Finalmente cierre y guarde la tabla con el nombre Servicios. Y ya tendr creadas las cuatro tablas de la base de datos.

47. Como prueba, se pueden introducir algunos datos en las tablas de esta base de datos directamente desde aqu. Introduciremos dos trabajadores. Haz doble clic sobre la tabla Trabajadores, e introduce los siguientes datos:

Luego cierra la ventana de la tabla Trabajadores. 48. Ahora introduciremos los coches de la empresa. Para ello haz doble clic sobre la tabla Coches e introduce en ella los siguientes datos de los coches:

Luego cierra la ventana de introduccin de coches.

49. Haz ahora doble clic sobre la tabla Clientes. Introduciremos los datos de varios de los clientes de la empresa:

Despus de introducir los datos de los clientes cierra la ventana de la tabla Clientes. 50. Finalmente introduzca los datos de algunos de los servicios prestados. Abra para ello la tabla Servicios e introduzca los siguientes datos (observa como los nmeros aparecen de forma automtica en el campo Nmero, esto es debido al tipo de datos Autonumrico)

51. Los datos que se introducen en una tabla se denominan registros, as pues, si la tabla Servicios contiene la informacin de 4 servicios, se dice que la tabla Servicios contiene 4 registros. El concepto de registro hace referencia a las filas de una tabla. 52. Ya tenemos terminada la base de datos MANEMPSA. Hemos creado las tablas que contiene e incluso hemos introducidos algunos registros en las tablas para no dejarlas vacas. Ya puede cerrar el programa Access. 53. La base de datos que ha creado es un fichero llamado MANEMPSA. Al crearlo lo guard dentro de la carpeta Mis Documentos. Eche un vistazo al contenido de la carpeta Mis Documentos y busque all el fichero MANEMPSA. Si hace doble clic sobre el fichero volver a abrir la base de datos.

NOTA: Al abrir un fichero de base de datos de Access de la versin 2003 el programa le har varias preguntas, las cuales tendr que contestar de la siguiente forma: Advertencia de seguridad, las expresiones no seguras no estn bloqueadas Desea bloquearlas? NO Desea abrir el archivo? SI Desea abrir el archivo o cancelar la operacin? Abrir

54. A la hora de programar una aplicacin java de bases de datos, se har que nuestro programa acceda al fichero de base de datos que acaba de crear con Access. As pues no pierda de vista el fichero de base de datos que acaba de crear, ya que se usar en posteriores hojas guiadas.

NOTA. El programa Microsoft Access es muy amplio y contiene mltiples opciones de manejo de bases de datos, aunque solo lo usaremos para la creacin de tablas y de consultas. Se recomienda al alumno buscar informacin adicional sobre este programa. En Internet podr encontrar mltiples tutoriales de aprendizaje de Access.

CONCLUSIN La informacin catica proporcionada por el cliente que encarga el programa se organiza en tablas. Estas tablas conforman la base de datos. La base de datos hay que introducirla en un programa gestor de bases de datos, como por ejemplo Access. En Access se crea el fichero que contendr la base de datos, y dentro de l se disean las distintas tablas de la base de datos. Es necesario indicar el tipo de datos que tiene cada campo de una tabla. Puedes usar los siguientes tipos de datos segn necesites: - Texto. Campos que almacenarn todo tipo de caracteres, sobre todo letras. - Nmero. Campos que almacenarn solo dgitos numricos. Son nmeros con un formato correcto desde el punto de vista matemtico. - Fecha / Hora. Campos para almacenar fechas. - Memo. Campos para almacenar grandes cantidades de texto. - Autonumrico. Campo que contendr nmeros correlativos.

Las tablas contendrn filas de informacin llamadas registros. Es posible introducir registros directamente en las tablas creadas desde Access. El fichero de base de datos creado desde Access ser usado por la aplicacin java de base de datos.

EJERCICIO GUIADO. BASES DE DATOS. CONSULTAS EN ACCESS

Operaciones bsicas en una base de datos


El trabajo con una base de datos consiste bsicamente en hacer lo siguiente: Aadir nuevos registros a las tablas (guardar nueva informacin) Eliminar registros de las tablas (eliminar informacin de la base de datos) Modificar registros (modificar la informacin guardada) Consultar las tablas.

Consultas
En esta hoja guiada nos centraremos en la realizacin de consultas. Una consulta consiste en visualizar aquella informacin de la base de datos que cumple determinados requisitos. Por ejemplo, podra interesar el visualizar las ventas realizadas entre una fecha inicial y otra final, o ver las ventas hechas a un cliente en concreto, o ver el listado de trabajadores que tienen turno de maana, etc Hay que tener en cuenta que las tablas de una base de datos contendrn mucha informacin, pero no siempre necesitaremos acceder a toda ella. Por eso, la realizacin de consultas es una accin habitual en una base de datos. Por otro lado, la creacin de consultas nos permite averiguar determinada informacin que no est tan accesible cuando la base de datos es muy grande. Por ejemplo, podramos querer ver quienes son los trabajadores que cobran ms de una cantidad de sueldo determinada, o qu clientes no han pagado determinadas ventas, etc

Consultas en Access
Access permite la creacin de consultas de forma sencilla. Estas consultas son almacenadas en la base de datos como si fueran otras tablas, aunque en realidad, no son tablas reales. En esta hoja guiada se ver la forma de crear consultas permanentes en una base de datos de Access.

EJERCICIO GUIADO N 1

1. Abra el fichero de base de datos MANEMPSA que hizo en la hoja anterior, contenido en la carpeta Mis Documentos. 2. Para crear una consulta active la opcin Consultas en la parte izquierda:

3. Aparecer un listado nuevo de opciones y un listado con las consultas que hay creadas hasta ahora (ninguna, claro est)

No hay consultas an

4. Para crear una consulta, activaremos la opcin Crear Consulta en Vista Diseo. 5. Aparecer un cuadro de dilogo inicial donde se tendr que indicar la tabla o tablas que se quieren consultar:

6. Supongamos que queremos consultar la tabla Servicios. Por tanto, haga clic sobre ella y active el botn Agregar: Observar como aparece un recuadro en la parte superior izquierda con los campos de la tabla Servicios:

Aparece un recuadro con los campos de la tabla Servicios

7. Como no queremos consultar ms tablas podemos pulsar el botn Cerrar.

8. Supongamos que queremos ver aquellos servicios que hayan tenido un coste mayor de 200 euros. Interesa ver la fecha del servicio, el tipo y la cantidad.

9. Teniendo en cuenta lo anterior, tendremos que aadir los campos Fecha, Tipo y Cantidad, que es la informacin que se quiere ver. Para ello, despliegue las casillas de la fila Campo hasta conseguir que aparezcan los tres campos:

10. No se quiere visualizar todos los servicios, sino solamente aquellos cuyo coste haya sido mayor de 200 euros, por tanto tendremos que indicar dicho criterio de seleccin en la consulta. Accede a la casilla de Criterios que se encuentra debajo del campo Cantidad y escribe all la siguiente condicin: > 200 Observa:

Estamos indicando que solo se quiere visualizar aquellos servicios cuya cantidad cobrada sea mayor de 200.

11. Bsicamente, para hacer una consulta hay que indicar la tabla que se quiere consultar, los campos que se quieren visualizar y la condicin que se tiene que cumplir:

Tabla a consultar

Campos a visualizar

Condiciones

12. Para ver el resultado de la consulta, puede pulsar el botn Vista que se encuentra en la parte superior izquierda de la ventana:

13. Al hacer esto ver un listado con los servicios que costaron ms de 200 euros. Observe que solo se visualiza la fecha, el tipo de servicio y la cantidad:

14. Puede hacer clic en el botn Vista de nuevo (que ahora ha cambiado de forma) para volver a la pantalla de diseo de la consulta:

15. Ahora estamos de nuevo dentro de la ventana de diseo:

16. Vamos a mejorar un poco ms la consulta. Interesara que apareciera el nombre del trabajador que ha realizado el servicio, as pues hay que aadir una nueva tabla a la consulta: la tabla Trabajadores, ya que es esta tabla la que contiene dicho dato. 17. Para aadir una tabla a la consulta pulse el botn Mostrar Tabla:

18. Aparecer de nuevo el listado de tablas inicial:

19. Elige la tabla Trabajadores y pulse el botn Agregar. Observars como aparece un nuevo recuadro en la parte superior izquierda con los campos de la tabla Trabajadores.

20. La lnea que aparece entre ambas tablas es la relacin establecida a travs del campo de unin DNI. Debido a que la tabla servicios tiene incluida la clave fornea DNI, ambas tablas pueden ser relacionadas.

Relacin entre las tablas Servicios y Trabajadores a travs del campo de unin DNI.

21. Una vez hecho esto, aade el campo Nombre de la tabla Trabajadores a la consulta (observa como se indica la tabla a la que pertenece, para que no haya confusin):

22. Comprueba de nuevo el resultado de la consulta pulsando el botn Vista. Observa como ahora tenemos ms informacin de cada servicio (ahora sabemos tambin el nombre del trabajador).

23. Vuelve a la ventana de diseo pulsando el botn Vista:

24. Tambin sera interesante que apareciera el nombre del cliente al que se le ha realizado el servicio. Para ello, tendremos que aadir la tabla Clientes que es la que contiene este campo. Activa de nuevo el botn Mostrar Tabla y agrega la tabla Clientes.

25. Observa la relacin automtica que aparece entre Clientes y Servicios. Esto es gracias al campo de unin que es el campo CIF.

26. Es posible reorganizar las tablas para que las relaciones se vean mejor. Haz clic sobre ellas y arrstralas hasta que queden en el orden Clientes Servicios Trabajadores:

27. Aade el campo Nombre de la tabla Clientes y comprueba el resultado.

28. Vuelve a la vista de diseo.

29. Una vez que una consulta est finalizada, la podremos guardar para usos posteriores. Para ello, cierra la consulta pulsando en el botn cerrar de la ventana de diseo.

30. Indica que s quieres guardar la consulta y escribe el siguiente nombre: Servicios de mas de 200 euros.

31. Como puedes observar, has creado una consulta en la base de datos. Puedes visualizar el contenido de esta consulta siempre que quieras haciendo doble clic sobre ella.

32. Vuelve a la ventana principal cerrando la ventana de visualizacin de la consulta.

33. En Access puedes disear y guardar todas aquellas consultas que puedan resultar ms interesantes para el trabajo diario. Las consultas, aunque no son tablas, se comportan como tal. Bsicamente, se puede decir que una consulta es una subtabla, que muestra una parte de la informacin de la base de datos.

CRITERIOS EN CONSULTAS

En el ejercicio guiado anterior, se realiz una consulta que mostraba los servicios de ms de 200 euros de coste. Para ello, en la vista diseo de la consulta se agreg lo siguiente:

Campos

Coste

Criterios

>200

A continuacin se muestran otras formas de indicar criterios en las consultas

Criterios para campos numricos

Campos

Coste
Buscar aquellos registros cuyo Coste sea igual a 200

Criterios

200

Campos

Coste
Buscar aquellos registros cuyo Coste sea mayor a 200

Criterios

>200

Campos

Coste
Buscar aquellos registros cuyo Coste sea mayor o igual a 200

Criterios

>=200

Campos

Coste
Buscar aquellos registros cuyo Coste sea menor a 200

Criterios

<200

Campos

Coste
Buscar aquellos registros cuyo Coste sea menor o igual a 200

Criterios

<=200

Campos

Coste
Buscar aquellos registros cuyo Coste sea distinto de 200

Criterios

<>200

Campos

Coste
Buscar aquellos registros cuyo Coste est entre 200 y 300

Criterios

Between 200 and 300

Criterios para campos de tipo Fecha/Hora En el caso de los campos de tipo Fecha los operadores que se usan son los mismos que para los campos numricos, solo que el significado es distinto en algunos casos. Ejemplos:

> 10-12-2007 >= 10-12-2007 < 10-12-2007 <= 10-12-2007 <> 10-12-2007

Posterior al 10 del 12 del 2007 Posterior al 10 del 12 del 2007 (incluyendo dicha fecha) Anterior al 10 del 12 del 2007 Anterior al 10 del 12 del 2007 (incluyendo dicha fecha) Distinto de 10 del 12 del 2007 Entre el 10 del 12 del 07 y el 20 del 12 del 07

Between 10-12-2007 and 20-12-2007

Criterios para campos de tipo Texto o Memo En los campos de tipo texto se pueden usar asteriscos para definir bsquedas ms extensas. Observa los siguientes ejemplos:

Campos

Nombre

Buscar aquellos registros cuyo Nombre sea exactamente Jos Manuel: Encontrara a los que tengan de nombre Jos Manuel. No encontrara a los que se llamaran Jos a secas, o Manuel a secas.

Criterios

Jos Manuel

Campos

Nombre

Buscar aquellos registros cuyo Nombre empiece por Jos: Encontrara a los Jos Manuel, Jos Mara, Jos Luis, etc. No encontrara a los Manuel Jos, Antonio Jos, etc.

Criterios

Jos*

Campos

Nombre

Buscar aquellos registros cuyo Nombre termine en Jos: Encontrara a los Manuel Jos, Antonio Jos, Mara Jos, etc. No encontrara a los Jos Manuel, Jos Antonio, etc.

Criterios

*Jos

Campos

Nombre

Buscar aquellos registros cuyo Nombre contenga la palabra Jos en cualquier parte: Encontrara a los Jos Manuel, Antonio Jos, Mara Jos, Antonio Jos de los Santos, etc.

Criterios

*Jos*

Criterios complejos Si se quiere buscar a aquellos registros que cumplan varios criterios a la vez, tendrn que escribirse dichos criterios en la misma fila. Por ejemplo:

Campos

Nombre

Sueldo
Busca aquellas personas que tengan un nombre que termine en Jos y cobren ms de 1000 euros.

Criterios

*Jos

>1000

Se pueden establecer varios criterios en una misma consulta colocndolos en filas distintas. Esto es como mostrar el resultado de varias consultas en una sola. Por ejemplo:

Campos

Nombre

Sueldo

Muestra aquellas personas que tengan un nombre que termine en Jos y cobren ms de 1000 euros. Muestra tambin aquellas personas que cobran 300 euros Y muestra tambin aquellas personas que se llamen Antonio.

Criterios

*Jos Antonio

>1000 300

NOTA. La creacin de consultas en Microsoft Access es un campo amplio. Se recomienda al alumno buscar informacin adicional sobre el tema. En Internet podr encontrar mltiples tutoriales de aprendizaje de Access.

CONCLUSIN Una consulta muestra una parte de informacin de toda la base de datos. Se muestran determinados campos y tambin aquellos registros que cumplan un criterio determinado. En Access se pueden disear consultas y almacenarlas permanentemente. Access tiene una zona de consultas donde encontrar el listado de las consultas ya creadas y donde podr crear nuevas consultas. Para crear una consulta en Access bsicamente hay que seguir tres pasos: - Indicar las tablas que contienen los campos necesarios. - Indicar los campos que se quieren visualizar. - Indicar el criterio de seleccin de registros. Las relaciones creadas en Access y almacenadas pueden ser usadas luego desde la aplicacin programada en Java, como si fueran tablas normales y corrientes.

EJERCICIO GUIADO. BASES DE DATOS. SQL

Lenguaje de Consulta SQL El lenguaje SQL (lenguaje de consulta estructurado) es un lenguaje que permite actuar sobre una base de datos. Con este lenguaje se pueden construir rdenes que permiten hacer lo siguiente (entre otras cosas): Aadir registros a las tablas. Modificar registros de las tablas. Eliminar registros de las tablas. Realizar Consultas sobre las tablas.

Gracias a este lenguaje, se construirn rdenes desde nuestra aplicacin java, que se aplicarn a la base de datos, actuando sobre ella.

Las rdenes de aadir, modificar, eliminar realizan cambios dentro de la base de datos, pero no devuelven nada al programa java.

Programa Java

RDENES SQL aadir, modificar, eliminar

Base de Datos

Por otro lado, cuando se da una orden de realizar una consulta, la base de datos nos devuelve el resultado de dicha consulta:

Consulta SQL Programa Java Resultado de la consulta Base de Datos

Gracias a este lenguaje, nuestra aplicacin tiene dominio total sobre la base de datos. Puede actuar sobre ella introduciendo nuevos datos, o modificando los que haba, o eliminndolos. Tambin puede extraer informacin de ella accediendo a las consultas de la base de datos o realizando nuevas consultas. A continuacin se comentarn las reglas bsicas de este lenguaje.

Creacin de consultas en SQL

Se empezar estudiando como realizar consultas sobre una base de datos usando el lenguaje SQL (ms adelante se ver como realizar consultas de accin: aadir, modificar eliminar)

Cdigo base en SQL para realizar consultas Para consultar una base de datos usar un cdigo general como el que sigue: SELECT campos a visualizar FROM tablas donde se encuentran dichos campos WHERE condiciones que deben cumplir los registros ORDER BY forma de ordenar la consulta; Como puede ver, una consulta en SQL tiene cuatro partes (SELECT, FROM, WHERE y ORDER BY) de las cuales solo las dos primeras son obligatorias. Se debe mantener el orden indicado. Es decir, primero SELECT, luego FROM, luego WHERE y luego ORDER BY. Este cdigo debe terminar siempre con punto y coma ; A continuacin se vern ejemplos de uso de este cdigo general.

Visualizar una tabla entera (todos los campos y todos los registros) Ejemplo: Visualizar la tabla Clientes SELECT * FROM clientes; Observa, el * significa ver todos los campos. En el FROM se indica la tabla que se quiere ver. Observa como hay que terminar con un ;

Visualizar algunos campos de una tabla (algunos campos y todos los registros) Ejemplo: Visualizar CIF, nombre y Direccion de todos los clientes
SELECT clientes.CIF, clientes.nombre, clientes.direccion FROM clientes;

Observa como se indican los campos a visualizar en la clusula SELECT. Se indica la tabla y luego el nombre del campo, separados por un punto.

Visualizar solo aquellos registros de la tabla que cumplan una condicin Ejemplo: Visualizar todos los campos de aquellos trabajadores que cobren un sueldo superior a los 1000 euros
SELECT * FROM trabajadores WHERE trabajadores.sueldo > 1000;

Observa el uso de la clusula WHERE para aplicar una condicin al resultado.

Ejemplo: Visualizar el nombre, apellido y sueldo de aquellos trabajadores que cobren un sueldo entre 800 y 2000 euros
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo FROM trabajadores WHERE trabajadores.sueldo BETWEEN 800 AND 2000;

Observa el uso de BETWEEN AND para indicar que el sueldo est entre 800 y 2000 Nota. Ms adelante en este ejercicio guiado se muestran las distintas posibilidades que tenemos a la hora de indicar criterios en la clusula WHERE

Visualizar el contenido de una tabla ordenado Ejemplo: Visualizar la tabla de trabajadores ordenada por sueldo de menor a mayor
SELECT * FROM trabajadores ORDER BY trabajadores.sueldo ASC;

Observa el uso de la clusula ORDER BY para indicar que se ordene por sueldo. La palabra ASC indica ascendente (de menor a mayor)

Ejemplo: Visualizar nombre, apellidos y sueldo de los trabajadores ordenados por sueldos de mayor a menor
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo FROM trabajadores ORDER BY trabajadores.sueldo DESC;

Observa el uso de DESC para indicar una ordenacin descendente.

Ejemplo: Visualizar nombre, apellidos y sueldo de los trabajadores que cobren ms de 1000 euros, ordenados por apellidos y nombre
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo FROM trabajadores WHERE trabajadores.sueldo > 1000 ORDER BY trabajadores.apellidos ASC, trabajadores.nombre ASC;

Observa aqu como ordenar por dos campos, primero por apellidos y luego por nombre. Esto significa que aquellos trabajadores que tengan el mismo apellido sern ordenados por nombre.

Visualizar datos de varias tablas Ejemplo: Visualizar todos los servicios. Interesa que aparezca el nombre del trabajador que hizo el servicio, la fecha del servicio realizado y el tipo de servicio
SELECT trabajadores.nombre, servicios.fecha, servicios.tipo FROM trabajadores, servicios WHERE trabajadores.DNI=servicios.DNI;

Observa aqu como se indica en la clusula FROM las dos tablas de las que extraemos datos. Es importante que te fijes tambin en como se unen ambas tablas igualando en la clusula WHERE el campo de unin de ambas tablas, que en el ejemplo es el DNI.

Ejemplo: Visualizar todos los servicios. Interesa que aparezca el nombre del trabajador que hizo el servicio, el tipo de servicio y el nombre del cliente al que se le hizo el servicio
SELECT trabajadores.nombre, servicios.tipo, clientes.nombre FROM trabajadores, servicios, clientes WHERE trabajadores.DNI=servicios.DNI AND clientes.CIF=servicios.CIF;

Observa aqu una consulta sobre tres tablas, las cuales aparecen en el FROM. Es necesario indicar en la clusula WHERE los campos de unin. La tabla Trabajadores se relaciona con la tabla Servicios a travs del campo DNI, y la tabla Trabajadores se relaciona con Clientes a travs del campo CIF. Observa el uso de AND para unir varias condiciones.

Ejemplo: Visualizar los servicios que hayan costado ms de 200 euros. Interesa ver la fecha del servicio, el nombre del cliente y el coste ordenado por cantidad
SELECT servicios.fecha, clientes.nombre, servicios.cantidad FROM servicios, clientes WHERE servicios.CIF=clientes.CIF AND servicios.cantidad>200 ORDER BY servicios.cantidad;

Observa como la clusula WHERE contiene por un lado la condicin de unin de ambas tablas y por otro lado la condicin que se busca (cantidad > 200)

FORMA DE INDICAR CRITERIOS EN LA CLUSULA WHERE Se van a indicar a continuacin una serie de reglas que se deben seguir a la hora de crear condiciones en la clusula WHERE de una consulta SQL

Operadores Relacionales
Operador = Significa Igual que
Ejemplos WHERE cantidad = 200 WHERE tipo = Limpieza WHERE fecha = #8-5-2006#

>

Mayor que (para nmeros) Posterior a (para fechas)

WHERE cantidad > 200 WHERE fecha > #8-5-2006#

>=

Mayor o igual que (para nmeros) Esa fecha o posterior (para fechas)

WHERE cantidad >= 200 WHERE fecha >= #8-5-2006#

<

Menor que (para nmeros) Anterior a (para fechas)

WHERE cantidad < 200 WHERE fecha < #8-5-2006#

<=

Menor o igual que (para nmeros) Esa fecha o anterior (para fechas)

WHERE cantidad <= 200 WHERE fecha <= #8-5-2006#

<>

Distinto de (para fechas, nmeros y textos)

WHERE cantidad <> 200 WHERE fecha <> #8-5-2006# WHERE tipo <> Limpieza

Between...and

Entre valor1 y valor2 (aplicable a nmeros y fechas) Que empiece por cadena (aplicable a textos) Que termine por cadena (aplicable a textos)

WHERE cantidad BETWEEN 100 AND 200 WHERE fecha BETWEEN #8-5-2006# AND #1-12-2006# WHERE nombre LIKE Jose*

Like cadena*

Like *cadena

WHERE nombre LIKE *Jose

Like *cadena*

Que contenga cadena (aplicable a textos) Que el campo est vaco (aplicable a nmeros, textos, fechas) Que el campo no est vaco (aplicable a nmeros, textos, fechas)

WHERE nombre LIKE *Jose*

IS NULL

WHERE telefono IS NULL

NOT ... IS NULL

WHERE NOT telefono IS NULL

Operadores Lgicos
Operador AND Significa Obliga a que se cumplan las dos condiciones que une.
Ejemplos WHERE cantidad > 200 AND tipo = Limpieza

(Debe cumplirse que la cantidad sea mayor de 200 y que el tipo de servicio sea Limpieza)

OR

Basta con que se cumpla una sola de las dos condiciones que une.

WHERE cantidad > 200 OR tipo = Limpieza (Basta con que la cantidad sea mayor de 200, o que el tipo de servicio sea Limpieza para que se cumpla la condicin)

NOT

Si no se cumple la condicin, la condicin global se cumple.

WHERE NOT cantidad > 200 (Se cumple la condicin si la cantidad NO es mayor de 200)

Forma de indicar los valores Como puedes observar en los ejemplos anteriores, tendrs que tener en cuenta las siguientes reglas para indicar valores: Valores numricos Indica los valores numricos tal cual, teniendo en cuenta que debes usar el punto decimal cuando quieras representar decimales. Ejemplo: WHERE cantidad > 200.12 Valores de texto Los valores de texto se indican rodendolos entre comillas simples: Ejemplos: WHERE nombre = Jose

WHERE direccin LIKE *avenida*

Valores de fecha Las fechas se indican rodendolas entre almohadillas #. Se debe tener en cuenta que las fechas deben indicarse separadas por guiones o barras / y que su formato debe ser el siguiente: Mes Dia Ao

Ejemplos: WHERE fecha > #02-01-2005# (Significa que la fecha debe ser posterior al 1 de febrero de 2005) WHERE fecha <> #10-12-2006# (Significa que la fecha debe ser distinta del 12 de Octubre de 2006)

Forma de indicar los campos Normalmente los campos que se usan en el WHERE (y en otras clusulas) se indican de la siguiente forma: Tabla.Campo Por ejemplo, WHERE trabajadores.sueldo > 1000 (Sueldo es un campo de la tabla trabajadores) Si tenemos la seguridad de que no existe otro campo de otra tabla que se llame igual, entonces podemos prescindir del nombre de la tabla. Por ejemplo, WHERE sueldo > 1000 (No existe otro campo sueldo en otras tablas de la consulta) En el caso de que el nombre del campo contenga espacios, entonces tendremos que rodear el campo con corchetes. Por ejemplo, WHERE [sueldo del trabajador] > 1000 (El campo se llama sueldo del trabajador)

EJERCICIO GUIADO N 1 ACCESS permite la creacin de consultas usando SQL. Esto nos permitir practicar con el lenguaje SQL antes de que se aplique posteriormente en nuestras aplicaciones Java. En este ejercicio guiado se explicar como crear una consulta usando el lenguaje SQL en Access. 1. Entre en Mis Documentos. All ver la base de datos MANEMPSA. brala. 2. Active la opcin de Consultas para acceder al listado de consultas de la base de datos.

3. Vamos a crear una nueva consulta, por lo que tendr que activar la opcin Crear una consulta en vista Diseo:

4. En el cuadro de eleccin de tablas no agregaremos ninguna. As pues pulsaremos directamente el botn Cerrar.

5. El resultado es que aparece la ventana de diseo de consultas. En la parte superior izquierda de esa ventana podrs ver un botn con el texto SQL. Este botn nos permitir crear la consulta usando el lenguaje SQL. Plsalo.

6. Aparecer una pantalla casi en blanco donde escribir la consulta SQL. Observe que ya aparece la clusula SELECT escrita:

7. Para empezar mostraremos el contenido de la tabla Trabajadores. Para ello, debe escribir la siguiente consulta SQL:
SELECT * FROM trabajadores;

8. Para ver el resultado de esta consulta debe pulsar el botn Vista que se encuentra en la parte superior izquierda de la ventana:

9. El resultado es que ver el contenido de la tabla Trabajadores:

10. Acaba de crear una consulta dentro de Access usando el lenguaje SQL. Para modificar de nuevo la consulta SQL tendr que desplegar el botn Vista y activar de nuevo la opcin SQL:

11. De esta manera entrar de nuevo en el editor de consultas SQL de Access, donde an permanecer la consulta creada:

12. Ahora modificaremos la consulta para que solo nos muestre los campos nombre, apellidos, sueldo y fecha. Para ello tendr que escribir la siguiente consulta:
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo, trabajadores.fecha FROM trabajadores;

13. Usa el botn Vista para ver el resultado de la consulta. Observa como ahora solo vemos los campos indicados:

14. Vuelve a la zona de edicin de consultas SQL y cambia la consulta para que quede as:
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo, trabajadores.fecha FROM trabajadores WHERE trabajadores.apellidos LIKE '*ez';

Como ves, hemos aadido una clusula where, para buscar solo aquellos trabajadores cuyo apellido termine en ez.

15. Comprueba el resultado:

16. Vuelve a la zona de edicin SQL. Vamos a complicar un poco la consulta. Supongamos que queremos ver los servicios que han realizado cada uno de estos trabajadores. Para ello tendremos que incluir a la tabla servicios en la consulta. Supongamos que queremos ver el tipo de servicio realizado y el coste de cada servicio. Por otro lado, de cada trabajador solo queremos ver el nombre y los apellidos. Hay que tener en cuenta que es necesario aadir en el WHERE una condicin que iguale el campo de unin entre la tabla trabajadores y la tabla servicios. Este campo de unin es el DNI. La consulta debe quedar as:
SELECT trabajadores.nombre, trabajadores.apellidos, servicios.tipo, servicios.cantidad FROM trabajadores, servicios WHERE trabajadores.apellidos LIKE '*ez' AND trabajadores.DNI=servicios.DNI;

(Observa la inclusin en el FROM de la tabla servicios, y como se ha aadido una condicin de unin entre la tabla trabajadores y servicios a travs del campo DNI)

17. Visualiza el resultado de la consulta (botn Vista) Aparecer lo siguiente:

Como ves, aparecen todos los servicios y el nombre y apellidos del trabajador que hizo cada uno. Solo aparecen los servicios de los trabajadores cuyo apellido termine en ez.

18. Vuelve a la vista de edicin SQL. Vamos a complicar an ms la consulta. Esta vez vamos a hacer que aparezca el nombre del cliente al que se le hizo el servicio. Esto implica la inclusin de una nueva tabla (clientes) y la necesidad de relacionar la tabla servicios con la tabla clientes segn el modelo E-R de esta base de datos. El campo de unin es el CIF.

Modifica la consulta para que quede de la siguiente forma:


SELECT trabajadores.nombre, trabajadores.apellidos, servicios.tipo, servicios.cantidad, clientes.nombre FROM trabajadores, servicios, clientes WHERE trabajadores.apellidos LIKE '*ez' AND trabajadores.DNI=servicios.DNI AND servicios.CIF=clientes.CIF;

(Observa la inclusin de la tabla clientes en la clusula FROM, y la adicin de una nueva condicin de unin, entre la tabla servicios y la tabla clientes en la clusula WHERE. Esta condicin de unin une ambas tablas usando el campo CIF)

19. Veamos el resultado de la consulta:

Como se puede observar, aparece el listado de los servicios realizados por los trabajadores cuyo apellido termine en ez. Aparece informacin incluida en tres tablas distintas: trabajadores, servicios y clientes.

20. Vuelve a la zona de diseo SQL. Aadiremos una ltima modificacin a la consulta y la finalizaremos. Ahora estableceremos un orden. Concretamente, ordenaremos el resultado de la consulta segn apellidos del trabajador. Para ello tendremos que aadir una clusula ORDER BY:
SELECT trabajadores.nombre, trabajadores.apellidos, servicios.tipo, servicios.cantidad, clientes.nombre FROM trabajadores, servicios, clientes WHERE trabajadores.apellidos LIKE '*ez' AND trabajadores.DNI=servicios.DNI AND servicios.CIF=clientes.CIF ORDER BY trabajadores.apellidos ASC;

21. Ejecuta la consulta y observa el resultado. Ahora el listado de servicios aparece ordenado segn el apellido del trabajador que lo realiza, alfabticamente.

22. Hemos finalizado con la consulta. Cirrela y gurdela. Puede ponerle de nombre Servicios realizados por trabajadores ez.

23. Este ha sido un ejemplo de consulta realizada en Access usando el lenguaje de consulta SQL. Este lenguaje ser vital para hacer que nuestra aplicacin java manipule la base de datos correspondiente.

NOTA. En Internet se pueden encontrar mltiples manuales sobre SQL. Se recomienda buscar informacin sobre el tema para ampliar los conocimientos aqu expuestos.

La sintaxis del lenguaje SQL puede variar segn el programa de base de datos que se use. En este ejercicio guiado se ha usado la sintaxis del SQL incluido en el programa Access. Tenga en cuenta que puede haber variaciones entre este SQL y el incluido en otro gestor de base de datos, aunque estas variaciones son mnimas.

CONCLUSIN El lenguaje de consulta SQL permite manipular la base de datos. A travs de este lenguaje, se pueden crear rdenes que permitan: - Introducir nuevos datos en la base de datos. - Eliminar datos de la base de datos. - Modificar datos de la base de datos. - Realizar consultas sobre la base de datos. Para realizar consultas en la base de datos usando el lenguaje SQL es necesario usar instrucciones SELECT, las cuales tienen la siguiente forma general: SELECT campos a visualizar FROM tablas a las que pertenecen dichos campos WHERE condiciones a cumplir, condiciones de unin de tablas ORDER BY campos por los que se ordena El programa ACCESS permite crear consultas usando el lenguaje SQL, por lo que puede ser una buena herramienta para practicar este lenguaje. Nuestro programa de bases de datos java, usar este lenguaje para manipular la base de datos correspondiente.

EJERCICIO GUIADO. BASES DE DATOS. SQL

Acciones en SQL En la hoja guiada anterior se ha visto como se pueden crear instrucciones usando el lenguaje SQL para consultar una base de datos, y, de esta forma, extraer informacin de ella. Pero el lenguaje SQL no se queda simplemente ah, sino que proporciona instrucciones que pueden realizar acciones sobre la base de datos. Estas acciones son (entre otras): Aadir nuevos registros a una tabla. Eliminar registros de una tabla. Modificar datos de una tabla.

Programa Java

RDENES SQL aadir, modificar, eliminar

Base de Datos

En esta hoja guiada veremos como ejecutar instrucciones SQL que permitan aadir, eliminar o modificar registros de las tablas de la base de datos.

Alta de registros en SQL Se empezar estudiando como aadir nuevos registros en una base de datos usado el lenguaje SQL. Cdigo base en SQL para aadir nuevos registros Para aadir un registro en una tabla se usa la siguiente sintaxis: INSERT INTO tabla VALUES (valor1, valor2, valor3, ..., valor n); En la clusula INSERT INTO se indica la tabla que en la que se quiere introducir una nueva fila (registro), y en la clusula VALUES se indican los valores de la fila que se quiere insertar. Estos valores tienen que estar indicados en el orden en el que estn definidos los campos en la tabla correspondiente. Por ejemplo:
INSERT INTO trabajadores VALUES (30.234.234-A, Mara, Lpez, 1250.45, #01/02/2006# 4455-RSD);

En esta instruccin se est introduciendo un nuevo trabajador en la tabla trabajadores. Concretamente se est introduciendo un trabajador con las siguientes caractersticas: DNI: 30.234.234-A Nombre: Mara Apellidos: Lpez Sueldo: 1250,45 Fecha de entrada: 02/01/2006 Matrcula: 4455-RSD Los valores estn indicados en el mismo orden en el que estn los campos en la tabla: DNI, Nombre, Apellidos, Sueldo, Fecha, Matrcula. Si se quiere introducir un nuevo registro, pero indicando solo los valores de algunos campos, se puede usar entonces esta otra sintaxis para la instruccin INSERT INTO: INSERT INTO tabla (campo a, campo b, campo c) VALUES (valor del campo a, valor del campo b, valor del campo c); En este caso solo se introducen los valores correspondientes a tres campos, el resto de los campos del registro se quedarn vacos. Por ejemplo: INSERT INTO trabajadores (DNI, Apellidos, Sueldo) VALUES (30.234.234-A, Lpez, 1250.45); En este caso introducimos a un trabajador de apellido Lpez, con DNI 30.234.234-A que cobra 1250,45 euros. Tanto la matrcula de su coche como su nombre y la fecha quedan en blanco.

Formato de los valores. Recuerda que debes seguir ciertas reglas para introducir valores: Las cadenas se escriben entre comillas simples. Por ejemplo: Lpez Se usa el punto decimal en los nmeros reales: Por ejemplo: 1250.45 Las fechas se indicarn entre almohadillas # y hay que indicar primero el mes, luego el da y finalmente el ao. Por ejemplo: #12-20-2007# es 20 de diciembre de 2007. En el caso de querer especificar explcitamente que un campo est vaco, se puede indicar el valor NULL. Ejemplo: INSERT INTO trabajadores (DNI, Apellidos, Sueldo) VALUES (30.234.234-A, NULL, 1250.45); Los apellidos del trabajador estn vacos en este ejemplo.

EJERCICIO GUIADO N 1

1. Entra en la base de datos MANEMPSA de la carpeta Mis Documentos. 2. Crearemos una consulta SQL para aadir registros a la tabla trabajadores. Para ello, accede a la zona de consultas.

3. Crea una consulta en vista Diseo y no agregues ninguna tabla. Simplemente pulsa el botn Cerrar.

4. Pulsa el botn SQL que se encuentra en la parte superior izquierda de la ventana para crear una consulta SQL.

5. Aparecer entonces el editor de consultas SQL. En l, escribe la siguiente instruccin SQL:


INSERT INTO trabajadores VALUES ('33.444.333-B','Antonio','Romero',1300.5,#01/02/2006#,NULL);

Vers que lo que se pretende es introducir un nuevo trabajador. Este trabajador tendr los siguientes datos: DNI: 33.444.333-B Nombre: Antonio Apellidos: Romero Sueldo 1300,5 Fecha de entrada: 2-1-2006 (Observa como en la clusula VALUES se indica la fecha en formato mes-dia-ao) Matrcula de su coche: No se indica (NULL)

6. Este tipo de consulta es de accin. Esto significa que no debe mostrar nada, simplemente ejecuta una accin sobre la base de datos (en este caso, aadir un registro nuevo en la tabla trabajadores) Para ejecutar esta consulta de accin activa el botn Ejecutar:

7. Access avisar de que vas a aadir un nuevo registro, y te pide confirmacin. Acepta la accin:

8. Se acaba de ejecutar la consulta. Para comprobar el resultado tendremos que ver el contenido de la tabla Trabajadores y observaremos que hay un nuevo trabajador aadido. Primero cierra la consulta, pero no la guardes.

9. Accede a la zona de tablas de la base de datos.

10. Abre la tabla trabajadores. Observa el nuevo trabajador que se ha aadido:

11. Cierra la base de datos.

Modificacin de registros en SQL Es posible usar el lenguaje SQL para modificar los datos de una tabla. Se puede incluso modificar los datos de aquellos registros que cumplan una condicin en concreto. Cdigo base en SQL para modificar registros Para modificar los datos de los registros de una tabla se usar el siguiente cdigo general:
UPDATE tabla a modificar SET campo1 = nuevovalor1, campo2 = nuevovalor2, , campon = nuevovalorn WHERE condicin;

En la clusula UPDATE se indica la tabla cuyos registros se van a modificar. La clusula SET permite indicar los cambios que se realizarn. Se debe indicar el campo que se va a cambiar y el nuevo valor que se introducir en el campo. Como puede observar, se pueden indicar varios campos a modificar. La clusula WHERE permite indicar una condicin. Esto har que solo se cambien los valores de aquellos registros que cumplan la condicin. La clusula WHERE es opcional, y si no se indicara se cambiaran todos los registros de la tabla. Ejemplo:
UPDATE trabajadores SET sueldo = 1200, matricula=3355-AAA WHERE fecha < #01/01/2004#;

En este ejemplo se les asigna un sueldo de 1200 euros y el coche con matrcula 3355-AAA a todos aquellos trabajadores que hayan entrado en la empresa antes del 1-1-2004. Ejemplo:
UPDATE trabajadores SET sueldo = 1300;

En este ejemplo, se les asigna a todos los trabajadores un sueldo de 1300 euros ya que no se ha indicado clusula WHERE.

Si se quisiera hacer un cambio puntual a un registro en concreto, tendremos que hacer uso de su campo clave para indicar la condicin. Recuerda que el campo clave es el que identifica de forma nica a un registro de la tabla. Por ejemplo:
UPDATE trabajadores SET sueldo = 1300 WHERE DNI=33.444.333-A;

En este ejemplo se estoy asignando un sueldo de 1300 al trabajador con DNI 33.444.333-A, y a ningn otro (ya que se supone que no habr otro con dicho DNI)

EJERCICIO GUIADO N2 1. Entra en la base de datos MANEMPSA. 2. Accede a la zona de consultas y crea una consulta en vista diseo. 3. No agregues ninguna tabla y pulsa directamente el botn Cerrar. 4. Pulsa el botn SQL para entrar en la zona de edicin de consulta SQL.

5. Escribe la siguiente instruccin SQL:


UPDATE trabajadores SET sueldo = 800, matricula=1111-AAA WHERE DNI=33.444.333-B;

Como puedes observar, en esta instruccin SQL vamos a asignarle un sueldo de 800 euros y el coche con matricula 1111-AAA al trabajador con DNI 33.444.333-B, que es precisamente el trabajador que aadimos en el ejercicio guiado anterior. 6. Ejecuta esta consulta de accin pulsando el botn Ejecutar: 7. Access avisar de que va a actualizar una fila en la tabla trabajadores y pedir confirmacin para hacerlo. Acepte la confirmacin. 8. El resultado de esta instruccin SQL de accin es que se habrn modificado los datos del trabajador con DNI 33.444.333-B. Para comprobarlo accederemos a la tabla trabajadores y observaremos su contenido. 9. Cierre la consulta que est realizando (no hace falta que la guarde) 10. Acceda a la zona de tablas de la base de datos y entre en la tabla trabajadores, observe su contenido. El trabajador con DNI 33.444.333-B habr cambiado:

11. Cierra la base de datos.

Eliminacin de registros en SQL Al igual que podemos aadir nuevos registros (filas) a las tablas usando SQL, tambin podemos usar este lenguaje para eliminar registros de las tablas. Cdigo base en SQL para eliminar registros Para eliminar registros de una tabla se usar el siguiente cdigo general:

DELETE FROM tabla de la que se quiere eliminar WHERE condicin de los registros que se eliminarn;
En la clusula DELETE FROM se indica la tabla de la que eliminaremos registros. En la clusula WHERE se indica la condicin que deben cumplir los registros que eliminaremos. Por ejemplo:

DELETE FROM trabajadores WHERE sueldo>1000;


En este ejemplo se estn eliminando de la tabla trabajadores aquellos trabajadores cuyo sueldo sea superior a 1000. Si se quiere eliminar un solo registro de la tabla, ser necesario hacer referencia a su campo clave. Recuerda que el campo clave es el que identifica de forma nica a cada registro. Por ejemplo, si queremos eliminar un trabajador en concreto, indicaremos su DNI en la condicin:

DELETE FROM trabajadores WHERE DNI=33.444.555-A;


Esta instruccin SQL borra al trabajador con DNI 33.444.555-A (solamente a l, ya que se supone que no habr otro trabajador que tenga ese mismo DNI) En la clusula WHERE de una instruccin DELETE, las condiciones se indican tal como se vio en la hoja anterior para las instrucciones SELECT. Si se quiere eliminar todo el contenido de una tabla, se puede usar una instruccin DELETE sin indicar ninguna condicin. Por ejemplo:

DELETE FROM trabajadores;


Esta instruccin eliminara todos los registros de la tabla trabajadores.

EJERCICIO GUIADO N 3

11. Entra en la base de datos MANEMPSA. 12. Accede a la zona de consultas y crea una consulta en vista diseo. 13. No agregues ninguna tabla y pulsa directamente el botn Cerrar. 14. Pulsa el botn SQL para entrar en la zona de edicin de consulta SQL.

15. Escribe la siguiente instruccin SQL: DELETE FROM trabajadores WHERE DNI = '33.444.333-B';

Como puedes observar, esta instruccin eliminar al trabajador con DNI 33.444.333B, que es precisamente el trabajador que se aadi en el ejercicio guiado 1.

16. Ejecuta esta instruccin de accin activando el botn Ejecutar:

17. Access avisar de que va a eliminar una fila de la tabla trabajadores, y pedir confirmacin. Confirme la eliminacin. 18. Para comprobar el ejemplo tendr que acceder a la tabla trabajadores y comprobar que el trabajador con DNI 33.444.333-B ya no est. Para ello cierre la consulta (no hace falta que la guarde) y acceda a la zona de tablas. 19. Abra la tabla trabajadores. Observe como el trabajador ha desaparecido:

20. Cierre Access.

CONCLUSIN El lenguaje de consulta SQL no solo permite extraer informacin de una base de datos, sino que tambin permite realizar acciones sobre la base de datos: - Introducir nuevos datos en la base de datos. - Eliminar datos de la base de datos. - Modificar datos de la base de datos. Para introducir nuevos datos en la base de datos usar la instruccin SQL llamada INSERT INTO Para eliminar datos de la base de datos usar la instruccin SQL llamada DELETE Para modificar datos de la base de datos usar la instruccin SQL llamada UPDATE

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Acceso a Base de Datos desde una aplicacin Java El objetivo de todas las hojas guiadas anteriores dedicadas a las bases de datos, es finalmente aprender a crear un fichero que contenga toda la informacin que la empresa necesita gestionar. Es decir, crear un fichero de base de datos. Este fichero se incluir con el programa java que se realice. Nuestro programa java acceder a este fichero continuamente para aadir nuevos datos, o modificar datos, eliminar datos, o extraer datos segn lo ordene el usuario del programa. En esta hoja guiada, se vern los pasos necesarios para conectar un proyecto java con un fichero de base de datos creado en Access.

Pasos Generales para preparar una Aplicacin Java para acceder a una Base de Datos Para preparar nuestra aplicacin Java para que pueda acceder a una Base de Datos, es necesario realizar tres pasos: 1. Cargar el controlador de la base de datos. El controlador define el tipo de base de datos que se va a usar (base de datos de Access, o de MySQL, o de cualquier otro gestor de base de datos) En nuestro caso, tendremos que indicar el controlador para base de datos de Access. 2. Crear un objeto conexin (Connection) Para crear este objeto hay que indicar la situacin del fichero de base de datos, el usuario y la contrasea de dicha base de datos. El objeto conexin abre el fichero de la base de datos. 3. Crear un objeto sentencia (Statement) El objeto sentencia se crea a partir del objeto conexin anterior. Los objetos sentencia permiten realizar acciones sobre la base de datos usando instrucciones SQL. Es decir, a travs del objeto sentencia introduciremos datos en la base de datos, eliminaremos datos, haremos modificaciones, y extraeremos datos de la base de datos. As pues, este objeto es vital. Este objeto es el que realmente permite el acceso a los datos de la base de datos y la manipulacin de dicha base de datos.

EJERCICIO GUIADO N 1 PLANTEAMIENTO En este ejercicio se pretende crear una pequea aplicacin de bases de datos que permita simplemente mostrar los datos de los trabajadores almacenados en la base de datos MANEMPSA.

1. Entre en NetBeans. Crea un nuevo proyecto llamado AccesoBD. Dentro de este proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un JFrame llamado ventanaprincipal:

2. En la parte superior de la ventana aade un botn con el texto Ver Datos Trabajadores que se llame btnVerDatos.

3. Se pretende simplemente que al pulsar el botn btnVerDatos aparezcan en un JOptionPane datos sobre los trabajadores almacenados en la base de datos.

SITUACIN DEL FICHERO DE BASE DE DATOS 4. Antes de empezar con la programacin de nuestra aplicacin, introduciremos el fichero de base de datos en la carpeta del proyecto java que estamos haciendo. Para ello, accede a la carpeta del proyecto AccesoBD. Esta carpeta se encontrar all donde ests guardando tus proyectos:

5. Entra dentro de esta carpeta y observars una serie de carpetas creadas por el propio NetBeans. (Entre ellas, la ms interesante es la llamada src, la cual es la que contiene los ficheros con el cdigo java)

6. Para tener todo bien organizado, crearemos una carpeta llamada Base dentro de la carpeta de proyecto, de manera que su contenido quede as:

7. Ahora lo nico que tiene que hacer es copiar el fichero de base de datos MANEMPSA.MDB que se encuentra en Mis Documentos dentro de la carpeta Base. (La extensin de los ficheros de base de datos de Access es MDB)

8. De esta manera, tenemos el fichero de base de datos que hemos creado con Access guardado dentro de la misma carpeta de proyecto java que usar dicha base de datos. Se recomienda que esto lo haga cada vez que programe una aplicacin de bases de datos Java. 9. Ahora ya podemos volver al NetBeans y continuar con nuestro trabajo.

PREPARACIN DE LA APLICACIN JAVA PARA EL ACCESO A LA BASE DE DATOS 10. Para poder acceder y manipular una base de datos, es necesario tener dos objetos: Un objeto del tipo Connection, al que llamaremos conexion. Este objeto define la conexin con la base de datos. Un objeto del tipo Statement, al que llamaremos sentencia. Este objeto permite manipular la base de datos.

11. As pues, lo primero que haremos ser definir estos objetos como globales en la clase de la ventana principal, para as poderlos usar desde cualquier lado:

Aparecern subrayados ya que ser necesario indicar el import para las clases Connection y Statement. Estos import son respectivamente: java.sql.Connection y java.sql.Statement Agrega los import correspondientes para eliminar los errores. 12. Una vez definidos los objetos conexin y sentencia, necesarios para el acceso a la base de datos, prepararemos nuestro programa para que pueda acceder a la base de datos MANEMPSA.MDB. Esto se har en el constructor. 13. En primer lugar, aade al constructor una llamada a una funcin PrepararBaseDatos:

14. Crea el mtodo PrepararBaseDatos debajo del constructor y empieza a programar lo siguiente:

El cdigo que acabas de programar es el primer paso a realizar para el acceso a una base de datos: La Carga del Controlador. Recuerda que el controlador le indica a Java que tipo de base de datos usaremos: Access, MySQL, etc El controlador que le indica al java que usaremos una base de datos de Access viene definido a travs de la siguiente cadena de texto: sun.jdbc.odbc.JdbcOdbcDriver

Y la forma de activar dicho controlador es a travs de la instruccin: Class.forName(controlador).newInstance(); Donde controlador es una variable de cadena que contiene la cadena anterior.

Bsicamente, lo que hacen estas dos lneas de cdigo, es preparar a Java para poder usar Access. En el caso de que se quisiera usar una base de datos realizada en otro programa que no fuera Access, habra que cambiar la cadena de texto correspondiente a su controlador. Por ejemplo, para usar una base de datos creada con el gestor de base de datos MySQL se usa la cadena: com.mysql.jdbc.Driver. En nuestro caso siempre usaremos Access. Tambin puedes observar que es obligatorio encerrar el cdigo de la carga del controlador entre try catch para capturar cualquier error imprevisto.

15. Ahora aade el siguiente cdigo a continuacin del anterior:

El cdigo que acabas de aadir se corresponde con el segundo paso para acceder a una base de datos: Crear el objeto Conexin. El objeto conexin es el que efecta la conexin real con la base de datos. Se podra decir que es el objeto que permite abrir la puerta del fichero de base de datos para entrar en l. Para construir este objeto conexin (el cual ya est declarado en la parte global de la clase) hacen falta tres datos: El nombre del usuario que manipular la base de datos. En el caso de Access no necesitamos indicar ningn nombre de usuario, por eso vers la instruccin:

String user = ; El password del usuario que manipular la base de datos. En el caso de Access tampoco necesitaremos ningn password, por eso vers la instruccin:

String password = ; La DSN de la base de datos. DSN significa nombre del origen de datos y es una cadena de texto algo compleja que contiene informacin sobre el fichero de base de datos que queremos usar. La parte inicial de la cadena de la DSN siempre ser igual para las bases de datos de Access: "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" Sin embargo, lo que nos interesa realmente de esta cadena es su parte final, donde hay que indicar el camino del fichero de base de datos al que accederemos. En nuestro caso, indicaremos el camino de MANEMPSA.MDB, el fichero de la base de datos. Observa como indicamos el camino del fichero: Base\\MANEMPSA.MDB Base es la carpeta donde hemos guardado el fichero, dentro de nuestro proyecto java, y MANEMPSA.MDB como ya sabes es el fichero de Access que contiene la base de datos. Observa la necesidad de escribir dos barras. En el cdigo podrs ver la creacin de la DSN: String DSN = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+ "Base\\MANEMPSA.MDB"; Finalmente se usa la instruccin conexion=DriverManager.getConnection(DSN,user,password); para crear la conexin. Ser necesario aadir un import para la clase DriverManager. Al igual que con el primer paso, es necesario rodear la creacin de la conexin con un trycatch para capturar cualquier error inesperado que se pueda producir en este paso.

16. Ahora aade el siguiente cdigo a continuacin del anterior:

Este cdigo que acabas de aadir se corresponde con el tercer paso necesario para poder acceder a una base de datos: Creacin del objeto Sentencia. El objeto sentencia ser el que nos permita ejecutar rdenes SQL sobre la base de datos. Es decir, el objeto que nos permite actuar y manipular la base de datos. Este objeto es vital, y es el objetivo de toda esta preparacin. El objeto sentencia se crea a partir del objeto conexin creado en el paso anterior, usando la siguiente instruccin:
sentencia=conexion.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Y como sucedi en los dos pasos anteriores, es necesario rodear esta instruccin con un trycatch para capturar cualquier tipo de error inesperado que se pudiera producir.

17. As pues ya tenemos preparado nuestro programa para acceder a la base de datos. Esta preparacin se realiza en el momento en que se ejecuta el programa, ya que hemos introducido este cdigo en el constructor. Es cierto que este cdigo puede resultar bastante abstracto y complejo, pero tiene la gran ventaja de que siempre es igual. Para nuestros ejercicios, solo tendremos que cambiar el nombre de la base de datos que se est usando en ese momento. El resto del cdigo queda igual. Observa:

El mtodo PrepararBaseDatos siempre ser igual, solo cambiar el nombre de la base de datos a usar.

18. El objetivo de todo este cdigo de preparacin para el acceso al fichero de la base de datos es obtener un objeto llamado sentencia que nos posibilitar la manipulacin de los datos de la base de datos, usando rdenes SQL. En este ejercicio guiado usaremos el objeto sentencia para averiguar informacin acerca de los trabajadores.

REALIZAR CONSULTAS SQL USANDO EL OBJETO SENTENCIA

19. Cuando se pulse el botn Ver Datos de Trabajadores tendremos que extraer los datos de la tabla trabajadores para poder mostrarlos. Para ello, escribe el siguiente cdigo dentro del evento actionPerformed del botn btnVerDatos:

Observa el cdigo:
ResultSet r = sentencia.executeQuery(select * from trabajadores order by nombre);

El objeto sentencia se usa para dar rdenes a la base de datos. Esas rdenes se dan usando el lenguaje de consulta SQL. Se usa el mtodo executeQuery del objeto sentencia para ejecutar la consulta SQL select * from trabajadores order by nombre. Esta consulta extraer todos los datos de la tabla trabajadores ordenados por nombre. El mtodo executeQuery recibe como parmetro una cadena representando la consulta SQL. No es necesario indicar el punto y coma final de la consulta SQL. El resultado de la consulta se guarda en un objeto del tipo ResultSet al que se ha llamado simplemente r. Los objetos ResultSet almacenan el resultado de una consulta SQL. (Ser necesario incluir el import necesario para la clase ResultSet) Y como puedes observar, es necesario rodear la ejecucin de una consulta SQL con un trycatch para capturar errores inesperados al realizar la consulta.

LOS OBJETOS RESULTSET

20. Debes imaginarte el objeto ResultSet r como una tabla que contiene el resultado de la consulta SQL que se ha ejecutado. En nuestro caso, la consulta SQL que hemos ejecutado ha extrado toda la tabla trabajadores. Por tanto nuestro ResultSet contiene toda la tabla trabajadores. El objeto r por tanto podra representarse as:

Trabajadores
Nombre Apellidos Sueldo Fecha Matricula BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 22.333.444-C Francisco Lpez 1000 01/06/2006 1144-BBB 12.321.567-B Juan Prez 1120 04/05/2002 4433-ABB EOF DNI

21. La fila BOF significa comienzo de fichero y representa una fila anterior al primer registro del ResultSet. La fila EOF significa final de fichero y representa una fila posterior al ltimo registro del ResultSet. La flecha indica la posicin actual donde estamos situados dentro de la tabla del ResultSet. 22. Aade la siguiente lnea al cdigo del actionPerformed:

El mtodo next del ResultSet har que avancemos una fila en el ResultSet. Es decir, ahora estaremos situados en la primera fila del ResultSet (la flecha avanza una posicin)

Trabajadores
Nombre Apellidos Sueldo Fecha Matricula BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 22.333.444-C Francisco Lpez 1000 01/06/2006 1144-BBB 12.321.567-B Juan Prez 1120 04/05/2002 4433-ABB EOF DNI

23. Ahora que estamos situados en la posicin del primer trabajador (Ana), podemos extraer informacin referente a sus campos. Aade el siguiente cdigo al actionPerformed del botn:

Lo que se ha hecho primero es declarar una variable de cadena llamada info. Luego, a esta variable se le ha asignado una concatenacin de cadenas:
info="El trabajador se llama "+r.getString("nombre")+" "+r.getString("apellidos")+ " y cobra "+r.getString("sueldo");

Lo interesante de esto es el mtodo getString del objeto ResultSet r. El mtodo getString permite extraer una cadena con el valor del campo indicado como parmetro. En nuestro caso: r.getString(nombre) r.getString(apellidos) r.getString(sueldo) Extrae el nombre del trabajador actual (Ana) Extrae los apellidos del trabajador actual (Ruiz) Extrae el sueldo del trabajador actual (1200)

Luego se muestra la cadena info en un simple JOptionPane.

24. Ya puedes ejecutar el programa.

Pulsa el botn Y aparecer informacin sobre el primer trabajador de la base de datos

25. Sigamos haciendo cambios en el cdigo del botn para entender mejor el funcionamiento de los ResultSet. Aade la siguiente lnea:

26. Se ha aadido un segundo next. Esto producir que la flecha avance dos posiciones en el ResultSet, y por tanto se coloque en la segunda fila:

Trabajadores
Nombre Apellidos Sueldo Fecha Matricula BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 22.333.444-C Francisco Lpez 1000 01/06/2006 1144-BBB 12.321.567-B Juan Prez 1120 04/05/2002 4433-ABB EOF DNI

27. Esto quiere decir que si se ejecuta el programa se mostrar informacin sobre Francisco Lpez. Comprubalo:

28. Los objetos ResultSet poseen diversos mtodos para cambiar la posicin actual en la tabla del ResultSet. Dicho de otro modo: para mover la flecha. Veamos algunos de estos mtodos (se supone que el objeto ResultSet se llama r): r.next(); r.previous(); r.first(); r.last(); r.beforeFirst() r.afterLast() r.absolute(n) Mueve la flecha a la siguiente fila Mueve la flecha a la fila anterior Mueve la flecha a la primera fila Mueve la flecha a la ltima fila Mueve la flecha a la fila BOF Mueve la flecha a la fila EOF Mueve la flecha a la fila n del ResultSet. Las filas se empiezan a numerar por 1.

29. Haga el siguiente cambio en el actionPerformed simplemente para experimentar:

En este caso la flecha se coloca en EOF (afterLast) y luego retrocede una fila (previous). Por tanto, al ejecutar el programa se mostrarn los datos del ltimo trabajador. Compruebalo.

Trabajadores
Nombre Apellidos Sueldo Fecha Matricula BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 22.333.444-C Francisco Lpez 1000 01/06/2006 1144-BBB 12.321.567-B Juan Prez 1120 04/05/2002 4433-ABB EOF DNI

30. Otro experimento. Cambie ahora el cdigo de esta forma:

Este cdigo coloca la flecha en la fila 2 ( absolute(2) ), luego avanza una fila (next), luego retrocede una fila (previous) y finalmente retrocede una fila (previous) As pues, finalmente, la flecha queda colocada en la primera fila. Por lo tanto se muestran los datos del primer trabajador. Comprubalo.

Trabajadores
Nombre Apellidos Sueldo Fecha Matricula BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 22.333.444-C Francisco Lpez 1000 01/06/2006 1144-BBB 12.321.567-B Juan Prez 1120 04/05/2002 4433-ABB EOF DNI

31. Como ves, podemos movernos dentro del contenido del ResultSet gracias a todos estos mtodos, para luego poder extraer los datos de la fila correspondiente. Ahora, estudiaremos la forma de recorrer todas las filas del ResultSet para as extraer la informacin de todos sus registros. 32. Vamos a modificar nuestro cdigo para que se muestren todos los trabajadores del ResultSet. Para ello, realiza el siguiente cambio:

En este cdigo se ha inicializado la variable info a la cadena vaca y luego se ha aadido un bucle bastante interesante:
r.beforeFirst(); while (r.next()) { info=info+r.getString("nombre")+" "+r.getString("apellidos")+" "+r.getString("sueldo")+"\n"; }

Analicemos este bucle: Lo primero que se hace es colocar explcitamente la flecha en la fila BOF, es decir, antes del primer trabajador:
r.beforeFirst();

Luego tenemos un bucle mientras que comienza as:


while (r.next()) {

El mtodo next intenta colocar la flecha en la siguiente fila, y si lo hace bien, devuelve el valor verdadero. Cuando no se puede avanzar ms, el mtodo next devolver falso. As pues, este while significa mientras se haya podido avanzar una fila, haz lo siguiente. O dicho de otro modo, este bucle se repetir para cada fila de la tabla del ResultSet.

Si analizamos el contenido del bucle, bsicamente veremos una concatenacin de cadenas dentro de la variable info. En cada vuelta del bucle se concatenar el nombre, apellidos y sueldo de cada trabajador.
info=info+r.getString("nombre")+" "+r.getString("apellidos")+" "+r.getString("sueldo")+"\n";

Finalmente se visualiza la variable info en un JOptionPane.

33. Ejecuta el programa y comprueba su funcionamiento.


Al pulsar el botn Aparecen los datos de todos los trabajadores de la base de datos.

34. El bucle que acabas de programar es un cdigo clsico para manipular un ResultSet. Siempre que quieras recorrer todas las filas del ResultSet hars algo como esto: r.beforeFirst(); while (r.next()) { manipulacin de la fila }

35. Se ha visto que para obtener un dato de la fila actual se usa el mtodo getString indicando como parmetro el dato que se quiere obtener. Por ejemplo: r.getString(sueldo); Obtiene el sueldo del trabajador sealado actualmente con la flecha. Este sueldo se obtiene convertido en cadena.

36. Los ResultSet poseen otros mtodos para obtener los datos convertidos en nmeros como son: getInt(campo) y getDouble(campo) para obtener el dato en entero o double, respectivamente. Esto nos permite el realizar operaciones con los datos extrados del ResultSet.

37. Como ejemplo de esto ltimo, realice la siguiente mejora al programa:

En este nuevo cdigo se ha aadido una variable double acumuladora llamada totalsu, donde sumaremos todos los sueldos. Dentro del bucle, se van acumulando el sueldo de cada trabajador. Observa el uso de getDouble para obtener el campo sueldo de forma numrica, en vez de usar getString: totalsu=totalsu+r.getDouble("sueldo"); Y finalmente usamos otro JOptionPane para ver la suma de los sueldos calculada. Ejecuta el programa y comprueba su funcionamiento.

38. Una vez finalizado el programa, es una buena costumbre cerrar la base de datos que estamos manejando. Esto se hace cerrando la conexin con la base de datos. Para hacer esto se usa el mtodo close del objeto conexin. Esto se har en el momento en que se finalice el programa, es decir, en el evento windowClosing de la ventana principal:

Como ves, tambin hay que encerrar este cdigo entre trycatch para evitar posibles errores.

CONCLUSIN Para crear un programa Java que pueda usar una base de datos ser necesario realizar los siguientes pasos: - Colocar el fichero de base de datos en una subcarpeta de la carpeta del proyecto java. - Preparar el acceso a la base de datos (en el constructor) * Se crearn dos objetos: conexin (Connection) y sentencia (Statement) * Se cargar el controlador del tipo de base de datos a usar * Se crear el objeto conexin indicando el fichero de la base de datos. * Se crear el objeto sentencia a partir del objeto conexin - Se usar el objeto sentencia para ejecutar consultas SQL en la base de datos. - Las consultas SQL ejecutadas en la base de datos se almacenan en objetos del tipo ResultSet

- Un objeto ResultSet tiene forma de tabla conteniendo el resultado de la consulta SQL * Los objetos ResultSet tienen mtodos para seleccionar el registro de la tabla * Los objetos ResultSet tienen mtodos que permiten extraer el dato de un campo en concreto.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Recapitulando Para hacer una aplicacin java que acceda a una base de datos se tiene que Introducir la base de datos en una subcarpeta del proyecto. Preparar la base de datos desde el constructor. Usar el objeto sentencia cada vez que se quiera consultar la base de datos o actuar sobre ella. Los resultados de las consultas ejecutadas sobre la base de datos se recogern en objetos ResultSet que contendrn los datos devueltos por la consulta. Cerrar la conexin a la base de datos cuando ya no haya que usarla ms.

Consultar la Base de Datos En la hoja anterior se vio que se puede usar el objeto sentencia para ejecutar una consulta SQL en la base de datos. Al hacer esto se consigue un objeto ResultSet que contiene el resultado de la consulta. El contenido del ResultSet tiene forma de tabla, y podemos extraer la informacin colocndonos en la fila correspondiente del ResultSet y luego usando los mtodos: getString getDouble getInt segn queramos extraer el dato en forma de cadena, de nmero real o nmero entero. En esta hoja guiada se insistir sobre la forma de manipular los datos contenidos en un ResultSet

EJERCICIO GUIADO N 1 PLANTEAMIENTO Se quiere realizar una pequea aplicacin de base de datos que nos muestre informacin sobre los servicios realizados en la empresa MANEMPSA. Para ello, siga los pasos que se indican a continuacin:

1. Entre en NetBeans. Crea un nuevo proyecto llamado ServiciosBD. Dentro de este proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un JFrame llamado ventanaprincipal:

2. En la parte superior de la ventana aade un botn con el texto Ver Datos Servicios que se llame btnServicios.

3. Se pretende simplemente que al pulsar el botn btnServicios aparezcan en un JOptionPane datos sobre los servicios almacenados en la base de datos.

SITUACIN DEL FICHERO DE BASE DE DATOS 4. Como se vio en la hoja anterior, interesa colocar el fichero de la base de datos que se va a usar en una subcarpeta de la carpeta de proyecto que se est haciendo. As pues, entre en la carpeta de proyecto ServiciosBD

5. Y dentro de ella crea una carpeta Base. Dentro de la carpeta Base copia el fichero de base de datos MANEMPSA.MDB, el cual se encuentra dentro de la carpeta Mis Documentos.

Copia aqu dentro el fichero de base de datos MANEMPSA.MDB

6. Ahora ya podemos volver al NetBeans y continuar con nuestro trabajo.

PREPARACIN DE LA APLICACIN JAVA PARA EL ACCESO A LA BASE DE DATOS 7. Preparar nuestro proyecto para que permita el acceso a la base de datos MANEMPSA.MDB es un proceso complejo, aunque afortunadamente siempre se hace igual. Solo tiene que aadir el siguiente cdigo a su ventana principal:

Declara los objetos globales conexin y sentencia

Haz la llamada al mtodo PrepararBaseDatos

Recuerda que el mtodo PrepararBaseDatos siempre ser igual, solo tienes que indicar aqu el nombre de la base de datos a usar.

REALIZAR CONSULTAS SQL USANDO EL OBJETO SENTENCIA 8. Ahora que hemos preparado nuestro proyecto para poder usar la base de datos MANEMPSA.MDB, ya podemos programar el botn para visualizar los servicios. Entra dentro del actionPerformed de este botn y programa lo siguiente:

Si observas el cdigo, lo que hace es ejecutar la consulta SQL select * from servicios order by cantidad la cual extrae todos los servicios almacenados en la tabla servicios ordenados por cantidad de menor a mayor. El resultado de esta consulta se almacena en un ResultSet y se usa un bucle tpico que recorre el ResultSet y muestra el tipo de cada servicio y la cantidad:
while (r.next()) { info=info+r.getString("tipo")+" "+r.getString("cantidad")+"\n"; }

Puedes ejecutar el programa para ver como funciona.

9. Aunque no es vital para el programa, aadamos el cierre de la conexin de la base de datos en el windowClosing de nuestra ventana:

EXTRAER FECHAS DEL RESULTSET 10. Se va a mejorar el programa de forma que se muestre de cada servicio el tipo, la cantidad y la fecha en que se hizo. Por tanto, haz el siguiente cambio en el cdigo del actionPerformed del botn btnServicios:

Simplemente estamos cambiando la concatenacin de la cadena info de forma que aparezca la fecha de cada servicio, el tipo y la cantidad.

11. Ejecuta el programa y observa el resultado.

Como se puede ver, las fechas aparecen en orden cambiado (ao-mes-dia) Y adems incluyen el formato de hora.

12. Como se ha podido observar, las fechas extradas del ResultSet tienen un formato distinto al que usamos normalmente. Para mejorar la presentacin de las fechas extradas del ResultSet haz los siguientes cambios en el cdigo:

El cdigo se ha mejorado de forma que la fecha aparezca en un formato espaol correcto. Ejecuta el programa para comprobar el resultado:

Observa como ahora las fechas aparecen correctamente

13. Estudiemos el cdigo que acabamos de aadir: Lo primero que se ha hecho es crear varias variables de cadenas para contener el da, mes y ao de la fecha as como la fecha completa.
String String String String cadfecha; //cadena para fechas caddia; //cadena para el dia cadmes; //cadena para el mes cadanio; //cadena para el ao

Dentro del bucle extraemos la fecha del ResultSet y la almacenamos en la variable cadfecha: cadfecha=r.getString("fecha"); Ahora mismo, la variable cadfecha contendr una cadena como la siguiente: 2 0 0 5 1 2 2 1 0 0 : 0 0 : 0 0

Para extraer el ao de la cadena, extraemos los caracteres comprendidos entre la posicin 0 y la posicin 3. Esto se hace usando el mtodo substring de la siguiente forma: cadanio=cadfecha.substring(0,4); Para extraer el mes de la cadena, tendremos que extraer los caracteres comprendidos entre la posicin 5 y la posicin 6. Esto se hace usando el mtodo substring de la siguiente forma: cadmes=cadfecha.substring(5,7); Para extraer el dia de la cadena, tendremos que extraer los caracteres comprendidos entre la posicin 8 y la posicin 9 de la cadena. Esto se hace usando el mtodo substring de la siguiente forma: caddia=cadfecha.substring(8,10); Una vez extrados dia, mes y ao, de la cadena, podemos concatenarlos formando una fecha en formato dia/mes/ao de la siguiente forma: cadfecha=caddia+"/"+cadmes+"/"+cadanio; As pues, finalmente tenemos una variable cadfecha que ser la que se visualizar en el JOptionPane: info=info+cadfecha+" "+r.getString("tipo")+" "+ r.getString("cantidad")+"\n";

PRESENTACIN DE COMAS DECIMALES 14. Ahora mejoraremos el programa para que los costes de los servicios aparezcan con coma decimal, en vez de punto decimal:

Haremos que aqu aparezcan comas, en vez de puntos

Modifica el cdigo de la siguiente forma:

Se ha aadido una variable de cadena llamada cadcoste que almacenar el coste de cada servicio. En el cdigo del bucle, recogemos la cantidad en dicha variable y luego usamos el mtodo de cadena replace para reemplazar los puntos por comas:
cadcoste=r.getString("cantidad"); cadcoste=cadcoste.replace(".",",");

Finalmente, mostramos la cadena de coste en la concatenacin:


info=info+cadfecha+" "+r.getString("tipo")+" "+cadcoste+"\n";

Ejecuta el programa y observa el resultado:

Ahora ya tenemos las comas decimales

VALORES NULOS 15. Es posible que algn campo de algn registro de la tabla est vaco. Es decir, que sea nulo. Si esto ocurre, entonces al extraer dicho dato de la tabla usando getString aparecer el valor null en el JOptionPane. 16. Para comprobar esta circunstancia, agrega un nuevo botn a la ventana principal con el texto Ver Datos de Clientes. Llmalo por ejemplo btnClientes. 17. Al pulsar este botn aparecer el listado de clientes de la empresa. Concretamente debe aparecer el nombre del cliente, el telfono 1 y el telfono 2. Para ello aade el siguiente cdigo dentro del evento actionPerformed del botn.

Este cdigo es prcticamente igual que el anterior. Simplemente ejecuta una consulta SQL usando el objeto sentencia que permite extraer el contenido de la tabla clientes, y luego recorre el ResultSet mostrando los campos nombre, telfono 1 y telfono 2 en un JOptionPane. 18. Ejecuta el programa ahora y prueba a pulsar este nuevo botn. Observa el resultado. Cada vez que un cliente no tenga un telfono, aparecer el valor null en el JOptionPane:

19. Vamos a arreglar esto de forma que aparezca el texto no tiene en vez de la cadena null. Modifique el cdigo como se indica:

Como puedes ver, lo que se hace ahora es comprobar si el valor extrado del ResultSet es null, y en ese caso, se concatena la cadena no tiene. En caso contrario se concatena el valor del campo.

CONCLUSIN A travs del objeto sentencia podemos ejecutar una consulta SQL en una base de datos. El resultado de la consulta se almacena en un objeto del tipo ResultSet. Al extraer el valor de un campo fecha desde el objeto ResultSet observaremos que tiene el siguiente formato: Ao Mes Dia Hora : Minutos : Segundos As pues puede ser necesario realizar cambios en esta cadena. Al extraer el valor de un campo numrico real, obtendremos un nmero con punto decimal. Quizs sea necesario cambiar este punto por una coma decimal. Cuando un campo est vaco, al intentar extraer su valor obtendremos el valor null.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Recapitulando. Ejecucin de consultas desde la aplicacin. Para ejecutar una consulta sobre la base de datos desde tu aplicacin java se tiene que ejecutar una instruccin usando el objeto sentencia de la siguiente forma: ResultSet r = sentencia.executeQuery(consulta_sql); La consulta_sql es una cadena que tiene forma de consulta SQL bien escrita (sin fallos). Por ejemplo:
String consulta; consulta=select * from trabajadores; ResultSet r = sentencia.executeQuery(consulta);

En este cdigo que se acaba de mostrar, se crea una cadena llamada consulta. Se le asigna a esta cadena una instruccin SQL para extraer todos los trabajadores, y finalmente se ejecuta dicha instruccin SQL usando el objeto sentencia. La cadena consulta puede ser construida a travs de concatenaciones de cadenas. Observa atentamente este ejemplo. Es parecido al anterior pero tiene una ligera diferencia:

//Supongamos que txtTabla es un cuadro de texto String consulta; consulta=select * from + txtTabla.getText(); ResultSet r = sentencia.executeQuery(consulta);

En este caso, la cadena consulta es la concatenacin de select * from con lo que contenga el cuadro de texto txtTabla - es decir, txtTabla.getText()

La gran ventaja de esto, es que el usuario podr escribir el nombre de una tabla cualquiera dentro del cuadro de texto txtTabla y al ejecutarse este cdigo se extraer el contenido de dicha tabla. Es decir, el usuario podr decidir lo que quiere consultar. El usuario afecta a la construccin de la consulta SQL, y por tanto, tiene cierto control sobre esta consulta.

La construccin de consultas SQL a partir de la concatenacin de cadenas y datos proporcionados por el usuario es algo muy usado en los programas de base de datos. En esta hoja guiada se insistir en esta idea.

EJERCICIO GUIADO N 1 PLANTEAMIENTO Se quiere realizar una aplicacin de base de datos que nos muestre informacin sobre los trabajadores de la empresa MANEMPSA. Esta aplicacin le dar al usuario la capacidad de elegir la informacin que quiere extraer de la base de datos. Es decir, el usuario tendr cierto control sobre las consultas que se realicen.

1. Entre en NetBeans. Crea un nuevo proyecto llamado TrabajadoresBD. Dentro de este proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un JFrame llamado ventanaprincipal:

2. Aade a la ventana un JTextPane y un botn de momento:

El botn se llamar btnTodos y el JTextPane se llamar txtPanel.

3. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que prepararlo haciendo lo siguiente: Crear la subcarpeta Base y copiar en ella el fichero de base de datos MANEMPSA.MDB que tiene en la carpeta Mis Documentos. Aadir al programa los objetos conexin (Connection) y sentencia (Statement) como globales. Crear el procedimiento PrepararBaseDatos y llamarlo desde el constructor. Cerrar la conexin desde el evento windowClosing

Realice estos cuatro pasos que se han indicado antes de continuar. 4. Ya se puede programar el botn btnTodos. Se pretende que al pulsar este botn aparezca en el panel txtPanel el contenido de la tabla trabajadores. Para ello, programe el siguiente cdigo dentro del actionPerformed del botn btnTodos:

Si analiza este cdigo, ver que es igual al que hemos realizado en hojas anteriores. Bsicamente lo que hace es lo siguiente: Ejecuta la consulta select * from trabajadores order by sueldo Luego extrae del ResultSet los campos nombre, apellidos, sueldo y fecha. Hay que indicar que al campo sueldo se le cambia el punto decimal por la coma decimal. Por otro lado, la fecha se transforma para que tenga el formato dia/mes/ao Finalmente se muestra el resultado de la consulta en el JTextPane: txtPanel. (Antes de mostrarlo se borra todo lo que hubiera en el panel)

5. Ejecuta el programa y prueba el funcionamiento de este botn:

Al pulsar el botn, se muestran los datos de todos los trabajadores.

6. Se va a mejorar el programa. Aada un cuadro de texto llamado txtSueldo y luego tres botones llamados respectivamente btnMayor, btnMenor y btnIgual. La parte inferior de la ventana quedar as:

7. Se pretende que estos botones funcionen de la siguiente forma: El usuario introducir un sueldo en el cuadro de texto txtSueldo. Luego, si pulsa el botn Igual, aparecer en el panel todos los trabajadores que tengan un sueldo igual al introducido. En cambio, si pulsa el botn Mayor, aparecer en el panel todos los trabajadores que tengan un sueldo mayor que el introducido. Y si pulsa el botn Menor, aparecer en el panel todos los trabajadores que tengan un sueldo menor que el introducido.

Se empezar programando el botn Igual.

8. Programe en el actionPerformed del botn btnIgual lo siguiente. (Nota: El cdigo siguiente es prcticamente igual al anterior, solo se hace un pequeo cambio. Puede copiar y pegar y luego hacer la modificacin que se indica)

Estudiemos detenidamente el cdigo remarcado:


String consulta; consulta = select * from trabajadores where sueldo = +txtSueldo.getText(); ResultSet r = sentencia.executeQuery(consulta);

Aqu se crea una variable de texto llamada consulta y luego se concatena en ella la cadena:
select * from trabajadores where sueldo =

con
lo que contenga el cuadro de texto sueldo es decir txtSueldo.getText()

Si el cuadro de texto del sueldo contuviera un 1000, entonces la cadena resultante sera:
select * from trabajadores where sueldo = 1000

Es decir, se construye una consulta que busca los sueldos de 1000 euros.

9. Prueba a ejecutar el programa. Escribe un valor 1000 en el cuadro de texto y luego pulsa el botn Igual. El resultado ser que aparecen solo los trabajadores que tengan 1000 de sueldo.

Al pulsar el botn Igual se construye una consulta usando el contenido del cuadro de texto txtSueldo. Al ejecutarse la consulta se muestran los trabajadores de 1000 euros.

10. Programa ahora el botn Mayor que de la siguiente forma (El cdigo es prcticamente igual al anterior, as que puedes usar copiar y pegar. Se indica con una flecha la pequea diferencia)

Como se puede observar, el cdigo es igual. Simplemente cambia el operador en la cadena que se concatena. Ahora se usa un mayor que. Es decir, si el usuario introdujera un 1000 en el cuadro de texto del sueldo, el resultado de la concatenacin en la variable consulta sera la siguiente cadena:
select * from trabajadores where sueldo > 1000

11. Prueba a ejecutar el programa introduciendo el valor 1000 en el sueldo y luego pulsando el botn Mayor que. El resultado ser que aparece en el panel de texto los trabajadores que cobran ms de 1000 euros. 12. Como prctica, programe el botn Menor que de forma que muestre aquellos trabajadores que cobren menos de la cantidad introducida en el cuadro de texto txtSueldo.

13. Vamos a seguir mejorando el programa. Aada ahora el siguiente cuadro de texto y los siguientes botones:

El cuadro de texto se llamar txtNombre mientras que el botn Igual a se llamar btnNombreIgual y el botn Contiene a se llamar btnContiene.

14. Estos botones funcionarn de la siguiente forma: El usuario introducir un nombre en el cuadro de texto txtNombre. Si luego pulsa el botn Igual a, entonces aparecern todos aquellos trabajadores que tengan exactamente dicho nombre. Si en cambio pulsa el botn Contiene a, entonces aparecern todos aquellos trabajadores cuyo nombre contenga la palabra que se haya escrito en el cuadro de texto.

15. Empezaremos programando el botn Igual a. Para ello, escriba el siguiente cdigo dentro del botn (este cdigo es parecido a los anteriores, puede usar copiar y pegar y luego realizar las modificaciones pertinentes)

Observa la modificacin del cdigo. Puedes ver que la consulta SQL se consigue concatenando tres cadenas (se han puesto en color para facilitar la comprensin): Primera cadena: select * from trabajadores where nombre = Segunda cadena: lo que contenga el cuadro de texto: txtNombre.getText() Tercera cadena: Supongamos que el cuadro de texto contiene la palabra Ana, el resultado de la concatenacin sera: select * from trabajadores where nombre = Ana

Es decir, el resultado de la concatenacin sera una consulta SQL que muestra aquellos trabajadores que tengan de nombre Ana. NOTA: Recuerda que cuando se especifica un valor de tipo texto en una consulta SQL, es necesario que est rodeado de comillas simples () Esa es la razn por la que se tienen que concatenar dos

16. Ejecuta el programa y prueba a escribir en el cuadro de texto del nombre Ana. Luego pulsa el botn Igual a

Se escribe Ana en el cuadro de texto y al pulsar el botn Igual a se construye una consulta SQL que muestra a los trabajadores con el nombre Ana.

17. Ahora programaremos el botn Contiene a de forma que el usuario escriba un texto en el cuadro del nombre, y al pulsar el botn Contiene a aparezcan todos aquellos trabajadores cuyo nombre contenga el texto escrito. Por ejemplo, si el usuario introduce el texto an en el cuadro, al pulsar Contiene a aparecern los trabajadores que se llamen: Juan, Antonio, Antonia, Manolo, Ana, etc (todos contienen el texto an)

18. Para ello programe lo siguiente en el actionPerformed del botn Contiene a (es un cdigo muy parecido al anterior, solo tiene que realizar una pequea modificacin)

En este caso, para crear la consulta se concatenan tres cadenas (se indican en color para facilitar la comprensin) Primera cadena: select * from trabajadores where nombre like % Segunda cadena: lo que contenga el cuadro de texto: txtNombre.getText() Tercera cadena: % Supongamos que escribimos en el cuadro de texto del nombre la palabra an, el resultado de la concatenacin sera el siguiente: select * from trabajadores where nombre like %an% La condicin nombre like %an% significa que contenga la palabra an. NOTA: Cuando se estudiaron las consultas SQL, se vio que el operador like funcionaba a travs de asteriscos. Es decir, la forma correcta de indicar la condicin anterior sera la siguiente: nombre like *an* Sin embargo, hay que decir que el asterisco se debe usar solamente cuando estamos manipulando una base de datos de Access desde dentro. En el caso de que queramos acceder a ella desde una aplicacin java se usarn porcentajes % en vez de asteriscos.

19. Ejecuta el programa y prueba a escribir en el cuadro de texto del nombre el texto fra. Luego pulsa el botn Contiene a y comprueba el resultado. Deben aparecer todos aquellos trabajadores cuyo nombre contenga el texto fra. Por ejemplo, Francisco.

Se escribe fra, se pulsa el botn Contiene a, y entonces el programa construye una consulta que muestra los trabajadores cuyo nombre contenga fra.

20. Sigamos mejorando el programa. Aade estos cuadros de texto y estos botones:

txtDia

txtMes

txtAnio

btnAnterior

btnDespues

21. El objetivo de estos elementos aadidos es el siguiente: El usuario introducir una fecha (da, mes y ao) en los cuadros de texto txtDia, txtMes, txtAnio. Luego, si pulsa el botn Anterior, aparecern los trabajadores que hayan entrado en la empresa antes de la fecha indicada. Si pulsa el botn Despus, en cambio, aparecern los trabajadores que hayan entrado en la empresa despus de la fecha indicada.

22. Empezaremos programando el botn Anterior. Accede a su actionPerformed e incluye el siguiente cdigo (es un cdigo similar al anterior, solo tienes que realizar un pequeo cambio):

Presta mucha atencin al cdigo remarcado. En l, se construye una consulta que permite mostrar aquellos trabajadores cuya fecha de entrada en la empresa sea anterior a la indicada en los cuadros de texto. Esto se consigue concatenando varias cadenas (se indican a continuacin en distintos colores para facilitar la comprensin)

Primera cadena: select * from trabajadores where fecha < # Segunda cadena: lo que contiene el cuadro de texto del mes: txtMes.getText() Tercera cadena: / Cuarta cadena: lo que contiene el cuadro de texto del da: txtDia.getText() Quinta cadena: / Sexta cadena: lo que contiene el cuadro de texto del ao: txtAnio.getText() Sptima cadena: # Por ejemplo, supongamos que: en el cuadro txtDia se introdujo un 20. en el cuadro txtMes se introdujo un 12. En el cuadro txtAnio se introdujo un 2005.

Entonces, la cadena resultante de la concatenacin ser:


select * from trabajadores where fecha < #12/20/2006#

Es decir, la cadena resultante es una consulta SQL que busca los trabajadores cuya fecha de entrada en la empresa sea anterior al 20 del 12 del 2006

NOTA: Recuerda que para que Access entienda las fechas al hacer una consulta SQL, es necesario indicarlas en el formato mes/dia/ao. Por otro lado, recuerda que las fechas deben estar rodeadas por almohadillas #

23. Ejecuta el programa y prueba a introducir una fecha en las casillas correspondientes. Luego pulsa el botn Anterior y observa como aparecen los trabajadores que entraron antes de la fecha indicada.

Introduce un da, mes y ao en los cuadros correspondientes. Al pulsar el botn Anterior, el programa mostrar los trabajadores que hayan entrado antes de esa fecha.

24. Como ejercicio se propone que programe el botn Despus. Al pulsar este botn, se mostrarn los trabajadores que hayan entrado antes de la fecha indicada en los cuadros de texto. El cdigo es prcticamente igual al cdigo del botn Anterior.

CONCLUSIN A travs del objeto sentencia podemos ejecutar una consulta SQL en una base de datos. Esta consulta SQL viene expresada como una cadena. Se puede construir una consulta SQL a travs de la concatenacin de varias cadenas. Estas cadenas pueden ser datos introducidos por el usuario en cuadros de textos u otros controles. Al hacer que el usuario pueda participar en la construccin de la consulta aportando sus propios datos, le damos la posibilidad de que l decida la informacin que se quiere extraer de la base de datos. De esta manera se consigue que el programa sea ms potente. A tener en cuenta lo siguiente acerca de las consultas SQL ejecutadas desde una aplicacin java para acceder a una base de datos de Access: - Los valores tipo texto se indicarn entre comillas simples - El operador like se usa con porcentajes (%) en vez de con asteriscos (*) - Las fechas van rodeadas por almohadillas (#) - Las fechas tienen que indicarse con el formato mes/dia/ao

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Recapitulando. Consultas de seleccin. Consultas de Accin. Al estudiar SQL, vimos que existan dos tipos de instrucciones. Consultas de seleccin (SELECT) Estas consultas permiten extraer datos de la base de datos. Dicho de otro modo, permiten visualizar informacin de la base de datos que cumpla un criterio. Estas consultas no afectan a la base de datos, simplemente muestran informacin sobre la propia base de datos. Consultas de accin. (INSERT, DELETE, UPDATE) Estas consultas realizan una accin sobre la base de datos. Esta accin puede ser: o o o Insertar un nuevo registro en una tabla (INSERT) Borrar un registro o registros de una tabla (DELETE) Modificar los datos de un registro o registros de la tabla (UPDATE)

Ejecucin de consultas de seleccin y de consultas de accin. Hasta ahora se han realizado programas java que ejecutaban consultas de seleccin sobre la base de datos. Recuerda que para ejecutar estas consultas se usa el mtodo executeQuery del objeto sentencia y el resultado de la consulta se almacena en un objeto ResultSet:
ResultSet r = sentencia.executeQuery(select . . .);

En esta hoja guiada veremos la ejecucin de consultas de accin sobre la base de datos desde la aplicacin java. Este tipo de consultas se ejecutan usando el mtodo executeUpdate del objeto sentencia, y no devuelven un resultado concreto, ya que simplemente actan sobre la base de datos modificando de alguna manera su contenido. As pues, para realizar un alta en la base de datos se usar: sentencia.executeUpdate(insert . . .); Para realizar una modificacin en la base de datos se usar: sentencia.executeUpdate(update . . . ); Para realizar una eliminacin en la base de datos se usar: sentencia.executeUpdate(delete . . . );

EJERCICIO GUIADO N 1 PLANTEAMIENTO Se quiere realizar una aplicacin de base de datos que manipule los datos de los trabajadores de la base de datos MANEMPSA. Esta aplicacin permitir ver el listado de trabajadores y adems permitir introducir nuevos trabajadores. 1. Entre en NetBeans. Crea un nuevo proyecto llamado GestionTrabajadores. Dentro de este proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un JFrame llamado ventanaprincipal:

2. Aade a la ventana un JTextPane y un botn de momento:

El botn se llamar btnTrabajadores y el JTextPane se llamar panelTexto.

3. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que prepararlo haciendo lo siguiente: Crear la subcarpeta Base y copiar en ella el fichero de base de datos MANEMPSA.MDB que tiene en la carpeta Mis Documentos. Aadir al programa los objetos conexin (Connection) y sentencia (Statement) como globales. Crear el procedimiento PrepararBaseDatos y llamarlo desde el constructor. Cerrar la conexin desde el evento windowClosing

Realice estos cuatro pasos que se han indicado antes de continuar. 4. Ya se puede programar el botn btnTrabajadores. Se pretende que al pulsar este botn aparezca en el panel panelTexto el contenido de la tabla trabajadores. Para ello, en el actionPerformed del botn btnTrabajadores programe lo siguiente:

5. Como puede ver, es una llamada a un mtodo al que se le ha dado el nombre MostrarTodos. Este mtodo se encargar de mostrar todos los trabajadores en el panelTexto. Programe el mtodo MostrarTodos de la siguiente forma:

El cdigo de este mtodo no debe resultarle ya desconocido. Bsicamente lo que hace es ejecutar una consulta SQL que recoge todos los datos de la tabla trabajadores y luego muestra dichos datos en el panel de la ventana. Se muestra el listado procurando que las fechas aparezcan con el formato dia-mes-ao, que los sueldos aparezcan con la coma decimal y que si el campo matrcula fuera nulo o la cadena vaca , entonces aparezca el texto sin coche. La razn por la que se ha programado este cdigo en un mtodo aparte llamado MostrarTodos en vez de hacerlo directamente en el actionPerformed del botn se entender ms adelante, cuando avancemos en el ejercicio guiado.

6. Ejecute el programa y pruebe el botn btnTrabajadores. Compruebe que realiza su cometido.

7. Ahora que ya tenemos un programa capaz de visualizar a los trabajadores, aada los siguientes elementos a la ventana principal:

Panel: panelAlta Cuadros de Texto: txtDNI txtNombre txtApellidos txtSueldo

txtDia txtMes txtAnio txtMatricula Botn: btnAlta

8. El objetivo de estos elementos es el siguiente: El usuario introducir los datos de un nuevo trabajador en las casillas indicadas. Luego, al pulsar el botn de Alta, se introducir en la tabla trabajadores los datos del nuevo trabajador y aparecer en el panel la lista actualizada de trabajadores incluyendo al nuevo que se ha aadido. Para ello tendrs que programar en el botn Alta lo siguiente:

Analicemos este cdigo detenidamente. Lo primero que hay que tener en cuenta es que se realiza una concatenacin de cadenas dentro de la variable consulta. Observa el uso de += para concatenar. Ten en cuenta que es lo mismo poner esto:
consulta += +txtDNI.getText()+,;

que poner esto:


consulta = consulta + +txtDNI.getText()+,;

Solo que el uso de += acorta las instrucciones. Si se analiza la concatenacin de las cadenas, se observar que el resultado es una instruccin SQL del tipo INSERT INTO. Es decir, una instruccin SQL que permite la insercin de un nuevo registro en la tabla trabajadores. Por ejemplo, supongamos que introducimos los siguientes valores en los cuadros de texto:
txtDNI txtNombre txtApellidos txtSueldo txtDia txtMes txtAnio txtMatricula 11.111.111-A Mara Ruiz 1100 10 4 2001 4433RET

La concatenacin en la variable consulta resultara lo siguiente (en azul los valores de los cuadros de texto, en rosa las cadenas que se concatenan):
insert into trabajadores values (11.111.111-A,Mara,Ruiz,1100,#4/10/2001#,4433RET)

Es decir, se sigue la misma estrategia que en la hoja anterior. Se concatenan trozos de cadenas y datos introducidos por el usuario hasta conseguir una cadena con forma de instruccin SQL. En este ejemplo, la instruccin SQL construida por concatenacin es una instruccin INSERT INTO que permite introducir en la tabla trabajadores los datos de un nuevo trabajador. El objeto que se encarga de ejecutar dentro de la base de datos la instruccin SQL recin construida es el objeto sentencia: sentencia.executeUpdate(consulta); Como se puede observar, para ejecutar instrucciones SQL de accin ya no se usa el mtodo executeQuery, sino que se usa el mtodo executeUpdate. Una vez ejecutada la introduccin del nuevo registro en la base de datos, se llama al procedimiento MostrarTodos el cual se encarga de mostrar todo el contenido de la tabla trabajadores en el panel de texto. Gracias a este mtodo, veremos como se rellena el panel y observaremos al nuevo registro recin introducido. La razn de que se programara aparte el mtodo MostrarTodos para mostrar el listado completo de trabajadores ha sido debido a la intencin de llamar a este mtodo desde otros lugares del programa. Es decir, la intencin ha sido centralizar cdigo y evitar su repeticin. Hay que tener en cuenta que todo este cdigo est rodeado de un try ... catch para evitar cualquier error inesperado. Ten en cuenta que pueden producirse errores fcilmente si introducimos valores incorrectos en los cuadros de texto.

9. Finalmente ejecute el programa y compruebe su funcionamiento aadiendo varios trabajadores a la tabla:

Introduce datos y pulsa el botn Alta.

En la parte superior aparecer el listado completo incluyendo al nuevo trabajador introducido.

CONCLUSIN Se pueden ejecutar instrucciones SQL del tipo INSERT INTO (insertar registros) usando el objeto sentencia. Para este tipo de instrucciones hay que usar el mtodo executeUpdate. Normalmente, ser necesario construir una cadena de consulta a travs de la concatenacin de subcadenas y datos introducidos por el usuario en cuadros de texto. Este tipo de instrucciones SQL no devuelven ningn ResultSet, ya que no extraen datos de las tablas, sino que modifican el contenido de stas.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Consultas de Accin. Bajas. En la hoja guiada anterior se vio como se podan ejecutar consultas SQL de accin del tipo INSERT INTO (para insertar registros en las tablas de la base de datos) En esta hoja guiada se practicar con otras consultas SQL de accin. Concretamente con las del tipo DELETE (usadas para eliminar registros de las tablas de la base de datos) Al igual que ocurre con las consultas INSERT INTO, las consultas DELETE haya que ejecutarlas usando el mtodo executeUpdate del objeto sentencia. sentencia.executeUpdate(delete . . . ); Al ejecutar estas consultas se cambiar el contenido de las tablas de la base de datos y no se devolver ningn ResultSet.

EJERCICIO GUIADO N 1 PLANTEAMIENTO Se mejorar el proyecto realizado en la hoja anterior de forma que no solo admita la insercin de nuevos trabajadores en la tabla trabajadores de la base de datos MANEMPSA, sino que tambin permite eliminar a trabajadores de la tabla.

1. Entre en NetBeans. Abre el proyecto llamado GestionTrabajadores que se program en la hoja anterior. 2. Aade en la parte inferior de la ventana un nuevo panel:

Panel: panelBajas Cuadro de texto: txtDNIEliminar Botn: btnEliminar

3. La mejora que se pretende hacer es la siguiente: El usuario introducir en el cuadro de texto txtDNIEliminar el DNI del trabajador que quiere eliminar. Al pulsar el botn Eliminar el trabajador con dicho DNI se eliminar de la tabla. Antes de eliminar al trabajador, se le pedir al usuario una confirmacin, para evitar un borrado accidental. Si el DNI introducido no se correspondiera con ningn trabajador de la tabla, entonces se mostrar un mensaje indicndolo.

4. Para hacer esto, entre en el actionPerformed del botn Eliminar y programe lo siguiente:

Se va a analizar este cdigo. Estdielo con detenimiento: Lo primero interesante que encontrar es la construccin de una consulta de seleccin (SELECT) usando la tpica concatenacin de cadenas:
consulta="select * from trabajadores where DNI='"+txtDNIEliminar.getText()+"'"; ResultSet r=sentencia.executeQuery(consulta);

Esto se hace para extraer aquellos trabajadores que tengan el DNI introducido en el cuadro de texto txtDNIEliminar. La idea es saber si existe en la tabla algn trabajador con dicho DNI. Al ejecutar esta consulta, el ResultSet r se llenar con trabajadores que tengan ese DNI. Observe el cdigo que viene a continuacin: if (!r.first()) { Este if significa: si no puedo colocarme en el primer elemento del ResultSet r.

Si no es posible colocarse en el primer elemento del resultado de la consulta ser porque no hay un primer elemento, o dicho de otra forma, porque el ResultSet est vaco, o dicho de otra forma ms, porque no se encontr a nadie que tuviera el DNI indicado. Si esto fuera as, no existe un trabajador con dicho DNI y por tanto no puede ser borrado. As pues se muestra un mensaje con un JOptionPane indicando dicha circunstancia. En caso contrario, existe ese trabajador y por tanto podemos borrarlo. Observa el contenido del else:
resp=JOptionPane.showConfirmDialog(null,"Confirma el borrado?", "Borrar",JOptionPane.YES_NO_OPTION); if (resp==JOptionPane.YES_OPTION) {

Este trozo de cdigo le pregunta al usuario si quiere borrar realmente al trabajador. Si la respuesta es s (YES_OPTION) se efectuar el borrado tal como se indica a continuacin:
consulta="delete from trabajadores where DNI='"+txtDNIEliminar.getText()+"'"; sentencia.executeUpdate(consulta); //se ejecuta la eliminacion MostrarTodos(); //y se muestra la tabla de nuevo

Como puede observar, se construye a travs de una concatenacin, una consulta de accin SQL del tipo DELETE, que nos permitir borrar el trabajador con el DNI introducido. Luego se ejecuta dicha instruccin usando el mtodo executeUpdate del objeto sentencia (recuerde que usar siempre executeUpdate para ejecutar consultas de accin: altas, eliminacin y modificacin) Finalmente se llama de nuevo al mtodo que creamos en la hoja anterior que muestra todo el contenido de la tabla trabajadores, y de esta forma podremos comprobar el borrado del trabajador. En caso de que el usuario no haya confirmado el borrado, el cdigo muestra un mensaje Borrado cancelado por el usuario. Por otro lado, todo este cdigo es susceptible de sufrir errores inesperados, por lo que est rodeado por un try ... catch.

5. Ejecute el programa y pruebe a eliminar trabajadores de la tabla. Se recomienda que pruebe a introducir DNIs inexistentes, para ver que ocurre. Pruebe tambin la confirmacin del borrado: responda a veces que s y otras veces que no.

Introduzca el DNI del trabajador que quiere borrar y luego pulse Eliminar. Al hacerlo el listado se actualizar y ya no mostrar el trabajador con dicho DNI ya que habr sido borrado. Si el DNI no existiera el borrado no se producira y mostrara un mensaje de error.

CONCLUSIN Se pueden ejecutar instrucciones SQL del tipo DELETE (borrar registros) usando el objeto sentencia. Para este tipo de instrucciones hay que usar el mtodo executeUpdate. Normalmente, ser necesario construir una cadena de consulta DELETE a travs de la concatenacin de subcadenas y datos introducidos por el usuario en cuadros de texto. Este tipo de instrucciones SQL no devuelven ningn ResultSet, ya que no extraen datos de las tablas, sino que modifican el contenido de stas. Para realizar borrados ser necesario habitualmente el comprobar que los registros a borrar existen en la tabla. Esto se har ejecutando una consulta SELECT y comprobando si el ResultSet resultante contiene algn registro, usando el mtodo first. Tambin se recomienda pedir confirmacin al usuario antes de realizar borrados en las tablas.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Consultas de Accin. Modificaciones. Las consultas SQL de accin son: INSERT INTO (permiten introducir nuevos registros en las tablas) DELETE (permiten eliminar registros de las tablas) UPDATE (permiten modificar los registros de las tablas)

Estas consultas SQL se ejecutan desde el programa a travs del mtodo executeUpdate propio del objeto sentencia. Estas instrucciones SQL afectan al contenido de la base de datos y no devuelven ningn resultado. Es decir, no extraen datos, y por tanto no devuelven un ResultSet. En las hojas anteriores se ha visto como ejecutar consultas INSERT INTO y DELETE. En esta hoja guiada veremos como ejecutar consultas de accin de modificacin: UPDATE.

EJERCICIO GUIADO N 1 PLANTEAMIENTO Se mejorar el proyecto realizado en la hoja anterior de forma que no solo permita aadir y borrar trabajadores de la tabla trabajadores de la base de datos MANEMPSA, sino que tambin permita realizar modificaciones en los datos de los trabajadores de dicha tabla.

1. Entre en NetBeans. Abre el proyecto llamado GestionTrabajadores que se program en la hoja anterior. 2. Modifique la ventana principal aadiendo un nuevo panel con los siguientes componentes:
Nuevo panel

El panel se llamar panelModificar El botn es btnBuscar Los cuadros de texto se llaman respectivamente: txtModDNI txtModNombre txtModApellidos txtModSueldo txtModDia txtModMes txtModAnio txtModMatricula El botn es btnModificar

3. La mejora que se pretende hacer es la siguiente: El usuario introducir en el cuadro de texto txtModDNI el DNI del trabajador cuyos datos se quieren modificar. Al pulsar el botn Buscar, el resto de cuadros de texto se rellenarn con los datos del trabajador al que pertenece dicho DNI. (Si dicho DNI no existiera, se mostrara un mensaje de error) Cuando aparezcan los datos del trabajador en los cuadros de texto, el usuario podr realizar las modificaciones pertinentes. Al pulsarse el botn Efectuar Modificacin se modificarn los datos en la tabla.

4. Primero programaremos el botn de bsqueda. Entre en el actionPerformed de este botn y programe lo siguiente:

Estudiemos atentamente el cdigo anterior:

Lo primero que hace el cdigo es construir una consulta de seleccin que busque a todos los trabajadores que tengan el DNI introducido en el cuadro de texto txtModDNI. Ejecuta la consulta y almacena el resultado en un tpico ResultSet. Luego comprueba a travs del siguiente if si no existe un trabajador con dicho DNI en el ResultSet:
if (!r.first()) {

En ese caso muestra un mensaje de error indicando que no se ha encontrado dicho trabajador. En caso contrario muestra los datos del trabajador encontrado en los cuadros de texto. Para ello, se extrae del ResultSet cada campo y se coloca en el cuadro de texto correspondiente. Por ejemplo:
txtModNombre.setText(r.getText(nombre));

Recoge el valor del campo nombre, y lo sita en el cuadro de texto txtModNombre. En el caso de la fecha de entrada del trabajador, se extrae la fecha y luego se extrae de la cadena el da, el mes y el ao, situando cada dato en su cuadro de texto correspondiente.
cadefe = r.getString("fecha"); caddia=cadefe.substring(8,10); cadmes=cadefe.substring(5,7); cadanio=cadefe.substring(0,4); txtModDia.setText(caddia); txtModMes.setText(cadmes); txtModAnio.setText(cadanio);

Recuerda que cuando se extrae una fecha de un ResultSet, su formato es: ao-mes-dia-hora:minutos Por ejemplo: 2001-12-23-00:00 As pues, si el DNI introducido pertenece a uno de los trabajadores de la tabla, sus datos aparecern en los cuadros de texto cuando se pulse el botn Buscar.

5. Ejecuta el programa y comprueba su funcionamiento. Escribe un DNI en el cuadro del DNI de bsqueda y pulsa Buscar.

Se introduce un DNI y luego se pulsa Buscar. Si existe un trabajador con ese DNI, sus datos aparecern en los cuadros de texto.

6. Se supone que cuando aparezcan los datos del trabajador en los cuadros de texto el usuario los modificar segn le interese. Luego, al pulsar el botn Efectuar Modificacin los nuevos datos sern actualizados en la tabla.

7. Para hacer esto, entre en el actionPerformed del botn Efectuar Modificacin y programe lo siguiente:

Se va a analizar este cdigo. Estdielo con detenimiento: Debe observar que lo primero que se hace en este cdigo es crear una consulta de actualizacin (UPDATE) a travs de una concatenacin de cadenas. Si observa la concatenacin, ver que el resultado es una instruccin SQL de tipo UPDATE en la que los datos que se actualizan son precisamente los datos introducidos en los cuadros de texto del panel de modificacin. Por ejemplo, si estos fueran los valores de los cuadros de texto del panel de modificacin: txtModDNI 11.111.111-A txtModNombre Juan txtModApellidos Perez txtModSueldo 1100 txtModDia 4 txtModMes 12 txtModAnio 2001 txtModMatricula 1234-ABC La instruccin ya construida por concatenacin sera la siguiente:
update trabajadores set nombre=Juan,apellidos=Perez,sueldo=1100,fecha=#12/4/2001#, matricula=1234-ABC where dni=11.111.111-A

Esta instruccin SQL de tipo UPDATE incluye una clusula WHERE con una condicin de forma que solo se modifica aquel trabajador que tenga el DNI introducido en el cuadro de texto txtModDNI. Una vez construida la consulta UPDATE, esta se ejecuta usando el objeto sentencia y luego se muestra el contenido de la tabla trabajadores en el panel a travs de una llamada al mtodo MostrarTodos. Todo este cdigo est rodeado de un try...catch para evitar errores inesperados.

8. Comprueba el funcionamiento del programa ejecutndolo. Debes introducir un DNI y pulsar el botn Buscar para que se rellenen los cuadros de texto con los datos del trabajador. Luego cambia algn dato de los que han aparecido en los cuadros de texto y pulsa el botn Efectuar Modificacin. Si observas el panel de texto deber aparecer la lista completa de trabajadores y en ella podrs observar la modificacin que se ha realizado en el trabajador correspondiente.

Se introduce un DNI y se le da a Buscar. Los cuadros de texto se rellenan con los datos del trabajador. Se realiza la modificacin que se quiera en los cuadros de texto. Finalmente se pulsa Efectuar Modificacin para que se realice la modificacin. En el panel aparecer la lista actualizada de los trabajadores.

CONCLUSIN Se pueden ejecutar instrucciones SQL del tipo UPDATE (modificar registros) usando el objeto sentencia. Para este tipo de instrucciones hay que usar el mtodo executeUpdate. Normalmente, ser necesario construir una cadena de consulta UPDATE a travs de la concatenacin de subcadenas y datos introducidos por el usuario en cuadros de texto. Este tipo de instrucciones SQL no devuelven ningn ResultSet, ya que no extraen datos de las tablas, sino que modifican el contenido de stas. Es una buena idea dar alguna opcin de bsqueda que permita encontrar al registro a modificar y que sus datos aparezcan en varios cuadros de texto, de forma que el usuario tenga ms facilidad a la hora de realizar los datos.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Tablas (JTable) Como se ha estudiado en las hojas guiadas anteriores, se pueden extraer datos de la base de datos a travs de consultas SQL de tipo SELECT. Los datos extrados se almacenan en objetos de tipo ResultSet. Luego, solo hay que analizar el contenido del objeto ResultSet para extraer los datos que contiene y trabajar con ellos. En las hojas anteriores hemos extrado los datos del ResultSet y los hemos presentado en un JOptionPane o en un JTextPane. Sin embargo, una mejor opcin para presentar el contenido de un ResultSet es usar objetos del tipo JTable, ya que estos objetos tienen forma de tabla. En esta hoja guiada se estudiarn los objetos JTable (sin tener en cuenta a las bases de datos) Una vez que entendamos el funcionamiento de los objetos JTable, los usaremos en posteriores hojas guiadas para presentar dentro de ellos el contenido de consultas SQL.

EJERCICIO GUIADO N 1

1. Crear un nuevo proyecto en NetBeans. En la ventana principal de dicho proyecto agregue un objeto JTable:

El nombre del objeto JTable ser simplemente tabla. Debes tener en cuenta que los objetos JTable se aaden siempre dentro de un panel de desplazamiento JScrollPane:

2. El objeto tabla que se acaba de introducir tiene por defecto cuatro columnas con los nombres Ttulo 1, Ttulo 2, Ttulo 3 y Ttulo 4, y contiene cuatro filas vacas. Puede ejecutar el programa para ver el funcionamiento del objeto tabla. Pruebe a introducir algn dato en las celdas de la tabla...

Haz doble clic para introducir datos en las celdas...

3. Aprenderemos ahora a configurar determinados aspectos de la tabla que vamos a usar. Para ello aada al constructor una llamada a un mtodo PrepararTabla que programaremos a continuacin.

4. Programa ahora el mtodo PrepararTabla de la siguiente forma:

La primera lnea del cdigo define un array de String con los ttulos de la tabla, es decir, con las columnas de la tabla. A continuacin, se construye un objeto del tipo DefaultTableModel, o dicho de otra manera, un modelo de tabla. El objeto m est declarado como variable global. MODELOS (recordatorio) Hay que recordar que existen objetos en java que contienen un objeto modelo, encargado de contener los datos del objeto. Un ejemplo de ello son las listas y los combos (cuadros desplegables) Para definir los datos contenidos en el objeto, primero haba que definir el modelo y luego asignar el modelo al objeto. El caso de las tablas es igual. Para introducir datos en la tabla primero hay que configurar su objeto modelo (que ser de la clase DefaultTableModel) y luego asignrselo a la tabla. En el cdigo, se define como global un objeto llamado m, de tipo DefaultTablaModel. Luego, al construir el objeto se deben indicar dos parmetros: null y el vector de ttulos de columnas: DefaultTableModel m = new DefaultTableModel(null,titulos); El valor null hace que la tabla aparezca vaca en un principio, mientras que el vector ttulos define las columnas que tendr la tabla. Una vez construido de esta forma el objeto modelo m, este se asigna al objeto tabla: tabla.setModel(m); La razn por la que se ha declarado el objeto modelo m como global es que ser usado en otros mtodos del programa.

5. Ejecuta el programa y observa el resultado:

Como puedes observar, se ha creado una tabla vaca con cinco columnas correspondientes al vector de ttulos. 6. Vamos a aadir un botn a la ventana con el texto Nueva Fila, al cual llamaremos btnNueva:

7. Dentro del botn btnNueva programa lo siguiente

Este cdigo aadir una nueva fila en blanco a la tabla. Estudiemos cada lnea: La primera lnea recoge el modelo de la tabla a travs del mtodo getModel. El modelo es recogido en la variable global m que creamos anteriormente. Observa como es necesario realizar un cast (en rojo) a la hora de asignar el modelo a la variable m: m = (DefaultTableModel) tabla.getModel(); El resultado de esta instruccin es que volvemos a tener disponible el modelo de la tabla en la variable m, y por tanto, podemos manipular los datos contenidos en la tabla a travs de esta variable. Por ejemplo, se usar el modelo m para aadir una fila en blanco en la tabla. Para ello, basta con crear un vector de cadenas de 5 elementos (ya que hay cinco columnas): String filavacia[]=new String[5]; Y luego, a travs del mtodo addRow (aadir fila), aadir una fila correspondiente a los valores del vector: m.addRow(filavacia); Debido a que el vector est vaco, la fila que se aade est vaca tambin. Si el vector contuviera algn dato, estos datos apareceran en la fila que se aade (esto se ver a continuacin)

7. Ejecuta el programa y pulsa varias veces el botn Nueva Fila. Observars como se van aadiendo filas vacas a la tabla.

Pulsa el botn y se aadirn filas en blanco...

8. Para entender bien el funcionamiento de la insercin de filas en la tabla, aada otro botn llamado btnNuevoElemento con el texto Nuevo Elemento:

9. En este botn programe lo siguiente:

Puedes observar que el cdigo es parecido al anterior, solo que en este caso se aade una fila correspondiente a un vector relleno de datos. Esto quiere decir que cuando se aada esta fila al modelo aparecer con los datos del vector.

10. Ejecuta el programa y comprueba su funcionamiento, observars que al pulsar el nuevo botn aparecen filas rellenas.

Cuando se pulsa el botn Nuevo Elemento aparecen filas ya rellenas.

11. Sigamos experimentando con la tabla. Ahora aadiremos un botn btnEliminar con el texto Eliminar Fila:

12. Este botn eliminar la fila que est seleccionada en ese momento. Para ello programe en este botn el siguiente cdigo:

Estudiemos este cdigo. En primer lugar usamos un mtodo que poseen los objetos JTable llamado getSelectedRow que nos dice el nmero de la fila que est seleccionada en este momento. Si no hubiera ninguna fila seleccionada, el mtodo getSelectedRow devuelve el valor 1. Esto lo usamos en el if que viene a continuacin para mostrar un mensaje de error diciendo que es necesario seleccionar la fila que se va a borrar. En el caso de que haya alguna fila seleccionada (es decir, que no se haya devuelto el valor 1) entonces efectuamos el borrado. Para borrar recogemos el modelo de la tabla y usamos un mtodo llamado removeRow para borrar la fila seleccionada (la cual se pasa como parmetro)

13. Ejecuta el programa y aade varias filas. Luego prueba a seleccionar alguna y pulsar el botn Eliminar. Observa tambin lo que sucede cuando intentas eliminar una fila cuando no hay ninguna seleccionada.

Al pulsar eliminar fila se eliminar la fila que est seleccionada de la tabla. Si no hubiera ninguna fila seleccionada aparecera un mensaje de error.

14. Sigamos aprendiendo nuevas cualidades de las tablas. Aada lo siguiente a su ventana:

txtFila txtColumna

btnVerValor

etiValor

15. Lo que se pretende es lo siguiente: El usuario introducir un valor en la fila y la columna, por ejemplo: Fila 3, columna 4, y al pulsarse el botn Ver Valor aparecer en la etiqueta Valor el contenido de la casilla situada en la posicin 3, 4 (fila 3 columna 4) As pues programe lo siguiente en el botn Ver Valor:

Estudiemos el cdigo. Primero, se recogen los valores introducidos en los cuadros de texto de la fila y columna y se convierten a enteros:
fila = Integer.parseInt(txtFila.getText()); col = Integer.parseInt(txtColumna.getText());

Luego, se extrae el modelo de la tabla y se usa un mtodo llamado getValueAt. Este mtodo permite extraer el valor de una casilla de la tabla, indicando la fila y columna de esa celda. El resultado lo hemos almacenado en una variable valor de tipo cadena. Es necesario realizar un cast (en rojo):

valor = (String) m.getValueAt(fila,col); Finalmente, una vez extrado el valor de la celda de la posicin fila, col este se coloca en la etiqueta etiValor. Este cdigo es susceptible de dar error, por ejemplo si el usuario introduce unos valores de fila y columna incorrectos. Por eso ha sido incluido dentro de un try...catch.

16. Ejecuta el programa y aade varias filas. Introduce algunos valores en las filas. Luego prueba a introducir un valor de fila y columna y pulsa el botn Ver Valor:

Se introdujo la posicin: 2, 1. Por tanto se quiere ver el valor de la casilla 2,1 (tanto las filas como las columnas empiezan en 0)

17. Sigamos experimentando. Aade lo siguiente a la ventana:

btnIntroducir

txtNuevoValor

18. Se pretende lo siguiente. El usuario introducir un valor de fila y de columna en los cuadros de texto correspondientes. Luego, el usuario introducir un valor en el cuadro de texto txtNuevoValor. Finalmente pulsar el botn btnIntroducir. El resultado ser que se introduce el valor escrito en la posicin de la tabla indicada por la fila y columna introducida. Para hacer esto, programe lo siguiente dentro del botn btnIntroducir:

Estudiemos el cdigo detenidamente. Lo primero que se hace es extraer de los cuadros de texto la fila, columna y el valor. La fila y columna son convertidas a enteros.
fila = Integer.parseInt(txtFila.getText()); col = Integer.parseInt(txtColumna.getText()); valor = txtNuevoValor.getText();

Luego se extrae (como siempre) el modelo de la tabla y se usa un mtodo suyo llamado setValueAt que permite introducir un valor en una celda de la tabla. Concretamente, se introduce el valor escrito por el usuario en la celda con fila y columna indicadas:
m=(DefaultTableModel) tabla.getModel(); m.setValueAt(valor,fila,col);

Este cdigo es susceptible de tener errores de ejecucin (por ejemplo que el usuario introduzca un valor equivocado en la fila y columna) por eso est rodeado de un try...catch.

19. Ejecuta el programa. Aade varias filas en blanco. Luego introduce un valor para la fila y la columna y escribe un valor que quieras introducir. Al pulsar el botn Introducir dicho valor aparecer en la celda correspondiente:

Introduce una fila y columna. Luego introduce un dato. Y al pulsar el botn Introducir el resultado es que el dato se introduce en la celda indicada por la fila y columna. Recuerda que las filas y columnas empiezan a numerarse por 0 en un JTable.

CONCLUSIN Existe una clase llamada JTable que permite crear objetos con forma de tabla. Estos objetos son ideales para mostrar el contenido de las tablas de una base de datos, aunque pueden ser usados de forma independiente tambin para mostrar cualquier tipo de datos. Los objetos JTable contienen un modelo de datos de tipo DefaultTableModel. Cada vez que se quiera trabajar con una tabla ser necesario construir su modelo y asignrselo a la tabla. Cada vez que se quiera modificar de alguna forma los datos de una tabla, ser necesario acceder a su modelo y trabajar con l. A travs del modelo de una tabla podemos aadir nuevas filas a la tabla, eliminar filas, extraer datos de las celdas de la tabla o aadir datos a las celdas de la tabla.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Representacin de Tablas en un JTable En la hoja guiada anterior vimos que existe un tipo de objeto llamado JTable que nos permite introducir tablas en nuestras aplicaciones. Estos objetos son ideales para mostrar el contenido de una tabla de la base de datos o del resultado de una consulta. Recuerda que para extraer datos de la base de datos realizamos una consulta SQL de tipo SELECT cuyo resultado se almacena en un objeto ResultSet. Un ResultSet bsicamente es una tabla almacenada en memoria (y por tanto no visible) Sin embargo, en esta hoja guiada veremos como trasladar el contenido de un ResultSet a un JTable para que el usuario pueda visualizar los datos de forma cmoda. El proceso ser bsicamente el siguiente:

Base de Datos

ResultSet

JTable

EJERCICIO GUIADO N 1

1. Crear un proyecto java y prepararlo para que pueda acceder a la base de datos MANEMPSA.MDB: a. Crear una subcarpeta Base y copiar dentro de ella el fichero de base de datos MANEMPSA.MDB b. Declarar los dos objetos globales: conexin y sentencia. c. Programar el mtodo PrepararBaseDatos de forma que el programa acceda a la base de datos y se construyan los objetos conexin y sentencia. d. Programar el evento windowClosing de la ventana principal de forma que se cierre la conexin.

2. Una vez hecho esto, aade a la ventana principal un objeto JTable y llmalo simplemente tabla. 3. Aade en la parte inferior un botn llamado btnTrabajadores. La ventana principal quedar as:

4. Agregaremos al proyecto un objeto modelo de tabla (DefaultTableModel) llamado m que sea global. Tambin aadiremos en el constructor una llamada a un mtodo PrepararTabla y programaremos dicho mtodo de la siguiente forma:

Si observas el cdigo, vers que en el mtodo PrepararTabla se crea un vector de cadenas con cuatro elementos pero que no contiene nada. Luego se crea el modelo de tabla a partir de este vector vaco. Y se asigna finalmente a la tabla. El resultado de esto es que la tabla aparecer vaca y sin ttulos (En realidad, como ttulos aparecen letras: A, B, C, etc)

5. Ejecuta el programa para ver su aspecto de momento.

Debido a que hemos asignado un vector de ttulos sin contenido, las columnas tienen como ttulo letras.

6. Bien, ahora programaremos el botn btnTrabajadores de forma que al pulsarlo se muestre el contenido de la tabla Trabajadores. Programe lo siguiente:

Estudiemos el cdigo detenidamente. Lo primero que se hace es extraer el contenido de la tabla Trabajadores de la base de datos, ejecutando una consulta SQL usando el objeto sentencia. El resultado de dicha consulta se almacenar en un objeto ResultSet llamado r.
ResultSet r = sentencia.executeQuery("select * from trabajadores");

A continuacin, se extraer informacin del ResultSet y se introducir en la tabla. Lo primero que se hace es crear el modelo de la tabla definiendo la cabecera. Observa el cdigo.
String titulos[] = {"DNI","Nombre","Apellidos","Sueldo","Fecha","Matrcula"}; m=new DefaultTableModel(null,titulos); tabla.setModel(m);

Como ves, lo que hacemos es definir un vector de cadenas con los ttulos correspondientes a los campos de la tabla, y luego usamos este vector para crear el modelo de la tabla. Finalmente asignamos el modelo creado a la tabla.

7. Ejecute el programa de momento. Observe como al pulsar el botn Trabajadores la cabecera de la tabla pasa a contener los campos indicados en el vector ttulos.

8. Ahora ya solo nos queda recoger todo el contenido del ResultSet y mostrarlo en la tabla. Para ello, modifique el cdigo del actionPerformed del botn Trabajadores para que quede como sigue:

Si estudiamos el cdigo, veremos que se extrae la tabla trabajadores entera introducindola en un ResultSet llamado r, a travs de una instruccin SELECT de SQL. Luego construimos un modelo de tabla (DefaultTableModel) llamado m usando un vector de ttulos, que se corresponde a los campos de la tabla trabajadores. Una vez hecho esto, creamos un vector de seis elementos, correspondiente a los seis datos que contiene cada fila, y empezamos a recorrer el ResultSet usando el tpico: while (r.next()) { En cada vuelta del bucle tomamos los valores de la fila del ResultSet y los almacenamos en el vector (en la posicin correspondiente) Luego se aade el vector que se ha construido al modelo de la tabla. As pues, en cada vuelta se aadir un registro ms al modelo m. Estos registros son extrados del ResultSet. Cuando el bucle ha terminado, el modelo de la tabla contiene exactamente lo mismo que el ResultSet. Es decir, contiene la tabla trabajadores, ya que este fue el resultado de la consulta SQL ejecutada. Ya solo tenemos que asignar el modelo de la tabla al JTable correspondiente, es decir, a la tabla, con lo que esta visualizar los datos del modelo. Todo este proceso se rodea con un try...catch para evitar errores inesperados.

9. Para entender el cdigo anterior aqu tienes un pequeo grfico explicativo: Base de Datos ResultSet Vector Modelo de Tabla JTable

De la base de datos extraemos datos a un ResultSet. (Esto se hace ejecutando una consulta SQL de tipo SELECT a travs del objeto sentencia) Del ResultSet extraemos los datos a un modelo de tabla. (Esto se hace recorriendo el ResultSet y almacenando cada registro en un vector) Almacenamiento del vector en el modelo de tabla. (Cada vector extraido del ResultSet se inserta como fila en el modelo de tabla) Se asigna el modelo de tabla al objeto JTable. (Al hacer esto el objeto JTable muestra el contenido del modelo)

10. Ejecute el programa y observe el resultado al pulsar el botn Trabajadores. Como ve, el objeto tabla muestra entonces el contenido de la tabla Trabajadores.

11. Si observa la tabla ver que la fecha aparece en el formato estndar de almacenamiento: Ao-mes-dia hora:min:seg Y que los sueldos aparecen con punto decimal. Mejore estos detalles haciendo los siguientes cambios en el botn Trabajadores:

Como se puede observar, antes de almacenar los sueldos en el modelo de la tabla se reemplazan el punto decimal por una coma. Y en el caso de la fecha, se extrae de la cadena el ao, mes y da y se concatenan en un formato ms habitual: dia/mes/ao. 12. Ejecuta ahora el programa y observa como se muestran las fechas y los sueldos:

CONCLUSIN El proceso a seguir para mostrar una tabla de una base de datos en un JTable es el siguiente: Realizar una consulta SELECT para extraer los datos de la tabla de la base de datos. El resultado se almacenar en un ResultSet. Recorrer el ResultSet almacenando cada una de sus filas en un vector y luego traspasando este vector a un modelo de tabla. Una vez que el modelo de tabla est relleno, asignar el modelo a un JTable.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Gestin de una tabla En la hoja guiada anterior se vio como mostrar el contenido de una tabla de la base de datos en un JTable de la aplicacin java. Se puede aprovechar esta idea de forma que todas las operaciones que realicemos sobre una tabla se vean inmediatamente reflejadas en el JTable de la aplicacin java. Por ejemplo, si eliminamos un registro sera interesante que automticamente viramos la tabla actualizada en el JTable. En esta hoja guiada se mejorar la aplicacin de la hoja guiada anterior, dotndola de opciones para la gestin de la tabla Trabajadores.

EJERCICIO GUIADO N 1

1. Abrir la aplicacin de la hoja guiada anterior. 2. El primer objetivo ser hacer que al ejecutar el programa aparezca automticamente el contenido de la tabla Trabajadores en el JTable. Para ello, realice los siguientes cambios en el cdigo del programa:

Aade una llamada a un mtodo MostrarTrabajadores, en el constructor del programa.

3. Crea el mtodo MostrarTrabajadores:

4. Copia en l el cdigo del actionPerformed del botn btnTrabajadores:

5. Lo que produce esta modificacin del cdigo es que al ejecutarse el programa se ejecute el mtodo MostrarTrabajadores con lo que se ejecutar el cdigo que hicimos en la hoja anterior para mostrar los datos de la tabla trabajadores en el JTable. Ejecuta el programa y comprueba el resultado.

6. Puesto que la tabla trabajadores se muestra al empezar el programa, la existencia del botn Trabajadores no tiene sentido, as pues elimina el botn Trabajadores de la ventana.

7. Aade ahora en la parte inferior un panel llamado panelAcciones y un botn Eliminar Trabajador llamado btnEliminar:

8. Se pretende que el usuario seleccione uno de los trabajadores de la tabla y al pulsar el botn Eliminar dicho trabajador se elimine de la base de datos. Esta eliminacin por supuesto se ver reflejada en el JTable. Para ello, programe en el botn Eliminar lo siguiente:

Estudiemos con detenimiento el cdigo programado. Lo primero que se hace es recoger la fila seleccionada de la tabla usando el mtodo getSelectedRow. Si el valor devuelto es 1 entonces es que no hay ninguna fila seleccionada. El programa avisa de esta circunstancia. Si se seleccion a un trabajador, entonces podemos borrar. Pero antes, es interesante pedir confirmacin. Esto es lo que se hace con el JOptionPane.showConfirmDialog. Si el usuario acepta la eliminacin del trabajador, entonces la llevamos a cabo. Observa el proceso: Extraemos del modelo del JTable el dni del trabajador seleccionado (este dni se encuentra en la fila seleccionada filsel- columna 0 la primera columna-):
m = (DefaultTableModel) tabla.getModel(); dni = (String) m.getValueAt(filsel,0);

Ahora se construir una instruccin de accin SQL del tipo DELETE para que se elimine el trabajador con el dni extrado. Esto se hace concatenando y ejecutando la instruccin SQL a travs del objeto sentencia:

sentencia.executeUpdate("delete from trabajadores where dni='"+dni+"'");

Y finalmente se llama al procedimiento MostrarTabla para que se extraiga de la base de datos y muestre de nuevo la tabla trabajadores. Esto actualizar el JTable, y se podr ver que el trabajador ha sido eliminado. Todo esto est dentro de un try...catch para capturar errores inesperados.

9. Ejecuta el programa y prueba a eliminar algn trabajador. Observa como el JTable se actualiza cuando se produce la eliminacin.

10. Ahora aade otro botn llamado btnNuevo:

11. Cuando se pulse el botn Nuevo se pretende que aparezca un formulario donde se puedan introducir los datos de un nuevo trabajador. Esto se conseguir aadiendo un cuadro de dilogo a nuestro proyecto. Para ello, agrega un JDialog al proyecto. Este dilogo se llamar dialogoNuevo.

12. Haga doble clic en el Inspector sobre el dialogoNuevo para disearlo. Debe quedar como sigue, con los nombres que se indican a continuacin:

txtNuevoDni txtNuevoNombre txtNuevoApellidos txtNuevoSueldo txtNuevoDia txtNuevoMes txtNuevoAnio txtNuevoMatricula

btnNuevoAceptar btnNuevoCancelar

13. La idea es la siguiente. Cuando el usuario pulse el botn Nuevo, aparecer este cuadro de dilogo. El usuario introducir los datos del nuevo trabajador y pulsar Aceptar, y entonces estos datos se introducirn en la tabla trabajadores. Si el usuario pulsa Cancelar, entonces no se har nada. El JTable se actualizar para mostrar el resultado de la insercin del nuevo trabajador. As pues, entre en el actionPerformed del botn btnNuevo y programe lo siguiente:

Este cdigo empieza asignando un tamao al cuadro de dilogo dialogoNuevo. Luego, se define el dialogoNuevo como Modal. Esto significa que hasta que no se termine de trabajar con este cuadro de dilogo no se podr continuar usando el programa principal. Luego se muestra dicho cuadro de dilogo. Y finalmente se actualiza el JTable por si se hubiera introducido un nuevo trabajador.

14. Ahora programemos los botones del cuadro de dilogo dialogoNuevo. Empecemos por el botn Cancelar:

Como ves, tan sencillo como descargar el cuadro de dilogo. El botn Cancelar debe limitarse a quitar de la pantalla el cuadro de dilogo dialogoNuevo.

15. Y finalmente se programar el botn Aceptar del cuadro de dilogo. Recuerda que este botn es el que introduce en la base de datos a un nuevo trabajador. Programa dentro de este botn lo siguiente:

Vamos a analizar detenidamente este cdigo. Lo primero que puedes observar es un conjunto de lneas que copian el contenido de los cuadros de texto en variables de cadena. Al hacer esto, cambiamos la coma decimal por punto decimal en el caso del sueldo y configuramos la fecha en el formato que entiende SQL: mes/dia/ao. Luego, con estas variables, se construye por concatenacin una instruccin SQL de tipo INSERT que permita introducir los datos del nuevo trabajador en la tabla trabajadores. Se ejecuta dicha instruccin SQL. Y se cierra el cuadro de dilogo. Por supuesto, es necesario un try...catch para evitar problemas inesperados.

16. Ejecuta el programa y prueba a introducir nuevos trabajadores.

17. Nuestro programa ya puede hacer altas y bajas. Solo queda que pueda realizar modificaciones. Para ello aade un nuevo botn a la ventana, llamado btnModificar:

18. Se pretende que el usuario seleccione en la tabla el trabajador cuyos datos quiere modificar, y luego pulse este botn para efectuar la modificacin. Al pulsar este botn debe aparecer un cuadro de dilogo donde el usuario pueda cambiar fcilmente los datos. Ese cuadro de dilogo ser muy parecido al que hemos hecho antes, as que bsicamente solo tendrs que hacer una copia de dicho cuadro de dilogo y modificarlo un poco. A continuacin se explica como hacerlo.

19. Haz clic con el derecho sobre el cuadro de dilogo dialogoNuevo y activa Copiar :

20. Luego activa Pegar sobre Otros Componentes:

21. Aparecer un nuevo cuadro de dilogo que es una copia del anterior. Este cuadro tendr como nombre dialogoNuevo1.

22. Sin embargo, le cambiaremos el nombre para que sea ms acorde con su funcin. Le llamaremos dialogoModificar. Cmbiale el nombre:

23. Vamos a modificar un poco el diseo del dialogoModificar. Haz doble clic sobre l y realiza las siguientes modificaciones en el diseo:

Cambia el ttulo. Ahora es Modificar Trabajador Los nombres para los cuadros de texto y botones sern: txtModDni (Desactiva su propiedad editable) txtModNombre txtModApellidos txtModSueldo txtModDia txtModMes txtModAnio txtModMatricula btnModAceptar btnModCancelar

24. Empezaremos programando el botn Modificar. Al pulsar este botn se debe mostrar el cuadro de dilogo anterior relleno con los datos del trabajador que se quiere modificar. Se supone que el usuario ha seleccionado a este trabajador en la tabla anteriormente. Entra en el actionPerformed del botn Modificar y programa lo siguiente:

Estudiemos el cdigo. Primero se comprueba el nmero de la fila seleccionada. Si no hubiera ninguna se muestra un mensaje de error, ya que es necesario modificar la fila del trabajador que se quiere modificar. En el caso de que haya una fila seleccionada, se extraen los datos del modelo del JTable y se almacenan en varias variables de cadena. Una vez hecho esto, esas mismas variables se almacenan en los cuadros de texto del cuadro de dilogo dialogoModificar. Y finalmente se prepara el cuadro de dilogo dialogoModificar y se muestra en la pantalla. Una vez realizada la modificacin (no programada an) se muestran los trabajadores en la tabla llamando al mtodo MostrarTrabajadores.

25. Puedes comprobar el funcionamiento del programa de momento. Prueba a seleccionar una fila de la tabla y al pulsar el botn Modificar.

Selecciona... Y luego pulsa modificar.

El resultado es que aparece el cuadro de dilogo dialogoModificar ya relleno con los datos del trabajador que se seleccion.

26. Lo bueno que tiene el rellenar el cuadro de dilogo dialogoModificar con los datos del trabajador que se quiere modificar es que no tenemos que escribir todos los datos, y solo modificar el campo que nos interese. El usuario realizar los cambios en los cuadros de textos ya rellenos y luego pulsar el botn Aceptar para que se produzca la modificacin. Si se pulsa Cancelar no sucede nada. Simplemente se cerrar el cuadro de dilogo.

27. Se empezar programando el botn Cancelar. Este botn debe limitarse a cerrar el cuadro de dilogo dialogoModificar:

28. Ahora nos centraremos en el botn Aceptar. Este botn debe realizar la modificacin, introduciendo todos los datos de los cuadros de texto en la tabla trabajadores. El cdigo siguiente tomar como referencia el DNI del trabajador que se est modificando. Es importante que este DNI no cambie, ya que entonces estaramos modificando los datos de otro trabajador.

Esta es la razn por la que el cuadro de texto txtModDni se ha configurado como no editable, para evitar que el usuario pueda cambiarlo accidentalente. Programa el siguiente cdigo en el botn Aceptar:

Estudiemos el cdigo. Lo primero que se hace es recoger en variables los datos introducidos en los cuadros de texto. Luego, con estas variables, se construye una instruccin SQL del tipo UPDATE que permite modificar los datos del trabajador con el dni indicado en el cuadro de dilogo. Finalmente se cierra el cuadro de dilogo. Todo este cdigo es susceptible de sufrir fallos por lo que est rodeado de un try...catch.

29. Ejecuta el programa y comprueba el funcionamiento de la actualizacin de trabajadores. Prueba a realizar varias actualizaciones. Observa como el JTable se actualiza con las nuevas modificaciones realizadas.

CONCLUSIN La ms simple de las aplicaciones de base de datos debe ser capaz de realizar las siguientes operaciones sobre una tabla: Altas Bajas Modificaciones

Es muy interesante que la aplicacin muestre en pantalla continuamente un JTable con el contenido de la tabla de la base de datos sobre la que se est trabajando. El JTable nos permite visualizar los datos de la tabla y seleccionar rpidamente el registro que queramos manipular. Para la insercin de nuevos registros en la tabla se recomienda la creacin de un cuadro de dilogo que muestre un formulario donde el usuario pueda introducir los datos del nuevo registro cmodamente. Para la modificacin de un registro, se recomienda la creacin de otro cuadro de dilogo que muestre los datos del registro que se quiere modificar.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Filtrados sobre una tabla En la hoja guiada anterior se realiz una pequea aplicacin de base de datos que permita realizar altas, bajas y modificaciones sobre la tabla trabajadores de la base de datos MANEMPSA. En todo momento se mostraba en un JTable el listado de trabajadores de la empresa. La eliminacin y modificacin de un trabajador se poda realizar simplemente haciendo clic sobre la fila del trabajador correspondiente en el JTable y luego activando el botn Eliminar o Modificar. Sin embargo, en el momento en que tengamos una gran cantidad de trabajadores almacenados en la tabla, puede resultar un poco complicado encontrar al trabajador en concreto que se quiere eliminar o modificar. Aparte, puede ser necesario a veces ver solo determinados registros de la tabla y no toda la tabla entera. Se hace necesario pues aadir al programa ciertas opciones de filtrado que nos permitan visualizar en el JTable solo aquellos registros que ms nos interesen. En esta hoja guiada se mejorar el programa de la hoja anterior de forma que permita al usuario ciertas opciones de filtrado.

EJERCICIO GUIADO N 1

1. Abrir la aplicacin de la hoja guiada anterior. 2. Primero debes aadir un botn btnFiltar a la ventana:

3. Al pulsar este botn aparecer un cuadro de dilogo que contenga opciones de filtrado, de forma que el usuario pueda decidir qu trabajadores quiere ver. Por lo tanto, tendr que aadir un nuevo cuadro de dilogo (JDialog) y asgnele el nombre dialogoFiltrar.

4. Haz doble clic sobre este dilogo y diselo de la siguiente forma:

txtFiltrarDni txtFiltrarNombre txtFiltrarApellidos comboSueldo txtFiltrarSueldo comboFecha txtFiltrarDia txtFiltrarMes txtFiltrarAnio txtFiltrarMatricula btnFiltrarAceptar btnFiltrarVerTodos btnFiltrarCancelar

NOTA: Los dos combos del cuadro de dilogo deben contener los siguientes elementos: = > < >= <= <>

Es decir, cuando se desplieguen aparecer esto:

5. La idea es la siguiente. Cuando el usuario pulse el botn Filtrar, se mostrar este cuadro de dilogo. Entonces el usuario introducir las condiciones de bsqueda y pulsar Aceptar, y entonces se visualizarn en el JTable aquellos registros que cumplan la condicin. Si el usuario pulsa el botn Ver Todos, entonces se mostrarn en el JTable todos los trabajadores. Si el usuario pulsa el botn Cancelar, entonces el cuadro de dilogo de filtrado se cierra sin ms.

6. Empezaremos programando el botn Filtrar de la ventana principal. Introduzca en l el siguiente cdigo:

Lo nico que hace este cdigo es asignar un tamao al cuadro de dilogo, configurarlo como modal, y finalmente presentarlo en pantalla.

7. Ejecute el programa si quiere ver el funcionamiento de este botn.

Se pulsa el botn Filtrar y aparece el cuadro de dilogo de filtrado.

8. Programemos ahora el botn Cancelar del cuadro de dilogo de filtrado. La programacin de este botn es muy sencilla:

Como puede ver consiste simplemente en cerrar el cuadro de dilogo de filtrado.

9. Se programar ahora el botn Aceptar, pero antes, es necesario entender como funcionar el cuadro de dilogo de filtrado. El usuario introducir los datos que quiere buscar. Ten en cuenta que no tiene por qu rellenar todas las casillas. Adems, puede hacer uso de los combos asignados a los campos sueldo y fecha. Por ejemplo, supongamos que el usuario introdujera los siguientes datos:

Si en este momento el usuario pulsara el botn Aceptar, se tendran que mostrar aquellos trabajadores que cumplan todas las siguientes condiciones: que tengan de nombre Juan, que ganen ms de 2000 euros de sueldo y que conduzcan un coche cuya matricula contenga la cadena CA. Las casillas que estn vacas no se tendrn en cuenta a la hora de hacer el filtrado. Si el usuario introduce una cadena en un campo de tipo texto, se buscar a todos aquellos trabajadores que contengan dicha cadena. Por ejemplo, si introduzco Juan en el nombre, el programa buscar a los trabajadores cuyo nombre contenga la palabra Juan. De esta manera la bsqueda ser mucho ms cmoda, al no tener que introducir el texto completo, y producir ms resultados (se encontrarn a los que se llamen Juan, Juan Antonio,Juana, etc.

10. El botn Aceptar tendr que construir una consulta SELECT que incluya estas condiciones, y luego ejecutarla. Finalmente tendr que mostrar el resultado de la consulta en el JTable. El cdigo de este botn ser largo, as que veamos poco a poco como programarlo. Empiece programando lo siguiente dentro del botn Aceptar:

Como puede ver, empezamos recogiendo el contenido de los cuadros de texto en distintas variables. Tambin recogemos los valores seleccionados en los combos del sueldo y fecha. En el caso de la fecha, recogemos de los cuadros de texto el da, mes y ao y los concatenamos para formar una fecha que Access pueda aceptar: mes/dia/ao. En el caso del sueldo cambiamos la coma decimal (ya que suponemos que el usuario introducir el valor en formato espaol) por el punto, para que no haya problemas a la hora de ejecutar la consulta SQL.

11. Siga programando en el botn Aceptar de la siguiente forma:

Agrega estas dos variables en la parte inicial del mtodo.

........... cdigo anterior...........

Y en la parte final del mtodo aade el siguiente cdigo...

Es necesario estudiar muy detenidamente el cdigo que tenemos programado hasta ahora antes de continuar. Se han aadido dos variables: La variable sql es una variable de cadena que contendr la instruccin SELECT que efectuar el filtrado (la consulta) La variable ncond (nmero de condiciones) es una variable numrica que va contando cuantas condiciones hay. Ten en cuenta que habr una condicin cada vez que un cuadro de texto est relleno con algn dato. Esta variable es muy importante, ya que nos permite saber si tenemos que concatenar una condicin con where o con and. Ten en cuenta que la primera condicin que se aade vendr precedida por where, pero las dems estarn precedidas por and. La primera condicin que se aade a la instruccin SELECT tendr que tener esta forma (en rojo):
select * from trabajadores where condicion1

La condicin 2, condicin 3, etc llevan el and delante. Por ejemplo, la segunda condicin tendra esta forma (en azul):
select * from trabajadores where condicion1 and condicion2

Si aadiramos una tercera condicin tambin llevara el and (en verde):


select * from trabajadores where condicion1 and condicion2 and condicion3

Etc. Resumiendo, la primera condicin vendr antecedida de where, mientras que el resto de las condiciones vendrn antecedidas del and.

Si se observa el cdigo aadido al final del mtodo, en l se empieza construyendo el comienzo de la consulta SELECT: select * from trabajadores y luego se aaden condiciones segn si el cuadro de texto correspondiente est vaco o no. Cada vez que se encuentra un cuadro de texto no vaco, se aade una condicin y se aumenta en 1 el contador de condiciones, es decir, la variable ncond. Observa como cuando se aade una condicin, se comprueba con un if el nmero de condiciones (ncond) para saber si hay que concatenar la condicin con el where o con el and. Debes observar tambin como nos decantamos por el uso de LIKE ya que este es ms verstil. Y se recuerda una vez ms que cuando usemos LIKE desde java en vez de asteriscos usaremos el smbolo tanto por ciento (%) Estudia bien este cdigo para entenderlo. Solo se ha indicado las posibles condiciones para el DNI y para el Nombre. Sin embargo ser necesario aadir ms if para el resto de los campos.

12. Aada al final del cdigo anterior el siguiente cdigo:

Este cdigo comprueba si hay algn dato en el cuadro de texto apellidos, y, si es as, entonces crea una condicin para filtrar por apellidos. Se incrementa el contador de condiciones en uno y si estamos ante la primera condicin esta se concatena usando where, y si no, esta se concatena usando and.

13. Aada al final del cdigo anterior el siguiente cdigo:

Este es el cdigo que aade una condicin para el sueldo (suponiendo que haya algn dato en el cuadro de texto del sueldo) Como en los casos anteriores, se suma uno al contador de condiciones y, si estamos ante la primera condicin se concatena con where, y si no, se concatena con and. Hay que destacar aqu que, al ser el sueldo un campo numrico, no se usa LIKE, sino que se usa el operador que el usuario haya escogido dentro del combo del sueldo. Recuerda que ese operador puede ser uno de los siguientes: =, >, <, >=, <= ,
<>

14. Aada al final del cdigo anterior el siguiente cdigo:

Este es el cdigo que aade una condicin para la fecha (suponiendo que haya algn dato en los cuadros de texto correspondientes a las fechas) Aqu hay que tener en cuenta que los valores de los cuadros de texto del da, mes y ao se concatenan dentro de una variable fecha usando la / como separador. Si los cuadros de texto dia, mes y ao estuvieran vacos, la variable fecha contendra la cadena //. Por eso preguntamos si la variable fecha es distinta de // para saber si es necesario aadir una condicin para la fecha. Como en los casos anteriores, se suma uno al contador de condiciones y se comprueba si estamos ante la primera condicin. En este caso se concatena la condicin usando where y en caso contrario se concatena la condicin usando and. Observa que para crear la condicin se usa el operador que el usuario haya elegido en el combo de la fecha, el cual puede ser uno de los siguientes: =, >, <, >=, <=
, <>

Ya que estamos manejando fechas recuerda que hay que aadir las almohadillas en la condicin.

15. Aada el siguiente cdigo al final del cdigo anterior.

En este caso tenemos la construccin de la condicin correspondiente a la matrcula del coche del trabajador. Por supuesto, esta condicin solo se construye si se ha escrito algo en el cuadro de texto de la matrcula. Como en los casos anteriores se suma uno al contador de condiciones y si estamos ante la primera condicin entonces la condicin se construir usando where, y en caso contrario aadiremos esta condicin usando and. Como en los dems campos de tipo texto, para construir esta condicin se ha preferido usar LIKE junto con los % (asteriscos en Access), que da ms posibilidades de bsqueda.

16. El resultado final de todo este largo cdigo es que la variable sql contendr una instruccin SELECT que realizar un filtrado sobre la tabla trabajadores de la base de datos de forma que se extraigan a los trabajadores que cumplan las condiciones indicadas por el usuario en el cuadro de dilogo de filtrado. Lo que hay que hacer ahora es ejecutar dicha instruccin SELECT. Y como ya sabe, esto se hace a travs del objeto sentencia. Programe lo siguiente a continuacin del cdigo anterior:

En este cdigo se ejecuta la consulta creada y el resultado se introduce en un ResultSet r. Ahora hay que mostrar el contenido del ResultSet r en el JTable de la ventana principal. Como ve, el cdigo da un error. Esto es debido a que es obligatorio rodear el cdigo con un try...catch, ya que es susceptible de error. (Esto se har ms adelante)

17. Ahora mostraremos el ResultSet r en el JTable, as que aada el siguiente cdigo a continuacin:

Este cdigo ya debe resultar conocido, ya que se us tambin en el mtodo MostrarTrabajadores, encargado de mostrar toda la tabla trabajadores en el JTable. Si observa este cdigo ver que lo que hace es definir un vector de ttulos para el JTable. A partir de este vector de ttulos se crea el modelo del JTable (DefaultTableModel) Luego se recorre el ResultSet r, que contiene ahora mismo el resultado del filtrado realizado, y se extrae cada fila almacenndola en un vector al que se ha llamado fila. Cada fila extrada se introduce en el modelo m de la tabla. Finalmente cuando se han traspasado todas las filas desde el ResultSet r al modelo m, se asigna dicho modelo al JTable. Esto quiere decir que el JTable debera mostrar ya el resultado del filtrado. La razn de que aparezcan tantos errores es porque an no hemos aadido el try...catch. Esto lo haremos al final.

18. El cdigo programado hasta ahora analiza los datos introducidos en el cuadro de dilogo de filtrado y construye una consulta SELECT que extrae los trabajadores que cumplan las condiciones indicadas. Estos datos se muestran finalmente en un JTable. Lo nico que queda por hacer es cerrar el cuadro de dilogo. Aade por tanto el siguiente cdigo:

19. Todo el cdigo programado en el botn Aceptar es bastante delicado y pude dar gran cantidad de errores, por lo que ser necesario rodearlo dentro de un try...catch:

.... resto del cdigo...

20. El cdigo que se acaba de programar es un poco enrevesado y largo, pero le da al programa una potencia tremenda, ya que permite al usuario realizar fcilmente bsquedas y filtrados en la tabla trabajadores. Ejecuta el programa y haz lo siguiente:

Pulsa Filtrar para ver el cuadro de dilogo de filtrado.

Queremos buscar a los trabajadores que tengan una a en el nombre y cobren menos de 1500 euros. (Recuerda activar el combo)

Pulsa Aceptar para ver el resultado.

21. Como habr podido observar en este ejemplo, se pueden realizar bsquedas en la tabla trabajadores gracias al cdigo programado. Esto es muy til sobre todo en el momento en que la tabla contenga muchos registros. Pruebe a ejecutar ms veces el programa y realice varios filtrados.

22. Solo queda por programar el botn Ver Todos del cuadro de dilogo de filtrado. Al pulsar este botn se pretende que se visualicen todos los registros de la tabla trabajadores. El cdigo de este botn es bastante sencillo:

Como ves aprovechamos el mtodo ya programado MostrarTrabajadores que se encarga de mostrar todos los trabajadores en el JTable. Luego solo tenemos que descargar el cuadro de dilogo de filtrado.

23. Ejecuta el programa y prueba lo siguiente: Haz el filtrado que quieras sobre la tabla trabajadores. Acepta y observa el filtrado en la tabla. Vuelve a filtrar pero esta vez pulsa el botn Ver Todos. Observars como vuelven a verse todos los trabajadores en la tabla. Ejemplo:

Se acaba de realizar un filtrado, la tabla muestra solo los trabajadores que cumplen la condicin... Pulsa ahora Filtrar

Pulsa Ver Todos para volver a ver todos los trabajadores.

Y el resultado ser que se quita el filtrado y se vuelven a mostrar todos los trabajadores

CONCLUSIN Las tablas que tengan muchos datos son incmodas de manejar, por lo que resulta muy interesante aadir al programa ciertas opciones de filtrado. Estas opciones permitirn visualizar solo aquellos registros que cumplan determinadas condiciones. Las opciones de filtrado consistirn bsicamente en la construccin de una consulta SELECT a travs de concatenaciones de cadenas. Una vez construida la cadena SELECT segn el filtrado que quiera hacer el usuario, se tendr que ejecutar dicha consulta y se tendr que mostrar el resultado. Normalmente en un JTable.

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Ordenacin y clculos Se van a aadir ciertas mejoras al programa que se viene realizando en las ltimas hojas guiadas. En esta hoja programaremos ciertas opciones de ordenacin as como realizaremos determinados clculos sobre la tabla trabajadores.

EJERCICIO GUIADO N 1

1. Abrir la aplicacin de la hoja guiada anterior. 2. Vamos a modificar el cuadro de dilogo de filtrado de forma que no solo sea capaz de filtrar, sino que tambin permita que el listado que se ha filtrado aparezca ordenado segn un campo. Para ello, aada lo siguiente al dilogo de filtrado:

panelOrdenacion cboCamposOrdenacion radioASC radioDESC

NOTA N1: El combo cboCamposOrdenacion contendr los siguientes elementos: (Sin Ordenacin), DNI, Nombre, Apellidos, Sueldo, Fecha, Matricula:

NOTA N2: Es necesario aadir un ButtonGroup al programa, al que llamaremos grupoOrdenacion. Los botones de opcin radioASC y radioDESC deben pertenecer a dicho grupo.

3. La idea es la siguiente. Cuando el usuario quiera hacer un filtrado podr indicar que el listado aparezca ordenado por algn campo, seleccionndolo en el combo de ordenacin. Tambin puede indicar la forma de ordenacin (ascendente o descendente) a travs de los botones de opcin. Al pulsar Aceptar el listado de trabajadores no solo saldr filtrado, sino que tambin saldr ordenado. Para ello tendremos que realizar modificaciones en el cdigo del botn Aceptar. Aade el siguiente cdigo en el actionPerformed del botn Aceptar (justo antes de la ejecucin de la consulta):

Estudiemos el cdigo. Lo primero que se hace es extraer el valor del combo desplegable de los campos de ordenacin. Si este combo no contiene el valor (Sin ordenacin) significar que se desea realizar una ordenacin por el campo seleccionado. As pues se concatena a la variable sql la clusula order by con el campo que se ha seleccionado en el combo. Se controla tambin la forma de ordenacin teniendo en cuenta el botn de opcin que est activado, y segn esto, se aade la cadena ASC o DESC para ordenar ascendentemente o descendentemente.

4. Ejecuta el programa y prueba a hacer un filtrado eligiendo un campo para ordenar y observa el resultado:

En este ejemplo se pretende visualizar a todos los trabajadores que contengan una a en su nombre...

... y el listado saldr ordenado por el campo sueldo descendentemente.

5. Una ventaja de esto es que se puede mostrar el listado completo de trabajadores ordenado por el campo que se quiera siempre y cuando no se indique ninguna condicin:

En este ejemplo apareceran todos los trabajadores, ya que no se ha indicado ninguna condicin.

... y el listado saldr ordenado por el nombre ascendentemente.

6. Ahora vamos a aadir una nueva mejora al programa. La idea es que se visualice junto al JTable de trabajadores los siguientes datos: el nmero de trabajadores que se muestra y la media de los sueldos. Para ello, aade las siguientes modificaciones en el diseo de la ventana principal:

Etiquetas con borde:

etiNumeroTrab

etiSueldoMedio

7. Ahora programaremos un mtodo que sea capaz de calcular el nmero de trabajadores y el sueldo medio a partir del contenido de un ResultSet. Este mtodo recibir un ResultSet como parmetro, y lo que har ser analizar el contenido de este ResultSet para calcular y luego mostrar el nmero de trabajadores y el sueldo medio. Accede al cdigo de tu programa y aade el siguiente procedimiento:

Este cdigo bsicamente toma el ResultSet pasado como parmetro y lo recorre aumentando en uno la variable ntrab cada vez que se pasa al siguiente trabajador. Por otro lado se calcula la suma de los sueldos de los trabajadores del ResultSet. Una vez terminado el bucle solo hay que dividir la suma de los sueldos entre el nmero de trabajadores para obtener la media, y estos datos se colocan en las etiquetas correspondientes.

8. Interesa que cada vez que se muestren todos los trabajadores en el JTable se realicen estos clculos, as pues debe aadir la siguiente lnea en el mtodo MostrarTrabajadores.

Esa lnea es una llamada al mtodo que acabamos de programar, y har que despus de que se presenten en el JTable todos los trabajadores se rellenen las etiquetas de los clculos.

9. Tambin interesa que cuando se realice un filtrado aparezca el nmero de trabajadores y el sueldo medio correspondiente al listado que se acaba de filtrar. Para ello debes aadir la siguiente lnea al cdigo del botn Aceptar del cuadro de dilogo de filtrado:

De nuevo se realiza la llamada al mtodo de los clculos justamente despus de colocar en la tabla el listado de trabajadores, en este caso filtrado.

10. Ejecuta el programa y observa como al iniciar el programa ya aparecen en las etiquetas los clculos (ya que el constructor llama al mtodo MostrarTrabajadores que a su vez llama al mtodo HacerCalculos) Tambin puedes comprobar como al hacer un filtrado se muestran los clculos correspondientes al listado filtrado, ya que en el botn Aceptar del dialogo de filtrado se hace una llamada al mtodo HacerCalculos.

Al iniciarse el programa aparece el listado completo de trabajadores y se calcula el nmero de trabajadores y el sueldo medio...

Si se hace un filtrado (en este ejemplo se visualizan los trabajadores con menos de 1000 de sueldo) los clculos se correspondern con el listado filtrado...

CONCLUSIN Todo programa de gestin de datos de una tabla debera tener opciones de ordenacin para mostrar los datos de la tabla ordenados como el usuario quiera. La opcin de ordenacin puede estar situada junto a las opciones de filtrado para permitir de esta manera que los filtrados aparezcan ordenados segn le interese al usuario. Suele ser habitual que al lado del JTable aparezcan ciertos clculos estadsticos relativos a la tabla.

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Informes Toda aplicacin de base de datos necesita imprimir documentos tales como listados, fichas, grficos, etc. Estos documentos se rellenan con datos tomados directamente desde la base de datos. A estos documentos se les denomina de forma general informes. Para crear estos documentos es necesario usar algn programa de creacin de informes. Estos programas permiten definir la estructura general del informe (sin tener en cuenta los datos) Una vez creado el informe, este se enlaza con nuestra aplicacin, de forma que cuando el usuario pulse la opcin de imprimir, el informe se rellene con los datos de la base de datos y luego sea enviado a la impresora. Para la creacin de informes para nuestras aplicaciones usaremos un programa gratuito llamado IReport. El fichero de instalacin para este programa lo encontrar en la subcarpeta Herramientas de la carpeta compartida. Para descargar las ltimas versiones de este programa puede acudir a la pgina http://www.jasperforge.org/sf/projects/ireport En esta hoja guiada se vern las ideas bsicas de manejo del programa IReport.

EJERCICIO GUIADO N 1. INSTALACIN DE IREPORT

1. En primer lugar copie el fichero de instalacin del programa IREPORT a su ordenador, e instale el programa. 2. Una vez instalado, ejectelo. La pantalla principal del IReport es la siguiente (es relativamente parecida a la pantalla principal de NetBeans):

En esta zona aparecern los informes que se estn diseando.

Aqu aparecern los distintos elementos que forman el informe.

En esta parte aparecern las propiedades del objeto seleccionado.

Aqu tendremos un listado con los campos de las tablas que podremos incluir en el informe, entre otras cosas.

Esta es la zona de diseo, donde se definen las caractersticas del informe.

Y aqu tenemos la salida, lugar donde aparecen los mensajes informativos y de error.

3. Cierre el programa IReport. Lo usaremos ms adelante.

EJERCICIO GUIADO N 2. CREACIN DE UN DSN

Definicin de DSN DSN significa Data Source Name, es decir, Nombre del origen de datos. Un DSN define cierta informacin sobre una base de datos, como por ejemplo el tipo de base de datos que es y donde se encuentra almacenada en el ordenador. Toda esta informacin se agrupa bajo un nombre, y ese nombre precisamente es lo que se denomina un DSN. Cuando un programa necesita acceder a una base de datos en concreto, solo hay que indicarle el nombre del DSN que tiene la informacin de dicha base de datos. De esta forma, el programa sabe acceder a la base de datos. El IReport es un programa que necesita saber el DSN de la base de datos que va a manejar, por eso es necesario aprender a crear DSNs para base de datos si queremos usar IReport. En este ejercicio guiado n 2 aprenderemos los pasos a seguir para crear un DSN para una base de datos. En nuestro caso, crearemos un DSN para la base de datos MANEMPSA.

1. Para crear un DSN acceda al Panel de Control. 2. Dentro del Panel de Control active el icono Herramientas Administrativas.

3. Dentro de Herramientas Administrativas active el icono Orgenes de datos.

4. En la pestaa DSN de Usuario pulse el botn Agregar para aadir un nuevo DSN.

5. Ahora hay que indicar el tipo de la base de datos a la que asignaremos el DSN. En nuestro caso, como la base de datos MANEMPSA es una base de datos de Access, tendremos que escoger Microsoft Access Driver (*.mdb) y pulsamos Finalizar.

6. Ahora seleccionaremos el fichero de la base de datos MANEMPSA haciendo clic en el botn Seleccionar:

7. Usando la ventana de exploracin que aparece, busca la base de datos MANEMPSA que se encuentra en Mis Documentos. Seleccinala y pulsa Aceptar.

8. Esta es toda la informacin que necesitaremos para crear el DSN de la base de datos MANEMPSA. Ahora ya solo queda darle un nombre al DSN. El nombre ser BaseEjemplo. Escribe el nombre del DSN en la casilla correspondiente:

9. Pulsa Aceptar las veces que sea necesario y el DSN BaseEjemplo habr sido creado. Esto quiere decir, que un programa determinado podr acceder a la base de datos MANEMPSA simplemente indicndole el DSN BaseEjemplo. Este es el caso del programa IReport. Como vers en los pasos siguientes, tendremos que usar el DSN BaseEjemplo que acabamos de crear para poder realizar informes sobre la base de datos MANEMPSA. 10. Una vez creado un DSN para una base de datos, este se queda almacenado en el ordenador. Esto significa que no necesitaremos volver a crear un DSN para la base de datos MANEMPSA. 11. El DSN se queda almacenado en el ordenador hasta que el propio usuario lo borre. Para practicar, veremos como borrar el DSN que acabamos de crear (aunque finalmente no lo borraremos porque lo usaremos ms adelante). Para ello entre en Panel de Control, Herramientas Administrativas, Orgenes de Datos:

12. En la pantalla que aparece ver el listado de DSNs que tiene creadas ahora mismo en el ordenador actual. Entre ellas ver la DSN llamada BaseEjemplo. Para eliminarla solo tienes que seleccionarla y pulsar el botn Quitar. Aparecer un mensaje preguntndole si quiere borrar el DSN. Debe responder NO ya que usaremos el DSN a continuacin. (Si lo borrara no sera algo grave. Simplemente se tendra que crear de nuevo con los pasos indicados antes)

EJERCICIO GUIADO N 3. CONEXIN DE IREPORT CON UNA BASE DE DATOS

1. Para poder crear informes con datos de una base de datos, es necesario realizar una conexin entre el programa iReport y la base de datos. Este proceso se tendr que realizar antes de crear cualquier informe sobre dicha base de datos, y solo hace falta hacerlo una vez. Para este proceso, se usar el DSN de la base de datos. En este ejercicio guiado conectaremos el programa iReport con la base de datos MANEMPSA. Para ello entre otra vez en el programa iReport.

2. Para crear esta conexin, active la opcin Datos Conexiones / Fuentes de Datos

3. Debe activar el botn Nuevo para crear una nueva conexin...

4. Para base de datos de Access, debes activar la opcin Conexin Base de Datos JDBC y pulsar Prximo.

5. Ahora le daremos un nombre a la conexin que realizaremos con la base de datos MANEMPSA. El nombre ser simplemente: Conexin con MANEMPSA.

6. Lo siguiente es indicar el controlador (driver) de la base de datos. Para las bases de datos de Access el controlador que tendremos que indicar es sun.jdbc.odbc.JdbcOdbcDriver

7. Y finalmente hay que indicar el DSN que le hemos asociado a la base de datos MANEMPSA. Como vio en el ejercicio anterior, el DSN que se cre tena de nombre BaseEjemplo. Tiene que cambiar la palabra DSNAME por BaseEjemplo:

Quedara as:

8. Finalmente, activaremos la opcin Salvar el password para evitar que se nos pida constantemente una contrasea para acceder a la base de datos (La casilla de la contrasea password- se deja en blanco ya que la base de datos MANEMPSA no tiene contrasea)

9. Se acaba de establecer una conexin entre el informe que estamos haciendo y la base de datos MANEMPSA. Es muy interesante comprobar que todos los pasos que hemos seguido son correctos. Para ello, pulse el botn Prueba, y si todo ha ido bien, debe aparecer un mensaje indicndolo:

10. La conexin con la base de datos MANEMPSA est ya configurada. Solo tiene que pulsar el botn Salvar para que quede guardada. 11. Al pulsar el botn Salvar volver a la pantalla inicial. En ella podr observar que se ha creado una conexin (la conexin con MANEMPSA) Siguiendo estos mismos pasos puede crear todas las conexiones que quiera con las bases de datos de su ordenador. Una vez creada una conexin, esta se queda guardada y podr ser usada para la creacin de informes sobre la base de datos con la que conecta.

Conexin creada.

Listado de conexiones a base de datos (solo hay una de momento)

12. Cierra el cuadro de conexiones. Ya tenemos el programa iReport preparado para la creacin de informes con la base de datos MANEMPSA.

EJERCICIO GUIADO N 4. CREACIN RPIDA DE INFORMES 1. Ahora que tenemos configurado el iReport para acceder a la base de datos MANEMPSA, podemos crear informes con los datos de esta base de datos. En este ejercicio guiado se crear simplemente un informe que muestre un listado de los trabajadores de la empresa. 2. Una forma rpida de crear un informe es a travs de la opcin Mago de Informes que se encuentra dentro de la opcin del men Fichero. Actvela.

3. La opcin Mago de Informes muestra un asistente donde tendr que indicar algunos datos necesarios para crear el informe. Lo primero que tiene que indicar es la base de datos sobre la que quiere realizar el informe. Para ello debe elegir la conexin correspondiente a dicha base de datos:

4. Hasta el momento solo hemos configurado una conexin en el iReport (la conexin con MANEMPSA), as que ser la nica que aparezca al desplegar el listado de conexiones. 5. Una vez elegida la base de datos (indicando su conexin correspondiente) tenemos que extraer de ella los datos que queremos que aparezcan en el informe (listado) Y para ello tendremos que hacerlo indicando una consulta SQL de tipo SELECT. Ya que queremos hacer un listado con todos los trabajadores de la base de datos tendremos que introducir una consulta SELECT que extraiga a dichos trabajadores:

6. Ya podemos ir al siguiente paso del asistente pulsando el botn Prximo. 7. En este nuevo paso tendremos que indicar los campos que queremos que aparezcan en el listado. Para ello solo tendremos que seleccionar cada campo y pulsar el botn > para aadirlo. En nuestro ejemplo debes aadir los campos: DNI, Nombre, Apellidos y Sueldo nicamente. Nota: El botn > aade de uno en uno. El botn >> los aade todos. El botn < quita un campo del informe. El botn << los quita todos.

8. Una vez elegidos los campos puede pulsar el botn Prximo para ir al siguiente paso. 9. En este nuevo paso se tendr que elegir una forma de agrupamiento para el informe. En este ejemplo no se estudiar el agrupamiento en informes as que pulse simplemente el botn Prximo otra vez. 10. El siguiente paso es la distribucin del informe. Es decir, la forma de colocar los datos. Existen dos posibilidades: En columnas. Esta distribucin crea fichas individuales de cada registro (en nuestro ejemplo de cada trabajador) Tabulada. La distribucin tabular presenta el tpico listado con una cabecera.

Para nuestro ejemplo escogeremos la distribucin Tabulada. Dentro de la distribucin Tabulada se pueden elegir entre algunas variantes. Dejaremos activado el formato ClassicT.xml

11. Active el botn Prximo para acceder al quinto y ltimo paso del asistente. En este paso iReport le felicita porque acaba de crear el informe. Aqu solo tiene que pulsar el botn Terminar.

12. Una vez finalizado el asistente, volveremos a la pantalla principal de iReport. En ella, ver como ha aparecido el diseo del informe que acaba de crear.

Diseo del informe

En prximas hojas guiadas se estudiar la forma de modificar el diseo y de crear un informe desde cero. 13. Vamos a guardar el informe. Para ello activa la opcin Fichero Guardar. El nombre que le daremos al informe ser trabajadores:

14. Ahora que est guardado, vamos a ver como quedara el listado. Para ello active la opcin Construir Ejecutar informe (usando la conexin activa) o bien el botn de la barra de herramientas con el mismo nombre:

15. Al hacer esto aparecer por fin el listado que ha creado. Este listado aparece en una ventana nueva y tendr un aspecto similar al siguiente:

Como puede observar, aparecen los campos que indic en el asistente. El informe es tabulado (es decir, tiene forma de listado) y en l aparecen los trabajadores que tenga en su base de datos MANEMPSA. Debe tener en cuenta que si ha cambiado el contenido de la base de datos MANEMPSA entonces es posible que le aparezcan otros trabajadores. Observe como el ttulo del listado no es muy adecuado. Lo cambiaremos a continuacin.

16. Cierre la ventana del informe (no la del iReport) y volver a la pantalla principal de iReport. 17. Haga doble clic sobre el ttulo del informe y cmbielo por Listado de Trabajadores:

18. Vuelva a visualizar el resultado del informe:

19. Ahora el informe tendr mejor aspecto:

20. Acabamos de crear nuestro primer informe. Un listado con los datos de los trabajadores. Ya puede cerrar el programa iReport. Guarde todos los cambios.

CONCLUSIN Todo programa de gestin de datos de una tabla debera tener opciones de ordenacin para mostrar los datos de la tabla ordenados como el usuario quiera. La opcin de ordenacin puede estar situada junto a las opciones de filtrado para permitir de esta manera que los filtrados aparezcan ordenados segn le interese al usuario. Suele ser habitual que al lado del JTable aparezcan ciertos clculos estadsticos relativos a la tabla.

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Diseo de Informes En la hoja anterior se aprendi a realizar un informe usando el mago de informes. Este asistente crea un informe predefinido a partir de los campos de la tabla que indiquemos. El mago de informe es una forma rpida de crear informes, aunque el resultado quizs no sea exactamente lo que buscbamos. Es posible que nos interese cambiar los colores, el tipo de letra, el formato de los nmeros, etc. En la hoja guiada anterior vimos un ejemplo de esto. Una vez creado el informe, se tuvo que cambiar el ttulo ya que el ttulo incluido por defecto no era el adecuado. En esta hoja guiada se aprendern algunas tcnicas para modificar un informe una vez que haya sido creado con el mago de informes. Veremos como modificar las propiedades de cada elemento del informe.

EJERCICIO GUIADO N 1. CREACIN Y MODIFICACIN DE UN INFORME

En este ejercicio guiado se crear un informe usando el mago de informes. Concretamente, se crear un informe que muestre el listado de los coches de la empresa MANEMPSA. Luego, una vez creado dicho listado, lo modificaremos. 1. Abra el programa iReport. 2. Active la opcin Fichero Mago de Informes.

3. Aparecer el asistente para la creacin de informes. En el primer paso tiene que elegir la conexin correspondiente a la base de datos MANEMPSA (que es donde se encuentra la tabla coches)

4. Ahora tendremos que escribir la consulta SELECT para extraer el listado completo de coches. Haremos que este listado se presente ordenado por marca. Para ello, introduzca la siguiente instruccin SQL:

5. Pulsa el botn Prximo para pasar al siguiente paso del asistente. 6. En este paso tendremos que indicar los campos que nos interesa que aparezcan en el listado. Estos campos sern los siguientes: matrcula, marca, modelo y ao.

7. Pulse el botn Prximo para pasar al siguiente paso del asistente: 8. Estamos en el paso 3 del asistente. En este paso hay que indicar el agrupamiento del informe. En nuestro ejemplo no usaremos agrupamiento as que pulse simplemente el botn Proximo. 9. En el paso 4 del asistente tendremos que elegir la distribucin del informe. Escogeremos una distribucin tabulada y de tipo ClassicT.

10. Active Prximo para ir al 5 y ltimo paso del asistente y pulse Terminar. 11. Acabamos de crear el informe. Observe su diseo.

12. Ahora es conveniente guardarlo para evitar problemas. Pulse la opcin Fichero Guardar y gurdelo con el nombre listadocoches en la carpeta Mis Documentos.

13. Acaba de crear un informe con forma de listado. Para ver el resultado debe pulsar el botn Ejecutar informe (usando la conexin activa)

14. Ahora podr ver el informe creado, el cual debe tener el siguiente aspecto (tenga en cuenta que los elementos del listado pueden variar dependiendo de los datos que tenga almacenado en su tabla)

15. Ya tenemos el informe creado. Este informe tiene su formato (tipos de letras, colores, etc) que puede que sea suficiente para nuestras necesidades. Pero, y si quisiramos cambiar las caractersticas del informe? En los puntos siguientes veremos como cambiar el aspecto del listado. De momento cierre la ventana del listado para volver a la pantalla de diseo.

16. Empezaremos cambiando el ttulo del informe. Para ello haremos doble clic sobre el ttulo y escribiremos Listado de Coches:

17. Puede cambiar el aspecto de cada elemento del informe seleccionndolo con un clic y luego modificando sus propiedades, las cuales aparecern en la parte derecha de la ventana. Por ejemplo, seleccione en la cabecera del listado el campo matrcula:

18. En la zona de propiedades (parte derecha) active por ejemplo la propiedad negrilla y el tipo de letra Comic Sans:

19. Si observa el elemento seleccionado (Matrcula en la cabecera) observar que est ahora en negrita y con el tipo de letra Comic:

20. Selecciona ahora el ttulo, por ejemplo (solo tienes que hacer un clic sobre l)

21. Ahora activa las siguientes propiedades:

Activa la propiedad primer plano (en el botn con los tres puntos) y escoge un color verde. Activa la propiedad fondo y escoge un color amarillo. Desactiva la propiedad Transparente.

Pon un tamao de 28, y negrilla. Activa la itlica (cursiva) y el subrayado. Asigna una alineacin izquierda.

22. Si observas el ttulo del informe, vers que tendr el siguiente aspecto ahora:

23. Vamos a colocar el recuadro del ttulo a la izquierda. Para ello, haz clic sobre el ttulo y sin soltar el botn del ratn arrstralo a la parte izquierda del informe, para que quede as:

24. Visualiza el informe para ver el resultado:

25. El informe tendr el siguiente aspecto:

Como ve, hemos cambiado la forma y posicin del ttulo. Observa. No aparece el campo matrcula!, Esto es debido a que es demasiado grande y no cabe aqu.

26. Vamos a solucionar el problema del campo Matrcula. Cierra la ventana del listado y en la ventana de diseo haz que el campo matrcula tenga un tamao de letra de 10:

27. Si ahora visualizas el listado de nuevo, vers como s aparece el campo matrcula:

28. Sigamos cambiando cosas en el diseo del informe. Ahora vas a seleccionar el campo matrcula correspondiente no a la cabecera, sino al listado de datos:

Este cuadro se corresponde al conjunto de datos de la columna matrcula.

29. Haz que sus propiedades sean las siguientes: Negrita: Activado Tamao de letra: 8 Tipo de letra: Courier New Primer Plano: Azul

30. Una vez cambiadas las propiedades, si visualizas el informe, deber tener el siguiente aspecto:

Si observas el listado vers que todos los datos de la columna matrcula tiene ahora las propiedades asignadas.

31. As pues, el diseo del informe que haya creado con el mago de informes puede ser modificado luego. Bsicamente solo tiene que seleccionar el elemento a modificar y luego cambiar sus propiedades. Debe tener en cuenta que los elementos del diseo pueden cambiarse de lugar y que pueden cambiarse de tamao. En la parte superior de la ventana de iReport tiene una barra de herramientas que puede usar tambin para realizar cambios en los elementos:

32. Ha terminado de realizar el informe. Puede cerrar iReport y guardar los cambios si hiciera falta.

CONCLUSIN La forma ms sencilla de crear un informe con iReport es a travs del mago de informes. Una vez creado el informe, puede realizar modificaciones en su diseo seleccionando cada elemento y cambiando sus propiedades en la zona de propiedades. Tambin puede mover y cambiar de tamao los distintos elementos del informe. De esta forma, puede crear rpidamente un listado para luego personalizarlo.

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Creacin de un informe desde cero En hojas anteriores hemos visto que la forma ms rpida de crear un informe es usando el mago de informes de iReport. Luego, con el informe resultante, solo tenamos que cambiar las propiedades de cada elemento del informe. En esta hoja veremos como crear un informe empezando desde cero, lo que nos servir adems para entender las distintas zonas en que se divide un informe. La creacin de informes desde cero es algo tedioso y lento, aunque por otro lado nos da total libertad a la hora de distribuir cada elemento en el informe. En muchos casos tendr que crear los informes desde cero, ya que el cliente le insistir en usar un determinado formato para los listados, las facturas y todos aquellos documentos que deben imprimirse desde el programa. Insistir en mantener los colores propios de la empresa (la imagen corporativa) y dems caractersticas propias de la empresa. Para hacer esto a veces lo mejor es crear el informe desde el principio. En esta hoja se ver un ejemplo de creacin de informe desde cero.

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME DESDE CERO

1. Entre en iReport 2. Nuestro objetivo ser crear un informe que muestre el listado de servicios realizados por el trabajador Juan Prez, cuyo nmero de DNI es 12.321.567-B. 3. Para ello, active la opcin Fichero Nuevo Documento.

4. El nombre del informe ser serviciosjuan:

5. Al pulsar OK, observar que aparece un informe en blanco:

6. Este informe est dividido en zonas, cada una con un cometido distinto (lo iremos estudiando a medida que realicemos el informe) 7. En la barra de herramientas debe indicar la conexin a la base de datos que quiere usar. En nuestro caso la conexin se llama Conexin con Manempsa.

8. Ahora hay que indicar la consulta SQL que nos permita acceder a los datos necesarios para el informe. Esto se tiene que hacer activando la opcin Datos Consulta de Informe:

9. En la ventana que aparece tendr que introducir la siguiente consulta SQL:


select * from trabajadores, servicios where trabajadores.dni=servicios.dni and trabajadores.dni=12.321.567-B order by servicios.fecha

Si en la parte inferior aparece el listado de campos seleccionados en la consulta, entonces es indicativo de que todo va bien.

10. Pulsa OK. Acabamos de indicarle al informe que estamos realizando la base de datos de donde tomaremos los datos y la consulta para extraer dichos datos. Si observa la parte izquierda de la ventana del iReport, ver una opcin Campos:

11. Pulse en el + para visualizar el listado de campos disponibles. Ver todos los campos seleccionados en la consulta SQL que acaba de introducir.

12. Nos interesa que en el listado de los servicios de Juan aparezca el nmero, el tipo de servicio y la cantidad. Para ello, tendr que aadir estos datos a la zona de Detalle (Detail). La zona de detalle es la zona en la que aparecern los datos del listado, y por tanto es all donde tiene que aadir los campos a mostrar. Arrastra el campo nmero desde la zona de campos a la zona de detalle:

13. Haz lo mismo con los otros campos que queremos mostrar: el tipo y la cantidad: El detalle quedar as:

14. Visualice el informe resultante. serviciosjuan.

iReport le pedir que guarde el informe. Llmelo

15. Una vez guardado ver como queda el informe que acaba de hacer:

16. No est muy conseguido, pero solo acabamos de empezar. Recuerde que la zona de Detalle (Detail) es el sitio donde colocar los campos del listado de datos. 17. Nuestra zona de Detalle es muy grande, por eso los datos salen tan separados. Puede achicar una zona haciendo clic en la lnea de separacin y arrastrando. Pruebe a hacerlo hasta que la zona de Detalle quede as (es posible que necesite mover los campos):

Clic en la lnea de separacin y arrastra.

18. Si visualiza ahora el informe ver que tiene mejor aspecto (los servicios de Juan aparecen ms unidos):

19. Ahora sera interesante que el listado tuviera una cabecera. Para ello, haz clic en el botn de la barra de herramientas llamado Texto Esttico y luego haz clic en la zona del informe llamada Column Header y arrastre el ratn:

20. Haz doble clic sobre el recuadro que ha aparecido y escriba dentro de l N Servicio.

21. La zona del informe llamada Encabezado de Columna (Column Header) es la zona donde colocar los encabezamientos del listado. Acabamos de colocar el encabezamiento de la columna nmero. Ahora repita el proceso para colocar los otros dos encabezados de columnas:

22. Para destacarlos un poco (ya que son los encabezados), haremos que estn en negrita y que su tamao sea un poco ms grande (para ello use las propiedades de dichos elementos) El resultado debe ser similar al siguiente:

23. Visualiza el informe y observa el resultado:

24. Ya tiene un mejor aspecto, pero an puede mejorarse ms. A travs del botn Lnea puede dibujar lneas en el informe. Dibuje una lnea en la zona del Encabezado de Columna:

botn lnea

NOTA: Para que la lnea le salga recta puede dibujarla teniendo pulsada la tecla Maysculas.

25. Visualice el informe:

26. Ahora vamos a colocar un ttulo al informe. El ttulo del informe se coloca en la zona Ttulo (Title). En nuestro caso vamos a colocar el ttulo Ficha de Servicios. Para introducir un texto tendr que usar el botn Texto esttico que ya us antes:

Haga clic en este botn y luego haga clic y arrastre en la zona del Ttulo. Se crear un recuadro:

27. Haz doble clic sobre ese recuadro y escribe Ficha de Servicios.

28. Ahora asigna al ttulo las siguientes propiedades: a. b. c. d. e. f. Un tamao de letra de 24 Agranda el cuadro de forma que ocupe prcticamente toda la zona de ttulo. Centra el ttulo en el recuadro. Subryalo. Asigna un color de fondo gris claro. Desactiva la opcin transparente.

Si todo va bien, su ttulo tiene que haber quedado as:

29. Visualice el listado. Su aspecto debe ser ms o menos el siguiente:

30. Ahora introduciremos algunos datos del trabajador (en nuestro caso de Juan Prez) La zona que usaremos ser el Encabezado de Pgina (pageHeader) Debe saber que en el encabezado de pgina se colocan aquellos datos que deban aparecer en la parte superior de todas las pginas. La diferencia entre Ttulo y Encabezado de Pgina es que lo que escriba en el ttulo aparecer en la parte superior de la primera pgina (y ninguna ms), mientras que lo que escriba en el encabezado de pgina aparecer en la parte superior de todas las pginas del listado. 31. Vamos a empezar agrandando la zona del Encabezado de Pgina. Esto se hace fcilmente arrastrando la lnea lmite inferior de la zona:

Haz clic en esta lnea y arrastra hacia abajo.

32. Ahora que tenemos ms espacio en el encabezado de pgina vamos a dibujar en l un recuadro. Esto lo puede hacer usando el botn Rectngulo de la barra de herramientas:

Solo tiene que activar este botn y hacer clic y arrastrar en el encabezado. Intente que quede as:

33. Ahora aada los siguientes cuadros de texto esttico dentro del recuadro que acaba de hacer:

Recuerde que estos cuadros de texto se hacen usando el botn Texto esttico de la barra de herramientas:

En el ejemplo, se ha asignado un tamao de letra de 12, y adems se ha puesto en negrita el texto del primer cuadro.

34. Ahora, para que salgan los datos propios del empleado, aadiremos los campos nombre, apellidos y DNI. Empezaremos por aadir el campo DNI. Esto se hace arrastrando desde la zona de campos:

35. Haga lo mismo con el campo Apellidos y el campo Nombre. El informe quedar as:

36. Ahora se cambiarn algunas propiedades de los campos que hemos aadido: a. Asigne un tamao de 12 b. El DNI debe aparecer en negrita. c. Agrande los cuadros de los campos. El resultado ser el siguiente:

37. Visualice el resultado del informe. Debe tener el siguiente aspecto:

Como puede ver, en la ficha del empleado aparecen sus datos reales.

38. Y ya para terminar agregaremos un logotipo al informe. Dicha imagen se colocar en la zona del Encabezado de Pgina, al lado del recuadro. Para ello, tendr que usar el botn de la barra de herramientas imagen:

Haga clic en este botn y luego haga clic y arrastre hasta crear un rectngulo en la zona del Encabezado de Pgina. Debe quedar as:

39. La imagen del logotipo aparecer en el recuadro que acabamos de hacer. Es necesario que se copie el fichero de la imagen en la misma carpeta que donde est guardado el informe. En nuestro caso, en la carpeta Mis Documentos. Usaremos la imagen nenfares.jpg que se suele encontrar en la carpeta Mis Imgenes como logotipo para el informe. As pues, copie el fichero nenfares.jpg desde la carpeta Mis Imgenes a la carpeta Mis Documentos.

40. Una vez copiado el fichero de la imagen en la misma carpeta que el informe, tenemos ahora que usar la propiedad del cuadro de imagen llamada Expresin Imagen, en ella tendr que escribir el nombre del fichero de imagen entre comillas dobles:

41. Ya tiene asociada la imagen con el cuadro de imagen. Ya solo queda visualizar el informe. Su aspecto ser parecido al siguiente:

42. Ha podido observar en este ejemplo los pasos bsicos a seguir para crear un informe desde cero. Como puede ver, es una forma ms trabajosa de crear un informe, pero a cambio disponemos de ms libertad a la hora de disear el informe.

43. Para finalizar con esta hoja guiada, veamos para que sirve cada una de las zonas del informe:
Encabezado de Pgina (pageHeader) Lo que se coloque aqu aparecer en todas las pginas, en la parte superior. Encabezado de columna (columnHeader) Se usa para colocar el texto del encabezado del listado (los nombres de cada columna) Detalle (detail) Aqu aparecern todos los datos del listado. Por tanto, aqu se suelen colocar los campos que se quieren visualizar.

Pie de columna (columnFooter) Lo que se coloque aqu aparecer siempre debajo del listado de datos, en todas las pginas. Ttulo (title) Aqu se coloca el ttulo del informe. Aparecer en la parte superior de la primera pgina nicamente.

Pie de Pgina (pageFooter) Lo que se coloque aqu aparecer en la parte inferior de todas las pginas (menos en la ltima). Ideal para colocar nmeros de pgina.

Resumen (summary) Aparece cuando finaliza el listado de datos (en la ltima pgina) Esta zona se usa para colocar clculos estadsticos, como suma de cantidades o cuentas y promedios, etc... que deban aparecer al final.

Pie de la ltima pgina (lastPageFooter) Es un pie especial, ya que solo aparece en la parte inferior de la ltima pgina.

CONCLUSIN iReport permite la creacin de informes desde cero, lo que da ms versatilidad a la hora de disear el listado. Es necesario indicar la conexin a la base de datos y la consulta SQL para extraer los datos que aparecern en el informe. El informe se divide en zonas, y los elementos se colocarn en dichas zonas segn donde queramos que aparezcan dichos elementos en el informe final. Para introducir texto en el informe se usar la opcin texto esttico. Si se quiere que aparezca un dato de la base de datos, entonces habr que introducir un campo. Tambin se pueden colocar lneas, recuadros, imgenes, etc. Todos los elementos colocados pueden ser modificados a travs de sus propiedades.

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Clculos Es muy habitual que un informe no solo muestre datos de las tablas de la base de datos, sino que tambin muestre clculos realizados con esos datos. Para hacer esos clculos se puede usar la potencia de SQL por un lado. Podemos generar esos clculos directamente en la consulta SQL, con lo cual solo tendremos que mostrar los resultados en el informe como si fueran otros campos. Por otro lado tambin podemos realizar los clculos directamente en el informe. En esta hoja se ver como crear un informe con clculos. Adems se aprendern algunos conceptos nuevos en lo que se refiere a presentacin de datos y uso de las zonas del informe.

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME CON CLCULOS

1. Entra en iReport. 2. Vamos a crear un informe desde cero donde aparezca el listado de servicios realizados. Interesa en principio que aparezca la fecha del servicio el tipo del servicio y la cantidad cobrada. Para ello active la opcin Fichero Nuevo Documento. 3. Asigne el nombre informeservicios al informe. 4. Indique ahora que usar la conexin con la base de datos MANEMPSA. Para ello puede elegir la Conexin con MANEMPSA en el desplegable de conexiones, en la parte superior derecha de la ventana:

5. Ahora que hemos elegido la conexin, ahora indicaremos la consulta SQL que nos permita extraer los datos que queremos mostrar en el informe. Para ello, activa la opcin Datos Consulta de Informe. 6. En la pantalla que aparece debes introducir la siguiente consulta SQL: select * from servicios order by fecha

7. Acepta la pantalla anterior. Ya podemos empezar a disear el informe. Empezaremos por poner un ttulo. El ttulo ser Listado de Servicios. Agrande la letra del ttulo y cntrelo.

8. Ahora aadiremos los textos de la cabecera. En la zona de Encabezado de columna (columnHeader) aadiremos los siguientes cuadros de texto esttico:

9. Ahora para definir los datos del listado, tendremos que aadir campos a la zona del detalle (detail). Debes arrastrar los campos fecha, tipo y cantidad:

10. La zona del detalle es demasiado grande, as que reduzca su tamao arrastrando la lnea de separacin:

Arrastra la lnea del detalle.

11. Visualice el listado. IReport le pedir que guarde antes de visualizar. Guarde el listado con el nombre informeservicios en Mis Documentos. 12. El listado tendr la siguiente forma:

13. Observe como la fecha muestra tambin la hora. Antes de continuar, cambiaremos el formato de la columna de la fecha para que esto no suceda. Para ello seleccione el campo Fecha:

14. Vamos a modificar una de las propiedades llamada Patrn. Haz clic en el botn con tres puntos de esta propiedad:

15. Esta propiedad permite cambiar la forma en que se presentan nmeros, fechas y dems tipos de datos en el informe. Elige en la zona de categoras la categora Date (Fecha) y luego escoge el patrn con forma dia/mes/ao:

Aplica los cambios. 16. Vuelve a visualizar tu listado. Ahora vers como las fechas aparecen correctamente. Recuerda esta propiedad, ya que la usars muchas veces. Sobre todo con fechas y nmeros. En el caso de los nmeros, se puede usar para decidir algunas caractersticas como los dgitos decimales o si mostrar el punto separador de miles.

17. Vamos a mejorar el listado aadiendo dos lneas. Una lnea justamente debajo de la cabecera y otra en la parte del pie de columna (columnFooter):

18. La lnea de la cabecera separar esta de los datos. Por otro lado, la lnea del pie de columna aparecer en la parte inferior del listado en todas las pginas. Visualiza el listado:

19. La zona del pie de pgina pageFooter es ideal para colocar en ella el nmero de pgina del listado. (Tenga en cuenta que el listado puede ser muy largo y tener varias pginas) Lo que introduzca en la zona pageFooter aparecer en la parte inferior de cada pgina en todas las pginas del listado excepto en la ltima pgina. En el caso de la ltima pgina la zona que hace esta funcin es la zona llamada lastPageFooter (ltimo pie de pgina) Para que la zona pageFooter afecte a todas las pginas del informe incluyendo la ltima, es necesario ocultar la zona lastPageFooter. Veamos como se hace esto: 20. Haga clic con el botn derecho del ratn sobre la zona lastPageFooter y elija Propiedades de banda.

21. Aparecer un cuadro de opciones donde se podr elegir el tamao de la zona. En nuestro caso indicaremos un cero y aplicaremos. Luego cerraremos el cuadro de opciones.

22. Se podr observar entonces como hemos ocultado la zona lastPageFooter. Al hacer esto, la zona pageFooter tendr control sobre todas las pginas incluyendo la ltima.

23. Ahora arrastra el elemento especial Pgina X de Y desde la librera hasta el pie de pgina. Observa:

24. La Librera contiene una serie de campos especiales que muestran cosas como el nmero de la pgina o la fecha actual. Elementos que suelen ser muy comunes en los informes. 25. Aprovecha la Librera para agregar en la parte derecha del pie la fecha actual. Arrastra el elemento Fecha actual a la zona del pie. Entonces vers como aparece un cuadro donde tendrs que elegir el formato de la fecha. Elige el formato completo.

26. El pie tiene que haber quedado ms o menos as:

27. Ahora visualice el informe y observe la parte inferior (si cambia el zoom al 50% podr tener una vista global del informe):

Ver que en la parte inferior aparece el nmero de la pgina y la fecha en el formato indicado.

28. Supongamos ahora que nos interesa tener una columna IVA en la que aparezca el 16% de IVA de cada una de las cantidades. Desgraciadamente, este campo no existe en la tabla servicios, de la que hemos extrado los datos. Sin embargo, es posible crear este campo directamente en la consulta SQL realizando el clculo. Active la opcin Datos Consulta del Informe para acceder a la consulta que introducimos al principio.

29. Cambie la consulta por la siguiente instruccin SELECT (respete maysculas y minsculas):
select Fecha, Tipo, Cantidad, Cantidad*0.16 as IVA from servicios order by fecha

Esta consulta SELECT muestra la Fecha, Tipo y Cantidad de los servicios, pero adems, ver que realiza un clculo: multiplica el campo Cantidad por 0.16 y le asigna al resultado del clculo el nombre IVA. Es decir, se crea un nuevo campo (campo calculado) llamado IVA y creado a partir del producto del campo Cantidad por 0.16
select Fecha, Tipo, Cantidad, Cantidad*0.16 as IVA from servicios order by fecha
Nombre del campo calculado

Clculo que se realiza

Los campos calculados es una caracterstica del lenguaje SQL que aprovecharemos para realizar clculos con los campos de las tablas.

30. Pulse Ok y observe la zona de campos. Ver como ha aparecido un nuevo campo llamado IVA. Tan solo tiene que agregarlo a la zona de detalle como si fuera un campo ms.

31. Por supuesto, sera interesante aadir un texto esttico en el encabezado de columnas:

32. Visualice el informe resultante:

33. Para hacer otro ejemplo de campos calculados, entre en la consulta del informe y modifique la instruccin SQL de forma que quede as:
select Fecha, Tipo, Cantidad, Cantidad*0.16 as IVA, IVA+Cantidad as Total from servicios order by fecha

En este caso, se est aadiendo otro campo calculado (en rojo) llamado Total. Este campo es la suma del IVA y la Cantidad. Es decir, es el total con Iva. 34. Al pulsar Ok observar en la zona de campos este nuevo campo. Aproveche esto para agregar una nueva columna con los totales con iva:

35. Visualice el informe. Debe tener este aspecto:

36. Hemos aprendido a agregar campos calculados a partir de otros campos, y aadirlos al listado. Ahora aprenderemos a realizar clculos de totales, o clculos resumen. Por ejemplo, sera interesante calcular la suma de todas las cantidades, todos los IVA y todos los totales ms IVA. Estos totales suelen aparecer en la parte final del listado. En la zona llamada Resumen (summary) 37. Empezaremos agregando en la zona summary una lnea corta:

38. Para agregar un total (una suma) se usa el elemento Total de la Librera. Haga clic en l y arrstrelo a la zona del resumen.

39. Aparecer un cuadro de dilogo donde tendr que indicar el campo que quiere sumar. Elija el campo Cantidad y acepte.

40. Aparecer un nuevo recuadro en el resumen. Colquelo al mismo nivel que la columna de la cantidad.

41. Haga el mismo proceso para calcular la suma del IVA y del Total. Al final, el diseo de la zona resumen debe tener el siguiente aspecto:

42. Los elementos situados en la zona del resumen aparecen al final del listado. Visualice el informe y observe la parte final del listado.

43. El informe est terminado. Gurdelo y cirrelo.

CONCLUSIN SQL permite la creacin de campos calculados a partir de otros campos en una consulta SELECT. Esta caracterstica es muy til por ejemplo en el caso de los informes, ya que nos permite mostrar clculos en ellos. iReport, adems, proporciona la posibilidad de realizar sumas totales de campos. Recuerde tambin el uso de las distintas zonas del informe: Title Ttulo: Usado para colocar el ttulo del informe. Aparece en la primera pgina nicamente. pageHeader Encabezado de pgina: En el se coloca aquello que deba aparecer en la parte superior de todas las pginas. columnHeader Encabezado de columna: Usado para colocar la cabecera del listado. Detail Detalle: Usado para colocar los datos (campos) columnFooter Pie de Columna: En el se coloca aquello que deba aparecer en la parte inferior del listado en todas las pginas. pageFooter Pie de pgina: En esta zona se coloca aquello que deba aparecer en la parte inferior de todas las pginas (menos la ltima, si est activado el lastPageFooter) Se usa para colocar el nmero de pgina. lastPageFooter Ultimo pie de pgina: Es el pie de pgina de la ltima pgina. Si se desactiva, entonces es sustituido por el pageFooter. Summary Resumen: Usado para colocar clculos de totales. Aparece al final del listado.

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Informes Agrupados Un informe agrupado se puede definir como varios listados en un mismo informe. Los elementos de cada listado tienen una caracterstica en comn, o, dicho de otra forma, pertenecen a un mismo grupo. Por ejemplo, si tuviera un listado de trabajadores, podra mostrar dicho listado agrupado segn profesin, y entonces tendramos el listado de albailes, el listado de profesores, el listado de policas, el listado de bomberos, etc... Es decir, el listado de trabajadores se dividira en grupos segn las distintas profesiones de los trabajadores. En esta hoja guiada se ver como realizar este tipo de listados.

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME AGRUPADO

1. Entra en iReport. 2. Crearemos un informe en el que aparezca el listado de servicios realizados. Usaremos el mago de informes para hacer este listado. Para ello active la opcin Fichero Mago de informes. 3. La conexin a usar ser Conexin con MANEMPSA. Y la consulta SQL ser la siguiente: select * from servicios order by tipo (Nota: observe que hemos ordenado la consulta por tipo. Luego ver por qu) Pulse el botn Prximo. 4. Los campos a aadir al listado sern: Nmero, Fecha, Tipo y Cantidad. Pulse el botn Prximo. 5. Ahora ya estamos en el paso tercero del asistente. En este paso tendremos que indicar la forma de agrupar el listado. En el desplegable grupo 1 indique el campo tipo. Esto significa que el listado saldr agrupado por tipo de servicio.

Pulse Prximo. 6. Elija una disposicin Tabulada del tipo Classic_T. Pulse Prximo y Terminar.

7. Aparecer el diseo del informe que acaba de crear. Observe que entre las zonas tpicas del informe ha aparecido una nueva zona de agrupamiento:

8. Visualice el informe y observe el resultado (al visualizarlo iReport le pedir que lo guarde. Gurdelo con el nombre serviciosagrupados):

Como ve, aparecen varios sub-listados. Un listado con los servicios de electricidad, otro con los servicios de fontanera, y otro con los servicios de limpieza. Tenemos un informe en grupos. NOTA: Es obligatorio que la consulta del informe est ordenada segn el campo por el que vayamos a agrupar. Esta es la razn por la que la consulta se orden por tipo.

9. Ahora se mejorar un poco el listado que se ha hecho. En primer lugar modifique el patrn del campo fecha, de forma que aparezca en formato da-mes-ao:

10. Tambin puede resultar interesante modificar el patrn de la Cantidad, de forma que aparezca con dos decimales:

11. Finalmente asigne el ttulo Listado de Servicios al informe. Este debe tener ahora el siguiente aspecto al visualizarlo:

NOTA: Es posible agregar distintos niveles de agrupamiento a un informe. Usando el ejemplo del inicio de esta hoja, podramos tener un listado de trabajadores agrupado por profesiones y por estado civil. En este caso, aparecera un grupo por cada profesin, y, cada grupo, estara a su vez subdividido en grupos segn el estado civil. Por ejemplo, el grupo de bomberos podra tener el siguiente aspecto: Bomberos Casados ------Solteros ------Etc... Para hacer esto basta con indicar varios campos en el paso de agrupamiento del asistente mago de informes. Pero tenga en cuenta que tendr que ordenar la consulta SELECT segn dichos campos. En el ejemplo de los trabajadores, la consulta podra tener este aspecto: select * from trabajadores order by profesin, estado Se anima al alumno que experimente con esta posibilidad.

CONCLUSIN Un informe agrupado es aquel en que los registros aparecen en distintos grupos. Los elementos de un grupo tienen la misma caracterstica. Se puede decir que un informe agrupado consiste en una serie de sub-listados. Para crear los grupos se toma como referencia el valor de un determinado campo. La mejor forma de crear un informe agrupado usando iReport es a travs del mago de informes, ya que este asistente muestra un paso donde se puede elegir el campo segn el que se quiere agrupar. No olvide que cuando quiera agrupar un listado por un campo es obligatorio que la consulta SELECT del informe ordene el listado por el campo por el que se quiere agrupar.

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Conexin con Informes desde Java Una vez creados los informes con iReport, tendremos que acceder a ellos desde nuestra aplicacin Java. En esta hoja guiada veremos los pasos bsicos necesarios para mostrar un informe desde una aplicacin Java. Nota: En esta hoja guiada se usar el informe creado en la hoja anterior, llamado serviciosagrupados.

EJERCICIO GUIADO N 1. CREACIN DEL INFORME COMPILADO

1. Entra en iReport y abra el informe serviciosagrupados (se encontrar en la carpeta Mis Documentos) Los ficheros que contienen un informe son ficheros del tipo .jrxml. As pues, en la carpeta Mis Documentos encontrar el fichero serviciosagrupados.jrxml, que es el que tiene que abrir.

(Nota: Si le echa un vistazo a la carpeta Mis Documentos, ver tambin un fichero llamado serviciosagrupados.bak. Este fichero es simplemente una copia de seguridad que se crea automticamente al guardar el informe.) 2. Vamos a ver el aspecto del informe. Pulse el botn: Ya sabe que este botn, llamado Ejecutar informe (usando conexin activa), permite visualizar el informe relleno con los datos de la base de datos, segn la consulta SQL que haya usado.

3. Sin embargo, este botn no solo sirve para visualizar el informe final, sino que adems acta como compilador, generando un fichero del tipo .jasper. Los ficheros .jasper son informes compilados, de forma que puedan ser usados en aplicaciones java. Cada vez que ha visualizado un informe, ha generado sin darse cuenta un fichero .jasper, con el nombre del informe que estaba visualizando. En nuestro ejemplo, acabamos de generar un fichero serviciosagrupados.jasper 4. Los ficheros .jasper generados se suelen almacenar dentro de la carpeta del programa iReport, sin embargo, nosotros configuraremos el programa iReport para que los ficheros compilados se almacenen directamente en la carpeta Mis Documentos, de forma que estn ms accesibles. Para ello, active la opcin Opciones Opciones:

5. En el cuadro de opciones que aparece active la pestaa Compilador.

6. En el primer recuadro que aparece se tiene que indicar el directorio donde aparecern los ficheros compilados. Para ello, pulse el botn Explorar y seleccione la carpeta Mis Documentos. Si todo va bien, el resultado ser parecido al siguiente:

7. Pulse el botn Grabar. A partir de ahora cada vez que visualice un informe el fichero compilado se guardar en la carpeta Mis Documentos. Lo vamos a comprobar. Vuelva a visualizar su informe: 8. Acuda a la carpeta Mis Documentos y compruebe que en ella hay ahora un fichero serviciosagrupados.jasper. Este es el fichero del informe compilado. Este fichero ser el que usar para visualizar informes desde java.

EJERCICIO GUIADO N 2. CONEXIN CON UN INFORME DESDE JAVA

1. Entra en NetBeans y crea un nuevo proyecto Java. El proyecto se llamar PruebaInformes y contendr un paqueteprincipal. Este paquete a su vez contendr una ventanaprincipal.

2. Crea la carpeta Base dentro de la carpeta del proyecto y copia en ella la base de datos MANEMPSA. 3. Prepara tu proyecto para que pueda acceder a la base de datos MANEMPSA (ya sabes, crear el objeto conexin, sentencia, etc...) 4. Para que nuestro programa sea capaz de presentar informes, crearemos una carpeta llamada Informes dentro de la carpeta del proyecto. Y dentro de dicha carpeta copiaremos los ficheros .jasper de los informes que queremos utilizar. En nuestro caso, copiaremos el fichero serviciosagrupados.jasper que creamos en el apartado anterior. Como ve, es algo parecido a lo que hacemos con la base de datos. As pues crea la carpeta Informes dentro de la carpeta de proyecto y copia el fichero serviciosagrupados.jasper dentro de ella. 5. Crea un botn en la ventana de tu proyecto. El botn contendr el texto Informe Agrupado y su nombre ser btnInformeAgrupado.

6. El objetivo es hacer que aparezca el informe serviciosagrupados cuando se pulse este botn. Para ello, programe lo siguiente en el actionPerformed del botn:

Este cdigo le muestra muchos errores, no se preocupe ahora de ellos. En los siguientes pasos se corregirn. De momento lo que se va a hacer es explicar el cdigo de este evento: Lo primero que observar es como se usa una variable rutaInforme para almacenar el camino del informe que queremos mostrar. Observa que dicho informe se especifica con el fichero .jasper generado con iReport, y que este fichero se encuentra dentro de la subcarpeta informes. A continuacin viene una lnea donde se crea un objeto informe del tipo JasperPrint:

JasperPrint informe = JasperFillManager.fillReport(rutainforme,null,conexin);

Esta lnea es la que genera el informe que se va a mostrar. El informe en java es un objeto del tipo JasperPrint y es creado a travs de otro objeto del tipo JasperFillManager. Es interesante que observes el uso de un mtodo llamado fillReport (rellenar informe) que se encarga de rellenar el informe con datos. Este mtodo necesita tres parmetros: El sitio donde se encuentra el fichero del informe. Los parmetros (Null en nuestro ejemplo. Los parmetros se estudiarn en prximas hojas guiadas) Y el objeto conexin, que le permite a java acceder a la base de datos para recoger los datos que se presentarn en el informe.

Una vez creado el objeto informe, solo tenemos que presentarlo en pantalla. Los informes se presentan a travs de un objeto del tipo JasperViewer. Los objetos JasperViewer son ventanas donde se muestran los informes.

JasperViewer ventanavisor = new JasperViewer(informe,false);

Esta lnea de cdigo crea una ventana llamada ventanavisor donde se muestra el informe informe. El parmetro false indica que al cerrarse la ventana del informe no debe acabar el programa. Si este parmetro fuera true, al cerrar la ventana del informe se cerrara el programa entero (esto no interesa).

El objeto ventanavisor es una ventana normal y corriente y puede ser visualizada con setVisible. Por otro lado, se le asigna el ttulo Informe de servicios con el mtodo setTitle. Todo este cdigo debe estar rodeado de un try...catch para evitar errores inesperados.

7. Todos los errores del cdigo se producen debido a que es necesario indicar los imports correspondientes a las clases JasperPrint, JasperFillManager, JasperViewer que participan en el cdigo. Un import es una lnea de cdigo que le dice a java en qu librera debe encontrar la clase correspondiente. Normalmente, al hacer clic sobre la lnea que da el error, aparece el icono de una bombilla pequea en la parte izquierda de la ventana. Al hacer clic sobre esta bombilla se nos informa de la librera que hace falta importar. Ya sabe que basta hacer clic sobre esta librera para que se aada la instruccin import correspondiente de forma automtica. Sin embargo, si prueba esto mismo con las lneas errneas del cdigo anterior, ver que no aparece ninguna bombilla. Esto es debido a que las libreras donde se encuentran las clases JasperPrint, JasperFillManager y JasperViewer no vienen incluidas en NetBeans, ya que son clases pertenecientes al programa iReport. As pues, NetBeans no sabe donde encontrar estas clases.

8. Para evitar este error, es necesario incluir en el proyecto una serie de libreras propias del programa iReport. Esto se hace de la siguiente forma: 9. Haga clic con el botn derecho del ratn sobre el apartado Bibliotecas de su proyecto y luego active la opcin Agregar archivo JAR/carpeta.

10. Debe acudir a la carpeta del programa iReport para buscar en ella las bibliotecas necesarias. Concretamente, la carpeta donde se encuentran estas bibliotecas es la siguiente: Archivos de programa JasperSoft iReport-2.0.1 lib

Archivos de programa JasperSoft iReport-2.0.1 lib

9. Los ficheros que contienen las libreras necesarias para este programa son lo siguientes: commons-collections-2.1, commons-logging-1.0.2 y jasperreports-2.0.1 Empezaremos aadiendo el fichero commons-collections-2.1. Seleccinelo y active Abrir:

10. Observar que se ha agregado el fichero a la zona de bibliotecas:

11. Repita el proceso para agregar los otros dos ficheros necesarios. Al final, su zona de Bibliotecas debe quedar as (observe los tres ficheros aadidos):

12. Gracias a la inclusin de estos ficheros, nuestro proyecto ya dispone de las libreras de clases que contienen a las clases que necesitamos, que recuerda que son: JasperPrint, JasperFillManager, JasperViewer Si ahora haces clic sobre la primera lnea que da error, ver como ahora NetBeans ya sabe el import que debe aadirse, y por tanto aparecer la bombilla. Pulse sobre la bombilla:

13. Tiene que agregar el import para la clase JasperFillManager: net.sf.jasperreports.engine.JasperFillManager 14. Ahora agregue el import para la clase JasperPrint: net.sf.jasperreports.engine.JasperPrint 15. Y finalmente agregue el import para la clase JasperViewer: net.sf.jasperreports.view.JasperViewer

16. Los errores han desaparecido. Ya puede ejecutar el programa. 17. Si pulsa sobre el botn Informe Agrupado aparecer el informe. El informe aparece en una ventana (el visor de informes objeto JasperViewer) que tiene una pequea barra de herramientas. En esta barra podr por ejemplo imprimir el informe, o cambiar su zoom, entre otras cosas:

Ventana visor de informes (JasperViewer) Herramientas: guardar, imprimir, zoom, etc...

18. Tal como se ha programado este botn, al pulsarse se visualiza el informe antes de que el usuario decida imprimirlo o no. En algunos casos, puede ser interesante que el informe se imprima directamente sin que se visualice antes. Veamos como hacer esto. Primero aada otro botn btnImprimirDirectamente a su ventana:

19. Ahora programe dentro de l lo siguiente:

El cdigo es similar al anterior, solo que se elimina todo uso del objeto JasperViewer (ventana visualizadora) ya que el informe ya no debe salir en pantalla. Adems se aade una nueva lnea:
JasperPrintManager.printReport(informe,true);

Esta lnea usa un objeto llamado JasperPrintManager que se encarga de imprimir el informe informe usando el mtodo printReport. Si el segundo parmetro tiene el valor true, entonces significa que aparecer el cuadro de dilogo de impresin:

Si estuviera a false, este cuadro de dilogo no aparecera y el informe se enviara directamente a la impresora configurada por defecto en el ordenador. En nuestro caso, al tener el valor true, este cuadro s aparecer. 20. Ejecute el programa y pruebe el nuevo botn. No hace falta que imprima el informe.

CONCLUSIN Para poder imprimir un informe creado con iReport desde una aplicacin Java es necesario agregar ciertas libreras pertenecientes al programa iReport: commons-collections-2.1, commons-logging-1.0.2 y jasperreports-2.0.1 Una vez agregadas estas libreras, el proceso para imprimir un informe es el siguiente: Crear un objeto del tipo JasperPrint (el informe) Crear un objeto visor (JasperViewer) que permita visualizar el informe. O bien imprimir directamente el informe con un objeto JasperPrintManager.

EJERCICIO GUIADO. JAVA. INFORMES CON PARMETROS

Conexin con Informes desde Java: Parmetros En la hoja guiada anterior se conect una aplicacin Java con un informe realizado con iReport. La aplicacin contaba con un botn que al ser pulsado mostraba el informe. Hay que tener en cuenta que los datos que se muestran en el informe dependen del contenido de la base de datos. Es decir, si se aaden nuevos registros a las tablas, estos registros aparecern en el informe (no ser necesario modificarlo de alguna forma) Sin embargo, esta forma de trabajar puede ser poco interesante, ya que el usuario no tiene ningn control sobre el informe que se muestra. En la hoja guiada anterior el informe mostraba todos los servicios agrupados por tipo, pero, y si el usuario quisiera en un determinado momento que solo se mostraran los servicios anteriores a una fecha, o que se mostraran los servicios que costaran ms de una cantidad, etc... El problema est en que la consulta SQL del informe es una consulta fija, y siempre sacar los mismos datos. El usuario de nuestro programa no tiene forma de modificar esa consulta para cambiar los datos deben aparecer en el informe. Para poder hacer esto, es necesario usar parmetros en la consulta SQL del informe. Un parmetro se podra definir como dato de la consulta que no est definido an. Es necesario definir ese dato antes de ejecutar la consulta y extraer los datos que se mostrarn. Puede ser el usuario de nuestro programa el que aporte ese dato que le falta a la consulta, de manera que as tenga cierto control sobre la informacin que aparece en el listado. En esta hoja se ver un ejercicio paso a paso de uso de parmetros en la consulta de informe, y de esta manera entender la utilidad de esta caracterstica.

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME CON PARMETROS

1. Entra en iReport y abre el informe llamado serviciosjuan, realizado en una de las ltimas hojas guiadas. Este informe, concretamente, fue construido desde cero y mostraba los servicios del trabajador Juan Prez:

2. Visualzalo para recordar su aspecto:

3. Este informe tiene un gran diseo pero est muy limitado, ya que solo es capaz de mostrar el listado de servicios realizados por el trabajador Juan Prez (DNI 12.321.567-B) Si quisiramos sacar el listado de servicios de otro trabajador, este informe no nos servira. Es necesario hacer que este informe sea ms verstil, que sea capaz de mostrar el listado de servicios de cualquier trabajador. Para ello, ser necesario crear un parmetro en la consulta SQL. 4. Acceda a la consulta del informe a travs de la opcin Datos Consulta de informe y obsrvela:

La consulta SQL extrae informacin de aquellos servicios que hayan sido realizados por el trabajador con DNI 12.321.567-B.

5. Cambie la consulta para que quede as:

Lo que acaba de aadir es un parmetro llamado DNI. Observe su estructura: $P{nombredelparmetro} En nuestro caso el nombre que le hemos dado al parmetro es DNI, por lo tanto el parmetro es: $P{DNI} Este parmetro indica que el DNI no est definido an. Ser el usuario el que introduzca el DNI segn el cual habr que consultar en la base de datos.

6. Pulse OK. Cada vez que use un parmetro hay que definirlo en el programa iReport. Esto se hace en la zona de campos. Observa que tenemos tambin una zona de parmetros:

7. En la carpeta de parmetros haz clic con el botn derecho del ratn e indica la opcin Add Parameter para aadir un nuevo parmetro:

8. En la ventana que aparece debes indicar el nombre que le has dado al parmetro. En nuestro caso, el nombre asignado es DNI:

9. Ahora ya tiene definido un parmetro que se corresponde con el DNI del trabajador. El usuario introducir ese DNI y ser sustituido en la consulta SQL. Si intenta visualizar el informe, no podr ver nada, ya que el parmetro no tiene ahora ningn valor. Al visualizar el informe aparecer el siguiente mensaje:

10. En cualquier caso, se tiene que haber generado el fichero .jasper correspondiente. Si el iReport sigue configurado tal como se hizo en la hoja guiada anterior, dicho fichero se tiene que haber guardado en Mis Documentos con el nombre serviciosjuan.jasper. Este fichero lo usar en el siguiente ejercicio.

11. Cierre iReport, guarde los cambios y pase al siguiente ejercicio.

EJERCICIO GUIADO N 2. USO DE PARMETROS DE UN INFORME DESDE JAVA

1. Abra la aplicacin Java que realiz en la hoja guiada anterior. Aada en su ventana un nuevo botn y un cuadro de texto. El botn se llamar btnServiciosTrabajador y el cuadro de texto se llamar txtDNI.

2. El objetivo es hacer que el usuario introduzca un DNI en el cuadro de texto DNI y que al pulsar el botn Servicios del Trabajador aparezca un informe con el listado de servicios del trabajador con el DNI introducido. Para hacer esto es necesario que el DNI introducido en el cuadro de texto txtDNI se traslade directamente al informe creado anteriormente y se coloque en la posicin del parmetro. Entonces la consulta SQL del informe se completar y se podr rellenar el informe con los datos correctos. 3. De momento copie el fichero serviciosjuan.jasper dentro de la carpeta informes de su carpeta de proyecto. 4. Nota Importante: Recuerde que el informe contiene una imagen proporcionada por el fichero nenfares.jpg. Para que el informe funcione correctamente es necesario que copie este fichero directamente en la carpeta de su proyecto (no dentro de la carpeta informes) 5. Ahora programe el siguiente cdigo en el actionPerformed del botn Servicios Trabajadores.

Estudiemos con detenimiento este cdigo. En l ver dos lneas nuevas en las que se definen los valores de los parmetros:

Map parametros = new HashMap(); parametros.put(DNI,txtDNI.getText());

En la primera de estas dos lneas se define un objeto de tipo Map. Este objeto contendr el nombre de cada parmetro que usar y el valor de dicho parmetro. Observe la segunda lnea, en ella se define el parmetro llamado DNI y se le asigna a l el valor del cuadro de texto del DNI, es decir, el DNI que haya escrito el usuario. Si existieran ms parmetros habra que definirlos de la misma forma, por ejemplo: parametros.put(sueldo,txtSueldo.getText()); parametros.put(codigo,A-54); En este cdigo ficticio se crea un parmetro sueldo al que se le asigna el valor de un cuadro de texto txtSueldo. Y se crea un parmetro codigo al que se le asigna el valor A-54. En nuestro caso solo necesitamos usar un parmetro llamado DNI. Hay que tener en cuenta que el nombre del parmetro debe ser el mismo que el nombre usado en iReport.

La siguiente lnea es la que crea el objeto informe (JasperPrint) Esta lnea crea el informe a partir del fichero de informe compilado serviciosjuan.jasper, a partir de la base de datos (representada por el objeto conexin) y lo ms interesante ahora es que se indica el conjunto de parmetros a travs del objeto parametro creado antes.
JasperPrint informe = JasperFillManager.fillReport(rutaInforme,parametros,conexion);

Cuando el informe que se va a mostrar no tiene parmetros, entonces se usa el valor null, en caso contrario, se usa el objeto parmetro (Map)

El resto del cdigo es igual que los anteriores, se crea el visor de informe conteniendo el informe y se muestra en pantalla.

6. Ejecute el programa y pruebe a introducir un DNI existente en el cuadro de texto del DNI. Si escribi correctamente el DNI, podr ver el listado de servicios realizados por el trabajador con dicho DNI. Como puede observar, ahora ya puede visualizar los datos de los servicios de cualquier trabajador y no solo del trabajador Juan Prez. El uso de parmetros en los informes da potencia y versatilidad a las aplicaciones, y es algo muy usado.

Trabajos realizados por Ana Ruiz

NOTA En los ejemplos guiados que se acaban de proponer, se usa una consulta SQL de informe que contiene un parmetro equivalente a un dato. Concretamente, a un DNI. Este dato forma parte de una condicin. Observa la consulta SELECT del informe que hemos usado:
parmetro
select * from trabajadores, servicios where trabajadores.dni=servicios.dni and trabajadores.dni=$P{DNI} order by servicios.fecha

Condicin

En este caso, el DNI ser proporcionado por la aplicacin java y la condicin se completar. Sin embargo, hay que indicar que tambin se pueden crear parmetros que sustituyan a una condicin completa, en vez de a un solo dato. Observa el siguiente ejemplo:
select * from trabajadores, servicios where trabajadores.dni=servicios.dni and $P!{COND} order by servicios.fecha

En este caso, el parmetro se llama COND y no sustituye a un simple dato, sino que sustituye a toda la condicin. En este caso, la aplicacin java mandar una cadena que tenga forma de condicin SQL, como por ejemplo: trabajadores.sueldo > 200, que ser reemplazada en el lugar del parmetro.

Para que lo vea claro, el cdigo a usar en la aplicacin java para dar valor al parmetro podra ser como sigue:
Map parametros = new HashMap(); parametros.put(COND, trabajadores.sueldo>200);

Observa que el valor del parmetro es una condicin entera. Cuando se quiera usar un parmetro que represente a un dato, se usar la siguiente sintaxis: $P{nombreparmetro} Cuando se quiera usar un parmetro que represente a una condicin, se usar la siguiente sintaxis: $P!{nombreparmetro} (Observa el uso de la admiracin !)

CONCLUSIN Cuando un informe tiene una instruccin SQL invariable, siempre mostrar los mismos datos. Puede resultar interesante que parte de la instruccin SQL del informe pueda variar, de forma que se pueda extraer distinta informacin segn el dato que vara. Estos datos variantes se denominan parmetros. Un parmetro puede referirse a un dato concreto, o a una condicin. Si el parmetro se refiere a un dato concreto, entonces tiene la siguiente forma: $P{nombre} Si el parmetro se refiere a una condicin, entonces tiene la siguiente forma: $P!{nombre} El parmetro debe ser sustituido por un valor que es proporcionado desde la aplicacin java, y es entonces cuando la instruccin SQL se completa y se ejecuta. En la aplicacin java es necesario crear un objeto de tipo Map que contenga los distintos parmetros con los valores de cada uno para luego enviar este objeto al informe que se quiere mostrar. El uso de parmetros en informes hace que estos sean mucho ms verstiles y que el programa tenga ms posibilidades.

EJERCICIO GUIADO. JAVA. CARPETA DISTRIBUIBLE

Distribucin e Instalacin de programas en Java Una vez que se ha finalizado el programa, debemos prepararlo para la instalacin en el ordenador del cliente. Para ello, es necesario tener en cuenta todos aquellos ficheros externos que han sido necesarios para la programacin de la aplicacin: base de datos, imgenes, informes, etc... A continuacin se indican las cosas a tener en cuenta a la hora de realizar una distribucin de nuestro proyecto.

1. En primer lugar es necesario pulsar el botn Limpiar y construir proyecto principal. Este botn compila el programa y crea una carpeta llamada dist dentro de la carpeta del proyecto, la cual ser la carpeta distribuible.

(Si hubiera un error de compilacin el proceso se detendra y aparecera un mensaje de error)

2. Si realiza esta operacin con alguno de sus proyectos, puede acudir a la carpeta del proyecto y observar la existencia de la carpeta dist:

3. Entre dentro de esta carpeta y observe su contenido:

4. Observar la existencia de un fichero con extensin .jar. Este fichero se puede decir que es el ejecutable del programa. El fichero .jar contiene todas las clases que ha programado en su proyecto. Debe recordar que los programas java pueden ejecutarse en cualquier entorno. Por ello, los ejecutables java no tienen una extensin .exe la cual es propia de los entornos Windows. Para que un ejecutable .jar pueda ser ejecutado en un determinado sistema, debe estar instalado en l la mquina virtual de java.

5. Aparte del fichero ejecutable (.jar) el cual tendr el nombre del proyecto, ver tambin una carpeta lib. Esta carpeta contendr aquellas libreras adicionales que se hayan incluido en el proyecto. 6. Bases de datos. Si su programa usa una base de datos, entonces ser necesario copiar dicha base de datos en la carpeta del distribuible. Si suele crear una carpeta para la base de datos, entonces copie la carpeta con la base de datos en la carpeta distribuible:

7. Imgenes, Iconos. Si est usando imgenes en su programa (para la presentacin, los iconos de los botones de las barras de herramientas, etc.) tendr que introducir los ficheros de estas imgenes dentro de la carpeta distribuible. Si es ordenado, todas estas imgenes estarn dentro de una misma carpeta (llamada por ejemplo imgenes) As pues, copie la carpeta que contiene las imgenes que est usando dentro la carpeta distribuible:

8. Informes. Si su programa usa informes, es necesario que los ficheros de estos estn dentro de la carpeta del distribuible. Los ficheros de informes necesarios para el funcionamiento del programa son los ficheros compilados .jasper. Los dems no son necesarios incluirlos. Estos ficheros estarn normalmente dentro de una carpeta llamada Informes, si es usted ordenado. En ese caso, copie la carpeta con los informes dentro de la carpeta del distribuible, la cual quedara ahora as:

9. Imgenes de informes. Si los informes del programa usan imgenes, la situacin de estas en la carpeta distribuible depende de la forma en que haya configurado dichas imgenes en el iReport. Normalmente, al crear una imagen en el informe, asignamos simplemente el nombre del fichero de imagen, suponiendo que la imagen se encontrar en la misma carpeta que el informe:

En este ejemplo, el informe usa un fichero de imagen llamado logo.jpg que se encuentra en la misma carpeta que donde se ha guardado el informe.

10. Si estamos ante este caso, para que funcione los informes con imgenes de su programa es necesario que introduzca las imgenes de los informes directamente en la carpeta distribuible. En nuestro ejemplo la carpeta distribuible quedara as:

11. Sin embargo, para mantener una cierta organizacin de la carpeta distribuible, sera interesante que las imgenes de los informes estuvieran tambin dentro de la carpeta Imgenes. Si quisiera hacer esto, tendra que modificar sus informes con imgenes de forma que se indicara la carpeta donde estar cada imagen. En nuestro ejemplo, la imagen del informe se tendra que haber configurado as:

Se indica que las imagen logo.jpg estar dentro de una subcarpeta Imgenes.

12. Si modifica sus informes con imgenes de esta forma y los recompila, entonces podr organizar su carpeta distribuible de esta manera:

La carpeta Informes contiene los .jasper

La carpeta Imagenes contiene todas las imgenes del programa as como las imgenes usadas por los informes.

13. Una vez incluidos todos estos elementos ya tendremos la carpeta distribuible completada. Solo tiene que copiar la carpeta dist en un CD, USB o disquete para trasladarla al ordenador del cliente. Si quiere, puede cambiarle el nombre a dicha carpeta. Antes de hacer esto, se recomienda que compruebe que el programa funciona, ejecutando el fichero .jar de dicha carpeta. Compruebe que la ubicacin de la base de datos, los informes y las imgenes es la correcta.

14. Para la instalacin del programa en el ordenador del cliente, solo tiene que copiar la carpeta distribuible en el disco duro del ordenador del cliente. Se recomienda que lleve la mquina virtual de java propia del sistema operativo del cliente por si este no la tuviera instalada en su ordenador. Si este fuera el caso, se tendra que instalar para que el proyecto pudiera ejecutarse.

CONCLUSIN NetBeans permite crear una carpeta llamada dist la cual ser la que copiaremos en el ordenador del cliente. Basta que el cliente tenga instalada la mquina virtual de java para que nuestro proyecto funcione. La instalacin consistir bsicamente en copiar la carpeta dist al ordenador del cliente, y en instalar la mquina virtual de java en el caso de que el cliente no la tenga instalada. A la hora de crear la carpeta dist debe tener en cuenta que debe aadir la base de datos, los informes y las imgenes del proyecto, si es que este usa alguno de dichos elementos.

EJERCICIO GUIADO. JAVA. INSTALABLE.

Instalacin de programas Java Se ha visto en la hoja guiada anterior que para trasladar el programa java realizado al ordenador del cliente basta con crear una carpeta distribuible. Esta carpeta contiene el fichero ejecutable .jar que permite ejecutar el programa. El ordenador del cliente debe tener instalada la mquina virtual de java para que nuestro programa funcione. Una vez instalada la mquina virtual de java en el ordenador del cliente, basta con copiar la carpeta distribuible en su disco duro. Aunque este proceso es muy sencillo, puede suceder que el cliente no sea capaz de realizarlo, en el caso de que carezca de conocimientos informticos bsicos. En este caso, podra ser interesante automatizar la instalacin del programa a travs de un fichero de instalacin. En esta hoja guiada se ver como crear un instalable para un programa java, usando un programa llamado iZpack.

Qu es IZPACK IZPack es una aplicacin que nos permite crear un fichero de instalacin a partir de una aplicacin escrita en java. Esto nos permite que nuestras aplicaciones Java sean ms fciles de distribuir e instalar. IZPack crea un fichero .jar, que contiene todos los ficheros necesarios del programa. Basta con ejecutar este fichero para que el programa java que ha creado se instale. El programa IZPack se proporciona en la carpeta Herramientas de la carpeta compartida del curso, aunque puedes bajarte la ltima versin de forma gratuita desde esta pgina web: http://www.izforge.com/izpack/ Antes de empezar con esta hoja guiada instala el programa IZPack en tu ordenador. El programa se instalar en la carpeta Archivos de Programa/Izpack, a no ser que se escoja otro lugar. Dentro de la carpeta Izpack encontrar otra carpeta llamada Bin, y dentro de esta encontrar un fichero .bat llamado compile que ser el que use para crear los instalables.

Creacin de un Instalable con IZPack. PREPARACIN.

1. Lo primero que debes hacer es crear la carpeta Distribuible (dist) de tu programa si es que no la has creado ya. Para ello debes abrir tu proyecto en NetBeans y seguir los pasos que se indicaron en la hoja guiada anterior. 2. Una vez creada la carpeta del Distribuible, crea un fichero usando el Bloc de Notas llamado Licencia.txt. Este fichero debe contener la licencia de uso del programa. Este fichero lo guardars en la carpeta Distribuible. 3. Ahora crea usando el Bloc de Notas un fichero llamado Leeme.txt. Aqu introducirs algn comentario sobre tu proyecto que consideres til para el cliente. Por ejemplo datos de contacto (telfono, email), informacin sobre la versin del programa o cualquier otra informacin que consideres interesante. Este fichero tambin lo guardars en la carpeta Distribuible. 4. Busca un icono para tu programa y almacnalo tambin en la carpeta del Distribuible. Este fichero ser del tipo ico (fichero de icono) y se guardar con el nombre icono.ico en la carpeta del Distribuible. 5. Una vez creados estos dos ficheros de texto, tiene que crear un nuevo fichero llamado install.xml. Este fichero lo crear usando el Bloc de Notas en la carpeta Distribuible. El contenido de este fichero estar escrito en un lenguaje llamado XML y ser el siguiente (no se preocupe si no entiende el contenido, solo fjese en los textos remarcados):

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?> <installation version="1.0"> <info> <appname>Nombre del Programa</appname> <appversion>Versin</appversion> <authors> <author name="Juan Prez" email="juanperez@hotmail.com"/> </authors> <url>http://www.mipagina.es/</url> </info>

<guiprefs width="640" height="480" resizable="no"/>

<locale> <langpack iso3="spa"/> </locale> <native type="izpack" name="ShellLink.dll" />

<resources> <res id="LicencePanel.licence" src="Licencia.txt"/> <res id="InfoPanel.info" src="Leeme.txt"/> <res src="shortcutSpec.xml" id="shortcutSpec.xml"/> </resources>

<panels> <panel <panel <panel <panel <panel <panel <panel <panel </panels>

classname="HelloPanel"/> classname="InfoPanel"/> classname="LicencePanel"/> classname="TargetPanel"/> classname="PacksPanel"/> classname="InstallPanel"/> classname="ShortcutPanel" /> classname="SimpleFinishPanel"/>

<packs> <pack name="Ficheros del Programa" required="yes"> <description>Ficheros y Carpetas del Programa</description> <file src="lib" targetdir="$INSTALL_PATH"/> <file src="base" targetdir="$INSTALL_PATH"/> <file src="informes" targetdir="$INSTALL_PATH"/> <file src="imagenes" targetdir="$INSTALL_PATH"/> <file src="gestion.jar" targetdir="$INSTALL_PATH"/> <file src="icono.ico" targetdir="$INSTALL_PATH"/> </pack> </packs> </installation>

6. El fichero install.xml que acaba de crear en el punto anterior es siempre igual. Solo tiene que cambiar una serie de datos (los marcados en verde), tal como se indica a continuacin: Datos del programador. En la primera parte del fichero se indican los datos del programador y del programa. Observe:
Pon aqu el nombre de tu programa. <info> <appname>Nombre del Programa</appname> <appversion>Versin</appversion> Y aqu la versin <authors> <author name="Juan Prez" email="juanperez@hotmail.com"/> </authors> <url>http://www.mipagina.es/</url> </info> Escribe aqu tu nombre, y tu email Y tu pgina web

Carpetas de tu programa. En la parte final del fichero tendrs que indicar las carpetas que forman tu programa (es decir las carpetas que contiene la carpeta distribuible) Observa:

<packs> <pack name="Ficheros del Programa" required="yes"> <description>Ficheros y Carpetas del Programa</description> <file src="lib" targetdir="$INSTALL_PATH"/> <file src="base" targetdir="$INSTALL_PATH"/> <file src="informes" targetdir="$INSTALL_PATH"/> <file src="imagenes" targetdir="$INSTALL_PATH"/> <file src="gestion.jar" targetdir="$INSTALL_PATH"/> <file src="icono.ico" targetdir="$INSTALL_PATH"/> </pack> </packs> En este ejemplo se supone que la carpeta distribuible (dist) contiene: Tendr que indicar tambin el nombre del fichero executable de su programa, el - Una carpeta de librera (lib) cual se encuentra tambin dentro de la - Una carpeta para la base de carpeta distribuible. En este ejemplo se datos (base) supone que el fichero se llama - - Una carpeta para los informes gestion.jar. Escriba usted el nombre de (informes) su programa. - Una carpeta para las imgenes (imgenes) Y este es el fichero de icono que ha introducido en la carpeta distribuible. Usted tendr que indicar el nombre que le haya dado a sus subcarpetas.

7. Ahora tiene que aadir un nuevo fichero dentro de la carpeta Distribuible que configura la creacin de accesos directos en el men inicio cuando el programa se instala en Windows. Este fichero se llamar shortcutSpec.xml. Este fichero tiene el siguiente contenido (no es necesario que lo entienda, solo fjese en los elementos resaltados):

<?xml version="1.0" encoding="ISO-8859-1"?> <shortcuts> <programGroup defaultName="Nombre del Programa" location="startMenu" /> <shortcut name="Nombre del Acceso Directo" target="$INSTALL_PATH\gestion.jar" workingDirectory="$INSTALL_PATH" iconFile="$INSTALL_PATH\icono.ico" programGroup="yes" desktop="yes" startMenu="no" />

<shortcut name="Desinstalar Taller Mecnico" target="$INSTALL_PATH\uninstaller\uninstaller.jar" workingDirectory="$INSTALL_PATH" iconFile="$INSTALL_PATH\icono.ico" startMenu="no" programGroup="yes" /> </shortcuts>

8. Debes crear este fichero con el contenido anterior tal cual. Siempre es igual. Solo tienes que variar los elementos seleccionados en verde tal como se indica a continuacin:

<programGroup defaultName="Nombre del Programa" location="startMenu" /> <shortcut name="Nombre del Acceso Directo" target="$INSTALL_PATH\gestion.jar" workingDirectory="$INSTALL_PATH" iconFile="$INSTALL_PATH\icono.ico" programGroup="yes" desktop="yes" startMenu="no" En la parte inicial debes indicar el nombre de /> tu programa, el nombre que le quieras dar al acceso directo, el fichero ejecutable .jar de tu programa (aqu suponemos que se llama gestion.jar, tu tendrs que averiguar como se llama el tuyo) y el nombre del fichero de icono.

<shortcut name="Desinstalar Taller Mecnico" target="$INSTALL_PATH\uninstaller\uninstaller.jar" workingDirectory="$INSTALL_PATH" iconFile="$INSTALL_PATH\icono.ico" startMenu="no" programGroup="yes" /> Esta parte crea un icono para desinstalar el </shortcuts> programa. Debes indicar el nombre que le quieres dar a este acceso directo. Aqu lo hemos nombrado Desinstalar Taller Mecnico, porque el programa gestiona un taller. En vuestro caso tendris que indicar el nombre adecuado segn vuestro programa.

Creacin de un Instalable con IZPack. GENERACIN DEL INSTALABLE.

1. Una vez realizados los pasos anteriores (siempre son los mismos) hay que generar el fichero Instalable. Para ello debes entrar en el smbolo del sistema.

2. Debes acceder a la carpeta del programa IZPack. Para ello, debes ejecutar el siguiente comando MS-DOS:
CD C:\ARCHIVOS DE PROGRAMA\IZPACK

El resultado ser que acceders a la carpeta del programa IZPACK:

3. Una vez dentro de la carpeta del programa IzPack, debes ejecutar el siguiente comando:
bin\compile camino\carpeta\install.xml -b camino\carpeta

Donde camino\carpeta es el camino de la carpeta distribuible de tu proyecto. Por ejemplo, supongamos que tienes la carpeta distribuible llamada dist en una carpeta llamada proyectos en el disco duro. (c:\proyectos\dist) Entonces tendras que indicar el siguiente comando para crear el instalable:
bin\compile c:\proyectos\dist\install.xml -b c:\proyectos\dist

4. Al ejecutar este comando, se generar un fichero llamado install.jar dentro de la carpeta distribuible. Este es el fichero de instalacin. 5. Si ejecuta este fichero aparecer un programa de instalacin que le guiar a travs de varios pasos por la instalacin de su programa. El resultado ser que instala su programa en el men inicio e incluso, si activa la opcin correspondiente durante la instalacin, se crear un acceso directo en el escritorio a su programa.

Creacin de un Instalable con IZPack. DISTRIBUCIN DEL INSTALABLE.

1. Una vez creada la carpeta de distribucin con el fichero install.jar dentro de ella, solo hay que guardar esta carpeta en un CD y entregrselo al cliente. 2. El cliente solo tiene que introducir el CD, entrar dentro de l y ejecutar con un doble clic el fichero de instalacin install.jar. Y el programa se instalar automticamente. 3. Es necesario que el cliente tenga instalada la mquina virtual de java en su ordenador para que la instalacin sea posible. Por eso es recomendable incluir en el CD la mquina virtual de java para que el usuario pueda instalarla tambin antes de instalar su programa.

CONCLUSIN La distribucin de un programa java es tan sencilla como copiar la carpeta distribuible dist en el ordenador del cliente. Sin embargo, si el cliente carece de conocimientos bsicos de informtica podemos crear un fichero de instalacin dentro de la carpeta distribuible para que el usuario solo tenga que entrar dentro de ella y hacer doble clic sobre el fichero de instalacin. Para generar el fichero de instalacin, es necesario usar un programa llamado IZPACK. Se introducirn varios ficheros dentro de la carpeta distribuible, necesarios para la creacin del instalable, y luego se generar el instalador. Una vez creado el instalador dentro de la carpeta distribuible, esta se copiar en un CD y se pasar al cliente. Es recomendable que el CD contenga la mquina virtual de java para que el cliente tambin la pueda instalar. Hay que tener en cuenta que si el cliente no tiene instalada la mquina virtual de java no se podr realizar la instalacin del programa.

Вам также может понравиться