Академический Документы
Профессиональный Документы
Культура Документы
Ingenieroensistemas.blogspot.com Ingenieroensistemas.com
INDICE
EJERCICIO GUIADO. JAVA: CUADROS DE VERIFICACIN .................................................................. 8 EJERCICIO GUIADO. JAVA: BOTONES DE OPCIN.......................................................................... 12 EJERCICIO GUIADO. JAVA: CUADROS DE LISTA ............................................................................. 21 EJERCICIO GUIADO. JAVA: CUADROS COMBINADOS ..................................................................... 28 EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA ......................................................... 35 EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA ......................................................... 42 EJERCICIO GUIADO. JAVA: TOGGLEBUTTONS................................................................................ 48 EJERCICIO GUIADO. JAVA: SLIDERS ............................................................................................... 57 EJERCICIO GUIADO. JAVA: SPINNER.............................................................................................. 65 EJERCICIO GUIADO. JAVA: SCROLLBARS ....................................................................................... 72 EJERCICIO GUIADO. JAVA: BARRA DE MENUS ............................................................................... 82 EJERCICIO GUIADO. JAVA: BARRA DE HERRAMIENTAS.................................................................. 93 EJERCICIO GUIADO. JAVA: MENUS EMERGENTES ....................................................................... 100 EJERCICIO GUIADO. JAVA: FILECHOOSER .................................................................................... 106 EJERCICIO GUIADO. JAVA: PANELES DE DESPLAZAMIENTO ......................................................... 115 EJERCICIO GUIADO. JAVA: VARIABLES GLOBALES ....................................................................... 127 EJERCICIO GUIADO. JAVA: CENTRALIZAR CDIGO ...................................................................... 135 EJERCICIO GUIADO. JAVA: LAYOUTS ........................................................................................... 148 EJERCICIO GUIADO. JAVA: LAYOUTS Y PANELES .......................................................................... 165 EJERCICIO GUIADO. JAVA: DILOGOS ......................................................................................... 180 EJERCICIO GUIADO. JAVA: DISEO DE FORMULARIOS DESDE CDIGO ....................................... 199 EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO .................................................................. 222 Programacin de eventos .......................................................................................................... 223 PROGRAMACIN DE EVENTOS DE ACCIN ............................................................................. 225 Eventos .............................................................................................................................. 225 actionPerformed ................................................................................................................ 225 EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO. EVENTOS DE RATN................................. 237
Como enlazar eventos de ratn con un componente ................................................................. 239 EJERCICIO GUIADO ................................................................................................................. 242 EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO. IDEAS GENERALES .................................... 249 Ejemplo 1. Eventos del Ratn ..................................................................................................... 251 Ejemplo 2. Eventos del teclado .................................................................................................. 252 EJERCICIO GUIADO. JAVA: VECTORES ......................................................................................... 257 EJERCICIO GUIADO. JAVA: VECTORES Y EVENTOS ....................................................................... 276 EJERCICIO GUIADO. JAVA: INTRODUCCIN A LA POO ................................................................. 283 EJERCICIO GUIADO. JAVA: POO. CLASES PROPIAS ....................................................................... 294 CASO PRCTICO: MULTICINES AVENIDA ..................................................................................... 297 EJERCICIO PRCTICO .................................................................................................................. 306 EJERCICIO GUIADO. JAVA: POO. PROGRAMACIN DE UNA CLASE .............................................. 308 PROGRAMACIN DE UNA CLASE ................................................................................................ 311 EJERCICIOS RECOMENDADOS..................................................................................................... 333 EJERCICIO GUIADO. JAVA: POO. USAR CLASES PROPIAS EN UN PROYECTO ................................. 338 EJERCICIO GUIADO. JAVA: POO. HERENCIA ................................................................................ 362 EJERCICIO GUIADO. JAVA: POO. HERENCIA. DIALOGOS PROPIOS................................................ 390 EJERCICIO GUIADO. JAVA: POO. REUTILIZACIN DE CDIGO ...................................................... 406 EJERCICIO GUIADO 2 .................................................................................................................. 417 EJERCICIO GUIADO. JAVA: PROGRAMACIN MDI ....................................................................... 429 EJERCICIO GUIADO. JAVA: PROGRAMACIN MDI CONTINUACIN ............................................. 449 EJERCICIO GUIADO. BASES DE DATOS ......................................................................................... 458 Entidad Clientes ......................................................................................................................... 468 Entidad Trabajadores ................................................................................................................. 468 Entidad Servicios ........................................................................................................................ 468 Entidad Coches .......................................................................................................................... 468 Entidad Servicios ........................................................................................................................ 470 Entidad Trabajadores ................................................................................................................. 475
Entidad Coches .......................................................................................................................... 475 Entidad Trabajadores ................................................................................................................. 476 Entidad Servicios ........................................................................................................................ 476 Entidad Servicios ........................................................................................................................ 476 Entidad Clientes ......................................................................................................................... 476 Entidad Coches .......................................................................................................................... 477 Entidad Trabajadores ................................................................................................................. 477 Entidad Servicios ........................................................................................................................ 477 Entidad Clientes ......................................................................................................................... 478 EJERCICIO GUIADO. BASES DE DATOS. Relaciones Muchas a Muchas ......................................... 492 EJERCICIO GUIADO. BASES DE DATOS. ACCESS ........................................................................... 510 EJERCICIO GUIADO. BASES DE DATOS. CONSULTAS EN ACCESS .................................................. 546 Criterios para campos numricos ........................................................................................... 570 Criterios para campos de tipo Fecha/Hora.............................................................................. 573 Criterios para campos de tipo Texto o Memo ......................................................................... 574 Criterios complejos ................................................................................................................ 575 EJERCICIO GUIADO. BASES DE DATOS. SQL ................................................................................. 579 Operadores Relacionales........................................................................................................ 587 Operadores Lgicos................................................................................................................ 590 Forma de indicar los valores ................................................................................................... 591 Valores numricos.............................................................................................................. 591 Valores de texto ................................................................................................................. 591 Valores de fecha................................................................................................................. 592 Forma de indicar los campos .................................................................................................. 593 EJERCICIO GUIADO. BASES DE DATOS. SQL ................................................................................. 609 Alta de registros en SQL ............................................................................................................. 611 Modificacin de registros en SQL ............................................................................................... 620 Eliminacin de registros en SQL ................................................................................................. 625
EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS ................................................................ 630 EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS ................................................................ 667 EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS ................................................................ 719 EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS ................................................................ 734 EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS .......................................................... 855 EJERCICIO GUIADO N 1. INSTALACIN DE IREPORT ................................................................... 857 Definicin de DSN .................................................................................................................. 858 EJERCICIO GUIADO N 3. CONEXIN DE IREPORT CON UNA BASE DE DATOS .............................. 867 EJERCICIO GUIADO N 4. CREACIN RPIDA DE INFORMES ........................................................ 876 EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS .......................................................... 889 EJERCICIO GUIADO N 1. CREACIN Y MODIFICACIN DE UN INFORME..................................... 890 EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS .......................................................... 908 EJERCICIO GUIADO N 1. CREACIN DE UN INFORME DESDE CERO ............................................ 909 EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS .......................................................... 939 EJERCICIO GUIADO N 1. CREACIN DE UN INFORME CON CLCULOS ....................................... 940 EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS .......................................................... 965 EJERCICIO GUIADO N 1. CREACIN DE UN INFORME AGRUPADO ............................................. 966 EJERCICIO GUIADO N 1. CREACIN DEL INFORME COMPILADO ................................................ 974 EJERCICIO GUIADO N 2. CONEXIN CON UN INFORME DESDE JAVA ......................................... 979 EJERCICIO GUIADO. JAVA. INFORMES CON PARMETROS .......................................................... 991 EJERCICIO GUIADO N 1. CREACIN DE UN INFORME CON PARMETROS .................................. 993 EJERCICIO GUIADO N 2. USO DE PARMETROS DE UN INFORME DESDE JAVA .......................... 999 EJERCICIO GUIADO. JAVA. CARPETA DISTRIBUIBLE ....................................................................1008 EJERCICIO GUIADO. JAVA. INSTALABLE. .....................................................................................1019 Qu es IZPACK.......................................................................................................................1019 EJERCICIOS PARA PROGRAMAR.................................................................................................1033 PRIMEROS PROGRAMAS .......................................................................................................1033 Ejercicio 1 .............................................................................................................................1033
LISTAS, COMBOS, MODELOS .................................................................................................1041 Ejercicio 1 .............................................................................................................................1041 Ejercicio 2..........................................................................................................................1042 JTOGGLEBUTTONS ................................................................................................................1045 Ejercicio 1 .............................................................................................................................1045 JSLIDER .................................................................................................................................1047 Ejercicio 1 .............................................................................................................................1047 JSPINNER ..............................................................................................................................1051 Ejercicio 1 .............................................................................................................................1051 JSROLLBAR ............................................................................................................................1054 Ejercicio 1 .............................................................................................................................1054 BARRA DE MENS .................................................................................................................1056 Ejercicio 1 .............................................................................................................................1056 BARRA DE HERRAMIENTAS....................................................................................................1059 Ejercicio 1 .............................................................................................................................1059 MENS CONTEXTUALES ........................................................................................................1061 Ejercicio 1 .............................................................................................................................1061 DIALOGO ABRIR/GUARDAR FICHERO.....................................................................................1062 Notas Iniciales .......................................................................................................................1062 VARIABLES GLOBALES ...........................................................................................................1065 PROGRAMAS CON CLCULOS ................................................................................................1068 Ejercicio 1 .............................................................................................................................1068 CENTRALIZAR CDIGO ..........................................................................................................1076 CUADROS DE DILOGO .........................................................................................................1082 ASIGNACIN DE EVENTOS DESDE CDIGO. EVENTOS DE RATN...........................................1090 ASIGNACIN DE EVENTOS DESDE CDIGO. EVENTOS DE VENTANA ......................................1094 VECTORES DE COMPONENTES...............................................................................................1096 VECTORES DE COMPONENTES...............................................................................................1099
POO. CREACIN Y USO DE CLASES PROPIAS ..........................................................................1102 CUADROS DE MENSAJE, CONFIRMACIN E INTRODUCCIN DE DATOS .................................1112 Ejercicio 1 .............................................................................................................................1112 POO. DIALOGOS PROPIOS .....................................................................................................1120 PROGRAMACIN MDI ...........................................................................................................1123 MODELO E-R .........................................................................................................................1132 TRASPASO A TABLAS .............................................................................................................1136 RELACIONES MUCHAS A MUCHAS .........................................................................................1137 CREACIN DE BASES DE DATOS EN ACCESS ...........................................................................1141 CREACIN DE CONSULTAS EN ACCESS ...................................................................................1142 CREACIN DE CONSULTAS USANDO SQL ...............................................................................1146 CREACIN DE CONSULTAS DE ACCIN USANDO SQL .............................................................1151 INSERCIN DE REGISTROS .....................................................................................................1152 MODIFICACIN DE REGISTROS ..............................................................................................1152 ELIMINACIN DE REGISTROS .................................................................................................1153 CADENAS ..............................................................................................................................1155 Ejercicio 1 .............................................................................................................................1155 CREACIN DE APLICACIONES JAVA USANDO BASE DE DATOS ................................................1158 FECHAS, NMEROS REALES, VALORES NULOS .......................................................................1161 CONSULTAS DEL USUARIO.....................................................................................................1163 ALTAS DE REGISTROS ............................................................................................................1165 BAJA DE REGISTROS ..............................................................................................................1166 MODIFICACIN DE REGISTROS ..............................................................................................1167 CADENAS (CONTINUACIN) ..................................................................................................1173 Ejercicio 1 .............................................................................................................................1173 EXCEPCIONES ........................................................................................................................1182 Ejercicio 1 .............................................................................................................................1182 Ejercicio 1 .............................................................................................................................1184
CUADROS DE VERIFICACIN, BOTONES DE OPCIN...............................................................1187 Ejercicio 1 .............................................................................................................................1187 LISTAS Y COMBOS .................................................................................................................1190 Ejercicio 1 .............................................................................................................................1190
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:
10
mensaje=mensaje+"Perro "; }
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.
11
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.
12
EJERCICIO GUIADO. JAVA: BOTONES DE OPCIN 11. Realiza un nuevo proyecto. 12. En la ventana principal debes aadir lo siguiente: a. Un botn Aceptar llamado btnAceptar. b. Una etiqueta con borde llamada etiResultado. 13. 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.
14. 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)
13
c. Busca el tipo de borde llamado TitledBorder (borde con ttulo) y pon el ttulo colores.
14
16. Ahora debes aadir tres botones de opcin (botones de radio) dentro del panel. Estos botones son objetos del tipo JRadioButton.
15
17. Aade tres JRadioButton y cambia el texto de ellos, de forma que aparezca Rojo, Verde y Azul. 18. Debe cambiar el nombre de cada uno de ellos. Se llamarn: optRojo, optVerde, optAzul. 19. La ventana tendr el siguiente aspecto cuando termine:
20. 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.
16
21. 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.
17
d. Selecciona el botn de opcin optRojo y cambia su propiedad buttonGroup, indicando que pertenece al grupo colores (observa la imagen):
22. 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.
23. 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);
18
24. 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: ";
etiResultado.setText(mensaje);
25. Observa el cdigo. En l se hace lo siguiente: a. Se crea una variable de cadena llamada mensaje.
19
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.
26. 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.
20
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.
21
EJERCICIO GUIADO. JAVA: CUADROS DE LISTA 27. Realiza un nuevo proyecto. 28. En la ventana principal debes aadir lo siguiente: a. Un botn Aceptar llamado btnAceptar. b. Una etiqueta con borde llamada etiResultado. 29. Aade un cuadro de lista. Los cuadros de listas son objetos JList.
30. 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:
22
31. Aprovecha para cambiarle el nombre al JList. El nuevo nombre ser lstColores. 32. 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. 33. 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. 34. Puedes aadir elementos escribindolos en el cuadro Artculo y luego pulsando el botn Aadir (Add).
23
35. Debes hacer que la lista sea la siguiente: Rojo Verde Azul
36. Ahora programaremos el actionPerformed del botn Aceptar. Debes introducir el siguiente cdigo:
String mensaje;
24
37. 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. 38. Ejecuta el programa y observa su funcionamiento. Por ejemplo, si seleccionas el color verde y pulsas aceptar el resultado ser el siguiente:
25
39. 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);
26
40. 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. 41. Si ejecuta el programa y pulsa el botn Aceptar sin seleccionar nada el resultado debera ser el siguiente:
42. 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
27
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.
28
EJERCICIO GUIADO. JAVA: CUADROS COMBINADOS 43. Realiza un nuevo proyecto. 44. En la ventana principal debes aadir lo siguiente: a. Una etiqueta con borde llamada etiResultado. 45. Aade un cuadro combinado (combo). Los cuadros combinados son objetos del tipo JComboBox. Bsicamente, un combo es una lista desplegable.
46. Cmbiale el nombre al JComboBox. El nombre ser cboColores. Tu programa debe tener ms o menos este aspecto.
29
47. 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:
30
48. 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
31
50. 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:
mensaje=mensaje+cboColores.getSelectedItem().toString(); etiResultado.setText(mensaje);
51. 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.
32
d. Finalmente se coloca el mensaje en la etiqueta. 52. Ejecuta el programa y comprueba su funcionamiento. Por ejemplo, si elegimos el color verde, el aspecto del programa ser el siguiente:
53. 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.
33
54. Ejecuta el programa y observa como se puede escribir dentro del combo. Al pulsar Enter, el programa funciona igualmente con el texto escrito.
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.
34
35
EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA 55. Realiza un nuevo proyecto. 56. En la ventana principal debes aadir lo siguiente: a. Una etiqueta con borde llamada etiResultado. 57. Aade un cuadro de lista al formulario (JList).
58. 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.
36
59. 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.
37
60. 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);
61. En el evento actionPerformed del botn Curso 2 programa lo siguiente: DefaultListModel modelo = new DefaultListModel(); modelo.addElement("Ana");
38
62. 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");
39
modelo.addElement("Jose");
h. As pues, aqu tienes una forma de cambiar el contenido de un cuadro de lista desde el propio programa.
63. Prueba a ejecutar el programa. Observa como cuando pulsas cada botn cambia el contenido de la lista:
40
64. 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)
41
66. 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.
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.
42
EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA 67. Realiza un nuevo proyecto. 68. 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.
69. Elimina todos los elementos que contenga el combo. Recuerda, debes usar la propiedad model del combo para cambiar sus elementos. 70. Despus de haber hecho todo esto, tu ventana debe quedar ms o menos as:
43
int i;
cboNumeros.setModel(modelo);
72. 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:
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:
44
cboNumeros.setModel(modelo);
45
}
cboNumeros.setModel(modelo);
75. 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.
76. 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.
77. Prueba el programa. Prueba los botones Pares e Impares y prueba el combo.
46
78. 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.
47
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.
48
EJERCICIO GUIADO. JAVA: TOGGLEBUTTONS 79. Realiza un nuevo proyecto. 80. 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.
49
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.
f.
Aade finalmente tres etiquetas conteniendo los nmeros 40, 200, 200. La primera se llamar etiPrecioInstalacion, la segunda etiPrecioFormacion y la tercera etiPrecioAlimentacionBD.
50
82. Se pretende que el programa funcione de la siguiente forma: a. El usuario introducir un precio base para el servicio que se vende. b. A continuacin, si el cliente quiere la instalacin, activar el botn Instalacin. c. Si el cliente quiere la formacin, activar el botn Formacin. d. 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.
51
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.
52
double precio_base; double precio_instal; //precio instalacin double precio_for; //precio formacion double precio_ali; //precio alimentacion
//Al precio base se le van aadiendo precio de extras //segn estn o no activados los JToggleButtons
double precio_total;
precio_total = precio_base;
53
}
84. 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.
54
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.
55
86. 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);
56
CONCLUSIN
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.
57
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:
58
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.
Ejercicio guiado
3. Aade una etiqueta con borde. Su nombre ser etiValor. 4. La ventana tendr el siguiente aspecto:
59
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:
60
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.
61
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:
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:
62
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.
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.
63
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
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
64
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.
Si quieres programar el cambio (el arrastre) en el deslizador, tienes que programar el evento llamado stateChanged.
65
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
15. Crea un nuevo proyecto. 16. Aade en l un JSpinner. Su nombre ser spiValor.
66
17. Aade una etiqueta con borde. Su nombre ser etiValor. 18. La ventana tendr el siguiente aspecto:
19. 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:
67
20. 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.
22. 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.
23. Entra dentro del cdigo del programa y, dentro del constructor, aade este cdigo debajo de initComponents:
SpinnerNumberModel nm = new SpinnerNumberModel();
68
24. 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.
25. Prueba el programa y observa los valores que puede tomar el JSpinner.
69
26. 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);
70
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.
28. Ejecuta el programa de nuevo y observa como cambian los valores del JSpinner.
29. 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.
71
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.
72
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.
73
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.
74
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:
75
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.
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
76
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
77
78
Si llevas la barra de desplazamiento al mnimo, su valor ser de 50, ya que se configur as con la propiedad minimum
79
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:
***
80
** 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:
Es decir,
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
81
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)
82
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
12. Veamos como aadir una barra de mens a nuestras aplicaciones. En primer lugar, crea un proyecto con el NetBeans. 13. Aade a tu ventana un objeto JMenuBar
83
15. 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.
16. Aprovecha el Inspector para cambiar el nombre al objeto JMenuBar. Llmalo barraMenus. 17. Cambia tambin el nombre al objeto JMenu. Asgnale el nombre menuArchivo. El Inspector tendr el siguiente aspecto:
18. 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:
84
20. 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.
85
21. Aada dos opciones ms a la barra de mens. El inspector debe tener ahora el siguiente aspecto:
23. Cambia los nombres de las dos nuevas opciones. Sus nombres sern: menuEdicion y menuInsertar.
24. Cambia los textos de ambas opciones. Sus textos sern: Edicin e Insertar.
86
25. 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. 26. 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. 27. 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:
87
28. Usa ahora la propiedad Text de ambos JMenuItem para asignarles un texto. El primero tendr el texto Abrir y el segundo el texto Guardar. 29. 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.
30. Seguiremos aadiendo elementos al men. Ahora haga clic con el derecho sobre el elemento menuArchivo y aada un JSeparator.
88
Los JSeparator son objetos que definen una separacin entre las opciones de un men. Cmbiele el nombre y llmelo separador1:
31. 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:
89
33. 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:
90
35. Ahora aade dentro del menuColores tres JMenuItem llamados respectivamente: menuItemRojo, menuItemVerde, menuItemAzul. Sus textos sern Rojo, Verde y Azul.
91
La opcin Edicin (JMenu) contiene una opcin Colores (JMenu) que a su vez contiene las opciones Rojo, Verde y Azul (JMenuItems)
37. 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. 38. 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);
39. Compruebe el funcionamiento de la opcin Rojo del men ejecutando el programa. 40. Programa tu mismo las opciones Verde y Azul.
92
CONCLUSIN
Las barras de mens son un conjunto de objetos de distinto tipo que se contienen unos a los otros:
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.
93
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
41. Veamos como aadir una barra de herramientas a nuestras aplicaciones. En primer lugar, crea un proyecto con el NetBeans. 42. Aade a tu ventana un objeto JmenuBar (una barra de mens) 43. En la parte superior de tu ventana aparecer esto:
94
44. 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:
45. 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.
95
46. Puedes ver si los botones estn bien colocados observando el Inspector: Observa como los botones colocados se encuentran dentro de la barra.
47. 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:
96
48. Cambia el texto de los botones. Estos contendrn el texto: Uno, Dos, Tres y Cuatro. 49. Ejecuta el programa y observa el resultado.
50. 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.
51. Solo como demostracin de esto ltimo, entra en el actionPerformed del primer botn y programa esto:
JOptionPane.showMessageDialog(null,"Activaste el botn uno");
97
52. 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. 53. A travs de la propiedad icon de un botn podr seleccionar un fichero de imagen que contenga la imagen a mostrar en el botn. 54. 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.
98
55. 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:
99
CONCLUSIN
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.
100
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
101
57. No hace falta que aada nada a la ventana. 58. Programaremos la pulsacin del ratn sobre el formulario, as que haga clic sobre el formulario y active el evento mouseClicked. 59. 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.
102
61. Ejecuta el programa y haz clic sobre el formulario con el botn derecho, con el izquierdo y con el central. Observa el resultado. 62. 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.
63. 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. 64. Agrega a tu formulario un objeto del tipo JPopupMenu. Estos objetos definen mens emergentes. 65. Los objetos JPopupMenu no se muestran en el formulario, pero puedes verlo en el Inspector dentro de la rama de Otros Componentes:
66. Aprovecharemos el inspector para cambiar el nombre al men. Llmalo menuEmergente. 67. Los mens emergentes se crean igual que las opciones de mens normales, aadiendo con el botn derecho del ratn objetos JMenuItem.
103
68. Aada al men emergente tres JMenuItem, y asgneles los siguientes nombres a cada uno: menuRojo, menuVerde, menuAzul. El inspector debera tener el siguiente aspecto:
69. 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. 70. 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());
71. 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.
104
Es decir, decidimos mostrar el men emergente justo en las coordenadas donde se hizo clic.
73. 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:
105
this.getContentPane().setBackground(Color.RED);
74. 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.
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.
106
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:
107
(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.
108
Ejercicio guiado
75. Vamos a practicar con el JFileChooser. Para ello, crea un nuevo proyecto. 76. 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: i. Una opcin Abrir, llamada menuAbrir. ii. Un separador (llmalo como quieras) iii. Una opcin Salir, llamada menuSalir. 77. Una vez hecho esto tu formulario tendr la siguiente forma:
109
80. 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.
81. Haz clic con el derecho sobre la zona de otros componentes y activa la opcin Agregar desde Paleta Swing JFileChooser:
110
82. 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:
111
83. 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) {
112
84. 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 85. 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) {
113
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.
86. 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.
114
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.
115
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:
Ejercicio guiado 1
87. Vamos a practicar con los JScrollPane. Para ello, crea un nuevo proyecto. 88. Aade en el proyecto un JScrollPane. 89. 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) 90. El formulario debe tener ahora este aspecto:
116
92. Aprovechemos el Inspector para cambiar el nombre a cada objeto. Al JScrollPane le llamaremos scpImagen y a la etiqueta etiImagen.
117
93. Elimina el texto contenido en la etiqueta etiImagen. Solo tienes que borrar el contenido de la propiedad text. 94. 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
95. 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.
118
96. Puedes mejorar el programa si agrandas el panel de desplazamiento de forma que ocupe todo el formulario:
119
De esta forma, cuando ejecutes el programa, al agrandar la ventana, se agrandar el panel de desplazamiento, vindose mejor la imagen contenida.
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.
120
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:
121
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:
122
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:
123
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:
124
9. Haz doble clic sobre el JFrame (en el Inspector) para poder ver globalmente la ventana. En la pantalla debera aparecer esto:
125
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.
CONCLUSIN
126
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.
127
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
98. 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
128
99. Tu clase principal es la clase Parking. 100. 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:
101.
Esta ventana contiene lo siguiente: i. ii. iii. iv. v. 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.
102.
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.
129
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.
103. 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.
104. Para crear una variable global haz clic en el botn Origen para acceder al cdigo:
105.
Luego busca, al comienzo del cdigo una lnea que comenzar por
public class
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.
130
106.
107. 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:
131
Inicializamos a cero ya que se supone que cuando arranca el programa no hay ningn coche dentro del parking.
108. 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.
132
109.
110.
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.
133
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)
111. Ejecuta el programa y prueba los dos botones. Observa como la cantidad de coches del parking aumenta o disminuye.
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.
134
112. 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);
113.
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.
135
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
Cdigo A
Evento 2
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:
136
Veamos algunos ejemplos en los que el cdigo se puede repetir y como evitar esta repeticin.
Ejercicio guiado 1
114. 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:
137
115.
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.
138
116. Aqu puedes ver la ventana en ejecucin con el men Calcular desplegado:
117. a. b. c. d. e. f. g.
El objetivo de programa es el siguiente: 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.
139
118. 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:
119. 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:
120.
140
121. 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
122. 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:
141
123. 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.
142
Luego convierte dichas cadenas en nmeros que almacena en dos variables enteras llamadas a y b.
124. 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. 125. 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();
126. 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();
127. 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();
128. 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();
143
129. 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 CalcularSumar, 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
actionPerformed txtNumero1
actionPerformed txtNumero2
130. 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:
144
131. 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:
145
132. El cdigo de este procedimiento es prcticamente idntico al del procedimiento Sumar, as que no se comentar. 133. 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();
134. Igualmente, entre en el evento actionPerformed de la opcin del men Calcular Restar y aada la misma llamada: Restar();
135. 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:
146
136. 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):
137. 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();
147
138.
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.
148
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
139.
140. 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:
149
141. 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:
150
Tanto el botn como la etiqueta estarn siempre a esta distancia del borde derecho de la ventana
142. 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.
151
143. 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
144. 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. 145. En el Inspector de tu proyecto pulsa el botn derecho del ratn sobre el objeto JFrame y activa la opcin Establecer Disposicin AbsoluteLayout.
152
146.
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.
153
147. Sita la etiqueta y el botn donde quieras. Observa que no aparece ninguna lnea gua que defina distancias relativas:
148. 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. 149. Ejecuta el programa y reduce su ancho. Observa lo que ocurre:
154
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.
150. 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.
155
151. Observa como el layout AbsoluteLayout es sustituido por la distribucin FlowLayout. Una elemento solo puede tener un tipo de distribucin a la vez.
152. 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.
156
153. 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.
154. 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
157
155. 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. 156. Cambia el layout del JFrame por un GridLayout:
157. Marca el GridLayout y cambia sus propiedades Filas y Columnas. Asigna a la propiedad Filas un 2 y a la propiedad Columnas un 3.
158
158. 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.
159. 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.
159
160. 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. 161. 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.
160
BorderLayout
162. Otra de las distribuciones posibles es la llamada BorderLayout. Esta distribucin coloca los elementos de la ventana en cinco zonas: i. ii. iii. iv. v. 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.
163. Haz clic con el derecho sobre el JFrame y asigna una distribucin BorderLayout.
161
164. 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:
162
165. 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.
166. Ejecuta el programa y observa como los elementos siempre se mantienen dentro de la ventana aunque esta cambie de tamao.
163
CONCLUSIN
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.
164
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.
165
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.
166
etc
JPanel 1 (Diseo Libre, AbsoluteLayout o JPanel 2 (Diseo Libre, AbsoluteLayout o
Componentes
Componentes
167
Ejercicio guiado
167.
Se pretende crear un proyecto con una ventana de diseo complejo. Para ello sigue los siguiente pasos:
168.
169. El BorderLayout divide la ventana principal en zonas. Ahora aade un panel (JPanel) a la zona norte de la ventana.
168
170. Cambia el nombre a este panel y llmalo panelTitulo, ya que contendr el nombre del programa.
171. Aade otro panel, esta vez a la parte central. El panel se llamar panelDatos:
169
172. 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.
170
173. 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:
171
174.
172
175. 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:
176. 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. 177. En la parte izquierda del NetBeans aparecer nicamente el panelBotonera. Agrndalo para que tenga la siguiente forma:
173
178. 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:
179. Ahora aade cuatro botones al panel. Observa como tienes libertad total para colocar cada botn donde quieras. Procura que el panel quede as:
174
(No nos vamos a preocupar en este ejercicio de los nombres de los componentes) 180. 181. Ahora disea el panel panelVerificacin haciendo doble clic sobre l. Asgnale tambin un layout AbsoluteLayout.
182. Coloca en l cuatro casillas de verificacin. El aspecto del panel al terminar debe ser parecido al siguiente:
175
183.
184. En este caso se le aadir un FlowLayout. Recuerda que este layout hace que cada elemento se coloque uno detrs de otro. 185. una: Aade al panel dos etiquetas como las que siguen. Ponle un borde a cada
176
186. 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.
187. El panelDatos lo vamos a complicar un poco. Haz doble clic sobre l para disearlo y asgnale un GridLayout.
188. Marca el GridLayout y asgnale 2 filas y 2 columnas, para que interiormente tenga forma de una rejilla como esta:
177
189. 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:
190. Asignaremos a cada uno de los cuatro paneles los siguientes nombres: panelEtiqueta1, panelCuadro1, panelEtiqueta2, panelCuadro2. El panel quedar as en el Inspector.
178
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
191. Ahora aada al panelEtiqueta1 y al panelEtiqueta2 sendas etiquetas. Y al panelCuadro1 y panelCuadro2 sendos cuadros de textos. El panel panelDatos debe quedar as:
179
192. 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.
180
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.
181
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.
182
Ejercicio guiado
193. 194.
Crea un nuevo proyecto en java. Disea el JFrame de forma que la ventana tenga el siguiente aspecto:
Cuadro de texto de unidades: txtUnidades. Cuadro de texto de precio: txtPrecio. Etiqueta con borde del total: etiTotal. Botn Calcular: btnCalcular. Botn Configuracin: btnConfiguracion.
195. 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.
183
196. 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
197. 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:
184
198. 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 unidades; double precio; double total; double cantiva; double cantdes; //total //cantidad iva //cantidad descuento
//Recojo los datos de los cuadros de textos (convirtiendolos a nmeros) unidades = Double.parseDouble(txtUnidades.getText()); precio = Double.parseDouble(txtPrecio.getText());
185
cantiva=totalsiniva*iva/100; cantdes=totalsiniva*descuento/100;
199. 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. 200. 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.
201. Para aadir un cuadro de dilogo al proyecto, se tiene que aadir un objeto del tipo JDialog sobre el JFrame.
186
202. 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:
203.
204. Los dilogos normalmente traen por defecto el layout BorderLayout. Para nuestro ejemplo cambiaremos el layout del JDialog por el Diseo Libre:
187
205. 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. 206. As pues debes disear el dialogoConfiguracion para que quede de la siguiente forma:
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:
188
189
207. 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:
208. Para conseguir esto, debes programar el actionPerformed del botn btnConfiguracion de la siguiente forma:
190
209.
El cdigo anterior hace lo siguiente: i. ii. iii. 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.
210. 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:
191
211. 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. 212. 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.
192
213. Ejecuta el programa de nuevo y comprueba el funcionamiento del botn Cancelar del cuadro de dilogo. 214. 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.
215. 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();
216. 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. 217. 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.
218. 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.
193
219. Vuelva a ejecutar el programa. Observe la barra de ttulo del cuadro de dilogo:
220. 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.
221.
Ejecuta el programa y prueba a hacer lo siguiente: a. Pulsa el botn Configurar. Aparecer el cuadro de dilogo. b. Pulsa sobre la ventana.
194
195
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
196
g. Es muy comn, cuando tenemos un cuadro de dilogo no modal, usar la propiedad alwaysOnTop, para que siempre aparezca delante de la ventana.
222.
Un cuadro de dilogo modal es aquel que no permite que se active otra ventana hasta que este no se haya cerrado.
223. 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.
224.
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.
197
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.
c. Solo cuando pulses, Aceptar, o Cancelar, o cierres el cuadro de dilogo, podrs seguir trabajando con tu ventana.
CONCLUSIN
198
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.
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.
199
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.
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:
200
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:
201
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 compone Aqu se crea el botn, ntes, la etiqueta y el cuadro como se de texto asigna el texto a stos etc.
202
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
203
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:
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.
En este comentario aparece el nombre del fichero que contiene el cdigo, que como puedes observar tiene el mismo que el del JFrame.
204
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.
205
5. Para programar una clase se sigue la siguiente sintaxis: public class nombredelaclase {
programacin de la clase }
206
Programacin de la clase
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.
207
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:
El mtodo initComponents al que hace referencia el constructor es un mtodo generado automticamente, y no puede ser modificado.
208
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.
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:
209
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:
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:
210
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 setTitle cambias la barra de ttulo
211
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.
212
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:
213
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:
214
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:
215
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:
216
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:
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.
217
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:
218
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:
219
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:
220
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.
221
CONCLUSIN
La ventana de diseo de NetBeans es una herramienta que nos permite disear las ventanas sin tener que programar cdigo.
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;
Luego se pueden usar distintos mtodos del objeto para trabajar con l.
222
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.
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.
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
223
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: actionPerformed Activar un componente (pulsacin de botn, enter en un cuadro de texto)
Eventos de Teclado: keyPressed Se puls una tecla, pero no se solt. keyReleased Se solt una tecla. keyTyped Se puls y solt una tecla.
o o o
Eventos de Ratn:
224
o o o o o
mousePressed Se puls un botn del ratn. mouseReleased Se solt un botn del ratn. mousePressed Se puls y solt un botn del ratn. mouseEntered El ratn entr en la superficie del control. mouseExited El ratn sali de la superficie del control.
Eventos de Ventana: windowOpened Se abri la ventana windowClosing Se cerr la ventana windowActivated Se activ la ventana windowDeactivated Se desactiv la ventana
o o o o
225
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...)
226
Se quiere programar el evento de un botn llamado btnSumar desde cdigo. He aqu el cdigo para crear el evento:
btnSumar.addActionListener(new ActionListener() {
227
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
228
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):
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:
En el constructor hacemos una llamada a nuestro mtodo CreacionVentana
229
etiNum1 = new JLabel(); Creamos la etiqueta Nmero 1 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); Creamos la etiqueta Nmero 2
txtNum1 = new JTextField(); txtNum1.setText("0"); txtNum1.setBounds(110,10,100,20); this.getContentPane().add(txtNum1); Creamos el primer cuadro de texto
230
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:
231
(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)
232
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:
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
233
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.
234
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.
235
236
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.
Para enlazar el oyente ActionListener a un componente XXX hay que usar el siguiente cdigo:
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.
237
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.
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.
238
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.
239
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 mouseExited(MouseEvent evt) { XXXMouseExited(evt); } public void mousePressed(MouseEvent evt) { XXXMousePressed(evt); }
240
});
XXX.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent evt) { XXXMouseEntered(evt); } Estos son los eventos de ratn que pertenecen al adaptador MouseAdapter.
public void mouseExited(MouseEvent evt) { XXXMouseExited(evt); } public void mousePressed(MouseEvent evt) { XXXMousePressed(evt); }
241
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.
Cada evento recibe como parmetro un objeto del tipo MouseEvent al que por convencin se le suele llamar evt.
242
EJERCICIO GUIADO 14. Crea un nuevo proyecto. 15. Accede al cdigo del proyecto.
16. Inserta una llamada dentro del constructor a un procedimiento CreacionVentana de la siguiente forma:
La llamada...
Y el procedimiento.
17. La ventana va a contener dos etiquetas, que tendremos que declarar en la zona de variables globales:
18. Ahora vamos a disear la ventana. Introduce el siguiente cdigo dentro del procedimiento CreacionVentana:
243
Detalles de la ventana
19. Ejecuta ya el programa para observar el resultado de nuestro diseo. El aspecto debe ser el siguiente:
244
20. 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. 21. 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.
22. Primero programaremos el enlace del adaptador MouseAdapter con la etiqueta etiZona. Programa al final del mtodo CreacionVentana lo siguiente:
245
23. 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. 24. 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)
246
25. Ahora ya puedes ejecutar el programa y comprobar lo que sucede cuando interactas con el ratn sobre la etiqueta de color rojo.
26. 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.
247
27. 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. 28. 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() {
248
}
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.
249
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.
Componente.MetodoParaAadirOyente(new TipoOyente() {
250
LlamadaAProcedimiento1(evt); }
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.
251
Ejemplo 1. Eventos del Ratn Los eventos de ratn son: mouseEntered, mouseExited, mousePressed, mouseReleased, mouseClicked.
Conociendo esto, si queremos programar los eventos del ratn de una etiqueta llamada etiTexto, solo tenemos que hacer lo siguiente:
etiTexto.addMouseListener(new MouseAdapter() {
252
etiTextoMousePressed(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.
253
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() {
});
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.
254
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.
255
CONCLUSIN
* 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.
Componente.MetodoParaAadirOyente(new NombreOyenteAdaptador() {
256
Se puede aprender mucho sobre los eventos asocindolos desde diseo y luego mirando en el cdigo generado.
257
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
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.
258
Construccin de un vector
Para construir un vector que ya haya sido declarado se sigue la siguiente sintaxis:
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];
259
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:
Aqu se coloca en una etiqueta el valor contenido en el elemento de la posicin cuarta del vector v.
Ejemplo 2:
260
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:
261
Es posible crear un vector e introducir datos directamente en l al mismo tiempo. La forma general de hacerlo sera la siguiente:
Por ejemplo:
Ejemplo 2:
Este cdigo crea un vector que contiene 7 cadenas, correspondientes a los das de la semana.
262
VECTORES DE COMPONENTES
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[];
//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
263
}
264
Ejercicio guiado
225.
226. Empecemos definiendo desde cdigo las caractersticas de la ventana. Crearemos el mtodo CreacionVentana, y lo llamaremos desde el constructor del proyecto:
227. 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):
265
228. 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:
266
229. 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):
267
230.
Analiza este cdigo que se acaba de aadir: a. Observa como cada elemento del vector debe ser construido:
vcuadros[i] = new JCheckBox();
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);
231.
268
269
270
232. 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:
233. 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.
271
234. Ahora aade un botn con su evento actionPerformed. Aade en la zona de variables globales lo siguiente: JButton btnAceptar;
272
235. 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:
273
236. 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.
237. Ejecuta el programa. Selecciona varios cuadros y pulsa el botn Aceptar. Observa el resultado:
274
CONCLUSIN
275
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.
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.
276
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
238.
239. Empecemos definiendo desde cdigo las caractersticas de la ventana. Crearemos el mtodo CreacionVentana, y lo llamaremos desde el constructor del proyecto:
277
240. 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:
241. 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:
278
242. 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.
243.
279
244. 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.)
280
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:
245. 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.
246. as:
281
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.
247.
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.
282
283
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 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.
284
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 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:
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();
285
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:
- 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
286
setBounds
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:
- 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();
repaint
287
copy cut paste etc
- 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.
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;
288
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:
289
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:
En general, para declarar y construir un objeto en una sola lnea se sigue la siguiente sintaxis:
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:
290
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:
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?
291
-
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)
292
CONCLUSIN
Por otro lado, al objeto se le pueden dar rdenes que cumplir de inmediato. A dichas rdenes se les denomina MTODOS.
Para cambiar las propiedades del objeto (Mtodos set) Para pedir informacin al objeto (Mtodos get) Para dar rdenes al objeto.
Declaracin:
CLASE nombreobjeto;
Construccin:
293
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.
294
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:
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.
295
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.
296
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.
297
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:
298
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
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)
299
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:
Observa este cdigo, en l construimos el objeto correspondiente a la sala central del multicine:
SalaCine central;
300
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.
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:
setAforo
setOcupadas - asignar una cantidad de butacas ocupadas a la sala de cine setLibres setPelicula setEntrada - 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
301
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.
//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:
302
Pelcula: Entrada: 5,00
getAforo
getOcupadas - devuelve el nmero de butacas ocupadas que tiene el objeto getLibres - devuelve el nmero de butacas que tiene libres el objeto
getPorcentaje - devolver el porcentaje de ocupacin de la sala getIngresos getPelicula getEntrada - 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
303
multicine), para obtener la pelcula que se est proyectando en dicha sala solo habra que usar este cdigo:
String peli;
peli = central.getPelicula();
O, por ejemplo, para saber los ingresos producidos por la sala central
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)
304
RESUMEN SALACINE
- nmero entero (int) - nmero entero (int) - cadena (String) - nmero decimal (double)
305
setAforo
setOcupadas - modifica la propiedad Ocupadas setLibres setPelicula setEntrada - modifica la propiedad Ocupadas tambin - modifica la propiedad Pelcula - modifica la propiedad Entrada
getAforo
getOcupadas - devuelve el valor de la propiedad Ocupadas getLibres - devuelve el nmero de butacas libres
getPorcentaje - devuelve el porcentaje de ocupacin de la sala getIngresos getPelicula getEntrada - 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
306
EJERCICIO PRCTICO
Supongamos que programamos una Clase de objetos llamada Rectangulo, la cual permitir construir objetos que representen a rectngulos.
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?
307
CONCLUSIN
Valores iniciales que tendrn las propiedades cuando se construya cada objeto.
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.
308
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
- nmero entero (int) - nmero entero (int) - cadena (String) - nmero decimal (double)
Aforo: 100
309
setAforo
setOcupadas - modifica la propiedad Ocupadas setLibres setPelicula setEntrada - modifica la propiedad Ocupadas tambin - modifica la propiedad Pelcula - modifica la propiedad Entrada
getAforo
getOcupadas - devuelve el valor de la propiedad Ocupadas getLibres - devuelve el nmero de butacas libres
getPorcentaje - devuelve el porcentaje de ocupacin de la sala getIngresos getPelicula getEntrada - 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
310
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
311
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)
312
La programacin de una clase comienza siempre con una lnea de cdigo como la que sigue:
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:
313
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.
314
//Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ; Entrada = 5.0; } Constructor
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.
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.
315
Aforo = afo;
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.
316
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:
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.
317
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.
318
//Mtodos set
319
}
//Mtodo setPelicula public void setPelicula(String peli) { Pelicula = peli; } Mtodos Set
320
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.
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 getPelicula
321
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:
322
//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; }
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:
323
//Mtodos set
324
Pelicula = peli; }
//Mtodos get
//Mtodo getOcupadas
325
//Mtodo getLibres public int getLibres() { int lib; lib = Aforo Ocupadas; return lib; }
//Mtodo getPorcentaje
326
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.
327
Veamos la programacin del mtodo Vaciar, cuyo objetivo es vaciar la sala y quitar la pelcula en proyeccin:
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:
Aadiendo estos dos ltimos mtodos, la programacin de la clase SalaCine quedara finalmente como sigue: public class SalaCine {
328
//Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ; Entrada = 5.0; } Constructor
//Mtodos set
329
Pelicula = peli; }
330
//Mtodos get
331
//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; Mtodos de orden y otros mtodos.
332
Pelcula = ; }
333
EJERCICIOS RECOMENDADOS
Supongamos que tenemos una clase llamada Rectangulo que nos permitir generar objetos de tipo rectngulo.
CLASE RECTANGULO
Mtodos:
Mtodos set:
334
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.
335
336
CONCLUSIN
La programacin de una clase se realiza en un fichero que tiene el mismo nombre que la clase y extensin .java
Constructor
Mtodos set
Mtodos get
337
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.
338
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:
339
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:
340
Panel:
Panel:
Etiqueta:
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.
341
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:
342
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.
343
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.
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:
344
Esta instruccin, generada por NetBeans, indica que la clase SalaCine est programada dentro del paqueteprincipal
Inicio de la clase
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:
345
/*
* 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;
346
//Constructor public SalaCine() { Aforo = 100; Ocupadas = 0; Pelicula = ""; Entrada = 5.0; }
//Mtodos set
347
//Mtodo setLibres public void setLibres(int lib) { int ocu; ocu = Aforo - lib; Ocupadas = ocu; }
//Mtodos get
348
//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
349
public double getIngresos() { double ingre; ingre = Ocupadas * Entrada; return ingre; }
//Mtodos de orden
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.
350
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.
14. En la zona de variables globales de la ventana principal declararemos dos objetos del tipo SalaCine:
351
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)
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:
352
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:
Por lo tanto, modificamos las caractersticas del objeto en el constructor de la siguiente forma:
17. En el caso de la sala de versin original sucede lo mismo. Sus caractersticas son la siguientes:
Por tanto ser necesario modificar el objeto vo para asignar estos valores:
353
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:
354
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.
355
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.
Como puedes ver, simplemente se le informa al objeto central (sala central) que ha entrado una nueva persona usando el mtodo entraUno.
356
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.
357
Observa el cdigo:
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.
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:
Pulsa este botn varias veces, para simular la venta de varias entradas.
358
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:
359
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.
360
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.
361
CONCLUSIN
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.
362
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.
363
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.
364
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:
int p = btnContar.getPulsaciones(3); //Se recoge el nmero de pulsaciones del botn btnContar //en la variable p
365
Mtodo incrementa. Permite incrementar en uno las pulsaciones que tiene un botn.
Mtodo decrementa. Permite decrementar en uno las pulsaciones que tiene un botn
Mtodo aumentar. Permite aumentar en una determinada cantidad las pulsaciones del botn.
366
Mtodo disminuir. Permite disminuir en una determinada cantidad las pulsaciones del botn.
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
367
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.
368
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:
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.
369
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.
int pulsaciones;
Nuestra propiedad pulsaciones debe ser inicializada en el constructor de la clase. Para ello crea el constructor de la clase:
int pulsaciones;
370
Se aadirn los nuevos mtodos que queremos que la clase BotonContador posea. Estos son los siguientes:
- 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):
371
//mtodos
//devuelve las pulsaciones del botn public int getPulsaciones() { return pulsaciones; }
372
}
373
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:
374
Usaremos la clase BotonContador en un simple proyecto de prueba para que puedas observar sus posibilidades.
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:
375
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:
376
/*
* 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. */
377
//devuelve las pulsaciones del botn public int getPulsaciones() { return pulsaciones; }
378
//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:
379
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:
380
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.
381
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:
382
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.
383
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:
384
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.
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.
Aparecer un JOptionPane
385
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.
386
EJERCICIO
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
387
388
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
389
390
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.
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.
391
EJERCICIO GUIADO
20. Crea un proyecto llamado Fecha, que tenga un paquete principal llamado paqueteprincipal y un JFrame llamado ventanaprincipal:
21. 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.
392
22. 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.
393
23. 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.
394
24. Y pulsa el botn Terminar. Observars que se ha creado una nueva Clase dentro del proyecto llamada dialogoFecha.
25. Es interesante que veas el cdigo de esta clase. Haz doble clic sobre ella:
395
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
26. Adems, tenemos la ventaja de poder usar la ventana de diseo para crear nuestro cuadro de dilogo dialogoFecha:
396
27. 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:
a. b. c. d. e.
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
29. 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.
30. 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
397
Mes Anio
- entero - 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.
31. Bien, empecemos. Programar las propiedades es algo sencillo, ya que son simplemente variables globales a la clase dialogoFecha:
398
32. 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.
33. 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
399
34. 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.
400
35. 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.
401
36. 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.
37. Acude a la ventana principal, haciendo doble clic sobre ella en la ventana de proyectos:
402
39. El programa funcionar de la siguiente forma: a. Al pulsar el botn Introducir Fecha Nacimiento aparecer un cuadro de dilogo del tipo dialogoFecha, donde el usuario introducir la fecha de nacimiento. b. Al pulsar Aceptar, dicha fecha aparecer en la etiqueta etiFechaNacimiento.
c.
40. 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
403
41. 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:
42. 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:
404
43. Ejecuta el programa y observa el funcionamiento del botn btnFechaNacimiento y del cuadro de dilogo nacimiento
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
405
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.
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.
406
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.
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:
407
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.
408
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
409
410
4. Observars como se aade una copia de dialogoFecha al paquete principal del proyecto Reutilizacion.
411
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)
412
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
413
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.
414
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)
415
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:
13. Una vez movidas las dos clases al paquete elementosventana, su proyecto debe quedar as:
416
417
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.
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.
418
419
3. A este nuevo proyecto le agregaremos el paquete elementosventana que tenemos en el proyecto Reutilizacion. Solo hay que copiar:
420
4. Y luego Pegar
421
422
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.
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.
423
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:
424
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.
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:
425
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.
426
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.
427
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.
428
Es interesante reunir las clases que ms uses en un solo proyecto de tipo biblioteca, para poder acceder a ellas fcilmente.
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.
429
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.
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.
MDI se puede traducir como interfaz de mltiples documentos. Esto quiere decir que las aplicaciones MDI pueden mostrar varios documentos a la vez.
430
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.
431
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.
15. Crea un nuevo proyecto. El nombre del proyecto ser VisorFotos. Aade un paquete llamado paqueteprincipal. Dentro de dicho paquete aade un JFrame llamado ventanaprincipal.
432
16. Aade a la ventana principal una barra de mens, con una nica opcin Archivo, que contenga a su vez las siguiente opciones:
17. 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.
433
18. 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:
434
435
20. 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:
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.
436
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:
21. 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.
22. Luego elige Formularios GUI Java y dentro de esta categora Formulario JInternalFrame.
437
438
24. 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.
25. 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.
439
26. 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.
27. As pues, entra en la zona de cdigo de la ventanainterna y aade despus del constructor el siguiente mtodo:
440
28. 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.
29. 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:
441
442
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.
30. 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.
443
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)
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.
444
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.
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
445
ventana que pueda ser minimizada (setIconifiable) y finalmente que pueda ser cerrada (setClosable)
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.
Ahora aprovechamos el mtodo setImagen que programamos oportunamente dentro de la clase ventanainterna para situar dicha imagen dentro de la etiqueta.
vi.setImagen(camino);
vi.setTitle(camino);
446
vi.setVisible(true);
Observa como todas tienen el mismo aspecto (una etiqueta nica en la ventana conteniendo la imagen)
Observa como todas las ventanas internas estn encerradas dentro de los lmites del panel interno de la ventana principal:
447
448
CONCLUSIN
La programacin MDI consiste en crear aplicaciones capaces de abrir varios ficheros y mostrarlos en distintas 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.
449
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.
450
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:
451
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.
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:
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.
452
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:
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.
453
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)
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:
454
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.
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.
455
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:
456
17. Analicemos el cdigo. Observa de nuevo el uso de getAllFrames para almacenar todas las ventanas internas abiertas en un vector v:
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.
457
CONCLUSIN
- 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:
- 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.
458
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
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.
459
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.
Datos, rdenes
Datos, rdenes
Resultados
460
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.
461
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.
462
Aadiendo el concepto de Base de Datos a la idea de usuario, GUI y Proceso de Datos, podemos representar grficamente un programa como sigue:
Usuario Resultados GUI Interfaz de usuario Ventanas, botones, Resultados Programacin interna: Procedimientos, funciones, clases,
SQL
BASE
DE
463
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.
464
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.
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.
Un gestor de base de datos es un programa que nos permite crear bases de datos, mantenerlas, realizar consultas en ellas, etc
465
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.
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.
466
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.
467
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.
468
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:
469
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.
Entidad Servicios.
470
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.
471
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.
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.
472
No est establecida una relacin directa entre ambas entidades, pero s 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
473
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.
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:
474
Un profesor puede dar varios cursos, y un curso es impartido por varios profesores
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.
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.
475
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.
Entidad Trabajadores Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula
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.
476
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
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.
477
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 Trabajadores Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula
Entidad Servicios Atributos: fecha, tipo, cantidad, comentario, nmero, DNI, CIF.
478
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:
479
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.
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.
480
481
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.
482
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.
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 .
483
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.
484
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:
485
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:
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
486
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
487
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.
488
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
Ao 2000 2001
Tabla Trabajadores
Nombre Ana
Apellidos Ruiz
Sueldo 1200
Fecha 02-03-2002
Matrcula 3322-ASR
Juan
Prez
1120
04-05-2002
4433-ABB
Tabla Servicios
Nmero
1
Fecha
12-04-2004
Tipo
Limpieza
Cantidad
300
Comentario DNI
21.123.123A Arreglo tuberas 12.321.567B
CIF
B11223212
22-05-2005
Fontanera
238
B22334466
489
3
21-12-2005
Electricidad
130
Revisin cableado
21.123.123A 12.321.567B
B33221111
10-11-2006
Fontanera
250
B11223212
Tabla Clientes
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)
490
491
CONCLUSIN
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:
492
En las hojas anteriores se ha visto que entre las entidades se pueden establecer relaciones de tres tipos:
Relaciones 1 a 1.
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.
493
En esta hoja guiada se ver qu hacer cuando aparezca una relacin Muchas a Muchas
494
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.
1. Entidades participantes:
495
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):
Cursos Cdigo del curso Nombre del curso Nmero de horas Nombre del profesor
496
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.
4. Tipos de relaciones.
Un alumno puede apuntarse a muchos cursos. Por otro lado, en un curso se apuntan muchos alumnos. Es una relacin Muchas a Muchas:
497
Alumnos
Cursos
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)
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.
498
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
Entidad 2
499
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.
500
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:
Un alumno puede matricularse muchas veces (se puede apuntar a muchos cursos). As pues un alumno realiza o rellena varias matrculas.
1 Alumnos
Matrculas
Cursos
501
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)
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.
502
En la entidad matrculas se puede almacenar otras informaciones, como por ejemplo lo que paga el alumno por hacer el curso.
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:
503
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.
504
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.
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.
505
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.
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)
506
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):
507
1 M
Cursos
cdigo curso
DNI
Matrculas M
nombre
autor fecha DNI nombre cdigo apellidos nmero DNI fecha fecha ttulo
tema
cdigo
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.
508
509
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.
510
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)
511
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.
512
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
513
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.
514
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.
515
516
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
517
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.
518
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.
519
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.
520
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:
521
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.
522
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.
523
524
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.
525
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.
526
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:
527
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:
528
529
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
530
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.
531
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.
532
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.
533
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:
534
Tabla Servicios
Nmero
Fecha
Tipo
Cantidad
Comentario DNI
CIF
535
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.
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.
536
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:
537
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:
538
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.
539
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:
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:
540
49. Haz ahora doble clic sobre la tabla Clientes. Introduciremos los datos de varios de los clientes de la empresa:
541
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)
542
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:
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.
543
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.
544
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.
545
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.
546
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
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.
547
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.
548
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)
549
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:
550
551
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:
552
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:
553
554
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.
555
556
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:
557
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:
558
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:
559
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.
560
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.
561
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):
562
563
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).
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.
564
25. Observa la relacin automtica que aparece entre Clientes y Servicios. Esto es gracias al campo de unin que es el campo CIF.
565
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:
566
567
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.
568
569
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.
570
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
Campos
Coste
Criterios
200
571
Campos
Coste
Criterios
>200
Campos
Coste
Criterios
>=200
Campos
Coste
Criterios
<200
572
Campos
Coste
Criterios
<=200
573
Campos
Coste
Criterios
<>200
Campos
Coste
Criterios
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
574
< 10-12-2007
<> 10-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
Criterios
Jos Manuel
Encontrara a los que tengan de nombre Jos Manuel. No encontrara a los que se llamaran Jos a secas, o
575
Campos
Nombre
Criterios
Jos*
Campos
Nombre
Encontrara a los Manuel Jos, Antonio Jos, Mara Jos,
Criterios
*Jos
Campos
Nombre
Buscar aquellos registros cuyo Nombre contenga la palabra Jos en cualquier parte:
Criterios
*Jos*
Criterios complejos
576
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.
Criterios
*Jos
>1000 300
Antonio
577
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.
578
CONCLUSIN
Se muestran determinados campos y tambin aquellos registros que cumplan un criterio determinado.
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.
579
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
Base de Datos
580
Por otro lado, cuando se da una orden de realizar una consulta, la base de datos nos devuelve el resultado de dicha consulta:
Resultado de la consulta
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.
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)
581
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.
Visualizar una tabla entera (todos los campos y todos los registros)
582
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)
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.
583
Ejemplo: Visualizar todos los campos de aquellos trabajadores que cobren un sueldo superior a los 1000 euros
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
584
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
585
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.
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
586
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;
587
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)
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
>
Posterior a
588
(para fechas)
>=
<
<=
<>
589
Between...and
Like cadena*
Like *cadena
590
Like *cadena*
IS NULL
Operadores Lgicos
Operador Significa
Ejemplos
AND
(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.
591
NOT
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:
Valores de texto Los valores de texto se indican rodendolos entre comillas simples:
592
Ejemplos:
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:
593
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,
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,
En el caso de que el nombre del campo contenga espacios, entonces tendremos que rodear el campo con corchetes.
594
Por ejemplo,
595
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:
596
4. En el cuadro de eleccin de tablas no agregaremos ninguna. As pues pulsaremos directamente el botn Cerrar.
597
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:
598
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:
599
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:
600
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.
601
602
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.
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)
603
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.
SELECT trabajadores.nombre, trabajadores.apellidos, servicios.tipo, servicios.cantidad, clientes.nombre FROM trabajadores, servicios, clientes
604
(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)
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.
605
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;
606
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.
607
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.
608
CONCLUSIN
- 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.
609
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
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.
610
611
Se empezar estudiando como aadir nuevos registros en una base de datos usado el lenguaje SQL.
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
612
Nombre: Mara
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);
613
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.
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);
614
615
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.
616
4. Pulsa el botn SQL que se encuentra en la parte superior izquierda de la ventana para crear una consulta SQL.
617
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:
618
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.
619
620
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.
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;
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
621
En este ejemplo se les asigna un sueldo de 1200 euros y el coche con matrcula 3355AAA a todos aquellos trabajadores que hayan entrado en la empresa antes del 1-1-2004.
Ejemplo:
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:
622
En este ejemplo se estoy asignando un sueldo de 1300 al trabajador con DNI 33.444.333A, y a ningn otro (ya que se supone que no habr otro con dicho DNI)
623
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.
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.
624
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:
625
Al igual que podemos aadir nuevos registros (filas) a las tablas usando SQL, tambin podemos usar este lenguaje para eliminar registros de las tablas.
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:
En este ejemplo se estn eliminando de la tabla trabajadores aquellos trabajadores cuyo sueldo sea superior a 1000.
626
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.
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:
627
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.333-B, que es precisamente el trabajador que se aadi en el ejercicio guiado 1.
628
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:
629
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
630
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)
631
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.
632
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.
633
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:
634
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:
635
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.
636
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
637
y
java.sql.Statement
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:
638
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
639
Class.forName(controlador).newInstance();
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.
Tambin puedes observar que es obligatorio encerrar el cdigo de la carga del controlador entre try catch para capturar cualquier error imprevisto.
640
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:
641
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.
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.
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.
642
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:
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.
643
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.
644
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.
645
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:
El objeto sentencia se usa para dar rdenes a la base de datos. Esas rdenes se dan usando el lenguaje de consulta SQL.
646
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.
647
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
DNI Nombre Apellidos Sueldo BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 1000 01/06/2006 1144-BBB 1120 04/05/2002 4433-ABB Fecha Matricula
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.
648
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
DNI Nombre Apellidos Sueldo BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 1000 01/06/2006 1144-BBB 1120 04/05/2002 4433-ABB Fecha Matricula
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:
649
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.
650
En nuestro caso:
Extrae el nombre del trabajador actual (Ana) Extrae los apellidos del trabajador actual (Ruiz) Extrae el sueldo del trabajador actual (1200)
651
Pulsa el botn
25. Sigamos haciendo cambios en el cdigo del botn para entender mejor el funcionamiento de los ResultSet. Aade la siguiente lnea:
652
653
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
DNI Nombre Apellidos Sueldo BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 1000 01/06/2006 1144-BBB 1120 04/05/2002 4433-ABB Fecha Matricula
27. Esto quiere decir que si se ejecuta el programa se mostrar informacin sobre Francisco Lpez. Comprubalo:
654
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):
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.
655
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
DNI Nombre Apellidos Sueldo BOF Fecha Matricula
656
Trabajadores
DNI Nombre Apellidos Sueldo Ruiz Fecha Matricula
21.123.123-A Ana
657
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.
658
Trabajadores
DNI Nombre Apellidos Sueldo BOF 21.123.123-A Ana Ruiz 1200 02/03/2002 3322-ASR 1000 01/06/2006 1144-BBB 1120 04/05/2002 4433-ABB Fecha Matricula
659
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:
660
Lo primero que se hace es colocar explcitamente la flecha en la fila BOF, es decir, antes del primer trabajador:
r.beforeFirst();
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";
661
Al pulsar el botn
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 }
662
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)
getDouble(campo)
Esto nos permite el realizar operaciones con los datos extrados del ResultSet.
663
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.
664
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.
665
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.
* 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
- Las consultas SQL ejecutadas en la base de datos se almacenan en objetos del tipo ResultSet
666
* 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.
667
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.
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:
668
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
669
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:
39. 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:
40. En la parte superior de la ventana aade un botn con el texto Ver Datos Servicios que se llame btnServicios.
670
41. 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 42. 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
43. 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.
671
45. 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:
672
Recuerda que el mtodo PrepararBaseDatos siempre ser igual, solo tienes que indicar aqu el nombre de la base de datos a usar.
673
46. 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:
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:
674
47. Aunque no es vital para el programa, aadamos el cierre de la conexin de la base de datos en el windowClosing de nuestra ventana:
675
48. 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.
676
50. 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:
677
El cdigo se ha mejorado de forma que la fecha aparezca en un formato espaol correcto. Ejecuta el programa para comprobar el resultado:
678
679
51. 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 cadfecha; //cadena para fechas String caddia; //cadena para el dia String cadmes; //cadena para el mes String cadanio; //cadena para el ao
Dentro del bucle extraemos la fecha del ResultSet y la almacenamos en la variable cadfecha:
cadfecha=r.getString("fecha");
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);
680
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:
681
52. Ahora mejoraremos el programa para que los costes de los servicios aparezcan con coma decimal, en vez de punto decimal:
682
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:
683
cadcoste=r.getString("cantidad"); cadcoste=cadcoste.replace(".",",");
VALORES NULOS
684
53. 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. 54. Para comprobar esta circunstancia, agrega un nuevo botn a la ventana principal con el texto Ver Datos de Clientes. Llmalo por ejemplo btnClientes. 55. 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
685
tabla clientes, y luego recorre el ResultSet mostrando los campos nombre, telfono 1 y telfono 2 en un JOptionPane.
56. 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:
686
57. 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.
687
688
CONCLUSIN
A travs del objeto sentencia podemos ejecutar una consulta SQL en una base de datos.
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.
689
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:
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:
690
select * from
con
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.
691
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.
692
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.
58. 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:
693
694
60. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que prepararlo haciendo lo siguiente: a. Crear la subcarpeta Base y copiar en ella el fichero de base de datos MANEMPSA.MDB que tiene en la carpeta Mis Documentos. b. Aadir al programa los objetos conexin (Connection) y sentencia (Statement) como globales. c. Crear el procedimiento PrepararBaseDatos y llamarlo desde el constructor. d. Cerrar la conexin desde el evento windowClosing Realice estos cuatro pasos que se han indicado antes de continuar.
61. 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:
695
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.
696
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)
697
63. 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:
698
64. Se pretende que estos botones funcionen de la siguiente forma: a. El usuario introducir un sueldo en el cuadro de texto txtSueldo. b. Luego, si pulsa el botn Igual, aparecer en el panel todos los trabajadores que tengan un sueldo igual al introducido. c. En cambio, si pulsa el botn Mayor, aparecer en el panel todos los trabajadores que tengan un sueldo mayor que el introducido. d. 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.
65. 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)
699
String consulta; consulta = select * from trabajadores where sueldo = +txtSueldo.getText(); ResultSet r = sentencia.executeQuery(consulta);
700
Aqu se crea una variable de texto llamada consulta y luego se concatena en ella la cadena:
con
Si el cuadro de texto del sueldo contuviera un 1000, entonces la cadena resultante sera:
Es decir, se construye una consulta que busca los sueldos de 1000 euros.
66. 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.
701
Al pulsar el botn Igual se construye una consulta usando el contenido del cuadro de texto txtSueldo.
67. 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)
702
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:
703
68. 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. 69. 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.
704
70. 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.
71. Estos botones funcionarn de la siguiente forma: a. El usuario introducir un nombre en el cuadro de texto txtNombre. b. Si luego pulsa el botn Igual a, entonces aparecern todos aquellos trabajadores que tengan exactamente dicho nombre. c. 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. 72. 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)
705
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:
706
Supongamos que el cuadro de texto contiene la palabra Ana, el resultado de la concatenacin sera:
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 ()
707
73. 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.
74. 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.
708
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)
75. 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)
709
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: %
710
Supongamos que escribimos en el cuadro de texto del nombre la palabra an, el resultado de la concatenacin sera el siguiente:
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:
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.
76. 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.
711
Se escribe fra, se pulsa el botn Contiene a, y entonces el programa construye una consulta que muestra los trabajadores cuyo nombre contenga fra.
77. Sigamos mejorando el programa. Aade estos cuadros de texto y estos botones:
712
txtDia
txtMes
txtAnio
btnAnterior
btnDespues
713
78. El objetivo de estos elementos aadidos es el siguiente: a. El usuario introducir una fecha (da, mes y ao) en los cuadros de texto txtDia, txtMes, txtAnio. b. Luego, si pulsa el botn Anterior, aparecern los trabajadores que hayan entrado en la empresa antes de la fecha indicada. c. Si pulsa el botn Despus, en cambio, aparecern los trabajadores que hayan entrado en la empresa despus de la fecha indicada. 79. 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):
714
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)
715
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: #
en el cuadro txtDia se introdujo un 20. en el cuadro txtMes se introdujo un 12. En el cuadro txtAnio se introdujo un 2005.
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
716
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 #
80. 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.
717
Al pulsar el botn Anterior, el programa mostrar los trabajadores que hayan entrado
81. 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.
718
CONCLUSIN
A travs del objeto sentencia podemos ejecutar una consulta SQL en una base de datos.
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
719
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)
720
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:
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.
sentencia.executeUpdate(insert . . .);
sentencia.executeUpdate(update . . . );
sentencia.executeUpdate(delete . . . );
721
722
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.
82. 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:
723
84. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que prepararlo haciendo lo siguiente:
724
a. Crear la subcarpeta Base y copiar en ella el fichero de base de datos MANEMPSA.MDB que tiene en la carpeta Mis Documentos. b. Aadir al programa los objetos conexin (Connection) y sentencia (Statement) como globales. c. Crear el procedimiento PrepararBaseDatos y llamarlo desde el constructor. d. Cerrar la conexin desde el evento windowClosing Realice estos cuatro pasos que se han indicado antes de continuar.
85. 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:
86. 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:
725
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.
726
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.
87. Ejecute el programa y pruebe el botn btnTrabajadores. Compruebe que realiza su cometido.
727
88. 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
728
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.
Lo primero que hay que tener en cuenta es que se realiza una concatenacin de cadenas dentro de la variable consulta.
729
Observa el uso de += para concatenar. Ten en cuenta que es lo mismo poner esto:
consulta += +txtDNI.getText()+,;
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:
730
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):
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
731
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.
90. Finalmente ejecute el programa y compruebe su funcionamiento aadiendo varios trabajadores a la tabla:
732
733
CONCLUSIN
Se pueden ejecutar instrucciones SQL del tipo INSERT INTO (insertar registros) usando el objeto sentencia.
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.
734
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.
735
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.
91. Entre en NetBeans. Abre el proyecto llamado GestionTrabajadores que se program en la hoja anterior. 92. Aade en la parte inferior de la ventana un nuevo panel:
Panel: panelBajas
93. La mejora que se pretende hacer es la siguiente: a. El usuario introducir en el cuadro de texto txtDNIEliminar el DNI del trabajador que quiere eliminar.
736
b. Al pulsar el botn Eliminar el trabajador con dicho DNI se eliminar de la tabla. c. Antes de eliminar al trabajador, se le pedir al usuario una confirmacin, para evitar un borrado accidental. d. Si el DNI introducido no se correspondiera con ningn trabajador de la tabla, entonces se mostrar un mensaje indicndolo.
737
94. Para hacer esto, entre en el actionPerformed del botn Eliminar y programe lo siguiente:
Lo primero interesante que encontrar es la construccin de una consulta de seleccin (SELECT) usando la tpica concatenacin de cadenas:
738
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.
if (!r.first()) {
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:
739
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.
740
95. 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.
741
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.
742
CONCLUSIN
Se pueden ejecutar instrucciones SQL del tipo DELETE (borrar registros) usando el objeto sentencia.
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.
743
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.
744
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.
96. Entre en NetBeans. Abre el proyecto llamado GestionTrabajadores que se program en la hoja anterior. 97. Modifique la ventana principal aadiendo un nuevo panel con los siguientes componentes:
Nuevo panel
745
El botn es btnBuscar
txtModDNI txtModNombre
98. La mejora que se pretende hacer es la siguiente: a. El usuario introducir en el cuadro de texto txtModDNI el DNI del trabajador cuyos datos se quieren modificar. b. 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) c. Cuando aparezcan los datos del trabajador en los cuadros de texto, el usuario podr realizar las modificaciones pertinentes.
746
99. Primero programaremos el botn de bsqueda. Entre en el actionPerformed de este botn y programe lo siguiente:
747
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));
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.
748
ao-mes-dia-hora:minutos
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.
749
100. Ejecuta el programa y comprueba su funcionamiento. Escribe un DNI en el cuadro del DNI de bsqueda y pulsa Buscar.
Si existe un trabajador con ese DNI, sus datos aparecern en los cuadros
101. 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.
102. Para hacer esto, entre en el actionPerformed del botn Efectuar Modificacin y programe lo siguiente:
750
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:
751
txtModDNI
txtModNombre txtModApellidos
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.
752
103. 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.
753
754
CONCLUSIN
Se pueden ejecutar instrucciones SQL del tipo UPDATE (modificar registros) usando el objeto sentencia.
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.
755
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.
756
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:
757
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...
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.
758
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)
759
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:
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.
760
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:
761
Este cdigo aadir una nueva fila en blanco a la tabla. Estudiemos cada lnea:
762
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):
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.
763
8. Para entender bien el funcionamiento de la insercin de filas en la tabla, aada otro botn llamado btnNuevoElemento con el texto Nuevo Elemento:
764
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.
765
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:
766
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.
767
768
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:
769
Estudiemos el cdigo.
Primero, se recogen los valores introducidos en los cuadros de texto de la fila y columna y se convierten a enteros:
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):
770
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:
771
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
btnIntroducir
txtNuevoValor
772
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.
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.
773
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:
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:
774
Y al pulsar el botn Introducir el resultado es que el dato se introduce en la celda indicada por la fila y columna.
775
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.
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.
776
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.
Base de Datos
ResultSet
JTable
777
EJERCICIO GUIADO N 1
20. 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.
21. Una vez hecho esto, aade a la ventana principal un objeto JTable y llmalo simplemente tabla. 22. Aade en la parte inferior un botn llamado btnTrabajadores. La ventana principal quedar as:
778
23. 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:
779
Si observas el cdigo, vers que en el mtodo PrepararTabla se crea un vector de cadenas con cuatro elementos pero que no contiene nada.
El resultado de esto es que la tabla aparecer vaca y sin ttulos (En realidad, como ttulos aparecen letras: A, B, C, etc)
780
Debido a que hemos asignado un vector de ttulos sin contenido, las columnas tienen como ttulo letras.
25. Bien, ahora programaremos el botn btnTrabajadores de forma que al pulsarlo se muestre el contenido de la tabla Trabajadores. Programe lo siguiente:
781
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.
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.
782
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.
26. 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.
783
27. 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.
784
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)
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.
28. Para entender el cdigo anterior aqu tienes un pequeo grfico explicativo:
785
i.
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)
ii.
iii.
iv.
29. 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.
786
30. Si observa la tabla ver que la fecha aparece en el formato estndar de almacenamiento: Ao-mes-dia hora:min:seg
787
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.
31. Ejecuta ahora el programa y observa como se muestran las fechas y los sueldos:
788
789
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.
790
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.
791
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:
792
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.
793
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:
794
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.
795
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:
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.
796
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:
797
txtNuevoDni
txtNuevoNombre
txtNuevoApellidos
txtNuevoSueldo
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.
798
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.
14. Ahora programemos los botones del cuadro de dilogo dialogoNuevo. Empecemos por el botn Cancelar:
799
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:
800
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.
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:
801
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 :
802
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:
803
23. Vamos a modificar un poco el diseo del dialogoModificar. Haz doble clic sobre l y realiza las siguientes modificaciones en el diseo:
txtModNombre
txtModApellidos
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.
804
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.
805
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.
806
Selecciona...
Y luego pulsa modificar.
807
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.
808
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.
809
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.
810
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.
811
CONCLUSIN
La ms simple de las aplicaciones de base de datos debe ser capaz de realizar las siguientes operaciones sobre una tabla:
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.
812
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.
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.
813
814
EJERCICIO GUIADO N 1
30. Abrir la aplicacin de la hoja guiada anterior. 31. Primero debes aadir un botn btnFiltar a la ventana:
32. 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.
33. Haz doble clic sobre este dilogo y diselo de la siguiente forma:
815
txtFiltrarDni
txtFiltrarNombre
txtFiltrarApellidos
comboSueldo
txtFiltrarSueldo
comboFecha
NOTA: Los dos combos del cuadro de dilogo deben contener los siguientes elementos:
>
<
>=
<=
<>
816
34. 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.
817
35. 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.
818
37. Programemos ahora el botn Cancelar del cuadro de dilogo de filtrado. La programacin de este botn es muy sencilla:
819
38. 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.
820
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.
821
39. 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.
822
Es necesario estudiar muy detenidamente el cdigo que tenemos programado hasta ahora antes de continuar.
La variable sql es una variable de cadena que contendr la instruccin SELECT que efectuar el filtrado (la consulta)
823
-
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):
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
Etc.
Resumiendo, la primera condicin vendr antecedida de where, mientras que el resto de las condiciones vendrn antecedidas del and.
824
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.
825
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.
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.
826
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: =, >, <,
>=, <= , <>
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.
827
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.
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.
828
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.
45. 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:
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)
829
46. 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.
830
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.
47. 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:
48. 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:
831
49. 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:
832
Queremos buscar a los trabajadores que tengan una a en el nombre y cobren menos de 1500 euros. (Recuerda activar el combo)
833
834
50. 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.
51. 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.
52. 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.
835
Ejemplo:
Se acaba de realizar un filtrado, la tabla muestra solo los trabajadores que cumplen la condicin...
Pulsa ahora Filtrar
836
837
Y el resultado ser que se quita el filtrado y se vuelven a mostrar todos los trabajadores
838
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.
839
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.
840
EJERCICIO GUIADO N 1
53. Abrir la aplicacin de la hoja guiada anterior. 54. 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
841
NOTA N1: El combo cboCamposOrdenacion contendr los siguientes elementos: (Sin Ordenacin), DNI, Nombre, Apellidos, Sueldo, Fecha, Matricula:
842
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.
55. 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):
843
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. 56. Ejecuta el programa y prueba a hacer un filtrado eligiendo un campo para ordenar y observa el resultado:
844
En este ejemplo se pretende visualizar a todos los trabajadores que contengan una a en su nombre...
845
57. 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.
846
58. 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:
etiNumeroTrab
59. 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.
847
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.
848
849
60. 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.
61. 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.
850
Para ello debes aadir la siguiente lnea al cdigo del botn Aceptar del cuadro de dilogo de filtrado:
851
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.
62. 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.
852
Al iniciarse el programa aparece el listado completo de trabajadores y se calcula el nmero de trabajadores y el sueldo medio...
853
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...
854
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.
855
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.
856
857
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):
Aqu tendremos un listado con los campos de las tablas que podremos incluir en el informe, entre otras cosas.
858
Y aqu tenemos la salida, lugar donde aparecen los mensajes informativos y de error.
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.
859
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.
860
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.
861
6. Ahora seleccionaremos el fichero de la base de datos MANEMPSA haciendo clic en el botn Seleccionar:
862
7. Usando la ventana de exploracin que aparece, busca la base de datos MANEMPSA que se encuentra en Mis Documentos. Seleccinala y pulsa Aceptar.
863
864
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.
865
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:
866
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)
867
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.
2. Para crear esta conexin, active la opcin Datos Conexiones / Fuentes de Datos
868
869
4. Para base de datos de Access, debes activar la opcin Conexin Base de Datos JDBC y pulsar Prximo.
870
5. Ahora le daremos un nombre a la conexin que realizaremos con la base de datos MANEMPSA. El nombre ser simplemente: Conexin con MANEMPSA.
871
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
872
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:
873
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)
874
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.
875
Conexin creada.
12. Cierra el cuadro de conexiones. Ya tenemos el programa iReport preparado para la creacin de informes con la base de datos MANEMPSA.
876
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:
877
878
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:
879
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.
880
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
881
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.
882
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.
883
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:
884
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:
885
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:
886
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.
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:
887
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.
888
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.
889
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.
890
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.
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)
891
892
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.
893
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.
894
10. Active Prximo para ir al 5 y ltimo paso del asistente y pulse Terminar. 11. Acabamos de crear el informe. Observe su diseo.
895
12. Ahora es conveniente guardarlo para evitar problemas. Pulse la opcin Fichero Guardar y gurdelo con el nombre listadocoches en la carpeta Mis Documentos.
896
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:
897
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:
898
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:
899
20. Selecciona ahora el ttulo, por ejemplo (solo tienes que hacer un clic sobre l)
900
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.
901
902
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:
903
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:
904
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:
905
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.
906
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.
907
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.
908
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.
909
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.
910
911
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.
912
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:
913
Si en la parte inferior aparece el listado de campos seleccionados en la consulta, entonces es indicativo de que todo va bien.
914
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).
915
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.
13. Haz lo mismo con los otros campos que queremos mostrar: el tipo y la cantidad: El detalle quedar as:
916
15. Una vez guardado ver como queda el informe que acaba de hacer:
917
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):
918
18. Si visualiza ahora el informe ver que tiene mejor aspecto (los servicios de Juan aparecen ms unidos):
919
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:
920
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:
921
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:
922
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.
923
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:
924
27. Haz doble clic sobre ese recuadro y escribe Ficha de Servicios.
28. Ahora asigna al ttulo las siguientes propiedades: a. Un tamao de letra de 24 b. Agranda el cuadro de forma que ocupe prcticamente toda la zona de ttulo.
925
c. d. e. f.
Centra el ttulo en el recuadro. Subryalo. Asigna un color de fondo gris claro. Desactiva la opcin transparente.
926
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.
927
31. Vamos a empezar agrandando la zona del Encabezado de Pgina. Esto se hace fcilmente arrastrando la lnea lmite inferior de la zona:
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:
928
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:
929
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:
930
35. Haga lo mismo con el campo Apellidos y el campo Nombre. El informe quedar as:
931
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:
932
933
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:
934
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.
935
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:
936
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.
937
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,
Encabezado de columna (columnHeader) Se usa para colocar el texto del encabezado del listado (los Detalle (detail) Aqu aparecern todos los datos del listado. Por tanto, aqu se suelen colocar los campos que
Pie de columna (columnFooter) Lo que se coloque aqu aparecer siempre debajo del listado de
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 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
Pie de la ltima pgina (lastPageFooter) Es un pie especial, ya que solo aparece en la parte inferior de la ltima pgina.
938
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.
Si se quiere que aparezca un dato de la base de datos, entonces habr que introducir un campo.
Todos los elementos colocados pueden ser modificados a travs de sus propiedades.
939
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.
940
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. En la pantalla que aparece debes introducir la siguiente consulta SQL:
6.
941
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:
942
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:
943
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:
944
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:
945
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.
946
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:
947
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)
948
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.
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.
949
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:
950
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.
951
27. Ahora visualice el informe y observe la parte inferior (si cambia el zoom al 50% podr tener una vista global del informe):
952
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
953
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
954
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
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.
955
31. Por supuesto, sera interesante aadir un texto esttico en el encabezado de columnas:
956
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:
957
958
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)
959
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.
960
40. Aparecer un nuevo recuadro en el resumen. Colquelo al mismo nivel que la columna de la cantidad.
961
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.
962
963
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.
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.
964
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.
965
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.
966
44. Entra en iReport. 45. 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.
46. 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)
47. Los campos a aadir al listado sern: Nmero, Fecha, Tipo y Cantidad. Pulse el botn Prximo.
48. 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.
967
Pulse Prximo. 49. Elija una disposicin Tabulada del tipo Classic_T. Pulse Prximo y Terminar. 50. Aparecer el diseo del informe que acaba de crear. Observe que entre las zonas tpicas del informe ha aparecido una nueva zona de agrupamiento:
968
51. 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. 52. 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:
969
53. Tambin puede resultar interesante modificar el patrn de la Cantidad, de forma que aparezca con dos decimales:
54. Finalmente asigne el ttulo Listado de Servicios al informe. Este debe tener ahora el siguiente aspecto al visualizarlo:
970
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.
Bomberos
971
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.
972
CONCLUSIN
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.
973
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.
974
55. 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.)
975
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.
57. 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.
976
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
58. 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:
977
60. 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:
61. 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:
978
62. 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.
979
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.
980
5. Crea un botn en la ventana de tu proyecto. El botn contendr el texto Informe Agrupado y su nombre ser btnInformeAgrupado.
981
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: 1. 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. 2. A continuacin viene una lnea donde se crea un objeto informe del tipo JasperPrint:
JasperPrint informe = JasperFillManager.fillReport(rutainforme,null,conexin);
3. 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. 4. Es interesante que observes el uso de un mtodo llamado fillReport (rellenar informe) que se encarga de rellenar el informe con datos. 5. Este mtodo necesita tres parmetros: b. El sitio donde se encuentra el fichero del informe. c. Los parmetros (Null en nuestro ejemplo. Los parmetros se estudiarn en prximas hojas guiadas) d. 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.
982
1. 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);
2. 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). 3. 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. 4. 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.
983
8. 9.
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: 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
984
985
65. Repita el proceso para agregar los otros dos ficheros necesarios. Al final, su zona de Bibliotecas debe quedar as (observe los tres ficheros aadidos):
986
66. 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:
67. Tiene que agregar el import para la clase JasperFillManager: net.sf.jasperreports.engine.JasperFillManager 68. Ahora agregue el import para la clase JasperPrint: net.sf.jasperreports.engine.JasperPrint 69. Y finalmente agregue el import para la clase JasperViewer: net.sf.jasperreports.view.JasperViewer
70. Los errores han desaparecido. Ya puede ejecutar el programa. 71. 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:
987
72. 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:
988
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.
989
En nuestro caso, al tener el valor true, este cuadro s aparecer. 74. Ejecute el programa y pruebe el nuevo botn. No hace falta que imprima el informe.
990
CONCLUSIN
Para poder imprimir un informe creado con iReport desde una aplicacin Java es necesario agregar ciertas libreras pertenecientes al programa iReport:
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.
991
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.
992
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.
993
75. 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:
994
77. 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.
78. Acceda a la consulta del informe a travs de la opcin Datos Consulta de informe y obsrvela:
995
La consulta SQL extrae informacin de aquellos servicios que hayan sido realizados por el trabajador con DNI 12.321.567-B.
996
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.
80. 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:
81. En la carpeta de parmetros haz clic con el botn derecho del ratn e indica la opcin Add Parameter para aadir un nuevo parmetro:
997
82. En la ventana que aparece debes indicar el nombre que le has dado al parmetro. En nuestro caso, el nombre asignado es DNI:
83. 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:
998
84. 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.
999
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)
1000
En l ver dos lneas nuevas en las que se definen los valores de los parmetros:
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.
1001
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 A54.
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.
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.
1002
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.
1003
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:
1004
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:
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}
1005
1006
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.
$P{nombre}
$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.
1007
El uso de parmetros en informes hace que estos sean mucho ms verstiles y que el programa tenga ms posibilidades.
1008
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.
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:
1009
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.
1010
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.
1011
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.
1012
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:
1013
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.
1014
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:
1015
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:
1016
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.
1017
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.
1018
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.
1019
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.
1020
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.
1021
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):
1022
<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>
<resources> <res id="LicencePanel.licence" src="Licencia.txt"/> <res id="InfoPanel.info" src="Leeme.txt"/> <res src="shortcutSpec.xml" id="shortcutSpec.xml"/> </resources>
1023
<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:
<info>
1024
<appname>Nombre del Programa</appname> <appversion>Versin</appversion> <authors> <author name="Juan Prez" email="juanperez@hotmail.com"/> </authors> <url>http://www.mipagina.es/</url> Escribe aqu tu nombre, </info>
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 cual se encuentra tambin dentro de la carpeta distribuible. En este ejemplo se supone que el fichero se llama gestion.jar. Escriba usted el nombre de su programa.
Una carpeta de librera (lib) Una carpeta para la base de datos (base) - Una carpeta para los informes (informes) Una carpeta para las imgenes (imgenes)
1025
1026
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):
<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" />
1027
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.
1028
/>
<shortcut name="Desinstalar Taller Mecnico" target="$INSTALL_PATH\uninstaller\uninstaller.jar" workingDirectory="$INSTALL_PATH" iconFile="$INSTALL_PATH\icono.ico" startMenu="no" programGroup="yes" /> </shortcuts> Esta parte crea un icono para desinstalar el programa. Debes indicar el nombre que le quieres dar a este acceso directo.
1029
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
1030
3. Una vez dentro de la carpeta del programa IzPack, debes ejecutar el siguiente comando:
bin\compile camino\carpeta\install.xml -b camino\carpeta
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.
1031
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.
1032
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.
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.
1033
METODOLOGA DE LA PROGRAMACIN
Una etiqueta que contenga su nombre. Nombre de la etiqueta: etiNombre Una etiqueta que contenga su ciudad. Nombre de la etiqueta: etiCiudad Un botn con el texto Ocultar Nombre. Nombre del botn: btnOcultarNombre Un botn con el texto Visualizar Nombre. Nombre del botn: btnVisuNombre Un botn con el texto Ocultar Ciudad. Nombre del botn: btnOcultarNombre Un botn con el texto Visualizar Ciudad. Nombre del botn: btnVisuCiudad
Cuando se pulse el botn btnOcultarNombre, se debe ocultar la etiqueta etiNombre. Cuando se pulse el botn btnVisuNombre, se debe visualizar la etiqueta etiNombre.
1034
-
Cuando se pulse el botn btnOcultarCiudad, se debe ocultar la etiqueta etiCiudad. Cuando se pulse el botn btnVisuCiudad, se debe visualizar la etiqueta etiCiudad.
Ejercicio 2
Crear un programa java cuya ventana principal contenga los siguientes componentes:
Un cuadro de texto. El nombre ser txtTexto. Una etiqueta vaca (sin texto dentro). El nombre ser etiTexto1. Otra etiqueta vaca (sin texto dentro). El nombre ser etiTexto2. Un botn con el texto Traspasa 1. El nombre ser btnTraspasa1. Un botn con el texto Traspasa 2. El nombre ser btnTraspasa2.
Cuando el usuario pulse el botn Traspasa 1, lo que se haya escrito dentro del cuadro de texto se copiar dentro de la etiqueta 1. Cuando el usuario pulse el botn Traspasa 2, lo que se haya escrito dentro del cuadro de texto se copiar dentro de la etiqueta 2.
Usar el mtodo setText para situar el texto en la etiqueta, y getText para recoger el texto del cuadro de texto.
1035
Ejercicio 3
Se pide que realice un programa en java cuya ventana principal incluya los siguientes componentes:
Un cuadro de texto llamado txtTexto. Una etiqueta vaca llamada etiTexto. Un botn con el texto Vaciar llamado btnVaciar.
Cuando el usuario escriba en el cuadro de texto txtTexto, lo que escriba pasar inmediatamente a la etiqueta etiTexto. (Tendr que programar el evento keyPressed del cuadro de texto)
Cuando el usuario pulse el botn Vaciar el texto contenido en el cuadro de texto y en la etiqueta se borrar. (Tendr que programar el evento actionPerformed)
Tendr que usar el mtodo setText para colocar texto en la etiqueta y usar el mtodo getText para recoger el texto escrito en el cuadro de texto.
Ejercicio 4
Se pide que realice un programa en java cuya ventana principal contenga los siguientes elementos:
1036
-
Un cuadro de texto llamado txtCiudad. Una etiqueta llamada txtFrase. Un botn con el texto Aceptar llamado btnAceptar. Un botn con el texto Desactivar llamado btnDesactivar. Un botn con el texto Activar llamado btnActivar.
El usuario introducir un nombre en el cuadro de texto txtNombre. Por ejemplo Juan. El usuario introducir una ciudad en el cuadro de texto txtCiudad. Por ejemplo Jerez. Cuando el usuario pulse el botn Aceptar, entonces aparecer un mensaje en la etiqueta llamada txtFrase indicando como se llama y donde vive. Por ejemplo:
Cuando el usuario pulse el botn Desactivar, entonces los dos cuadros de texto se desactivarn. Cuando el usuario pulse el botn Activar, los dos cuadros de texto se volvern a activar.
Tendr que usar la concatenacin de cadenas. Recuerde que se pueden concatenar cadenas a travs del operador +.
Tendr que usar el mtodo setText para colocar el texto en la etiqueta y el mtodo getText para recoger el texto de cada cuadro de texto.
Tendr que usar el mtodo setEnabled para activar o desactivar cada cuadro de texto.
1037
Ejercicio 5
Debe realizar un programa java cuya ventana principal contenga los siguientes elementos:
Cuatro etiquetas, conteniendo distintas palabras cada una. Puede llamarlas: etiPal1, etiPal2, etiPal3 y etiPal4. Otra etiqueta que contenga el texto Ocultar. Esta etiqueta se llamar etiOcultar y tendr un tamao ms grande que las otras y un color de fondo.
Cuando el puntero del ratn sobrevuele la etiqueta etiOcultar, las etiquetas con las palabras deben desaparecer. Cuando el puntero del ratn salga de la superficie de la etiqueta etiOcultar, entonces las etiquetas con las palabras volvern a aparecer.
Tendr que programar los eventos mouseEntered y mouseExited para que el programa detecte cuando el ratn entra o sale de la etiqueta etiOcultar.
Ejercicio 6
Debe realizar un programa java cuya ventana principal contenga los siguientes elementos:
Una etiqueta que contenga su nombre. Esta etiqueta se llamar etiNombre. Esta etiqueta debe tener un color de fondo. Un botn con el texto Esquina. Este botn se llamar btnEsquina.
1038
-
Un botn con el texto Centro. Este botn se llamar btnCentro. Un botn con el texto Agrandar. Este botn se llamar btnAgrandar. Un botn con el texto Achicar. Este botn se llamar btnAchicar.
Cuando el usuario pulse el botn Esquina, la etiqueta etiNombre se colocar en la esquina de la ventana. Cuando el usuario pulse el botn Centro, la etiqueta etiNombre se colocar en el centro de la ventana. Cuando el usuario pulse el botn Agrandar, la etiqueta etiNombre cambiar de tamao, agrandndose. Cuando el usuario pulse el botn Achicar, la etiqueta etiNombre cambiar de tamao, empequeecindose.
Cuando el usuario lleve el puntero sobre uno de los botones, el botn cambiar de tamao agrandndose. Cuando el puntero salga del botn, el botn volver a su tamao normal.
Debe programar los eventos actionPerformed, mouseEntered y mouseExited para los botones.
Tendr que usar el mtodo setLocation para cambiar la posicin de la etiqueta. Este mtodo recibe como parmetro la posicin x e y donde situar el componente.
Tendr que usar el mtodo setSize para cambiar el tamao de la etiqueta y de los botones. Este mtodo recibe como parmetro el ancho y alto del componente.
La propiedad preferredSize permite definir un tamao inicial a cada componente de la ventana. Ejercicio 7
1039
Se pide realizar un programa java que tenga los siguientes elementos en la ventana principal:
Una etiqueta con el texto que quiera. Esta etiqueta se llamar etiTexto. Un botn con el texto Azul. Este botn se llamar btnAzul. Un botn con el texto Rojo. Este botn se llamar btnRojo. Un botn con el texto Verde. Este botn se llamar btnVerde. Un botn con el texto Fondo Azul. Este botn se llamar btnFondoAzul. Un botn con el texto Fondo Rojo. Este botn se llamar btnFondoRojo. Un botn con el texto Fondo Verde. Este botn se llamar btnFondoVerde. Un botn con el texto Transparente. Este botn se llamar btnTransparente. Un botn con el texto Opaca. Este botn se llamar btnOpaca.
Cuando se pulse el botn Azul, el texto de la etiqueta se pondr de color azul. Cuando se pulse el botn Rojo, el texto de la etiqueta se pondr de color rojo. Cuando se pulse el botn Verde, el texto de la etiqueta se pondr de color verde. Cuando se pulse el botn Fondo Azul, el fondo de la etiqueta se pondr de color azul. Cuando se pulse el botn Fondo Rojo, el fondo de la etiqueta se pondr de color rojo. Cuando se pulse el botn Fondo Verde, el fondo de la etiqueta se pondr de color verde. Cuando se pulse el botn Transparente, la etiqueta dejar de ser opaca. Cuando se pulse el botn Opaca, se activar la propiedad opaca de la etiqueta.
Para cambiar el color del texto de una etiqueta, usar el mtodo setForeground.
Para indicar el color azul usar Color.BLUE. Para indicar el color rojo, usar Color.RED. Y para indicar el color verde usar Color.GREEN.
Para hacer que una etiqueta sea opaca o no, usar el mtodo setOpaque.
1040
1041
PROGRAMACIN
JAVA
Un cuadro de lista llamado lstMeses. Varios botones de opcin con los siguientes nombres:
1042
o o o o o o
Un botn Trimestre 1 llamado optTri1. Un botn Trimestre 2 llamado optTri2. Un botn Trimestre 3 llamado optTri3. Un botn Trimestre 4 llamado optTri4. Todos estos botones deben estar agrupados a travs de un objeto ButtonGroup al que llamaremos grupoTrimestres. Interesar que estos botones estn dentro de un panel.
Un botn Rellenar llamado btnRellenar. Un botn Vaciar llamado btnVaciar. Una etiqueta etiMes con un borde.
El usuario elegir una de las opciones: Trimestre 1, Trimestre 2, Trimestre 3, Trimestre 4. A continuacin el usuario pulsar el botn Rellenar, y entonces el cuadro de lista se rellenar con los meses correspondientes al trimestre elegido. Por ejemplo, si el usuario elige el Trimestre 2 y pulsa el botn, entonces el cuadro de lista contendr: Abril, Mayo, Junio. Cuando el usuario pulse el botn Vaciar, el cuadro de lista se vaciar. Cuando el usuario haga clic sobre un elemento de la lista, este debe aparecer en la etiqueta etiMes.
Ejercicio 2
Se pide realizar un programa que tenga el siguiente aspecto:
1043
Un combo llamado cboProgresion. Un cuadro de texto llamado txtInicio. Un cuadro de texto llamado txtFin. Un cuadro de texto llamado txtIntervalo. Un botn Rellenar llamado btnRellenar. Una etiqueta llamada etiResultado. Un botn Vaciar llamado btnVaciar.
El usuario introducir un nmero en txtInicio. Luego introducir otro nmero en txtFin. Tambin introducir un nmero en txtIntervalo. Al pulsar el botn Rellenar, el combo se rellenar con el listado de nmeros comprendidos entre el nmero inicial y el nmero final con intervalo el indicado.
1044
o o o
El usuario introduce en txtIntervalo un 3 Al pulsar el botn Rellenar, el combo debe rellenarse con los siguientes nmeros: 2, 5, 8, 11 Observa, del 2 al 12 saltando de 3 en 3.
Al elegir cualquiera de los nmeros en el combo, este debe mostrarse en la etiqueta etiResultado. Al pulsarse el botn Vaciar el combo se vacia.
A tener en cuenta. Si el usuario introduce algo que no sea un nmero en los cuadros de texto, el programa debera mostrar un error.
El nmero inicial debe ser menor que el nmero final. En caso contrario el programa debe mostrar un error.
1045
PROGRAMACIN
JAVA
JTOGGLEBUTTONS Ejercicio 1
Realice un programa cuya ventana tenga el siguiente aspecto:
1046
Los botones numerados desde el 1 al 6 son JToggleButtons. Sus nombres son respectivamente: botonUno, botonDos, etc
o o o
Desactivar Todos. Nombre: btnDesactivarTodos Activar Todos. Nombre: btnActivarTodos Total. Nombre: btnTotal
Cuando el usuario pulse Total, en la etiqueta debe aparecer la suma de los nmeros de los botones seleccionados. Por ejemplo, si estn seleccionados el 2 y el 4, aparecer un 6.
1047
PROGRAMACIN
JAVA
JSLIDER Ejercicio 1
Una empresa de productos qumicos necesita calcular la cantidad de agua y sales que necesita mezclar para fabricar un detergente. Para ello hay que tener en cuenta tres factores:
Litros que se quieren fabricar. (Es un valor entre 1 y 100) Calidad del detergente. (Es un valor entre 0 y 10) Densidad deseada. (Es un valor entre 50 y 200)
Un JSlider llamado deslizadorLitros que represente los litros a fabricar. Sus valores estarn comprendidos entre 1 y 100. El valor inicial del deslizador ser 50.
1048
-
Un JSlider llamado deslizadorCalidad que represente la calidad del detergente. Sus valores estarn comprendidos entre 0 y 10. El valor inicial ser 5. Un JSlider llamado deslizadorDensidad que represente la densidad deseada. Sus valores estarn comprendidos entre 50 y 200. El valor inicial ser 100. Una etiqueta con borde llamada etiLitros donde aparecer la cantidad de litros elegida en el deslizador de litros. Una etiqueta con borde llamada etiCalidad donde aparecer la cantidad de calidad elegida en el deslizador de calidad. Una etiqueta con borde llamada etiDensidad donde aparecer la cantidad de densidad elegida en el deslizador de calidad. Una etiqueta con borde etiLitrosAgua, que contenga el total de litros de agua calculados. Una etiqueta con borde etiSales, que contenga el total de sales calculados.
1049
El usuario arrastrar los deslizadores y automticamente aparecer en las etiquetas los valores de cada deslizador y la cantidad total de aguas y sales calculada.
1050
1051
PROGRAMACIN
JAVA
JSPINNER Ejercicio 1
Se propone hacer un juego sencillo, que simule la apertura de una caja a travs de una combinacin. Para ello, debes crear una ventana como la que sigue:
Tres JSpinner a los que se les llamar: spiCentenas, spiDecenas y spiUnidades. Estos JSpinner solo admitirn los valores entre 0 y 9.
Un botn btnAbrir.
1052
El usuario modificar los valores de los JSpinner y luego pulsar el botn Abrir.
Si los valores de los JSpinner coinciden con la clave, 246, entonces en la etiqueta debe aparecer el mensaje Caja Abierta.
Si los valores de los JSpinner forman un nmero menor que 246, entonces en la etiqueta debe aparecer el mensaje: El nmero secreto es mayor.
Si los valores de los JSpinner forman un nmero mayor que 246, entonces en la etiqueta debe aparecer el mensaje: El nmero secreto es menor.
Nota:
Ten en cuenta que el valor obtenido de un JSpinner no es un nmero. Si quieres obtener el nmero entero del JSpinner tienes que usar un cdigo como este:
int x; x = Integer.parseInt(spiValor.getValue().toString()) ;
Sea el nmero A las centenas, el B las decenas y el C las unidades. Para calcular el nmero correspondiente hay que hacer el siguiente clculo:
N = A * 100 + B * 10 + C
1053
Ejemplo de funcionamiento:
Pulsas Abrir...
1054
PROGRAMACIN
JAVA
JSROLLBAR Ejercicio 1
Imagine que le encargan realizar un programa que contenga un ecualizador. Para permitir al usuario el control de las distintas frecuencias se usarn varias barras de desplazamiento. La ventana del programa que debe construir debe ser similar a la siguiente:
Esta ventana contiene lo siguiente: Cinco etiquetas con borde que puede llamar etiFrecuencia1, etiFrecuencia2, etc Cinco barras de desplazamiento que tienen de nombre desFrecuencia1, desFrecuencia2, etc Cinco cuadros de verificacin que puede llamar chkFrecuencia1, chkFrecuencia2, etc Un panel con ttulo y dentro de l tres botones de opcin a los que puede llamar optPelcula, optConcierto y optPlano. (Para estos tres botones de radio necesitar un objeto del tipo ButtonGroup al que puede llamar grupoEcualizacin)
El programa funcionar de la siguiente forma: Las cinco barras de desplazamiento deben tener valores comprendidos entre un mnimo de 0 y un mximo de 10. El incremento unitario debe ser de 1 y el incremento en bloque de 2.
1055
-
Cada vez que se mueva una barra, en su etiqueta correspondiente aparecer el valor de dicha barra (un valor que estar entre 0 y 10) Comprueba que cuando el usuario active al mximo una barra en la etiqueta aparezca un 10. Las casillas de verificacin indican el bloqueo o no de cada barra. Si el usuario activa una casilla de verificacin, entonces su barra correspondiente quedar bloqueada de forma que no pueda ser modificada. Cuando se vuelva a desactivar la casilla la barra se volver a activar (Use el mtodo setEnabled) Las opciones de ecualizacin predefinidas permitirn colocar las barras de desplazamiento en unos valores predefinidos. Concretamente: o o Si el usuario activa la opcin Pelcula, las barras quedarn con los siguientes valores respectivamente: 2, 5, 8, 5, 2 Si el usuario activa la opcin Concierto, las barras quedarn con los siguientes valores respectivamente: 9, 5, 1, 5, 9 Si el usuario activa la opcin Plano, todas las barras se colocarn a 5.
o -
Cuando el programa se inicie, todas las barras deben estar a 5 y la opcin Plano debe estar activada.
1056
PROGRAMACIN
JAVA
Se supondr que las distintas luces de cada oficina se pueden encender o apagar activando o desactivando los cuadros de verificacin.
El programa adems debe de contar con un men con una opcin llamada Activacin y otra llamada Info La opcin Activacin contendr las siguientes opciones:
1057
-
La opcin Apagar Todas desactivar todos los cuadros de verificacin de las luces. La opcin Encender Todas activar todos los cuadros de verificacin de las luces. La opcin Dia contiene las siguientes subopciones:
Si se activa la opcin Dia Oficina 1, entonces se encendern (activarn) las luces principal y secundaria de la oficina 1, y se apagar (desactivar) la luz de seguridad de dicha oficina. Si se activa la opcin Dia Oficina 2, entonces se encendern (activarn) las luces principal y secundaria de la oficina 2, y se apagar (desactivar) la luz de seguridad de dicha oficina. Si se activa la opcin Dia Oficina 3, entonces se encendern (activarn) las luces principal y secundaria de la oficina 3, y se apagar (desactivar) la luz de seguridad de dicha oficina. Si se activa la opcin Dia Todas, entonces todas las oficinas tendrn las luces principal y secundarias encendidas, y apagadas las luces de seguridad.
Si se activa la opcin Noche Oficina 1, entonces se apagarn las luces principal y secundaria de la oficina 1 y se encender la luz de seguridad. Si se activa la opcin Noche Oficina 2, entonces se apagarn las luces principal y secundaria de la oficina 2 y se encender la luz de seguridad. Si se activa la opcin Noche Oficina 3, entonces se apagarn las luces principal y secundaria de la oficina 3 y se encender la luz de seguridad.
1058
-
Si se activa la opcin Noche Todas, entonces se apagarn todas las luces principales y secundarias de todas las oficinas y se encendern todas las luces de seguridad.
La opcin Principales mostrar un JOptionPane donde se indique cuantas luces principales hay encendidas ahora mismo y cuantas apagadas. La opcin Secundarias mostrar un JOptionPane donde se indique cuantas luces secundarias hay encendidas ahora mismo y cuantas apagadas. La opcin Seguridad mostrar un JOptionPane donde se indique cuantas luces de seguridad hay encendidas y cuantas apagadas. La opcin Acerca de... mostrar un JOptionPane que contendr el nombre del programa y del programador.
MEJORA OPCIONAL Sera interesante que cada cuadro de verificacin estuviera acompaado de una pequea imagen que representara una bombilla encendida o apagada segn el estado de la luz. Use etiquetas para contener las imgenes. En el EJERCICIO DE INVESTIGACIN 2 puede encontrar ms informacin sobre esto.
1059
PROGRAMACIN
JAVA
1060
El objetivo del ejercicio es crear una barra de herramientas que contenga un botn para algunas de las opciones principales del men. Concretamente, la barra de herramientas contendr los siguientes botones: Un botn para la opcin Apagar Todas. Un botn para la opcin Encender Todas. Un botn para activar todas las oficinas en modo da (es equivalente a la opcin Activacin Da Todas) Un botn para activar todas las oficinas en modo noche (es equivalente a la opcin Activacin Noche Todas) Un botn para conseguir informacin sobre las luces principales (Info Principales) Un botn para conseguir informacin sobre las luces secundarias (Info Secundarias) Un botn para conseguir informacin sobre las luces de seguridad (Info Seguridad)
En cada actionPerformed de cada botn de la barra de herramientas se tiene que programar el mismo cdigo que el de la opcin del men correspondiente.
1061
PROGRAMACIN
JAVA
1062
PROGRAMACIN
JAVA
Notas Iniciales
Supongamos que tiene en su proyecto un objeto del tipo JFileChooser llamado elegirFichero. A travs del mtodo getSelectedFile obtiene el fichero que ha elegido el usuario. El mtodo getSelectedFile devuelve en realidad un objeto del tipo File. As pues, puede hacer lo siguiente: int resp; File f; //una respuesta //un fichero
Si observa este cdigo, ver que se crea una variable f de tipo File. Y f es el fichero elegido por el usuario en el cuadro de dilogo Abrir. Los objetos del tipo File poseen diversos mtodos que permiten obtener informacin sobre el fichero y realizar algunas operaciones con ellos. He aqu algunos mtodos que se pueden usar: getName() Por ejemplo: String nombre = f.getName(); //La variable nombre contendra el nombre del fichero f getPath() Por ejemplo: String camino = f.getPath(); //La variable camino contendra el camino del fichero f exists() - Devuelve verdadero o falso segn exista o no. - Devuelve el camino completo del fichero. - Devuelve el nombre del fichero.
1063
Por ejemplo:
if (f.exists() == true ) { JOptionPane.showMessageDialog(null, El fichero f existe); } else { JOptionPane.showMessageDialog(null, El fichero f no existe); } delete() - Borra el fichero Por ejemplo: f.delete(); //Borra el fichero f
Ejercicio Teniendo en cuenta las ideas expuestas, realizar un programa cuya ventana tenga el siguiente aspecto:
El programa funcionar de la siguiente forma: Si el usuario pulsa el botn Info Fichero, aparecer el cuadro de dilogo (JFileChooser) Abrir, donde el usuario podr elegir un fichero. Una vez que el usuario elija un fichero y pulse el botn Abrir, aparecern los datos del fichero en las distintas etiquetas. En la etiqueta nombre del fichero aparecer el nombre del fichero (use getName()) En la etiqueta camino del fichero aparecer el camino completo del fichero (use getPath()) En la etiqueta existe? aparecer un mensaje indicando si el fichero existe o no (use exists()) Queda claro que si el fichero no existe no se puede visualizar ni su nombre ni su camino.
1064
Si el usuario, en cambio, pulsa el botn Eliminar Fichero, entonces el programa mostrar el cuadro de dilogo Abrir y una vez que el usuario elija un fichero, el programa lo borrar (use delete()) Pida una confirmacin antes de eliminar el fichero. Tenga cuidado al comprobar esta opcin.
1065
PROGRAMACIN
JAVA
VARIABLES GLOBALES
Ejercicio 1
Realizar un programa cuya ventana contenga los siguientes elementos: Un cuadro de texto llamado txtNumero. Un botn Acumular llamado btnAcumular. Un botn Resultados llamado btnResultados. Un botn Reiniciar llamado btnReiniciar. Una etiqueta con borde llamada etiMayor. Una etiqueta con borde llamada etiSuma. Una etiqueta con borde llamada etiMedia. Una etiqueta con borde llamada etiCuenta.
El programa funcionar de la siguiente forma: El usuario introducir un nmero en el cuadro de texto txtNumero y luego pulsar el botn Acumular. En ese momento se borrar el nmero introducido en el cuadro de texto. Este proceso lo repetir el usuario varias veces. Cuando el usuario pulse el botn Resultados, deben aparecer en las etiquetas los siguientes datos: o o o o El nmero mayor introducido hasta el momento. La suma de los nmeros introducidos hasta el momento. La media de los nmeros introducidos hasta el momento. Cuantos nmeros ha introducido el usuario hasta el momento.
El botn Reiniciar reinicia el proceso borrando todo lo que hubiera en las etiquetas de resultados y reiniciando las variables globales.
Variables globales a usar Para que sirva de ayuda, se recomienda que use las siguientes variables globales: Una variable double llamada mayor. Contendr en todo momento el nmero mayor introducido. Una variable double llamada suma. Contendr en todo momento la suma de los nmeros introducidos. Una variable int llamada cuenta. Contendr en todo momento la cuenta de todos los nmeros introducidos hasta ahora.
1066
Al comenzar el programa, y al pulsar el botn Reiniciar, ser necesario que estas tres variables se inicien a 0. Nota. Se supondr que todos los nmero introducidos sern mayores o iguales a 0.
Ejercicio 2 Realizar un programa que contenga los siguientes elementos en su ventana: Un cuadro de texto llamado txtNumero. Un cuadro de texto llamado txtApuesta Un botn Jugar llamado btnJugar. Una etiqueta llamada etiNumero. Una etiqueta llamada etiResultado que contendr inicialmente un 100.
El programa funcionar de la siguiente forma: Se trata de un juego de adivinacin. El usuario introducir un nmero entre 1 y 10 en el cuadro de texto txtNumero. Luego introducir una apuesta en el cuadro de texto txtApuesta. Y a continuacin pulsar el botn Jugar. El programa calcular entonces un nmero al azar entre 1 y 10 y lo mostrar en la etiqueta etiNumero. Si el nmero introducido por el usuario coincide con el nmero elegido al azar por la mquina, entonces el usuario gana y se le debe sumar lo apostado a la cantidad que tena en dicho momento. Si el usuario pierde entonces se le debe restar lo apostado a la cantidad que tena. El total que le quede debe aparecer en la etiqueta resultado. Al empezar el programa el usuario tiene 100 euros de bote.
Las variables globales a usar son las siguientes: Solo se necesita una variable global de tipo double a la que puedes llamar ganancias. Esta variable estar inicializada al comienzo del programa a 100.
Para hacer que el ordenador calcule un nmero aleatorio entre 1 y 10 debes usar el siguiente cdigo:
int n;
//el numero
1067
1068
PROGRAMACIN
JAVA
Un cuadro de texto llamado txtUnidades donde el usuario introducir las unidades vendidas. Un cuadro de texto llamado txtPrecio donde el usuario introducir el precio unidad. Una etiqueta llamada etiTotalSinIva. Una etiqueta llamda etiIva. Una etiqueta llamada etiTotalMasIva. Un botn llamado btnCalcular.
El usuario introducir las unidades y el precio y luego pulsar el botn Calcular. El programa entonces calcular el total de la venta, el iva y el total ms iva y presentar dichos resultados en cada etiqueta.
Ejercicio 2
1069
Un cuadro de texto llamado txtPrimerTrimestre. Un cuadro de texto llamado txtSegundoTrimestre. Un cuadro de texto llamado txtTercerTrimestre. Una etiqueta llamada etiNotaFinal. Una etiqueta llamada etiResultado. Un botn llamado btnCalcular.
El usuario introducir las notas de los tres trimestres en los cuadros de texto correspondientes. Cuando se pulse el botn Calcular, el programa calcular la nota media y la mostrar en la etiqueta llamada etiNotaFinal. Si la nota final es menor de 5, entonces en la etiqueta etiResultado aparecer la palabra SUSPENSO. Si la nota final es 5 o ms, entonces en la etiqueta etiResultado aparecer la palabra APROBADO. Si la nota final fuera un suspenso, entonces las etiquetas etiNotaFinal y etiResultado deben aparecer de color rojo. En caso contrario aparecern de color negro.
1070
Ejercicio 3
El programa debe tener una ventana con al menos los siguientes elementos:
Un cuadro de texto llamado txtRadio, donde el usuario introducir el radio. Una etiqueta llamada etiArea, donde se mostrar el rea del crculo. Una etiqueta llamada etiPerimetro, donde se mostrar el permetro del crculo.
El usuario introducir un radio dentro del cuadro de texto llamado radio. Al pulsar la tecla Enter sobre dicho cuadro de texto, el programa calcular el rea y el permetro y los mostrar en las etiquetas correspondientes.
Si el usuario introduce un radio negativo, en las etiquetas debe aparecer la palabra Error en color rojo.
Ejercicio 4
El programa le permitir al usuario introducir una base y un exponente. Luego el programa podr calcular la potencia de la base elevada al exponente.
1071
Ejercicio 5
Realizar un programa que calcule la raz cuadrada de un nmero. El programa tendr los siguientes elementos en la ventana nicamente:
El programa funcionar de la siguiente forma: cuando el usuario escriba un nmero en el cuadro de texto txtNumero, inmediatamente aparecer su raz cuadrada en la etiqueta. Para ello, tendr que programar el evento keyReleased del cuadro de texto.
Ejercicio 6
Realice un programa que contenga dos cuadros de texto: txtPalabra1, y txtPalabra2. La ventana tendr tambin un botn llamado btnConcatena y una etiqueta llamada etiTexto.
El usuario introducir las dos palabras dentro de los cuadros de texto y luego pulsar el botn Concatena. El resultado ser que en la etiqueta etiTexto aparecern las dos palabras escritas concatenadas.
1072
Por ejemplo, si el usuario escribe en el primer cuadro de texto Lunes y en el segundo Martes, en la etiqueta aparecer: LunesMartes.
1073
Ejercicio 7
Realizar un programa que muestre 10 etiquetas llamadas respectivamente: etiUna, etiDos, etiTres, etc...
Se pide que cuando el usuario lleve el ratn sobre una de las etiquetas, aparezca en el cuadro de texto el nmero correspondiente.
Los nmeros se van aadiendo al cuadro de texto. Por ejemplo, si el usuario lleva el puntero sobre la etiqueta Uno, luego sobre la etiqueta Tres y luego sobre la etiqueta Uno, en el cuadro de texto debera haber aparecido lo siguiente: 131.
Aada un botn llamado btnBorrar, que al ser pulsado borre el contenido del cuadro de texto.
Ejercicio 8
ax2+bx+c=0
1074
Para saber el nmero de soluciones de una ecuacin de segundo grado se debe realizar el siguiente clculo:
R = b2 4ac
Si R es menor de cero, la ecuacin no tiene solucin. Si R da 0, la ecuacin tiene una solucin. Si R es mayor de cero, la ecuacin tiene dos soluciones.
x = -b / (2a)
1075
Realice el programa para resolver las ecuaciones de segundo grado. El diseo de la ventana queda a su eleccin. Procure que el programa indique cuando hay o no soluciones, y que las muestre de forma adecuada.
1076
PROGRAMACIN
JAVA
CENTRALIZAR CDIGO
Ejercicio 1 Realice un programa cuya ventana tenga el siguiente aspecto:
Esta ventana consta de los siguientes elementos: Adems: Un cuadro de texto txtHoras que contiene un 0. Un cuadro de texto txtMinutos que contiene un 0. Varias etiquetas de informacin. Una contiene la palabra Horas, otra contiene la palabra Minutos y otra contiene el smbolo dos puntos (:). Un cuadro de texto vaco al que se le llamar txtCantidadMin Un botn con el signo + al que se le llamar btnSumar. Un botn con el signo al que se le llamar btnRestar.
1077
-
Una barra de herramientas con el nombre barraHerramientas, que contenga tres botones: o Un botn herramientasSumar. o Un botn herramientasRestar. o Un botn herramientasReiniciar. Asigne a estos botones el icono que quiera. Por ejemplo, iconos de relojes.
Adems: -
La ventana contendr una barra de mens a la que puede llamar barraMenus. Esta barra contiene una opcin Accin a la que puede llamar menuAccion. Dentro de la opcin Accin, tendr estas otras opciones:
Una opcin Sumar a la que llamar menuSumar. Una opcin Restar a la que llamar menuRestar. Una opcin Reiniciar a la que llamar menuReiniciar. Y una opcin Salir a la que llamar menuSalir. Adems tendr una serie de separadores para mejorar la presentacin del men.
El programa funcionar de la siguiente forma: El usuario introducir en el cuadro de texto txtCantidadMin una cantidad de minutos. Si luego, pulsa el botn sumar, o bien activa el botn sumar de la barra de herramientas, o bien activa la opcin sumar del men, entonces los minutos escritos se suman a la hora que se muestra.
1078
-
En cambio, si el usuario pulsa el botn restar, o bien activa el botn restar de la barra de herramientas, o bien activa la opcin restar de la barra de mens, entonces los minutos escritos se restan a la hora que se muestra. Si el usuario pulsa el botn reiniciar de la barra de mens o pulsa la opcin reiniciar del men, entonces la hora que se muestra se reinicia a las 00:00 horas.
1079
Un ejemplo:
1080
A TENER EN CUENTA
1081
Se aconseja que realice un procedimiento Sumar que se encargue de hacer la suma de minutos. Realice tambin un procedimiento Restar que se encargue de hacer la resta de minutos. Realice un procedimiento Reiniciar que se encargue de reiniciar la hora. Llame desde los distintos eventos al procedimiento que corresponda. Se aconseja tener una variable global hora que contenga en todo momento la hora actual. Se aconseja tener una variable global minutos que contenga en todo momento los minutos actuales. Para calcular la nueva hora use estos algoritmos:
Sumar minutos Supongamos que la hora actual sea las 14:25 Y que se quiera sumar 70 minutos Primero se hace el clculo total de minutos: 14 * 60 + 25 = 865 Luego se suman los minutos: 865 + 70 = 935 El resultado se divide entre 60 y ya tenemos la nueva hora: 935 / 60 = 15 El resto de la divisin son los minutos: 935 % 60 = 35 La nueva hora por tanto es las 15 : 35 Restar minutos Supongamos que la hora actual sea las 14:25 Y que se quiera restar 70 minutos Primero se hace el clculo total de minutos: 14 * 60 + 25 = 865 Luego se le restan los minutos: 865 70 = 795 El resultado se divide entre 60 y ya tenemos la nueva hora: 795 / 60 = 13 El resto de la divisin son los minutos: 795 % 60 = 15 La nueva hora por tanto es las 13 : 15
1082
PROGRAMACIN
JAVA
CUADROS DE DILOGO
Ejercicio 1 Se pide realizar un programa que facilite el clculo del precio de implantacin de un determinado software en una empresa. Se pretende calcular el coste de instalacin, el coste de formacin y el coste de mantenimiento. Para ello, debe realizar un proyecto con una ventana como la que sigue:
Esta ventana tiene tres cuadros de textos, para cada uno de los costes. Si se desea, se puede introducir directamente cada uno de los costes en estos cuadros de textos y al pulsar el botn Calcular aparecer la suma de los tres en la etiqueta Total. Por otro lado, cada cuadro de texto tiene asignado un botn con tres puntos que permitir facilitar el clculo de cada coste a travs de un cuadro de dilogo. Cuadro de dilogo Coste de Instalacin En el caso de que se pulse el botn correspondiente al Coste de Instalacin, el cuadro de dilogo que debe aparecer tiene que ser el siguiente (haz que sea modal):
1083
Aqu se indicar el nmero de copias de la versin simplificada del programa a instalar, y el nmero de copias de la versin completa. Al pulsar el botn Aceptar, se mostrar el coste total por instalacin en el cuadro de texto correspondiente de la ventana principal y luego se cerrar el cuadro de dilogo. Para calcular el coste de instalacin, ten en cuenta lo siguiente: Cada copia de la versin simplificada cuesta 120 euros, y cada copia de la versin completa cuesta 180 euros. Si por ejemplo, el usuario introduce 1 copia simplificada y 2 de la versin completa, el coste total ser: coste por instalacin = 120 * 1 + 180 * 2 = 480 Si se pulsa el botn Cancelar, el cuadro de dilogo se cierra y no se muestra nada en el cuadro de texto del coste de instalacin de la ventana principal. Cuadro de dilogo Coste de Formacin En el caso de que se pulse el botn correspondiente al Coste de Formacin, el cuadro de dilogo que debe aparecer tiene que ser el siguiente (haz que sea modal):
El coste de formacin se calcular multiplicando el nmero de alumnos por el nmero de horas por 10 euros. Por ejemplo, si el usuario introduce 3 alumnos y 12 horas, el coste por formacin ser: coste por formacin = 2 * 12 * 10 = 240 Al pulsar el botn Aceptar, se calcular dicho coste y se introducir en el cuadro de texto del coste de formacin de la ventana principal (luego el cuadro de texto se cerrar). Si se pulsa el botn Cancelar, el cuadro de dilogo simplemente se cerrar, sin que ocurra nada ms.
1084
Cuadro de dilogo Coste de Mantenimiento En el caso de que se pulse el botn correspondiente al Coste de Mantenimiento, el cuadro de dilogo que debe aparecer tiene que ser el siguiente (haz que sea modal):
Al pulsar Aceptar, el programa calcular el coste de mantenimiento y lo presentar en el cuadro de texto correspondiente de la ventana principal (y luego se cerrar el cuadro de dilogo) La forma de calcular el coste de mantenimiento es la siguiente: Si se elige un mantenimiento Anual, entonces el coste ser de 600 euros. Si se elige un mantenimiento Semestral, entonces el coste ser de 350 euros. Si se elige un mantenimiento del tipo Puesta en funcionamiento entonces el coste ser de 200 euros.
Al pulsar este botn, aparecer un cuadro de dilogo de ayuda con este aspecto (haz que no sea modal y que est siempre por encima de la ventana principal:
1085
Al pulsar el botn Cerrar, el cuadro de dilogo simplemente se cerrar. Para hacer el texto, usa el objeto JTextPane, y su propiedad text. Este objeto permite crear cuadros con gran cantidad de texto. Ten en cuenta que cuando aadas un JTextPane este aparecer dentro de un JScrollPane. Pantalla de Splash (Presentacin) Se aadir un nuevo cuadro de dilogo al proyecto que servir como pantalla de presentacin (a estos cuadros de dilogo se les suele denominar Splash) Disee este cuadro de dilogo como quiera. Puede aadir varias imgenes, colocar el texto donde quiera, etc. Debe mostrar este cuadro de dilogo al comenzar el programa (en el evento windowOpened del formulario) Si quiere mostrar el cuadro de dilogo de la presentacin en el centro de la pantalla, puede usar este cdigo (se supone que el cuadro de dilogo se llama dialogoPres):
int x=(int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2 - dialogoPres.getWidth()/2); int y=(int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight()/2 - dialogoPres.getHeight()/2); dialogoPres.setLocation(x,y);
El cuadro de dilogo debe tener un botn Cerrar, o bien, debe tener la posibilidad de cerrarse cuando el usuario haga clic sobre l en cualquier parte. Para mejorar su cuadro de dilogo de presentacin, se recomienda que active la propiedad del cuadro de dilogo llamada undecorated. Esta propiedad oculta la barra de ttulo del cuadro de dilogo.
1086
PROGRAMACIN
JAVA
Ejercicio 1 Realice un proyecto cuya ventana tenga el siguiente diseo. Este diseo lo tiene que hacer totalmente desde cdigo, sin usar la ventana de diseo del NetBeans:
Tenga en cuenta lo siguiente: La ventana debe tener como ttulo Ejercicio 1 El tamao de la ventana al arrancar el programa debe ser de 350 x 400 Haga que la ventana aparezca en el centro de la pantalla. El recuadro de color verde con el texto RESULTADO es una etiqueta. El botn con el texto metros/seg es un JToggleButton y debe estar activado al arrancar el programa.
1087
-
En la parte inferior de la ventana hay un JSlider. Su valor mnimo ser 0 y su valor mximo ser 100. El valor inicial del JSlider tiene que ser 20. El JSlider debe mostrar sus marcas (mtodo setPaintTicks) y la separacin entre marcas debe ser de 5 (mtodo setMinorTickSpacing)
Ejercicio 2 Realice un proyecto cuya ventana principal tenga el siguiente diseo. Este diseo lo tiene que hacer directamente desde cdigo, sin usar la ventana de diseo del NetBeans.
Tenga en cuenta lo siguiente: La ventana debe tener el ttulo Ejercicio 2 El tamao de la ventana debe ser de 300x300 La ventana debe aparecer en el centro de la pantalla al arrancar el programa. En la parte derecha la ventana contiene un JList con las ocho provincias andaluzas. En la parte izquierda la ventana contiene un JComboBox con unos tipos de artculos. (El combo se muestra desplegado para que puedas ver la lista de tipos de artculos) En la parte inferior hay una etiqueta vaca con color CYAN de fondo.
1088
PROGRAMACIN
JAVA
Ejercicio 1 Realice un programa para calcular el rea y el permetro de un crculo. La ventana del programa debe tener un aspecto parecido al siguiente:
El usuario introducir un radio y Si pulsa el botn rea se calcular el rea del crculo. (actionPerformed del botn de rea) Si pulsa el botn Permetro se calcular el permetro del crculo. (actionPerformed del botn de Permetro) Si pulsa el botn Limpiar en el cuadro de texto aparecer un 0 y la etiqueta de resultado (la de color rojo) se vaciar. (actionPerformed del botn Limpiar)
Todo el programa debe ser realizado directamente desde cdigo, sin usar la ventana de diseo de NetBeans.
Ejercicio 2 Realice un programa para calcular la velocidad de un vehculo. La ventana del programa tendr el siguiente diseo:
1089
El programa funcionar de la siguiente forma: El usuario introducir un Espacio y un Tiempo, y al pulsar Enter (actionPerformed) en cualquiera de los dos cuadros de textos aparecer la velocidad en la etiqueta de resultados de color amarillo. La velocidad se calcula as: velocidad = espacio / tiempo El usuario tambin puede introducir una Velocidad y un Tiempo en los cuadros de textos de la parte derecha. Si pulsa Enter en cualquiera de estos cuadros de texto (actionPerformed) entonces se calcular el Espacio en la etiqueta roja de resultados. El espacio se calcula as: espacio = velocidad * tiempo Tendr que programar por tanto el evento actionPerformed de cada cuadro de texto. Tanto el diseo como la programacin de eventos debe realizarla directamente desde cdigo, sin usar la ventana de diseo del NetBeans.
1090
PROGRAMACIN
JAVA
En la ventana hay dos etiquetas. Una de ellas es de color negro y la otra es de color gris. Estn situadas de tal forma que la etiqueta de color negro simula la sombra de la otra etiqueta. La etiqueta de color gris debe tener asociados los siguientes eventos del ratn: mouseEntered. Cuando el ratn entre en la superficie de la etiqueta debe cambiar su texto por Pulsame. mouseExited. Cuando el ratn salga de la superficie de la etiqueta debe cambiar el texto de esta otra vez por Etiqueta. mousePressed. Cuando se pulse un botn del ratn sobre la etiqueta, esta debe moverse de sitio de forma que parezca que se ha pulsado como si fuera un botn (observa la imagen)
1091
(sin pulsar)
(pulsada)
Para conseguir esto, debes colocar la etiqueta gris sobre la etiqueta negra. Cuando suceda este evento tambin debes cambiar el texto de la etiqueta por Est pulsado mouseReleased. Cuando se suelte el botn del ratn, la etiqueta volver a su posicin normal, y el texto cambiar a Pulsado.
1092
PROGRAMACIN
JAVA
En la ventana hay simplemente un JSlider (deslizador) y una etiqueta que contiene inicialmente el valor 50. Se pide lo siguiente: 1. 2. Realice el diseo de la ventana desde cdigo. Interesa que cuando se modifique el valor del JSlider, dicho valor aparezca en la etiqueta. Esto se tiene que realizar programando el evento correspondiente desde cdigo. Aqu tiene la informacin necesaria: a. b. c. d. 3. El evento a programar del JSlider se llama: stateChanged Pertenece al oyente llamado ChangeListener Asignars el oyente al JSlider con el mtodo addChangeListener El evento lleva como parmetro un objeto evt del tipo ChangeEvent
Interesa que al girar la rueda del ratn cambie el valor del JSlider. Para controlar el movimiento de la rueda del ratn debe asignar un evento al formulario (this). Aqu tiene la informacin necesaria del evento para la rueda del ratn: a. b. c. d. El evento a programar de el formulario (this) se llamad mouseWheelMoved Pertenece al oyente llamado MouseWheelListener Se asigna a la ventana (this) con el mtodo addMouseWheelListener El evento lleva como parmetro un objeto evt del tipo MouseWheelEvent
1093
PISTA: El objeto evt pasado como parmetro del evento de la rueda del ratn contiene informacin sobre como se ha movido la rueda. Este objeto tiene un mtodo llamado getUnitsToScroll que devuelve un nmero entero que indica cuanto se ha movido la rueda. Este nmero puede ser positivo o negativo segn hacia donde se movi la rueda. Aprovechando esto, el evento de la rueda del ratn se puede programar as: int valor = slider.getValue(); //slider es el objeto JSlider valor = valor + evt.getUnitsToScroll(); slider.setValue(valor);
1094
PROGRAMACIN
JAVA
La ventana sobre la que trabajamos tambin tiene sus propios eventos. Estos eventos son los siguientes:
windowOpened Sucede cuando la ventana se abre. windowClosing Sucede cuando la ventana va a cerrarse. windowActivated Sucede cuando la ventana se activa. windowDeactivated Sucede cuando la ventana se desactiva.
Todos los eventos llevan como parmetro un objeto evt del tipo WindowEvent.
Teniendo en cuenta esto, realizar un programa cuya ventana tenga nicamente una etiqueta.
1095
-
Nota: Una forma de desactivar la ventana es hacer clic sobre la barra de tareas. Luego se puede volver a activar haciendo clic sobre la ventana.
Cuando se abra la ventana, debe aparecer un mensaje de bienvenida (un JOptionPane) De la misma forma, cuando se cierre la ventana, debe aparecer un mensaje de despedida.
1096
PROGRAMACIN
JAVA
VECTORES DE COMPONENTES
Ejercicio 1
Al pulsar el botn Aceptar debe aparecer en una de las etiquetas el nmero de botones activados. Tambin debe aparecer en la otra etiqueta los das de la semana elegidos (activos)
1097
Ejercicio 2
Disee la ventana totalmente desde cdigo y usando vectores. Tendr que usar los siguientes vectores:
Un vector de etiquetas (JLabel) para cada etiqueta. Necesitars tambin un vector auxiliar de String que contenga los textos de las etiquetas: Devoluciones, Impagos, Caducidad y Robos.
1098
-
Tendrs que construir cada vector y luego tendrs que construir los elementos de dichos vectores, colocndolos en la ventana.
1099
PROGRAMACIN
JAVA
VECTORES DE COMPONENTES
Ejercicio 1
Realizar un programa donde aparezcan diez botones conteniendo los nmeros entre el 0 y 9.
Todos estos botones pertenecern a un vector de JButton, y tendrn asociado un evento actionPerformed.
Cada vez que se pulse uno de los botones, en un cuadro de texto de la ventana se aadir el dgito correspondiente, como si estuvieramos usando una calculadora.
Aadir tambin un botn Borrar (no perteneciente al vector) que permita borrar el contenido del cuadro de texto.
1100
Se puls el 9 y luego el 5
Para la colocacin de los botones en el JFrame, se puede usar un vector de posiciones X y un vector de posiciones Y que contengan las posiciones (X,Y) de cada botn:
Y luego se puede aplicar los valores de estos vectores en el momento de usar setBounds:
1101
}
Ejercicio 2
Se pide hacer un programa que muestre 8 etiquetas, cada una con el nombre de una provincia andaluza. Estas etiquetas estarn definidas al principio con color azul de fondo y texto negro.
Crear un vector para hacer el programa que contenga las ocho etiquetas (vector de JLabel) y las situar en el formulario como desee.
Al hacer clic sobre una etiqueta (mouseClicked), el color de fondo de esta cambiar a verde, mientras que el color de fondo de todas las dems se colocar en azul (para cambiar el color de fondo: setBackground y setOpaque) Al sobrevolar el ratn la etiqueta (evento mouseEntered) el color del texto de la etiqueta se pondr en amarillo (para cambiar el color de texto: setForeground).
Al abandonar el ratn la etiqueta (evento mouseExited) el color del texto de la etiqueta volver a ser de color negro.
1102
PROGRAMACIN
JAVA
Ten en cuenta lo siguiente: Al iniciarse el programa, debe estar activada por defecto la opcin Pared Norte. El botn Asignar asignar el ancho y alto que se haya introducido a la pared que est seleccionada en ese momento. El botn Area mostrar en un JOptionPane el rea de la pared seleccionada en ese momento. El botn Permetro mostrar en un JOptionPane el permetro de la pared seleccionada en ese momento.
1103
CLASE RECTANGULO PARA HACER ESTE EJERCICIO USAR UNA CLASE DE CREACIN PROPIA LLAMADA RECTNGULO.
1104
CLASE RECTANGULO
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
1105
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.
UNA VEZ INCLUIDA ESTA CLASE, CREAR CUATRO OBJETOS DE LA CLASE RECTNGULO, CADA UNO DE LOS CUALES HAR REFERENCIA A UNA DE LAS CUATRO PAREDES:
Objetos de la clase Rectngulo que usar en el proyecto: ParedNorte ParedSur ParedOeste ParedEste
Para programar cada botn de la ventana principal, solo tiene que ayudarse dando rdenes a las cuatro paredes o pidindoles informacin.
1106
Ejercicio 2
PRIMERA PARTE
Trabajamos de programador para una empresa de venta por correo. Esta empresa recibe pedidos de clientes y necesita controlar la situacin de cada pedido.
Para facilitar la realizacin de aplicaciones para esta empresa se decide crear una CLASE de objetos llamada PEDIDO.
La Clase Pedido permitir crear objetos de tipo pedido. Estos objetos nos proporcionarn informacin sobre el estado del pedido y nos facilitar la programacin de los proyectos para la empresa.
SE PIDE PROGRAMAR LA CLASE PEDIDO TENIENDO EN CUENTA SUS CARACTERISTICAS, LAS CUALES SE MENCIONAN A CONTINUACIN:
1107
CLASE PEDIDO
Propiedades de los objetos de la Clase Pedido: Articulo: una cadena que indica el nombre del artculo que se ha pedido. Unidades: un entero indicando las unidades pedidas. Precio: un double indicando el precio unidad. GastosEnvio: un double indicando los gastos de envo. Descuento: un double indicando el tanto por ciento de descuento.
Valores iniciales de las propiedades de los objetos de la Clase Pedido: Articulo: (cadena vaca) Unidades: 1 Precio: 0 GastosEnvio: 3 Descuento: 0
Mtodos set setArticulo permite asignar el nombre del artculo al objeto pedido setUnidades permite asignar el nmero de unidades pedidas setPrecio permite asignar un precio unidad al artculo del pedido setGastosEnvio permite asignar la cantidad de gastos de envo del pedido setDescuento permite asignar el tanto por ciento de descuento del pedido
1108
Mtodos get getArticulo devuelve el nombre del artculo del pedido getUnidades devuelve el nmero de unidades del artculo getPrecio devuelve el precio del artculo del pedido getGastosEnvio devuelve los gastos de envo del pedido getDescuento devuelve el tanto por ciento de descuento del pedido
1109
1110
SEGUNDA PARTE
En el panel Datos del Pedido se introducirn los siguientes datos del pedido a enviar: o Nombre del Artculo o Unidades pedidas o Precio unidad del artculo o Gastos de envo o Tanto Por Ciento de descuento.
Al pulsar el botn Aceptar Pedido, todos estos datos deben asignarse a un objeto llamado ped de tipo Pedido.
Al pulsar el botn Ver Desglose, deben aparecer en las distintas etiquetas (de color verde en la imagen) los siguientes datos del pedido:
1111
o o o o o o o o o
Nombre del Artculo Unidades pedidas Precio unidad Gastos de envo Total Sin Iva del pedido Iva del pedido Total Ms iva Total de Descuento Total del Pedido.
Para hacer esto solo tendr que pedirle informacin al objeto ped usando sus mtodos get y luego colocar esta informacin en cada etiqueta.
PARA PODER REALIZAR ESTE PROYECTO SER NECESARIO INCLUIR LA PROGRAMACIN DE LA CLASE PEDIDO REALIZADA EN EL APARTADO ANTERIOR DEL EJERCICIO.
SI NO SE AADE LA PROGRAMACIN DE LA CLASE, SER IMPOSIBLE CREAR EL OBJETO PED QUE NOS PERMITE MANEJAR LAS CARACTERSTICAS DEL PEDIDO.
1112
PROGRAMACIN
JAVA
Ejercicio 1
Realice un programa para calcular la divisin de un nmero A entre un nmero B. El programa tendr los siguientes elementos en la ventana:
Dos cuadros de texto llamados txtA y txtB donde se introducirn los dos nmeros.
Cuando se pulse el botn Calcular Divisin se calcular la divisin del nmero A entre el B y el resultado aparecer en la etiqueta etiResultado.
Si el usuario introduce un valor 0 dentro del cuadro de texto del nmero B, entonces el programa mostrar un mensaje de error (Use un JOptionPane.showMessage)
Si el usuario introduce un valor menor que cero en cualquiera de los dos cuadros de texto, entonces tambin se mostrar un error.
1113
Ejercicio 2
Realice un programa que permita calcular el sueldo total de un empleado. Para ello, el programa tendr los siguientes elementos en la ventana:
Un cuadro de texto llamado txtSueldoBase. Un cuadro de texto llamado txtMeses. Un botn llamado btnCalcular. Una etiqueta llamada etiResultado.
El usuario introducir en el cuadro de texto txtSueldoBase la cantidad bruta que cobra el trabajador al mes. En el cuadro de texto txtMeses introducir el nmero de meses trabajados. Al pulsar el botn calcular se calcular el sueldo a percibir por el empleado. Se calcular as:
Cuando se pulse el botn calcular, antes de que aparezca el sueldo en la etiqueta de resultado, el programa debe pedirle al usuario que introduzca una contrasea. Solo si la contrasea es correcta el programa mostrar el sueldo total.
Si el usuario introduce una contrasea incorrecta, el programa mostrar un aviso (JOptionPane.showMessage) y el resultado no se mostrar.
1114
Ejercicico 3
Un cuadro de texto llamado txtPeso, donde se introducir el peso de la persona. Un cuadro de texto llamado txtTalla, donde se introducir la talla. Una etiqueta llamada etiIMC donde aparecer el Indice de masa corporal calculado. Un botn llamado btnCalcular y otro llamado btnLimpiar.
El usuario introducir un peso y una talla en los cuadros de texto. Luego pulsar el botn calcular para calcular el ndice de masa corporal, el cual se calcula as:
2
El IMC calculado aparecer en la etiqueta, y adems, aparecer un mensaje indicando la conclusin a la que se llega, la cual puede ser una de las siguientes segn el IMC:
IMC <18 >=18 y <20 >=20 y <27 >=27 y <30 >=30 y <35 >=35 y <40 >=40 y
CONCLUSIN Anorexia Delgadez Normalidad Obesidad (grado 1) Obesidad (grado 2) Obesidad (grado 3) Obesidad mrbida
1115
El mensaje puede ser algo as: Su IMC indica que tiene anorexia, por ejemplo. Este mensaje aparecer en un JOptionPane.showMessage.
Cuando pulse el botn Limpiar, se borrarn los cuadros de texto Peso y Talla. Antes de que esto ocurra, el programa debe pedir confirmacin, con un cuadro de dilogo de confirmacin (JOptionPane.showConfirmDialog). El cuadro de confirmacin tendr el siguiente aspecto:
1116
PROGRAMACIN
JAVA
POO. HERENCIA
EJERCICIO 1 Interesa crear una etiqueta propia cuya funcin sea la de mostrar temperaturas. Este tipo de etiqueta se llamar EtiquetaTemperatura y tendr las siguientes caractersticas: Propiedades temperatura double Mtodos setTemperatura() Este mtodo recibe como parmetro un double con la temperatura a mostrar. Esta temperatura se almacena en la propiedad temperatura. Adems, este mtodo muestra la temperatura en la etiqueta, aadiendo C. Por ejemplo, si la temperatura asignada fuera 10, entonces en la etiqueta aparecera: 10 C getTemperatura() Este mtodo devuelve un double con la temperatura actual. mostrarRangoColor() Este mtodo asignar un color a la etiqueta segn la temperatura que contenga. Aqu est la escala de colores a usar: <0 >= 0 y < 10 >= 10 y < 25 >= 25 y < 35 >= 35 Azul Cyan Magenta Naranja Rojo
1117
Si la etiqueta no contuviera un valor numrico vlido, entonces se mostrar transparente (es decir, setOpaque(false) ) cambiarTemperatura() Este mtodo recibe un valor double como parmetro. Si este valor es positivo, entonces la temperatura aumenta en este valor. Si el valor es negativo, la temperatura disminuye.
1118
Un ejemplo de uso de una etiqueta de este tipo: etiTemp.setTemperatura(12); //en la etiqueta se mostrar 12 C etiTemp.mostrarRangoColor(); //la etiqueta se mostrar con color //de fondo Magenta etiTemp.cambiarTemperatura(20); //la temperatura sube 20 C etiTemp.mostrarRangoColor(); //la etiqueta se muestra naranja double t = etiTemp.getTemperatura(); //t contendr un 32
Objetivo del ejercicio Debe programar la clase EtiquetaTemperatura de forma que herede de las etiquetas normales de java (JLabel) Tendr que aadir la propiedad temperatura a la clase EtiquetaTemperatura y programar los mtodos antes comentados.
EJERCICIO 2
1119
En la parte superior aadir (a travs de cdigo) una etiqueta del tipo EtiquetaTemperatura, que estar inicializada a 0 C
En la parte inferior aadir tres botones y un cuadro de texto (esto lo puede hacer desde la ventana de diseo). Cada vez que se pulse el botn +, la temperatura de la etiqueta aumentar en la cantidad de grados indicados en el cuadro de texto. Y cuando se pulse el botn -, la temperatura disminuir.
Al pulsar el botn Fahrenheit, aparecer en un JOptionPane la temperatura que tiene actualmente la etiqueta convertida a grados Fahrenheit.
1120
PROGRAMACIN
JAVA
Resulta un rollo tener que programar el cuadro de presentacin cada vez que nos encargan un nuevo proyecto, as que programaremos una Clase Propia que derive de la clase JDialog, y que represente un cuadro de dilogo que contenga el nombre del programa, la versin y el programador. Gracias a esta clase que vamos a programar, no tendremos que perder tiempo cada vez que necesitemos aadir una presentacin a los futuros proyectos que hagamos en la empresa. Clase DialogoPresentacion Se programar una clase propia que se llamar DialogoPresentacion. Esta clase ser un cuadro de dilogo, o, dicho de otra forma, heredar de la clase JDialog. El aspecto de un cuadro de dilogo de este tipo en funcionamiento podra ser el siguiente:
1121
Las tres etiquetas con bordes se llaman respectivamente: etiNombrePrograma, etiVersion, etiNombreProgramador. El botn se llamar btnEmpezar. Todos estos elementos estn dentro de un JPanel al que se le ha asignado un borde con relieve. Mtodos de la clase DialogoPresentacion Esta clase tendr los siguientes mtodos: setNombrePrograma Recibir una cadena con el nombre del programa, y esta cadena se introducir en la etiqueta etiNombrePrograma.
setVersion Recibir una cadena con la versin del programa, y esta cadena se introducir en la etiqueta etiVersion.
setNombreProgramador Recibir una cadena con el nombre del programador, y esta cadena se introducir en la etiqueta etiNombreProgramador.
Cuando el usuario pulse el botn Empezar, lo nico que tiene que suceder es que se cierre el cuadro de dilogo.
1122
Proyecto Ejemplo Debes crear un programa simple que permita calcular el rea de un crculo. Este proyecto debe incluir una presentacin que aparezca al principio. Esta pantalla de presentacin debe contener los siguientes datos: Nombre del programa: Clculo del rea del Crculo Versin: v 1.0 Nombre del programador: su nombre. Tendr por supuesto, que incluir la clase DialogoPresentacion en su proyecto, y crear un objeto del tipo DialogoPresentacion. Debe asignar a este objeto los tres datos: nombre del programa, versin y programador. Y hacer que aparezca la presentacin cuando se ejecute el programa. Pista. La aparicin de la presentacin se programar en el evento windowOpened de la ventana principal.
1123
PROGRAMACIN
JAVA
PROGRAMACIN MDI
Bloc de Notas MDI
Planteamiento Inicial Se pretende realizar un programa capaz de abrir ficheros de texto (.txt). Este programa ser MDI, es decir, ser capaz de abrir varios ficheros, mostrando sus contenidos en distintas ventanas.
1124
Ventana Principal La ventana principal del programa constar de un men con las siguientes opciones: Archivo Abrir Cerrar Cerrar Todos Salir Ventana Cascada Mosaico Horizontal Mosaico Vertical
En el centro de la ventana (se recomienda un Layout del tipo BorderLayout) se colocar un panel del tipo JDesktopPane que ser el encargado de contener las ventanas internas. Puede llamar a este panel panelInterno. Aspecto de la ventana principal:
panelInterno (JDesktopPane)
Ventana Interna Debe aadir a su proyecto una clase JInternalFrame para disear las ventanas internas. Una ventana interna constar nicamente de un objeto JTextPane que ocupar toda la ventana. Los objetos JTextPane son similares a los cuadros de texto (JTextField) con la diferencia de que pueden contener grandes cantidades de texto en varias lneas. Llame al objeto JTextPane con el nombre txtTexto.
1125
txtTexto (JTextPane)
Estas ventanas internas contendrn el texto del fichero que se abra. Para facilitar la tarea de abrir un fichero y colocar su texto en la ventana interna debe aadir el siguiente mtodo a la clase ventana interna: public void ponerTexto(String caminofichero) { try { File fi = new File(caminofichero); FileReader lectura = new FileReader(fi); BufferedReader entrada = new BufferedReader(lectura); String linea; String texto=""; linea = entrada.readLine(); while(linea!=null) { texto = texto+linea+"\n"; linea = entrada.readLine(); } entrada.close(); lectura.close(); txtTexto.setText(texto); } catch(Exception e) { JOptionPane.showMessageDialog(null,"Error al leer fichero."); } }
Este mtodo recibe el camino de un fichero, y coloca dentro del JTextPane (el panel de texto) el texto contenido en el fichero. Aunque no es necesario entender el cdigo de este mtodo, en la parte final del enunciado se da una explicacin de su funcionamiento.
1126
Opciones principales del programa Se comenta a continuacin la forma en que deben funcionar las distintas opciones del programa: Opcin Archivo Abrir Esta opcin servir para abrir un fichero .txt y mostrar su contenido en una ventana interna. Para ello, tendr que mostrar un JFileChooser para abrir un fichero. Si el usuario selecciona un fichero, entonces tendr que crear una ventana interna llamada por ejemplo vi, y mostrarla en el panel Interno. Finalmente, usando el mtodo ponerTexto de la ventana interna vi deber mostrar el contenido del fichero seleccionado en el JFileChooser. vi.ponerTexto(caminoficheroseleccionado) Al abrir un fichero de texto en una ventana, deber aparecer el camino del fichero en la barra de ttulo de la ventana interna. Opcin Archivo Cerrar La opcin Cerrar cerrar la ventana interna que est activa (si es que hay alguna) Opcin Archivo Cerrar Todas Esta opcin cerrar todas las ventanas internas abiertas en el panel interno. Opcin Archivo Salir Permitir salir del programa. Opcin Ventana Cascada Esta opcin colocar todas las ventanas internas que haya abiertas en cascada. Esto es, una encima de otra, mostrando el ttulo de cada una.
1127
Opcin Ventana Mosaico Horizontal Esta opcin har visible todas las ventanas mostrndolas en horizontal, ocupando todo el panel interno. Para ello, tendrs que obtener el tamao vertical del panel interno, y dividirlo por el nmero de ventanas abiertas en l. Esa cantidad ser la altura de cada ventana. El ancho de cada ventana ser el ancho del panel interno. Una vez calculado el ancho y alto de cada ventana debes colocar cada ventana una debajo de otra.
1128
1129
Opcin Ventana Mosaico Vertical Esta opcin har visible todas las ventanas mostrndolas en vertical, ocupando todo el panel interno. Para ello, tendrs que obtener el tamao horizontal del panel interno, y dividirlo por el nmero de ventanas internas abiertas en l. Esa cantidad ser el ancho de cada ventana. Al alto de cada ventana ser el alto del panel interno. Una vez calculado el ancho y alto de cada ventana debes colocar cada ventana una al lado de otra.
1130
EXPLICACIN MTODO ponerTexto Para realizar este ejercicio es necesario aadir a la clase de la ventana interna el siguiente mtodo. No es necesario entender el cdigo de este procedimiento para hacer el ejercicio, pero en cualquier caso, aqu hay una explicacin de este:
public void ponerTexto(String caminofichero) { try { File fi = new File(caminofichero); FileReader lectura = new FileReader(fi); BufferedReader entrada = new BufferedReader(lectura); String linea; String texto=""; linea = entrada.readLine(); while(linea!=null) { texto = texto+linea+"\n"; linea = entrada.readLine(); } entrada.close(); lectura.close(); txtTexto.setText(texto); } catch(Exception e) { JOptionPane.showMessageDialog(null,"Error al leer fichero."); } }
Este mtodo recibe un camino de fichero de texto y muestra dentro de un JTextPane el texto que contiene dicho fichero. La forma de acceder a un fichero para extraer su contenido es a travs de canales. Los canales son objetos que se enganchan al fichero uno detrs de otro. Cada canal ofrece una serie de posibilidades al programador. Para los ficheros de texto, la forma de acceder a ellos es la siguiente: Se crea un objeto File a partir del camino del fichero (El camino del fichero es un String) Se engancha al objeto File un objeto del tipo FileReader. (Los objetos FileReader son canales de lectura, que permiten extraer informacin del fichero) Se engancha al canal FileReader un objeto BufferedReader. (Los objetos BufferedReader dan facilidad al programador para extraer el texto del fichero) Finalmente, a travs del mtodo readLine del objeto BufferedReader se pueden extraer una a una las lneas de texto del fichero. Una vez finalizado el trabajo con el fichero se cierra el canal FileReader y el canal BufferedReader.
La creacin de un objeto File a partir del camino del fichero se hace con la siguiente instruccin: File fi = new File(caminofichero);
1131
La creacin de un canal FileReader y la conexin con el fichero anterior se hace a travs de la siguiente instruccin: FileReader lectura = new FileReader(fi); La creacin de un canal BufferedReader y la conexin con el canal FileReader anterior se hace a travs de la siguiente instruccin: BufferedReader entrada = new BufferedReader(lectura); Una vez hecho esto, tenemos un objeto llamado entrada del tipo BufferedReader que posee un mtodo llamado readLine que permite leer una lnea de texto del fichero. A travs de este mtodo vamos leyendo lneas de texto del fichero. Hay que tener en cuenta que si al usar readLine obtenemos el valor null, es que ya no hay ms texto en el fichero. Todo esto se aprovecha para crear una cadena larga con el contenido del fichero: String linea; String texto=""; linea = entrada.readLine(); while(linea!=null) { texto = texto+linea+"\n"; linea = entrada.readLine(); } El cdigo anterior crea una variable texto que contiene el texto completo del fichero. Este cdigo extrae una a una las lneas de texto del fichero y las va concatenando en la variable texto. Como hemos terminado con la manipulacin del fichero, es bueno cerrar los canales de comunicacin con el fichero (el canal FileReader y el canal BufferedReader creados): entrada.close(); lectura.close(); Y finalmente metemos el texto extrado en el panel de texto de la ventana, el cual se llama txtTexto: txtTexto.setText(texto);
Todo esto debe estar dentro de un try ... catch ya que es un cdigo susceptible de tener errores de ejecucin (es decir, de lanzar excepciones)
1132
PROGRAMACIN
MODELO E-R
SUPUESTO N 1. "CONTROL DE VENTAS" Una empresa necesita un programa para controlar las ventas que realiza diariamente. La empresa tiene una lista de clientes cuyos datos quiere controlar. Los datos que la empresa quiere guardar de cada cliente es : el CIF, el nombre, la ciudad y un telfono de contacto. La empresa tiene una serie de comerciales que son los que realizan las ventas. La empresa quiere controlar la informacin de sus comerciales. Concretamente necesita almacenar de ellos sus nombres y apellidos y su mvil. A cada comercial se le asigna un nmero en la empresa para distinguirlos. Diariamente, los comerciales realizan ventas de productos a los clientes. Interesa almacenar informacin sobre dichas ventas. De cada venta interesa almacenar el nombre del producto que se vende, las unidades vendidas del artculo, el precio del producto y la fecha en que se efectu la venta. Tambin interesa saber la forma de pago. Debes tener en cuenta tambin la siguiente informacin : Un comercial realiza ventas. Una venta es realizada por un solo comercial. Una venta en concreto se realiza a un solo cliente. Por otro lado, un cliente comprar muchas cosas a la empresa. Es decir, se le pueden hacer muchas ventas a un cliente. SE PIDE : 1. 2. 3. 4. 5. 6. 7. Identifique las entidades que participan, teniendo en cuenta el enunciado. Identifique los atributos de cada entidad. Indique el atributo clave para cada entidad. Si fuera necesario, aada un atributo clave a la entidad. Indique las relaciones que existen entre las entidades. Indique el tipo de relaciones existentes (Nota : no existen relaciones Muchas a Muchas) Averigue las claves forneas segn las relaciones existentes. Realice el grfico correspondiente al Modelo E-R.
1133
SUPUESTO N 2. TRANSPORTES Una empresa cuenta con una serie de camiones que usa para transportar diversos productos. La empresa necesita un programa que gestione toda la informacin producida por esta actividad. Concretamente, la empresa necesita almacenar informacin sobre los camiones que posee. Necesita almacenar la matrcula de cada camin, la marca y el modelo y el ao de compra. Por otro lado, la empresa tiene una serie de conductores. De cada conductor se quiere almacenar el nombre, los apellidos, el mvil y el sueldo que gana. A cada conductor se le asigna un nmero en la empresa. No hay dos conductores con dos nmeros iguales. La empresa quiere controlar la informacin correspondiente a cada transporte que se efecta. Concretamente quiere saber la ciudad de origen del transporte, la ciudad de destino, el material que se transporta, cuantos kilos se transporta y la fecha del transporte. Cada transporte concreto est encargado por un cliente. A la empresa le interesa tener informacin de los clientes que encargan transportes. La informacin que interesa almacenar de cada cliente es : el CIF del cliente, el nombre de la empresa, la direccin de la empresa, el telfono de la empresa. Hay que tener en cuenta tambin la siguiente informacin : En un transporte en concreto solo participa un camin. Ahora bien, un camin se usa en muchos transportes. En cada transporte participa un solo conductor, y, por supuesto, un conductor realiza muchos transportes mientras trabaja para la empresa. Cada transporte est encargado por un solo cliente. Pero ten en cuenta que un cliente puede encargar muchos transportes. SE PIDE : 1. 2. 3. 4. 5. 6. 7. Identifique las entidades que participan, teniendo en cuenta el enunciado. Identifique los atributos de cada entidad. Indique el atributo clave para cada entidad. Si fuera necesario, aada un atributo clave a la entidad. Indique las relaciones que existen entre las entidades. Indique el tipo de relaciones existentes (Nota : no existen relaciones Muchas a Muchas) Averigue las claves forneas segn las relaciones existentes. Realice el grfico correspondiente al Modelo E-R.
1134
SUPUESTO N 3. MEDICIONES Una empresa qumica realiza mediciones constantemente de los materiales que contiene la tierra de distintas parcelas de cultivo, y le interesara tener un control de toda la informacin que esto genera. Para ello le encargan un programa para gestionar esta informacin. A esta empresa le interesara guardar informacin sobre cada medicin que se hace. Interesa almacenar lo siguiente: fecha en que se hace la medicin, hora, temperatura ambiente en el momento de hacer la medicin, humedad del aire y un comentario sobre la medicin (en este comentario se indicar el resultado de la medicin) Cada medicin se numera, de forma que no puede haber dos mediciones con el mismo nmero. Las mediciones las realizan qumicos especializados contratados por la empresa. Esta empresa desea almacenar los datos de estos qumicos: nombre, apellidos y telfono de contacto. Las mediciones se realizan en terrenos particulares, e interesa almacenar informacin sobre dichos terrenos. Concretamente interesa almacenar: el nmero de hectreas del terreno, nombre del propietario, DNI del propietario, telfono de contacto del propietario, direccin del terreno. A cada terreno se le asignar un cdigo nico para distinguirlo de los dems. Las mediciones se plasman finalmente en informes recopilatorios que se envan a la empresa que ha encargado las medidas. Interesa almacenar de cada informe lo siguiente: nmero de informe (no hay dos informes con el mismo nmero), nombre de la empresa que encarga el informe, fecha en que se lanza el informe, conclusiones del informe (aqu se redactan una serie de conclusiones finales deducidas a partir de las distintas mediciones) Debe tener en cuenta tambin lo siguiente: Un qumico realiza muchas mediciones, pero una medicin la realiza solo un qumico. En un mismo terreno se pueden realizar diversas mediciones, pero tenga en cuenta que una medicin est realizada en un solo terreno. Un informe de mediciones plasmar el resultado de muchas mediciones, pero una medicin aparecer en un solo informe. SE PIDE : 1. 2. 3. 4. 5. 6. 7. Identifique las entidades que participan, teniendo en cuenta el enunciado. Identifique los atributos de cada entidad. Indique el atributo clave para cada entidad. Si fuera necesario, aada un atributo clave a la entidad. Indique las relaciones que existen entre las entidades. Indique el tipo de relaciones existentes (Nota : no existen relaciones Muchas a Muchas) Averigue las claves forneas segn las relaciones existentes. Realice el grfico correspondiente al Modelo E-R.
1135
SUPUESTO N4. REVISIONES MDICAS En un hospital se realizan distintas revisiones mdicas a los pacientes ingresados, y les interesa almacenar informacin sobre estas revisiones. De cada revisin interesa almacenar la fecha y hora en que se hizo, peso y altura del paciente y otros resultados de dicha revisin. Cada revisin se numera de forma que no haya dos revisiones con el mismo nmero. Cada revisin se realiza a un solo paciente, aunque a un paciente se le pueden hacer varias revisiones mientras est ingresado. Interesa almacenar la informacin de cada paciente: nombre, apellidos, DNI y fecha de nacimiento del paciente. Los mdicos realizan revisiones a sus pacientes. Hay que tener en cuenta que un mismo mdico puede realizar revisiones a distintos pacientes, pero un paciente tiene asignado un solo mdico para las revisiones. Interesa almacenar la informacin de cada mdico: nombre, apellidos, especialidad. A cada mdico se le asigna un cdigo que es nico. SE PIDE : 1. 2. 3. 4. 5. 6. 7. Identifique las entidades que participan, teniendo en cuenta el enunciado. Identifique los atributos de cada entidad. Indique el atributo clave para cada entidad. Si fuera necesario, aada un atributo clave a la entidad. Indique las relaciones que existen entre las entidades. Indique el tipo de relaciones existentes (Nota : no existen relaciones Muchas a Muchas) Averigue las claves forneas segn las relaciones existentes. Realice el grfico correspondiente al Modelo E-R.
1136
PROGRAMACIN
TRASPASO A TABLAS
SUPUESTO N 1. "CONTROL DE VENTAS" A partir del Modelo Entidad-Relacin correspondiente a este supuesto de la hoja anterior, realice el traspaso a tablas de modelo. Introduzca luego algunos datos en las tablas. Invntese los datos, pero procure que tengan cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves forneas tendrn que coincidir para que la base de datos tenga coherencia. SUPUESTO N 2. TRANSPORTES A partir del Modelo Entidad-Relacin correspondiente a este supuesto de la hoja anterior, realice el traspaso a tablas de modelo. Introduzca luego algunos datos en las tablas. Invntese los datos, pero procure que tengan cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves forneas tendrn que coincidir para que la base de datos tenga coherencia. SUPUESTO N 3. MEDICIONES A partir del Modelo Entidad-Relacin correspondiente a este supuesto de la hoja anterior, realice el traspaso a tablas de modelo. Introduzca luego algunos datos en las tablas. Invntese los datos, pero procure que tengan cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves forneas tendrn que coincidir para que la base de datos tenga coherencia. SUPUESTO N4. REVISIONES MDICAS A partir del Modelo Entidad-Relacin correspondiente a este supuesto de la hoja anterior, realice el traspaso a tablas de modelo. Introduzca luego algunos datos en las tablas. Invntese los datos, pero procure que tengan cierto sentido. Tenga en cuenta que los datos correspondientes a las claves y claves forneas tendrn que coincidir para que la base de datos tenga coherencia.
1137
PROGRAMACIN
1138
SUPUESTO N 2 RESERVAS HOTEL Un hotel quiere guardar un histrico con todas las reservas realizadas en el hotel por sus clientes. Concretamente se quiere guardar lo siguiente : Informacin sobre sus clientes : nombre del cliente, apellidos, DNI y pas. Informacin sobre sus habitaciones : nmero de la habitacin, nmero de camas, precio de la habitacin por noche. Un cliente puede haber reservado varias habitaciones (no tiene por qu ser a la vez : un verano puede alojarse en la habitacin n 124, pero al verano siguiente puede alojarse en la habitacin n 535 del mismo hotel) En una habitacin se alojan muchos clientes (no a la vez, claro est : una semana est alojado el cliente Juan Gonzlez y a la semana siguiente est alojado el cliente Ana Prez) Interesara almacenar tambin como se ha pagado la reserva de la habitacin, y la fecha de entrada y de salida del cliente en la habitacin. SE PIDE : 1. 2. 3. 4. 5. Este supuesto produce una relacin Muchas a Muchas entre las entidades habitaciones y clientes. Represente dicha relacin. A continuacin identifique la entidad intermedia que elimina la relacin Muchas a Muchas. Aada los atributos que considere necesarios a la entidad intermedia. Realice el Modelo Entidad Relacin completo del supuesto teniendo en cuenta la nueva entidad introducida y sus atributos. Realice el traspaso a tabla de dicho modelo.
1139
SUPUESTO N 3 TALLER MECNICO Un taller mecnico quiere guardar informacin sobre todas las reparaciones que se realizan en l. Para ello se quiere guardar informacin sobre lo siguiente : Mecnicos : Interesa almacenar la informacin del mecnico que realiza la reparacin. Se almacenar el nombre del mecnico, apellidos, mvil y un cdigo que identifica a cada mecnico. Coches : Interesa almacenar la informacin de los coches que han sido reparados en el taller. Se almacenar la matrcula, marca y modelo del coche. Debes tener en cuenta que un mecnico repara muchos coches (no a la vez, se supone, primero uno y luego otro) Por otro lado, un coche puede ser reparado por varios mecnicos (es de suponer que un coche puede sufrir varias averas a lo largo de su vida, y cada una de estas avera puede ser reparada por un mecnico distinto) Interesa almacenar tambin el coste de cada reparacin, as como el nmero de horas que se usaron para hacer la reparacin. SE PIDE : 1. 2. 3. 4. 5. Este supuesto produce una relacin Muchas a Muchas. Represente dicha relacin. A continuacin identifique la entidad intermedia que elimina la relacin Muchas a Muchas. Aada los atributos que considere necesarios a la entidad intermedia. Realice el Modelo Entidad Relacin completo del supuesto teniendo en cuenta la nueva entidad introducida y sus atributos. Realice el traspaso a tabla de dicho modelo.
1140
SUPUESTO N 4 VIDEOCLUB Un videoclub quiere almacenar informacin sobre los alquileres de pelculas que se hicieron. Le interesa almacenar informacin sobre las pelculas y sobre sus socios : Pelculas : se almacenar el nmero del DVD (no hay dos DVD con el mismo nmero), el ttulo de la pelcula que contiene, el nombre del director y el tipo de pelcula. Socios : se almacenar el nmero de socio (no hay dos socios con el mismo nmero), el nombre y apellidos del socio, su telfono y direccin. Hay que tener en cuenta que una pelcula se alquila a muchos socios (No a la vez, claro est : el DVD es alquilado a un socio, y cuando este lo devuelve, se vuelve a alquilar a otro, y as sucesivamente) Por otro lado, un socio alquila muchas pelculas (No a la vez, claro est : primero alquila una, y al da siguiente alquila otra, y as sucesivamente) Interesara almacenar tambin la fecha en que produce cada alquiler y lo que pag el socio por el alquiler. SE PIDE : 1. 2. 3. 4. 5. Este supuesto produce una relacin Muchas a Muchas. Represente dicha relacin. A continuacin identifique la entidad intermedia que elimina la relacin Muchas a Muchas. Aada los atributos que considere necesarios a la entidad intermedia. Realice el Modelo Entidad Relacin completo del supuesto teniendo en cuenta la nueva entidad introducida y sus atributos. Realice el traspaso a tabla de dicho modelo.
1141
PROGRAMACIN
1142
PROGRAMACIN
Tabla Coches
Tabla Clientes
Tabla Servicios
1143
Ahora, realice las siguientes consultas en la base de datos. Guarde cada una con el nombre que se indica. Se recomienda que compruebe cada consulta antes de guardarla. 1. Crear una consulta llamada Servicios de Limpieza. En ella deben aparecer los campos fecha del servicio, tipo, cantidad y comentario de aquellos servicios cuyo tipo sea Limpieza. 2. Crear una consulta llamada Servicios Baratos. En ella deben aparecer los campos nmero del servicio, fecha, tipo y cantidad de aquellos servicios que hayan costado menos de 180 euros. 3. Crear una consulta llamada Servicios anteriores 2006. En ella deben aparecer los campos nmero del servicio, fecha, tipo y cantidad de aquellos servicios que fueron realizados antes del 1 1 2006 4. Crear una consulta llamada Servicios de Fontanera En ella deben aparecer los campos nmero de servicio, cantidad, tipo y comentario de todos aquellos servicios que fueron de fontanera y costaron 250 o ms euros. 5. Crear una consulta llamada Listado de Servicios No Limpieza En ella deben aparecer los campos nmero de servicio, cantidad, tipo y comentario de los servicios de Fontanera y los servicios de Electricidad. 6. Crear una consulta llamada Listado de Servicios de Electricidad En ella deben aparecer los campos fecha del servicio, cantidad, tipo, comentario, nombre y apellidos del trabajador y nombre del cliente de aquellos servicios que sean del tipo Electricidad.
1144
Debes tener en cuenta que los campos nombre y apellidos del trabajador pertenecen a la tabla Trabajadores, mientras que el nombre del cliente pertenece a la tabla Clientes. Los dems campos pertenecen a la tabla Servicios. 7. Crear una consulta llamada Servicios realizados por Juan En ella deben aparecer los campos fecha del servicio, cantidad, tipo, comentario, nombre del cliente y nombre y apellidos del trabajador de todos aquellos servicios realizados por el trabajador con DNI 12.321.567-B Ten en cuenta que tendrs que usar varias tablas para hacer la consulta. 8. Crear una consulta llamada Servicios a Academias En ella deben aparecer los campos fecha del servicio, tipo, cantidad, nombre del cliente y nombre y apellidos del trabajador de todos aquellos servicios que se hayan realizado a una Academia (es decir, el nombre del cliente debe contener la palabra academia) 9. Crear una consulta llamada Servicios del ao 2006 En ella aparecern los campos fecha del servicio, tipo, cantidad, apellidos del trabajador, nombre del cliente, CIF del cliente de todos aquellos servicios que se hayan realizado entre el 1 del 1 de 2006 y el 31 del 12 del 2006 10. Crear una consulta llamada Servicios en la calle Larga En ella aparecern los campos fecha del servicio, tipo, cantidad, nombre del cliente, direccin del cliente, DNI del trabajador para todos aquellos servicios realizados en la calle Larga. 11. Crear una consulta llamada Servicios trabajadores 2006 En ella deben aparecer los campos fecha del servicio, tipo cantidad, nombre y apellidos del trabajador y fecha de entrada del trabajador de todos aquellos servicios realizados por los trabajadores que entraron en la empresa a partir del 1 1 2006. Para crear esta consulta tienes que usar las tablas Trabajadores y Servicios. 12. Crear una consulta llamada Clientes de Seguros En ella deben aparecer los campos CIF, nombre del cliente, direccin del cliente de todos aquellos clientes que gestionen seguros (deben contener en el nombre la palabra seguros) 13. Crear una consulta llamada Listado de Academias y Papeleras En ella deben aparecer los campos CIF, nombre del cliente, direccin del cliente y telfono fijo de todos aquellos clientes que sean academias o papeleras.
1145
14. Crear una consulta llamada Listado de SEAT y trabajadores En ella deben aparecer los campos matrcula, marca y modelo de los seat de la empresa. Tambin interesa que aparezca el nombre y apellido del conductor de cada coche. 15. Crear una consulta llamada Servicios realizados con CITROEN En ella debe aparecer el listado de servicios que han sido realizados usando alguno de los citroen de la empresa. En esta consulta deben aparecer los siguientes campos: matrcula del vehculo, marca y modelo. Nombre y apellidos del trabajador que hizo el servicio. Nombre y direccin del cliente al que se le hizo el servicio. Tipo de servicio y cantidad. En esta consulta participan todas las tablas de la base de datos.
1146
PROGRAMACIN
1147
22. Crear una consulta llamada Servicios realizados por Juan SQL En ella deben aparecer los campos fecha del servicio, cantidad, tipo, comentario, nombre del cliente y nombre y apellidos del trabajador de todos aquellos servicios realizados por el trabajador con DNI 12.321.567-B Ten en cuenta que tendrs que usar varias tablas para hacer la consulta. 23. Crear una consulta llamada Servicios a Academias SQL En ella deben aparecer los campos fecha del servicio, tipo, cantidad, nombre del cliente y nombre y apellidos del trabajador de todos aquellos servicios que se hayan realizado a una Academia (es decir, el nombre del cliente debe contener la palabra academia) 24. Crear una consulta llamada Servicios del ao 2006 SQL En ella aparecern los campos fecha del servicio, tipo, cantidad, apellidos del trabajador, nombre del cliente, CIF del cliente de todos aquellos servicios que se hayan realizado entre el 1 del 1 de 2006 y el 31 del 12 del 2006 25. Crear una consulta llamada Servicios en la calle Larga SQL En ella aparecern los campos fecha del servicio, tipo, cantidad, nombre del cliente, direccin del cliente, DNI del trabajador para todos aquellos servicios realizados en la calle Larga. 26. Crear una consulta llamada Servicios trabajadores 2006 SQL En ella deben aparecer los campos fecha del servicio, tipo cantidad, nombre y apellidos del trabajador y fecha de entrada del trabajador de todos aquellos servicios realizados por los trabajadores que entraron en la empresa a partir del 1 1 2006. Para crear esta consulta tienes que usar las tablas Trabajadores y Servicios. 27. Crear una consulta llamada Clientes de Seguros SQL En ella deben aparecer los campos CIF, nombre del cliente, direccin del cliente de todos aquellos clientes que gestionen seguros (deben contener en el nombre la palabra seguros) 28. Crear una consulta llamada Listado de Academias y Papeleras SQL En ella deben aparecer los campos CIF, nombre del cliente, direccin del cliente y telfono fijo de todos aquellos clientes que sean academias o papeleras. 29. Crear una consulta llamada Listado de SEAT y trabajadores SQL En ella deben aparecer los campos matrcula, marca y modelo de los seat de la empresa. Tambin interesa que aparezca el nombre y apellido del conductor de cada coche.
1148
30. Crear una consulta llamada Servicios realizados con CITROEN SQL En ella debe aparecer el listado de servicios que han sido realizados usando alguno de los citroen de la empresa. En esta consulta deben aparecer los siguientes campos: matrcula del vehculo, marca y modelo. Nombre y apellidos del trabajador que hizo el servicio. Nombre y direccin del cliente al que se le hizo el servicio. Tipo de servicio y cantidad. En esta consulta participan todas las tablas de la base de datos. EJERCICIO 2 Realice tambin estas otras consultas usando el lenguaje SQL (asgneles el nombre que quiera): 1. Se pide mostrar un listado de clientes con las siguientes caractersticas: Campos a mostrar: nombre del cliente, direccin, telfono 1. La condicin es que no tengan telfono 2 (dicho de otra forma, que el campo telfono 2 sea nulo) 2. Se pide mostrar un listado de clientes con las siguientes caractersticas: Campos a mostrar: nombre, direccin, telfono 1. La condicin es que vivan en una calle, es decir, que su direccin comience por C/ 3. Se pide mostrar un listado de trabajadores con las siguientes caractersticas: Campos a mostrar: nombre, sueldo, fecha de entrada. La condicin es que hayan entrado en la empresa en el ao 2002. Es decir, entre el 1/1/2002 y el 31/12/2002. 4. Se pide mostrar un listado de trabajadores con las siguientes caractersticas: Campos a mostrar: nombre, apellidos, sueldo. Condicin: ninguna. Se pide que el listado salga ordenado por sueldo de mayor a menor. 5. Se pide mostrar un listado de trabajadores con las siguientes caractersticas: Campos a mostrar: todos Condicin: Que no se llamen Ana Ordenados por nombre ascendentemente.
1149
6.
Se pide mostrar un listado de coches con las siguientes caractersticas: Mostrar todos los campos. Ordenado por ao de compra, de ms antiguo a ms moderno.
7.
Mejore la consulta anterior de forma que tambin se muestre el nombre del trabajador que conduce cada coche.
1150
8.
Se pide mostrar un listado de servicios con las siguientes caractersticas: Campos a mostrar: tipo de servicio, fecha, cantidad, comentario. Condicin: mostrar los servicios de limpieza que hayan costado menos de 250 euros. Ordenado por cantidad de menor a mayor
9.
Mejore la consulta anterior de forma que tambin se muestre la direccin donde se hizo el servicio.
10. Se pide mostrar un listado de servicios con las siguientes caractersticas: Campos a mostrar: tipo de servicio, fecha, cantidad, comentario. Condicin: se pide mostrar los servicios de limpieza y los de fontanera todos en la misma consulta. Ordenado por fecha de ms reciente a ms antigua. 11. Se pide mostrar un listado de servicios con las siguientes caractersticas: Campos a mostrar: el nombre del trabajador, la fecha en que se hizo el servicio, la cantidad que cost el servicio, el tipo de servicio, el nombre del cliente, la direccin del cliente. Condicin: se pide mostrar aquellos servicios de fontanera realizados por el trabajador con nombre Juan que hayan costado menos de 240 euros. El listado debe aparecer ordenado por cantidad de mayor a menor.
1151
PROGRAMACIN
EJERCICIO: Crear una copia de las dems tablas: Clientes Clientes2 Coches Coches2 Servicios Servicios2 (Nota: para los siguientes ejercicios usaremos las copias de las tablas, para as mantener intacto el contenido de las tablas originales)
1152
INSERCIN DE REGISTROS
NOTA: COMPROBAR QUE LOS EJERCICIOS SE HAN REALIZADO CORRECTAMENTE ENTRANDO EN LAS TABLAS Y OBSERVANDO SU CONTENIDO
EJERCICIOS: 1. En la tabla Trabajadores2 aada los siguientes trabajadores: Rosa Gonzlez, con DNI 11.567.789-D, cobra 1100,60 euros y entr en la empresa el 2 de marzo del 2006. No tiene asignado un coche. Benito Rodrguez, con DNI 56.456.345-W, cobra 500 euros y entr en la empresa el 10 de Diciembre de 2005. El coche que tiene asignado tiene de matrcula 4454-EEE Eva Ramos, con DNI 33.987.987-F. Entr en la empresa el 20 de enero de 2007. No tiene asignado de momento un sueldo y tampoco tiene asignado coche. En la tabla Coches2 aada el siguiente coche: SEAT Crdoba con matrcula 4454-EEE. Ao 2004. Est asignado al trabajador con DNI 56.456.345W
2.
MODIFICACIN DE REGISTROS
NOTA: COMPROBAR QUE LOS EJERCICIOS SE HAN REALIZADO CORRECTAMENTE ENTRANDO EN LAS TABLAS Y OBSERVANDO SU CONTENIDO
EJERCICIOS: 31. Se pide asignar a los trabajadores de la tabla Trabajadores2 que hayan entrado antes del ao 2005 un sueldo de 1400 euros. 32. En la tabla Trabajadores2 asigne al trabajador con DNI 33.987.987-F el coche con matrcula 4454-EEE. 33. La trabajadora llamada Ana ha sido suspendida de empleo. Asigne un valor 0 al sueldo de esta trabajadora en la tabla Trabajadores2. 34. Se ha averiguado el telfono mvil del gerente de la empresa Academia La Plata. El mvil es el 633 45 54 45. Se pide que en la tabla Clientes2 asigne ese telfono mvil a dicho cliente. 35. Se han detectado algunos errores de datos en el cliente con CIF B44556666. Concretamente, el nombre del cliente es Seguros La Cruz, su direccin es C/Lealas 10, y su telfono fijo es el 956 30 90 90. Se pide que en la tabla Clientes2 haga dichos cambios a dicho cliente.
1153
ELIMINACIN DE REGISTROS
NOTA: COMPROBAR QUE LOS EJERCICIOS SE HAN REALIZADO CORRECTAMENTE ENTRANDO EN LAS TABLAS Y OBSERVANDO SU CONTENIDO
1.
Eliminar de la tabla Servicios2 a todos los servicios del ao 2004 (es decir, cuya fecha est comprendida entre 1-1-2004 y 31-12-2004) Comprueba el resultado observando el contenido de la tabla Servicios2
2.
Eliminar de la tabla Servicios2 a todos los servicios de fontanera de ms de 250 euros. Comprueba el resultado observando el contenido de la tabla Servicios2
3.
Eliminar de la tabla Servicios2 aquellos servicios en los que se haya instalado algn recambio (es decir, que el campo comentario contenga la palabra recambio) Comprueba el resultado observando el contenido de la tabla Servicios2
4.
Finalmente, elimina todos los registros de la tabla Servicios2. Comprueba el resultado observando el contenido de la tabla Servicios2
5.
En la tabla Clientes2, eliminar a todos los clientes que no tengan mvil (es decir, que el campo mvil sea nulo) Comprueba el resultado observando el contenido de la tabla Servicios2
6.
En la tabla Clientes2, eliminar a todos los clientes que tengan una empresa de seguros (es decir, que contengan la palabra seguros en el nombre del cliente) Comprueba el resultado observando el contenido de la tabla Servicios2
7.
Finalmente, eliminar de la tabla Clientes2 el resto de registros. Comprueba el resultado observando el contenido de la tabla Servicios2
1154
EJERCICIO FINAL Para la realizacin de los ejercicios anteriores se han hecho copias de las tablas de la base de datos. Una vez realizados dichos ejercicios estas tablas no son necesarias. Puede borrarlas simplemente haciendo clic con el botn derecho sobre ellas y activar la opcin eliminar. As pues, elimine las tablas: Trabajadores2, Clientes2, Servicios2, Coches2.
1155
PROGRAMACIN
JAVA
CADENAS Ejercicio 1
Realice un programa cuya ventana tenga los siguientes elementos:
Un cuadro de texto llamado txtFrase. Varias etiquetas. (Llmelas como quiera) Un botn Analizar llamado btnAnalizar.
El usuario introducir una frase en el cuadro de texto, y luego pulsar el botn Analizar.
o o o o
La frase en maysculas. La frase en minsculas. Nmero de caracteres de la frase. Nmero de caracteres de la frase sin contar los espacios.
Si el usuario pulsa Analizar cuando no hay ninguna frase introducida en el cuadro de texto, el programa debe mostrar un error emergente (JOptionPane)
Ejercicio 2
1156
Un cuadro de texto llamado txtFrase y otro llamado txtSubcadena. Varias etiquetas. Un botn Analizar llamado btnAnalizar.
El usuario introducir una frase en el cuadro de texto txtFrase, y luego introducir una palabra en el cuadro de texto txtSubcadena, y luego pulsar el botn Analizar.
o o o o
La posicin en la que se encuentra la primera aparicin de la palabra en la frase. La posicin en la que se encuentra la ltima aparicin de la palabra en la frase. Mostrar el texto que hay en la frase antes de la primera palabra. Mostrar el texto que hay en la frase despus de la ltima palabra.
Por ejemplo, si la frase fuera: Un globo, dos globos, tres globos. La luna es un globo que se me escap.
Y la palabra fuera globo, entonces la informacin a mostrar sera: Posicin inicial: 3 Posicin final: 49 Texto anterior: Un Texto posterior: que se me escap
Si la palabra no se encuentra en la frase, el programa mostrar un error emergente y no se presentar nada en las etiquetas. Ejercicio 3
1157
Un cuadro de texto llamado txtFrase. Un cuadro de texto llamado txtPalabra1. Un cuadro de texto llamado txtPalabra2. Un cuadro de texto llamado txtPalabra3. Un cuadro de texto llamado txtPalabra4. Varias etiquetas. Un botn Analizar llamado btnAnalizar.
El usuario introducir una frase en el cuadro de texto txtFrase, y tres palabras en los cuadros de texto de las palabras.
Al pulsar el botn Analizar, el programa debe indicar la siguiente informacin en las etiquetas:
o o o o
Indicar si la frase es igual a la palabra 1. Indicar si la frase empieza por la palabra 2. Indicar si la frase termina por la palabra 3. Indicar si la palabra 4 est contenida en la frase, y en el caso de que est contenida, se indicar la posicin inicial en la que se encuentra.
1158
PROGRAMACIN
1159
Cuando se pulse este botn, deber aparecer en un JOptionPane el listado de servicios de limpieza realizados. Debe aparecer el nmero del servicio, el DNI del trabajador que realiz el servicio, el tipo de servicio y el coste. Debe aparecer ordenado por nmero de servicio de menor a mayor. Electricidad btnElectricidad Este botn es igual que el anterior, solo que en vez de mostrar los servicios de limpieza se tienen que mostrar los servicios de electricidad. Ingresos Empresa btnIngresos Cuando se pulse este botn, interesa que aparezca en un JOptionPane la suma de las cantidades de todos los servicios realizados. Citroen btnCitroen Cuando se pulse este botn, interesa que aparezca en un JOptionPane el nmero de coches citroen que tiene la empresa. Estadisticas Limpieza btnEstLim Cuando se pulse este botn, interesa que aparezca en un JOptionPane lo siguiente: El nmero de servicios de limpieza que se han realizado. La suma de los costes de todos los servicios de limpieza. El coste medio de un servicio de limpieza.
El quinto servicio btnQuinto Cuando se pulse este botn interesa que aparezca en un JOptionPane los datos del quinto servicio realizado. Interesa que aparezca el nmero del servicio, el tipo de servicio y el coste de dicho servicio.
Listado de servicios de fontanera btnFont Cuando se pulse este botn interesa que aparezca en un JOptionPane un listado con los servicios de fontanera. Interesa que aparezca el nombre y apellidos del trabajador que hizo el servicio, el tipo de servicio y el coste del servicio.
Listado de servicios de menos de 200 euros btnMenosDos Cuando se pulse este botn interesa que aparezca en un JOptionPane un listado con los servicios con una cantidad menor de 200 euros.
1160
Interesa que aparezca el nombre del trabajador que hizo el servicio, el tipo de servicio, el coste y el nombre del cliente al que se le hizo el servicio. Haz que el listado salga ordenado por coste de mayor a menor.
1161
PROGRAMACIN
Botn Datos Trabajadores Al pulsar este botn debe aparecer el listado de trabajadores en el JTextPane.
1162
Concretamente deben aparecer el nombre, apellidos, sueldo, fecha de entrada y matrcula del coche que conduce. El listado debe aparecer ordenado por fechas ascendentemente (es decir, primero los trabajadores con ms antigedad, y luego los ms recientes) Las fechas deben aparecer en el siguiente formato: Da / Mes / Ao Los sueldos deben aparecer con la coma decimal. Si el trabajador no tuviera asignada un coche, en el campo matrcula debera aparecer la cadena sin coche. Botn Datos Servicios Al pulsar este botn aparecer el listado de servicios en el JTextPane. El listado aparecer ordenado por fechas de ms reciente a ms antiguo. Debe aparecer la fecha del servicio, el coste, el tipo y el comentario. La fecha debe aparecer en formato: Dia del Mes del Ao. Por ejemplo: 3 del 5 del 2001 El coste aparecer con coma decimal. Si no hay comentario para el servicio, debe aparecer la cadena sin comentarios.
1163
PROGRAMACIN
En el cuadro de texto el usuario introducir una cantidad. Al pulsar el botn Mayor que aparecer el listado de servicios cuyo coste sea mayor a dicha cantidad. Al pulsar el botn Menor que aparecer el listado de servicios cuyo coste sea menor a dicha cantidad. Al pulsar el botn Igual a aparecer el listado de servicios cuyo coste sea igual a dicha cantidad. Al pulsar el botn Distinto de aparecer el listado de servicios cuyo coste sea distinto a dicha cantidad. Seleccin por tipo: Se deben aadir a la ventana los siguientes elementos: Un cuadro de texto. Un botn Igual a.
1164
-
Un botn Contiene a.
El usuario introducir un texto en el cuadro de texto. Al pulsar el botn Igual a, el programa mostrar el listado de servicios cuyo tipo sea igual al texto introducido. Por ejemplo, si el usuario introduce el texto Limpieza, el programa mostrar los servicios cuyo tipo sea igual a Limpieza. Al pulsar el botn Contiene a, el programa mostrar el listado de servicios cuyo tipo contenga el texto del cuadro de texto. Por ejemplo, si el usuario introduce el texto a, el programa mostrar el listado de servicios de Fontanera, Carpintera, etc. Es decir, todos los servicios que contengan a en el tipo. Seleccin por fecha: Se deben aadir a la ventana los siguientes elementos: Un cuadro de texto para el da, otro para el mes y otro para el ao. Un botn Anterior a Un botn Posterior a Un botn En el ao
El usuario introducir una fecha en los cuadros da-mes-ao. Luego, si el usuario pulsa el botn Anterior a el programa mostrar el listado de servicios que hayan sido anteriores a la fecha indicada. Si el usuario pulsa Posterior a el programa mostrar el listado de servicios que hayan sido posteriores a la fecha indicada. Si el usuario pulsa el botn En el ao, el programa mostrar el listado de servicios que hayan sido realizados en el ao indicado en el cuadro ao. (En este caso no se tienen en cuenta los cuadros da y mes)
1165
PROGRAMACIN
ALTAS DE REGISTROS
Realizar una pequea aplicacin de base de datos que maneje la base de datos MANEMPSA. La ventana principal de dicha aplicacin contendr los siguientes elementos: Botn Listado de coches Al pulsar este botn, aparecer en un panel de texto el listado de coches de la empresa. Deben aparecer todos los campos de los coches. Panel de Alta de coches Este panel contendr una serie de cuadros de texto que permitirn introducir los datos de un nuevo coche que se quiera aadir. Dentro del panel tambin tendremos un botn Alta que al ser pulsado efectuar la introduccin del nuevo coche en la tabla. Al pulsarse el botn Alta, deber mostrarse el contenido de la tabla coches en el panel, y all deber aparecer el listado incluyendo el nuevo coche introducido. (El cdigo del botn Alta deber construir una consulta SQL vlida del tipo INSERT INTO que permita introducir los datos del nuevo coche)
1166
PROGRAMACIN
BAJA DE REGISTROS
Mejorar la aplicacin realizada en la hoja de ejercicios anterior de forma que posibilite la eliminacin de coches de la tabla coches de la base de datos MANEMPSA. Para ello, debe aadir a la ventana principal lo siguiente: Un cuadro de texto donde el usuario introducir una matrcula. Un botn Eliminar coche.
Al pulsar el botn Eliminar coche, se borrar de la tabla el coche cuya matrcula se haya escrito en el cuadro de texto. Una vez realizado el borrado, aparecer en el panel de la ventana el contenido de la tabla coches para que el usuario pueda confirmar que el coche ha sido realmente borrado. Hay que tener en cuenta varias cosas: El programa avisar si la matrcula introducida en el cuadro de texto no se corresponde con ningn coche de la base de datos. (En este caso no se har el borrado, claro est) En el caso de que la matrcula exista, el programa pedir confirmacin antes de efectuar el borrado.
1167
PROGRAMACIN
MODIFICACIN DE REGISTROS
Mejorar la aplicacin realizada en la hoja de ejercicios anterior de forma que posibilite la modificacin de coches de la tabla coches de la base de datos MANEMPSA. Para ello, debe aadir a la ventana principal lo siguiente: Un panel de modificacin que contenga un cuadro de texto por campo de la tabla coches (Este panel ser muy parecido al panel de introduccin de coches) Un botn Buscar al lado del cuadro de texto de la matrcula. Un botn Efectuar Modificacin.
El usuario tendr que introducir una matrcula y luego pulsar el botn Buscar. Al pulsar este botn, el programa rellenar los cuadros de texto con los datos del coche que tenga dicha matrcula. Si no existe un coche con dicha matrcula entonces el programa mostrar un mensaje de error. Una vez rellenos los cuadros de texto con los datos del coche, el usuario realizar modificaciones en dichos datos y luego pulsar el botn Efectuar Modificacin. Al pulsar este botn se efectuar la modificacin de los datos de este coche en la tabla coches y se presentar el listado completo de la tabla coches en el panel del programa.
1168
PROGRAMACIN
JAVA JTABLE
EJERCICIO N1
Se pide que realice una aplicacin que muestre una tabla con las siguientes columnas: Nombre Examen 1 Examen 2 Examen 3
Al comenzar el programa la tabla estar vaca y solo se mostrar la cabecera. El programa constar adems de la tabla de los siguientes elementos: Un botn Aadir Blanco. Este botn aadir una nueva fila en blanco a la tabla. Un botn Aadir Alumno. Este botn aadir una nueva fila a la tabla con los siguientes valores: Nombre: No definido Examen 1: 5 Examen 2: 5 Examen 3: 5 Un botn Eliminar Este botn eliminar la fila donde que est seleccionada en ese momento. En el caso de que no hubiera ninguna fila seleccionada al pulsar este botn, el programa debe mostrar un mensaje de error. Un botn Resultados Este botn mostrar en un JOptionPane la nota media del alumno de la fila que est seleccionada. Tambin debe indicar en ese JOptionPane si el alumno ha aprobado o no. En el caso de que no hubiera ninguna fila seleccionada al pulsar este botn, el programa debe mostrar un mensaje de error. Un botn Resultados Trimestre 1
1169
Este botn mostrar en un JOptionPane el nmero de alumnos que aprobaron el examen 1 y el nmero de alumnos que suspendieron dicho examen.
1170
PROGRAMACIN
JAVA JTABLE
EJERCICIO N1 Realiza un programa que contenga un JTable y un botn. El botn tendr el texto Clientes y al pulsarse se mostrar en la tabla el contenido de la tabla clientes de la base de datos MANEMPSA. EJERCICIO N2 Realiza un programa igual al anterior pero que permita mostrar el contenido de la tabla servicios de la base de datos MANEMPSA.
1171
PROGRAMACIN
JAVA JTABLE
EJERCICIO N1 Realiza un programa que permita realizar Altas, Bajas y Modificaciones en la tabla clientes de la base de datos MANEMPSA. Este programa debe mostrar en todo momento un JTable con el contenido actualizado de la tabla clientes. El programa debe tener tres botones. Un botn Eliminar, otro botn Nuevo Cliente y un botn Modificar Cliente. Al pulsar Eliminar se eliminar el cliente seleccionado en el JTable. Al pulsar Nuevo Cliente aparecer un cuadro de dilogo donde el usuario introducir los datos de un nuevo cliente. Al pulsar Modificar Cliente aparecer un cuadro de dilogo donde el usuario podr cambiar los datos del cliente que haya seleccionado en el JTable.
1172
PROGRAMACIN
JAVA JTABLE
EJERCICIO N1 El programa realizado en la hoja de ejercicios anterior permita el alta, baja y modificacin de los clientes de la base de datos MANEMPSA. Se pide ahora que aada un cuadro de dilogo de filtrado al ejercicio de la hoja anterior que permita filtrar por los distintos campos de la tabla de clientes.
1173
PROGRAMACIN
JAVA
Un cuadro de texto llamado txtFrase. Varias etiquetas. Un botn Analizar llamado btnAnalizar.
El programa debe contar cuantas vocales tiene la frase. El funcionamiento ser el siguiente:
El usuario escribir una frase en el cuadro de texto txtFrase. Luego se pulsar el botn Analizar.
Si el usuario no introduce nada en el cuadro de texto txtFrase, entonces el programa debera mostrar un error.
Ejercicio 2
1174
-
Un cuadro de texto llamado txtDNI. Una etiqueta llamada etiDNI. Un botn Preparar DNI llamado btnPrepararDNI.
El usuario introducir un DNI en el cuadro de texto llamado txtDNI y luego pulsar el botn Preparar DNI. El resultado ser que el DNI introducido aparecer preparado en la etiqueta etiDNI.
Sin embargo, cuando el usuario pulse el botn Preparar DNI, en la etiqueta etiDNI debe aparecer el DNI con el siguiente formato:
31543234A
Si el usuario no introduce nada en el cuadro de texto del DNI y pulsa el botn, entonces debe aparecer un error emergente (JOptionPane).
1175
Ejercicio 3
Se pide hacer un programa que le permita al usuario introducir una palabra en latn de la primera declinacin, y a continuacin generar sus casos en plural y singular.
Las palabras de la primera declinacin en latn son sustantivos femeninos (la mayora), que terminan en a, como por ejemplo: ROSA o ANIMA.
Por ejemplo, para la palabra ROSA, sus casos son los siguientes:
Por ejemplo, para la palabra ANIMA, sus casos son los siguientes:
1176
Debes observar que algunos casos son exactamente iguales a la palabra inicial, como por ejemplo el Nominativo Singular.
Otros casos, en cambio, se construyen aadiendo algunas letras al final de la palabra inicial. Por ejemplo, el Acusativo singular se construye aadiendo una m a la palabra inicial.
Para construir el Dativo y Ablativo plural, es necesario concatenar la palabra inicial (sin la a final) con is. Por ejemplo, en el caso de la palabra Rosa, se concatenara: Ros + is.
Un cuadro de texto txtPalabra. Doce etiquetas al menos correspondientes a los 6 casos en singular y plural. Un botn Declinar llamado btnDeclinar.
El usuario introducir una palabra en latn de la primera declinacin en el cuadro de texto, y luego pulsar el botn Declinar. Entonces en las etiquetas aparecern los casos declinados de la palabra.
Si el usuario introduce una palabra que no termine en a, entonces el programa dar un error, ya que dicha palabra no es de la primera declinacin.
1177
PROGRAMACIN
JAVA JTABLE
EJERCICIO N1 El programa de la hoja de ejercicios anterior permita la gestin de la tabla clientes de la base de datos MANEMPSA. Se pide que mejore el programa de la hoja anterior de forma que el cuadro de dilogo de filtrado permita al usuario decidir la ordenacin del listado. Por otro lado, se pide que junto al JTable donde aparece el listado de clientes aparezca el nmero de clientes que se est mostrando en todo momento en el JTable.
1178
PROGRAMACIN
JAVA iREPORT
EJERCICIO N1 Crear una DSN llamada EjercicioDSN que haga referencia a la base de datos MANEMPSA que tiene almacenada en Mis Documentos.
EJERCICIO N2 En el programa iReport, crear una conexin llamada Conexin Ejercicio que est creada a partir de la DSN del ejercicio anterior.
EJERCICIO N3 Crear un informe usando la conexin Conexin Ejercicio del ejercicio anterior donde aparezca el listado de clientes de la base de datos MANEMPSA ordenado por nombre de cliente. El ttulo de este listado debe ser: Listado de Clientes y luego guarde el informe con el nombre clientes.
1179
PROGRAMACIN
JAVA iREPORT
EJERCICIO N1 Crea un listado de clientes usando la opcin mago de informes de iReport. Este listado debe mostrar los siguientes campos: nombre, direccin y los dos telfonos. El listado debe salir ordenado por nombre. Una vez creado el listado, debe realizar las siguientes modificaciones en l: El ttulo del listado debe ser: Clientes de MANEMPSA. Y debe tener las siguientes caractersticas: o Color de fondo: Azul. o Tamao de la letra: 18. o Color de letra: Blanco. o En cursiva. La cabecera del listado debe tener las siguientes caractersticas: o Tamao de letra: 10 o Cada campo de la cabecera debe tener una alineacin Centro. o Los campos deben estar en negrita y subrayados o Deben ser de color Azul. Los datos del listado deben tener las siguientes caractersticas: o Deben tener alineacin centro. o Deben tener un tamao de letra de 10 y el tipo de letra debe ser Comic Sans. o Los nombres deben aparecer en color verde, al igual que las direcciones. o Los telfonos deben aparecer en color rojo y en negrita.
Una vez hecho esto, si quiere experimentar realizando algn cambio ms, hgalo.
1180
PROGRAMACIN
JAVA iREPORT
EJERCICIO N1
Se pide realizar un informe en el que aparezcan los servicios realizados al cliente Seguros Segasa, cuyo CIF es B11223212.
Ficha de Cliente.
1181
Incluya tambin en el encabezado de pgina un logotipo (bjese una imagen de internet) El listado de servicios debe mostrar los datos: Fecha del servicio, tipo y cantidad ordenado ascendentemente por fechas. Por supuesto, este listado debe aparecer con su encabezado. Sera interesante que destacara el encabezado colocndolo en negrita y separndolo del listado de datos a travs de una lnea.
En la zona del pie de pgina y del pie de ltima pgina debe aparecer el siguiente texto centrado:
1182
PROGRAMACIN
JAVA
EXCEPCIONES Ejercicio 1
Realizar un programa que le permita al usuario introducir una frase, una posicin inicial y una posicin final. (Tres cuadros de texto llamados txtFrase, txtPosIni y txtPosFin.
El programa debe mostrar la subcadena contenida entre la posicin inicial y la posicin final (use una etiqueta etiSubcadena)
El cdigo de este programa puede generar errores de ejecucin (excepciones), en el caso de que el usuario no introduzca nada en el cuadro de texto de la frase, o en el caso de que el usuario introduzca un valor incorrecto de los cuadros de texto de las posiciones.
El programa debe ser capaz de capturar las excepciones producidas y mostrar un mensaje de error.
Ejercicio 2
1183
Realizar un programa que pida las coordenadas de una recta, es decir, las coordenadas del punto p1 (x1, y1) y las coordenadas del punto p2 (x2,y2).
As pues el programa tendr cuatro cuadros de texto: txtX1, txtY1, txtX2 y txtY2 donde el usuario introducir las coordenadas.
Aada un botn Calcular llamado btnCalcular que realice el clculo. El cdigo que introduzca en este botn debe ser capaz de capturar cualquier tipo de excepcin producida. Interesa que aparezca un mensaje indicando el tipo de error producido, y el tipo de excepcin.
Ejercicio 3
Realice un programa que le pida dos nmeros al usuario. Ambos nmeros deben estar comprendidos entre 0 y 100.
Adems, debe hacer que si el usuario introduce un nmero no comprendido entre 0 y 100, el cdigo genere una excepcin propia
1184
PROGRAMACIN
JAVA
LA CLASE JFRAME
Ejercicio 1
Un cuadro de texto llamado txtTitulo. Un botn Cambiar Ttulo llamado btnCambiarTitulo. Un botn Maximizar llamado btnMaximizar. Un botn Minimizar llamado btnMinimizar. Un botn Restaurar llamado btnRestaurar. Un cuadro de texto llamado txtPosicionX. Un cuadro de texto llamado txtPosicionY. Un botn Mover llamado btnMover. Un botn Centrar llamado btnCentrar. Un botn Estilo Java llamado btnEstiloJava. Un botn Estilo Windows llamado btnEstiloWindows. Un botn Rojo llamado btnRojo. Un botn Verde llamado btnVerde. Un botn Azul llamado btnAzul.
1185
-
Si el usuario pulsa el botn Cambiar Titulo, el ttulo de la ventana cambiar, colocndose como ttulo lo que el usuario haya escrito en el cuadro de texto txtTitulo.
Si el usuario pulsa el botn Mover, la ventana se colocar en la posicin de la pantalla que venga indicada por los valores x, y, introducidos respectivamente en los cuadros de texto txtPosicionX y txtPosicionY.
Si el usuario pulsa el botn Estilo Java, entonces toda la ventana cambiar a la visualizacin Java.
Si el usuario pulsa el botn Estilo Windows, entonces toda la ventana cambiar a la visualizacin Windows.
Si el usuario pulsa uno de los botones de color, entonces el fondo de la ventana se cambiar al color indicado.
1186
-
Al iniciarse el programa, este debe pedir una contrasea al usuario. Si el usuario introduce la contrasea correcta, entonces el usuario entrar en el programa. En caso contrario el programa se cerrar.
Si el usuario responde S, entonces el programa finalizar. En caso contrario, el programa seguir funcionando.
1187
PROGRAMACIN
JAVA
Un panel con el ttulo Ingredientes. No hace falta que le de un nombre. Un panel con el ttulo Tamao. No hace falta que le de un nombre. Cuatro JCheckBox con los textos: o Bacon nombre: chkBacon o Anchoas nombre: chkAnchoas
1188
o Cebolla nombre: chkCebolla o Pimiento nombre: chkPimiento Tres JRadioButtons con los textos: o Pequea nombre: optPequenia o Mediana nombre: optMediana o Familiar nombre: optFamiliar
Un botn Total llamado btnTotal. Una etiqueta con borde llamada etiResultado.
El usuario elegir un tamao para la pizza que quiere pedir. Este tamao puede ser uno solo de los siguientes: pequea, mediana o familiar. El usuario elegir tambin los ingredientes que desee. Puede seleccionar uno o varios ingredientes. Al pulsar el botn Total, el programa calcular y mostrar en la etiqueta etiResultado el precio de la pizza, teniendo en cuenta lo siguiente:
Una pizza pequea cuesta 7 euros. Una pizza mediana cuesta 9 euros. Una pizza familiar cuesta 11 euros.
Si se le aade como ingrediente Bacon, hay que aumentar el precio de la pizza en 1,50 euros. Si se le aade como ingrediente Anchoas, hay que aumentar el precio de la pizza en 1,80 euros. Si se le aade como ingrediente Cebolla, hay que aumentar el precio de la pizza en 1,00 euros. Si se le aade como ingrediente Pimiento, hay que aumentar el precio de la pizza en 1,20 euros.
1189
Al ejecutar el programa, debe estar seleccionada la opcin pizza familiar por defecto, y no debe estar seleccionada ninguno de los ingredientes.
Al iniciarse el programa, debe aparecer un cuadro indicando el nombre del programa. Por ejemplo: PIZZERA JAVA, y el nombre del programador.
Al intentar cerrar el programa, este debe pedir confirmacin para salir. Solo si el usuario acepta salir del programa este se cerrar.
1190
PROGRAMACIN
JAVA
1191
-
Un cuadro de texto donde se introducirn las unidades que se envan, llamado txtUnidades.
Normal Urgente
Un botn Calcular llamado btnCalcular. Una etiqueta con un borde llamada etiResultado. Otras etiquetas informativas.
El usuario marcar un producto de los tres que aparecen en la lista. El usuario indicar el nmero de unidades que se enviarn del producto.
1192
-
El usuario indicar el tipo de destino. El usuario indicar el tipo de envo. Al pulsar Calcular, el programa mostrar en la etiqueta etiResultado el total del envo, teniendo en cuenta lo siguiente:
Normal 3 Urgente 10
Si se pulsa calcular cuando no hay seleccionado ningn producto, el programa mostrar un mensaje de error emergente indicndolo.