Está en la página 1de 607

EJERCICIO GUIADO.

JAVA: CUADROS DE VERIFICACIN

1. Realiza un nuevo proyecto.


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

4. Aade tres JCheckBox y cambia el texto de ellos, de forma que


aparezca Perro, Gato y Ratn.
5. Debe cambiar el nombre de cada uno de ellos. Se llamarn: chkPerro,
chkGato, chkRaton.
6. La ventana tendr el siguiente aspecto cuando termine:

7. El programa debe funcionar de la siguiente forma:


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

8. Observa el cdigo. En l se hace lo siguiente:


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

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

EJERCICIO GUIADO. JAVA: BOTONES DE OPCIN


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

4. Una vez aadido el panel en el JFrame, le pondremos un borde para poder


localizarlo fcilmente. Debes hacer lo siguiente:
a. Selecciona el panel que has aadido.
b. Activa la propiedad Border (botn con tres puntos)
c. Busca el tipo de borde llamado TitledBorder (borde con ttulo) y pon el
ttulo colores.

5. Tu ventana debe quedar ms o menos as:

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

7. Aade tres JRadioButton y cambia el texto de ellos, de forma que aparezca


Rojo, Verde y Azul.
8. Debe cambiar el nombre de cada uno de ellos. Se llamarn: optRojo, optVerde,
optAzul.
9. La ventana tendr el siguiente aspecto cuando termine:

10. Si ejecuta el programa, observar que pueden seleccionarse varios colores a la


vez. Esto no es interesante, ya que los botones de opcin se usan para activar
solo una opcin entre varias.

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

b. Tienes que darle un nombre al ButtonGroup. El nombre ser


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

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

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

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

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

15. Observa el cdigo. En l se hace lo siguiente:


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

16. Ejecute el programa. Seleccione por ejemplo la Verde. Al pulsar Aceptar el


resultado debe ser el siguiente:

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

EJERCICIO GUIADO. JAVA: CUADROS DE LISTA


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

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

10

5. Aprovecha para cambiarle el nombre al JList. El nuevo nombre ser lstColores.


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

9. Debes hacer que la lista sea la siguiente:


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

11

11. Observa el cdigo:


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

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

14. Observa el cdigo:


a. El mtodo getSelectedIndex me dice el ndice del elemento que est
seleccionado.

12

b. Por ejemplo, si est seleccionado el primero el ndice es 0, si est


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

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

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

13

EJERCICIO GUIADO. JAVA: CUADROS COMBINADOS


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

4. Cmbiale el nombre al JComboBox. El nombre ser cboColores. Tu programa debe


tener ms o menos este aspecto.

5. Los elementos del cboColores pueden ser cambiados a travs de la propiedad


Model. Selecciona el combo y activa la propiedad Model (el botoncito con los tres
puntos) Aparecer lo siguiente:

14

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

15

8. Vamos a hacer que cuando se elija un elemento del desplegable, en la etiqueta


aparezca un mensaje indicando el color elegido.
Para ello, debes programar el evento actionPerformed del combo y aadir el siguiente
cdigo:
String mensaje="El color elegido es ";
mensaje=mensaje+cboColores.getSelectedItem().toString();
etiResultado.setText(mensaje);

9. Este cdigo hace lo siguiente:


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

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

16

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

Se escribe aqu y
se pulsa enter

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

17

EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA


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

4. Borra todo el contenido de la lista (propiedad model) y cmbiale el nombre a la lista.


La lista se llamar lstNombres. Recuerda que las listas aparecen dentro de un objeto
del tipo JScrollPane.

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

18

6. En el evento actionPerformed del botn Curso 1 programa lo siguiente:


DefaultListModel modelo = new DefaultListModel();
modelo.addElement("Juan");
modelo.addElement("Mara");
modelo.addElement("Luis");
lstNombres.setModel(modelo);

7. En el evento actionPerformed del botn Curso 2 programa lo siguiente:


DefaultListModel modelo = new DefaultListModel();
modelo.addElement("Ana");
modelo.addElement("Marta");
modelo.addElement("Jose");
lstNombres.setModel(modelo);

8. Explicacin de los cdigos anteriores:


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

19

e. Primero se crea el modelo, a travs de la siguiente instruccin (ser


necesario aadir el import correspondiente, atento a la bombillita):
DefaultListModel modelo = new DefaultListModel();
f.

El modelo tiene un mtodo llamado addElement que permite introducir datos


dentro de l. As pues usamos este mtodo para aadir los datos al modelo.

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

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

Click y cambia el
listado.

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

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

20

11. Ejecuta el programa:

Click y aparece
el elemento
seleccionado en
la etiqueta.

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

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

21

EJERCICIO GUIADO. JAVA: MODELOS DE CUADRO DE LISTA


1. Realiza un nuevo proyecto.
2. En la ventana principal debes aadir lo siguiente:
a.
b.
c.
d.

Un combo llamado cboNumeros.


Un botn Pares llamado btnPares.
Un botn Impares llamado btnImpares.
Una etiqueta con borde llamada etiResultado.

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

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


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

6. Observa lo que hace este cdigo:


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

22

b. A continuacin, se usa el objeto modelo creado y se rellena de datos.


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

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

Se pulsa y se rellena
automticamente

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


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

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

10. Finalmente se programar el actionPerformed del combo para que al seleccionar un


elemento este aparezca en la etiqueta. Esto se hace con una simple instruccin:

23

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

Recuerda el uso de getSelectedItem() para recoger el elemento seleccionado, y el


uso de toString() para convertirlo a texto.

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

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

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

24

EJERCICIO GUIADO. JAVA: TOGGLEBUTTONS


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

e. Debes aadir tambin tres botones, con el


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

f.

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

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

25

Observa como al pulsar los


JToggledButton estos se quedan
pulsados.
Si se vuelven a activar se despulsan.

4. Se pretende que el programa funcione de la siguiente forma:


a.
b.
c.
d.

El usuario introducir un precio base para el servicio que se vende.


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

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

26

double
double
double
double

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

//Recojo datos desde la ventana:


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

//Finalmente pongo el resultado en la etiqueta


etiTotal.setText(precio_total+" ");

6. Veamos una explicacin del cdigo:


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

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

27

d. A continuacin se le suma al precio_total los precios de los extras si el botn


correspondiente est seleccionado. Esto se hace a travs de if. Por ejemplo,
para sumar el extra por instalacin:
if (tbtnInstalacion.isSelected()) { //Si se seleccion instalacin
precio_total = precio_total+precio_instal;
}

Esto significa: Si el botn instalacin est seleccionado, aade al precio total


el precio por instalacin
Observa el uso del mtodo isSelected para saber si el botn tbtnInstalacion ha
sido seleccionado.
e. Finalmente el resultado se muestra en la etiqueta de total.

7. Comprueba el funcionamiento del programa


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

8. Supongamos que normalmente (en el 90 por ciento de los casos) la instalacin es


solicitada por el usuario. Podra ser interesante que el botn Instalacin ya saliera
activado al ejecutarse el programa. Para ello, aade en el Constructor la siguiente
lnea.
tbtnInstalacion.setSelected(true);

Esta lnea usa el mtodo setSelected para activar al botn tbtnInstalacin.


Comprueba esto ejecutando el programa.

28

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

29

EJERCICIO GUIADO. JAVA: SLIDERS

Introduccin a los JSliders


La clase JSlider permite crear objetos como el siguiente:

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

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

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

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

30

3. Aade una etiqueta con borde. Su nombre ser etiValor.


4. La ventana tendr el siguiente aspecto:

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

6. Se puede asignar un valor inicial al JSlider a travs de su propiedad value. Busque


esta propiedad y asigne un valor de 400. Observe donde se sita el recuadro del
JSlider.

31

7. Se puede mejorar el JSlider definiendo unas divisiones (medidas) Por ejemplo,


haremos que cada 50 unidades aparezca una divisin. Para ello use la propiedad
majorTickSpacing y asigne un 50.

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

Medidas cada 50
unidades

9. An se puede mejorar la presentacin del JSlider, si hacemos que aparezca el valor


de cada divisin. Para ello debes activar la propiedad paintLabel.

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

32

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

12. Ejecute el programa y observe lo que sucede cuando arrastra el deslizador.


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

Movemos aqu.
Y aparece el valor
correspondiente aqu.

14. A continuacin se mencionan otras propiedades interesantes de los JSlider que


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

33

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

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

34

EJERCICIO GUIADO. JAVA: SPINNER

Introduccin a los JSpinner


La clase JSpinner permite crear cuadros como el siguiente:

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

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

3. Aade una etiqueta con borde. Su nombre ser etiValor.


4. La ventana tendr el siguiente aspecto:

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

35

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

7. Prueba el programa y observa su funcionamiento:


El usuario modifica el
valor del JSpinner...

Y aqu aparece el valor


seleccionado.

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

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

10. Este cdigo hace lo siguiente:


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

36

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

Finalmente se asigna el modelo creado al JSpinner.

g. Este cdigo, en definitiva, har que el JSpinner muestre los valores


comprendidos entre 0 y 10.

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

Ahora los valores estn


comprendidos entre 0 y
10

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

13. La lnea aadida es:


nm.setStepSize(2);

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

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

37

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

38

EJERCICIO GUIADO. JAVA: SCROLLBARS

Introduccin a las JscrollBars (Barras de desplazamiento)


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

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

Valor mnimo

Cuando se pulsa algunos de los botones de la barra de desplazamiento, el valor de la barra


se incrementa / decrementa poco a poco. A este incremento / decremento lo llamaremos
incremento unitario.

Decrementa el valor poco a


poco (incremento unitario)

Incrementa el valor poco a poco


(incremento unitario)

Cuando se pulsa directamente sobre la barra, el valor de la barra se incrementa /


decrementa en mayor cantidad. A este incremento / decremento lo llamaremos incremento
en bloque.

Al pulsar directamente sobre la barra


se decrementa en mayor cantidad
(incremento en bloque)

Al pulsar directamente sobre la


barra se incremente en mayor
cantidad (incremento en bloque)

39

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

3. La barra de desplazamiento aparecer en vertical. Use la propiedad de la barra


llamada Orientation para hacer que la barra aparezca en posicin horizontal.

4. Aade tambin una etiqueta con borde y llmala etiValor.


5. La ventana debe quedar ms o menos as:

6. Interesa que cuando el usuario cambie de alguna manera la barra de


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

40

7. Como ves, se coloca en la etiqueta el valor de la barra. El valor de la barra se obtiene


con el mtodo getValue. Ejecuta el programa para ver su funcionamiento.
Pulsa aqu y observa
como el valor cambia
poco a poco

Pero si pulsas aqu el


valor cambia en mayor
cantidad

8. Sigamos estudiando el programa. Se pide que cambies las siguientes propiedades de


tu barra:
Minimum Permite asignar el valor mnimo de la barra. Escribe un 50
Maximum Permite asignar el valor mximo de la barra. Escribe un 150

UnitIncrement Permite cambiar el incremento unitario. Escribe un 2.

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

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

41

9. Ejecuta ahora el programa y comprueba su funcionamiento:


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

Si pulsas aqu, el valor


se incrementa de 20
en 20, ya que el
incremento en bloque
es de 20.

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

Observa lo que sucede cuando llevas


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

42

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

***

Valor de la barra (145) **

* Nuestra barra tiene un valor mximo de 150.


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

11. A travs del mtodo setValue de la barra de desplazamiento se puede asignar un


valor inicial a la barra. Programe en el constructor de su programa lo necesario para
que la barra de desplazamiento tenga un valor de 70 al empezar el programa.

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

43

EJERCICIO GUIADO. JAVA: BARRA DE MENUS

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

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

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

4. En el inspector (parte inferior izquierda) observars como aparece un objeto


JMenuBar, y, dentro de l, un objeto del tipo JMenu. Los objetos JMenu representan
las opciones principales contenidas dentro de la barra de mens.

5. Aprovecha el Inspector para cambiar el nombre al objeto JMenuBar. Llmalo


barraMenus.
6. Cambia tambin el nombre al objeto JMenu. Asgnale el nombre menuArchivo. El
Inspector tendr el siguiente aspecto:

44

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

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

9. Puedes aadir ms opciones principales a la barra de mens haciendo clic con el


derecho sobre el objeto de la barra de mens y activando la opcin Aadir JMenu.

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

45

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

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

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

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

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

46

16. Aade un JMenuItem ms al menuArchivo y luego cambia el nombre a ambos. Sus


nombres sern menuItemAbrir y menuItemGuardar. El aspecto del Inspector ser el
siguiente:

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

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


Guardar.

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

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

47

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

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

Observa el efecto que produce el separador.

22. Un JMenu representa las opciones principales de la barra de mens. A su vez, un


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

48

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

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

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

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

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

49

27. Marque en el inspector el objeto menuItemRojo y acceda a su evento


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

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

50

EJERCICIO GUIADO. JAVA: BARRA DE HERRAMIENTAS

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

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

4. Debajo de la barra de mens colocaremos una barra de herramientas, as que aade


un objeto del tipo JToolBar. Haz que la barra se coloque debajo de la barra de mens
y que alcance desde la parte izquierda de la ventana a la parte derecha.
La ventana quedar as:

51

5. Las barras de herramientas son simples contenedoras de objetos. Dentro de ellas se


pueden colocar botones, combos, etiquetas, etc.
Normalmente, las barras de herramientas contienen botones. As que aade cuatro
botones (JButton) dentro de la barra. Solo tienes que colocarlos dentro de ella.

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

7. Aprovecharemos el inspector para cambiar el nombre a la barra y a cada botn. A la


barra la llamaremos barraHerramientas, y a los botones los llamaremos btnUno,
btnDos, btnTres y btnCuatro:

52

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

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

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

Luego ejecuta el programa y comprueba el funcionamiento del botn.

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

53

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

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

54

EJERCICIO GUIADO. JAVA: MENUS EMERGENTES

El evento mouseClicked
El evento mouseClicked es capaz de capturar un clic del ratn sobre un determinado
elemento de la ventana.
Este evento recibe como parmetro un objeto del tipo MouseEvent, y gracias a l se puede
conseguir informacin como la siguiente:
-

Qu botn del ratn fue pulsado.


Cuantas veces (clic, doble clic, etc)
En qu coordenadas fue pulsado el botn.
Etc.

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

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

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

5. Dentro del evento programe lo siguiente:


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

55

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

8. Se puede aprovechar el mtodo getButton para controlar la pulsacin del botn


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

11. Aprovecharemos el inspector para cambiar el nombre al men. Llmalo


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

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

56

16. Este cdigo significa lo siguiente:


-

El mtodo show le da la orden al menuEmergente para que se muestre.


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

17. Ejecuta el programa y observa el resultado.

Al hacer clic con el derecho se mostrar el men contextual.


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

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

57

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

58

EJERCICIO GUIADO. JAVA: FILECHOOSER

Cuadros de dilogo Abrir y Guardar


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

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

59

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

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

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

6. Para que al pulsar la opcin Abrir de nuestro programa aparezca el dilogo de


apertura de ficheros, es necesario aadir a nuestro programa un objeto del tipo
JFileChooser.
Los objetos JFileChooser se aadirn el la zona de Otros Componentes del
inspector.

60

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

8. Aparecer entonces un objeto JFileChooser dentro de Otros Componentes.


Aprovecha para cambiarle el nombre a este objeto. Su nombre ser elegirFichero.
El inspector quedar as:

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

61

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

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

Estas dos lneas crean una variable entera resp (respuesta) y a continuacin hacen
que se muestre la ventana Abrir Fichero. Observa que para conseguirlo hay que
usar el mtodo showOpenDialog del objeto elegirFichero. Este mtodo lleva como
parmetro la ventana actual (this)

El mtodo showOpenDialog no solo muestra la ventana Abrir Fichero sino que


tambin devuelve un valor entero segn el botn pulsado por el usuario en esta
ventana. Esto es: botn Abrir o botn Calcelar.

Se pueden usar dos if para controlar lo que sucede si el usuario puls el botn Abrir
o el botn Calcelar de la ventana Abrir Fichero:

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

En el primer if se compara la variable resp con la constante


JFileChooser.APPROVE_OPTION, para saber si el usuario puls Abrir.

En el segundo if se compara la variable resp con la constante


JFileChooser.CANCEL_OPTION, para saber si el usuario puls Calcelar.

En el caso de que el usuario pulsara Abrir, el programa usa el mtodo


getSelectedFile del objeto elegirFichero para recoger el camino del fichero elegido.
Este camino debe ser convertido a cadena con el mtodo toString.

El programa aprovecha esto para mostrar dicho camino en pantalla gracias al tpico
JOptionPane.

En el caso del que el usuario pulsara el botn Cancelar el programa muestra un


mensaje indicndolo.

62

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

Luego queda en manos del programador el trabajar con el fichero correspondiente de


la forma que desee.

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

63

EJERCICIO GUIADO. JAVA: PANELES DE DESPLAZAMIENTO

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

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

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

64

Observa como tienes un JScrollPane que contiene una etiqueta.

6. Aprovechemos el Inspector para cambiar el nombre a cada objeto. Al JScrollPane le


llamaremos scpImagen y a la etiqueta etiImagen.

7. Elimina el texto contenido en la etiqueta etiImagen. Solo tienes que borrar el


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

65

10. Puedes mejorar el programa si agrandas el panel de desplazamiento de forma que


ocupe todo el formulario:

De esta forma, cuando ejecutes el programa, al agrandar la ventana, se agrandar el


panel de desplazamiento, vindose mejor la imagen contenida.

11. Ejecuta el programa y comprubalo.

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

1. Crea un nuevo proyecto.


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

66

3. Ahora aade dentro del JScrollPane un panel normal (JPanel). En la ventana no


notars ninguna diferencia, pero en el Inspector debera aparecer esto:

4. Como ves, el JScrollPane contiene a un objeto JPanel.


5. Aprovechemos para cambiar el nombre a ambos objetos. Al JScrollPane lo
llamaremos scpDatos y al JPanel lo llamaremos panelDatos.

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

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

67

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:

68

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:

69

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

Como ves, el JPanel contenido en el JScrollPane es ms grande que l, por lo que no


se podr visualizar completamente. Ser necesario usar las barras de
desplazamiento del JScrollPane.
10. Ejecuta el programa para entender esto ltimo.

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

70

EJERCICIO GUIADO. JAVA: VARIABLES GLOBALES

Variables Globales / Propiedades de la Clase


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

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

Clase Principal

2. Tu clase principal es la clase Parking.


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

71

4. Esta ventana contiene lo siguiente:


-

Un botn Entr un coche llamado btnEntro.


Un botn Sali un coche llamado btnSalio.
Un botn Reiniciar llamado btnReiniciar.
Una etiqueta con el texto Coches en el Parking.
Una etiqueta con borde llamada etiCoches que contenga un 0.

5. Se pretende que el programa funcione de la siguiente forma:


a. Cuando el usuario pulse el botn Entr un coche, el nmero de coches del
parking aumenta en 1, mostrndose en la etiqueta etiCoches.
b. Si el usuario pulsa el botn Sali un coche, el nmero de coches del parking
disminuye en 1, mostrndose en la etiqueta etiCoches.
c. El botn Reiniciar coloca el nmero de coches del parking a 0.

6. Para poder controlar el nmero de coches en el Parking, es necesario que nuestra


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

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

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

72

Declaracin de una variable


global int llamada coches.

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

Inicializacin de la propiedad
coches.

Inicializamos a cero ya que se supone que cuando arranca el programa no hay


ningn coche dentro del parking.

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

Como ves, se le aade a la variable coches uno ms y luego se coloca su valor


actual en la etiqueta.
12. Ejecuta el programa y prueba este botn varias veces.

73

Pulsas, y aparece aqu el valor de


la propiedad coches.

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

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

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

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

74

Al pulsar aqu aumentas en uno la


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

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

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

Simplemente introduzco el valor cero en la variable global y actualizo la etiqueta.


16. Ejecuta el programa y comprueba el funcionamiento de este botn.

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

75

EJERCICIO GUIADO. JAVA: CENTRALIZAR CDIGO

El problema de la repeticin de cdigo


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

Evento 1

Cdigo A

Evento 2

Cdigo A

Evento 3

Cdigo A

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

Evento 1
Evento 2

Cdigo A

Evento 3

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

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

76

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

Esta ventana contiene los siguientes elementos:


-

Una barra de mens a la que puede llamar menuBarra.


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

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

77

4. El objetivo de programa es el siguiente:


a.
b.
c.
d.
e.
f.
g.

El usuario introducir dos nmeros en los cuadros de texto.


Si pulsa el botn Sumar, se calcular la suma.
Si pulsa el botn Restar, se calcular la resta.
Si pulsa el botn Borrar, se borrarn ambos cuadros de texto.
Si elige la opcin del men Calcular-Sumar entonces se calcular la suma.
Si elige la opcin del men Calcular-Restar entonces se calcular la resta.
Si elige la opcin del men Calcular-Borrar entonces se borrarn ambos
cuadros de texto.
h. Si se pulsa enter en alguno de los dos cuadros de texto se debera calcular la
suma.

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

Activar Calcular Sumar en el men


Pulsar enter en el primer cuadro de texto

Pulsar enter en el segundo cuadro de texto

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

78

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

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

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

9. Se va a programar un procedimiento que se encargue de recoger los valores de los


cuadros de texto. Calcular la suma de dichos valores, y luego mostrar la suma en
la etiqueta de resultados.
Los procedimientos en java tienen prcticamente la misma estructura que en C.
Programe lo siguiente:

79

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

10. Si observas el cdigo, es el tpico procedimiento de C, cuya cabecera comienza con


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

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

80

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

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

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

actionPerformed btnSumar
Procedimiento
actionPerformed menuSumar
Sumar()
actionPerformed txtNumero1

actionPerformed txtNumero2

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

Pulsar Botn Restar


Calcular la resta y
mostrar el resultado.

Activar Calcular Restar en el men

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

81

Programa este
procedimiento.

19. El cdigo de este procedimiento es prcticamente idntico al del procedimiento


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

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

actionPerformed btnRestar
Procedimiento
actionPerformed menuRestar
Restar()

82

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

Programa el
procedimiento Borrar...

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

25. Ejecuta el programa y prueba su funcionamiento.

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

83

EJERCICIO GUIADO. JAVA: LAYOUTS

El problema de la distribucin de elementos en las ventanas


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

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

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

84

Tanto el botn como la


etiqueta estarn siempre
a esta distancia del borde
derecho de la ventana

El botn siempre estar a


esta distancia de la
etiqueta

El botn siempre estar a


esta distancia del borde
inferior de la ventana

4. Ejecuta el programa y prueba a ensanchar (o achicar) la ventana por el lado derecho


y por el lado inferior. Debes observar como la etiqueta y el botn mantienen sus
distancias relativas entre s y con los bordes derecho e inferior de la ventana.

Siempre se mantienen las


distancias relativas
definidas en el diseo
aunque el tamao de la
ventana cambie.

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

85

AboluteLayout. Posiciones Absolutas

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

8. El Inspector tendr la siguiente forma ahora:

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

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

86

10. La ventana de definir una distribucin AbsoluteLayout es la facilidad para colocar


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

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

Distribucin en lnea. FlowLayout


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

87

13. Observa como el layout AbsoluteLayout es sustituido por la distribucin


FlowLayout. Una elemento solo puede tener un tipo de distribucin a la vez.

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

15. Si seleccionas el FlowLayout en el Inspector, podrs acceder a sus propiedades (los


layout son objetos como los dems) Una de las propiedades del FlowLayout se llama
alineacin y permite que los elementos estn alineados a la izquierda, derecha o
centro. El FlowLayout tiene una alineacin centro por defecto.

88

16. El FlowLayout no permite controlar la posicin de los elementos en la ventana, pero


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

Distribucin en rejilla. GridLayout

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

89

19. Marca el GridLayout y cambia sus propiedades Filas y Columnas. Asigna a la


propiedad Filas un 2 y a la propiedad Columnas un 3.

20. Al asignar 2 filas y 3 columnas al GridLayout, conseguiremos que los elementos de la


ventana se distribuyan en una tabla como la siguiente:

Los distintos elementos se adaptarn al espacio que tienen asignado, y cambiarn de


tamao.
21. Ya que solo tienes dos elementos en la ventana (una etiqueta y un botn), aade
otros cuatro elementos ms (cuatro botones) para observar como se distribuyen en la
cuadrcula.

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

90

Con un GridLayout los


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

BorderLayout

24. Otra de las distribuciones posibles es la llamada BorderLayout. Esta distribucin


coloca los elementos de la ventana en cinco zonas:
-

Zona norte (parte superior de la ventana)


Zona sur (parte inferior de la ventana)
Zona este (parte derecha de la ventana)
Zona oeste (parte izquierda de la ventana)
Zona centro.

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

91

26. Para poder entender el funcionamiento del BorderLayout, se recomienda que el


JFrame contenga nicamente 5 botones (elimine los elementos que tiene ahora y
aada cinco botones)
La ventana tendr un aspecto parecido al siguiente:

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

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

Con un GridLayout los


elementos aparecen
zonas.
Siempre aparecen dentro
de la ventana aunque el
tamao de esta cambie.

92

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

93

EJERCICIO GUIADO. JAVA: LAYOUTS Y PANELES

Tcnicas de distribucin de elementos en las ventanas


A la hora de disear una ventana se tienen en cuenta dos cosas:
-

La facilidad a la hora de colocar muchos componentes en la ventana.


Que dichos componentes estn siempre visibles independientemente del tamao de
la ventana.

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

JPanel 1
(Diseo Libre, AbsoluteLayout o
FlowLayout)

Componentes

JPanel 2
(Diseo Libre, AbsoluteLayout o
FlowLayout)

Componentes

94

etc

Ejercicio guiado

1. Crea un nuevo proyecto en java.


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

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


a la zona norte de la ventana.

Panel en la zona norte.

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

95

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

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

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

96

7. Si el panel no se coloca en el sitio deseado, se puede seleccionar en el Inspector y


activar su propiedad Direccin, e indicar la zona donde se quiere colocar:

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

97

8. El Inspector tendr la siguiente forma ahora:

9. Aade ahora tu solo un panel en la zona oeste llamado panelBotonera y otro en la


zona esta llamado panelVerificacion. El Inspector debera tener la siguiente forma al
finalizar:

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

98

11. En la parte izquierda del NetBeans aparecer nicamente el panelBotonera.


Agrndalo para que tenga la siguiente forma:

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

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

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

99

14. Ahora disea el panel panelVerificacin haciendo doble clic sobre l.


15. Asgnale tambin un layout AbsoluteLayout.
16. Coloca en l cuatro casillas de verificacin. El aspecto del panel al terminar debe ser
parecido al siguiente:

Y el Inspector debe tener un estado similar a este:

17. Ahora se disear el panelTitulo. Haz doble clic sobre l.


18. En este caso se le aadir un FlowLayout. Recuerda que este layout hace que cada
elemento se coloque uno detrs de otro.
19. Aade al panel dos etiquetas como las que siguen. Ponle un borde a cada una:

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

100

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

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

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

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

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

101

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

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

PanelEtiqueta1 PanelCuadro1
PanelEtiqueta2 PanelCuadro2

25. Ahora aada al panelEtiqueta1 y al panelEtiqueta2 sendas etiquetas. Y al


panelCuadro1 y panelCuadro2 sendos cuadros de textos. El panel panelDatos debe
quedar as:

102

26. Finalmente ejecuta el programa y comprueba como se comportan los elementos


segn el panel donde se encuentre y el layout asignado a cada uno.

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

103

EJERCICIO GUIADO. JAVA: DILOGOS

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

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

104

Ejercicio guiado

1. Crea un nuevo proyecto en java.


2. Disea el JFrame de forma que la ventana tenga el siguiente aspecto:

Los elementos de la ventana tendrn los siguientes nombres:


-

Cuadro de texto de unidades: txtUnidades.


Cuadro de texto de precio: txtPrecio.
Etiqueta con borde del total: etiTotal.
Botn Calcular: btnCalcular.
Botn Configuracin: btnConfiguracion.

3. Se pretende que cuando se pulse el botn Calcular se calcule el total de la venta


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

Variables
globales

105

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

Inicializacin de
variables
globales

6. Estamos ya preparados para programar el botn btnCalcular. Entra en su


actionPerformed y all se programar la realizacin del clculo de la siguiente forma:
double
double
double
double
double
double

unidades;
precio;
total;
//total
cantiva; //cantidad iva
cantdes; //cantidad descuento
totalsiniva; //total sin iva

//Recojo los datos de los cuadros de textos (convirtiendolos a nmeros)


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

7. Puedes ya ejecutar el programa y comprobar que el botn Calcular funciona, aunque


el clculo que realiza lo hace con un iva 0 y un descuento 0.
8. A continuacin se programar el botn Configuracin de forma que nos permita
decidir qu iva y qu descuento queremos aplicar. Este botn mostrar un CUADRO
DE DILOGO que permita al usuario configurar estos datos.

106

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

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

11. Cmbiale el nombre. Lo llamaremos dialogoConfiguracion.


12. Los dilogos normalmente traen por defecto el layout BorderLayout. Para nuestro
ejemplo cambiaremos el layout del JDialog por el Diseo Libre:

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

107

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


forma:

Los elementos del cuadro de dilogo tienen los siguientes nombres:


-

El cuadro de texto del Iva: txtIva.


El cuadro de texto del Descuento: txtDescuento.
El botn Aceptar: btnAceptar.
El botn Cancelar: btnCancelar.
Si observas el Inspector debe tener el siguiente aspecto:

108

15. Se ha dicho que cuando se pulse el botn Configuracin en la ventana principal,


debe aparecer el cuadro de dilogo dialogoConfiguracion, que acabas de disear:

Haces clic sobre Configuracin


y aparece el dilogo

16. Para conseguir esto, debes programar el actionPerformed del botn


btnConfiguracion de la siguiente forma:
dialogoConfiguracion.setSize(250,200);
dialogoConfiguracion.setLocation(100,100);
dialogoConfiguracion.setVisible(true);

17. El cdigo anterior hace lo siguiente:


-

A travs del mtodo setSize se asigna un tamao de 250 x 200 al


cuadro de dilogo.
A travs del mtodo setLocation se determina que el cuadro de
dilogo aparecer en la posicin (100, 100) de la pantalla.
A travs del mtodo setVisible hacemos que el cuadro de dilogo se
muestre.

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

109

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

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

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

110

25. Compruebe el funcionamiento del programa de la siguiente forma:


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

26. Se pretende ahora mejorar un poco el cuadro de dilogo, aadindole un ttulo.


Seleccione el cuadro de dilogo en el Inspector y luego busque su propiedad title. En
ella escriba Configuracin de iva y descuento.
27. Vuelva a ejecutar el programa. Observe la barra de ttulo del cuadro de dilogo:

28. Ahora se estudiar el concepto de cuadro de dilogo modal y cuadro de dilogo no


modal.

Un cuadro de dilogo no modal. Es aquel que permite activar la ventana desde la que
apareci. Los cuadros de dilogo aadidos a un proyecto son por defecto no
modales.

29. Ejecuta el programa y prueba a hacer lo siguiente:


a. Pulsa el botn Configurar. Aparecer el cuadro de dilogo.
b. Pulsa sobre la ventana.

111

Pulsa sobre la
ventana.

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

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

d. Esto es posible gracias a que el cuadro de dilogo es no modal.


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

112

f.

Ahora ejecuta el programa de nuevo y haz que se visualice el cuadro de


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

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

g. Es muy comn, cuando tenemos un cuadro de dilogo no modal, usar la


propiedad alwaysOnTop, para que siempre aparezca delante de la ventana.

30. Ahora se estudiar el concepto de cuadro de dilogo modal.

Un cuadro de dilogo modal es aquel que no permite que se active otra ventana
hasta que este no se haya cerrado.

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

32. Ahora ejecuta el programa comprueba lo siguiente:


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

113

Aunque intentes activar la


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

c. Solo cuando pulses, Aceptar, o Cancelar, o cierres el cuadro de dilogo,


podrs seguir trabajando con tu ventana.

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

114

EJERCICIO GUIADO. JAVA: DISEO DE FORMULARIOS DESDE CDIGO

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

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

115

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

Haz clic en el + para


ver el cdigo generado.

6. El cdigo generado (sealado en azul) no puede ser modificado, sin embargo es


interesante estudiarlo para entenderlo. En l puedes encontrar como se crean los
componentes, como se asigna el texto a stos etc.
Aqu se crea el botn,
la etiqueta y el cuadro
de texto

Aqu se asigna el texto


a cada elemento

ETC

116

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

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

2. Una vez creado el proyecto, iremos directamente a la ventana de cdigo, pulsando el


botn Origen. No usaremos la ventana de diseo en este proyecto.

B. ESTRUCTURA DEL CDIGO (estructura de una clase)

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


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

Observars tambin una instruccin que indica que


este fichero (ventanaprincipal.java) pertenece al
paquete ventanas.

Tambin vers otro comentario donde aparece el


nombre del autor. Este comentario se puede
cambiar para que aparezca tu nombre.

117

4. Un proyecto en java est formado por mdulos denominados CLASES. El proyecto


que acabamos de crear tiene un solo mdulo: el JFrame que define la ventana
principal, llamado precisamente ventanaprincipal. Por tanto, se puede decir que
nuestro proyecto tiene una clase llamada ventanaprincipal.

El proyecto operaciones tiene una clase llamada


ventanaprincipal, que pertenece al paquete
ventanas.

5. Para programar una clase se sigue la siguiente sintaxis:


public class nombredelaclase {
programacin de la clase
}

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

118

Programacin
de la clase
ventanaprincipal

7. Dentro de la clase, tenemos una serie de funciones y procedimientos llamados


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

Observars que el constructor contiene una llamada a un mtodo llamado


initComponents. El mtodo initComponents define caractersticas iniciales de la
ventana, y es cdigo generado automticamente. Si quieres verlo, solo tienes que
desplegar la parte de Cdigo Generado:

119

Clic aqu
para
ocultar el
cdigo
generado

El mtodo initComponents al que hace referencia el constructor es un


mtodo generado automticamente, y no puede ser modificado.
Puedes verlo dentro de la seccin de Cdigo Generado.
Este mtodo define algunas caractersticas iniciales de la ventana.

El contenido del mtodo initComponents no resulta interesante para el ejercicio que


estamos realizando, as que puedes ocultar de nuevo el Cdigo Generado, haciendo
clic en el smbolo menos -

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

C. DISEO DE LA VENTANA DESDE CDIGO

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

Para conseguir esto, sigue los siguientes pasos:

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

120

El mtodo donde
disearemos nuestra
ventana

11. Lo primero que se va a hacer es definir caractersticas propias de la ventana, como


por ejemplo su ttulo, tamao, etc. Recuerda que la forma de hacer referencia a la
propia ventana es a travs de la palabra reservada this.
As pues, programa lo siguiente dentro del mtodo CreacionVentana:

Este cdigo hace lo siguiente:


-

Usa el mtodo setTitle de la ventana para definir el texto de la barra de ttulo.


Usa el mtodo setSize de la ventana para definir un tamao de 500x300.
Usa el mtodo setLocation de la ventana para definir la posicin de la ventana en
la posicin (100,100) de la pantalla.

121

Con setLocation
decides la posicin de
la ventana

Con setTitle cambias


la barra de ttulo

Con setSize defines el


ancho y alto de la
ventana

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

13. Ya puedes ejecutar el programa. En el momento en que se ejecuta el programa, el


constructor llama al mtodo CreacionVentana y se definen las caractersticas
programadas.

122

14. Ahora vamos a empezar a aadir componentes a la ventana. Concretamente,


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

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

Importacin de la librera para el


objeto JLabel, que define las
etiquetas.
(Agregada automticamente al pulsar
la bombilla del NetBeans)

17. Ahora agrega este cdigo a tu mtodo CreacionVentana:

18. La explicacin del cdigo es la siguiente:


-

La primera lnea construye la etiqueta llamada etiNum1 que fue delarada antes.
etiNum1 = new JLabel();

Generalizando: para crear un objeto llamado xxx del tipo tipoobjeto, se tendr que
hacer lo siguiente:

123

En la zona de las variables globales se declarar la variable del objeto de


la siguiente forma:
tipoobjeto xxx;

Luego, dentro de la clase, se construye el objeto siguiendo la siguiente


sintaxis:
xxx = new tipoobjeto();

En el ejemplo, la etiqueta creada, cuyo nombre es etiNum1, tiene que contener el


texto Nmero 1:. Esto lo hacemos con el tpico mtodo setText:
etiNum1.setText(Nmero 1: );

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

Finalmente, hay que colocar la etiqueta en el panel de contenidos de la ventana.


Para ello, se usa el mtodo add del panel de contenidos. Recuerda que para
obtener este panel se usa el mtodo getContentPane:
this.getContentPane().add(etiNum1);

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

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

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

124

22. Este cdigo es prcticamente igual al anterior. En l se constuye la etiqueta


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

24. Sigamos aadiendo elementos. Ahora aadiremos un cuadro de texto llamado


txtNum1. Primero declara la variable del cuadro de dilogo en la zona de variables
globales:

Tendrs que agregar el import correspondiente para el tipo de objeto JTextField.


25. Luego aade el siguiente cdigo en el mtodo CreacionVentana:

26. Este cdigo realiza lo siguiente:


-

La primera lnea construye el cuadro de texto llamado txtNum1. Los JTextField


son objetos del tipo cuadro de texto.

125

Esta lnea se subrayar en rojo ya que ser necesario aadir el import para la
librera de los JTextField.

La siguiente lnea introduce la cadena 0 dentro del cuadro de texto.

La siguiente lnea asigna la posicin y el tamao a travs del mtodo setBounds.

Y finalmente, la ltima lnea aade el cuadro de texto al panel de contenidos de la


ventana.

27. Ejecuta el programa y comprueba el funcionamiento de este cdigo.


28. Ahora se aadir un nuevo cuadro de texto llamado txtNum2. El cdigo es similar.
Declara la variable global:

29. Y ahora aade el cdigo que construye el objeto en el mtodo ConstruirVentana.


Este cdigo es similar al del cuadro de texto anterior. Solo cambia el nombre del
objeto y la posicin donde se colocar:

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

126

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

32. Y a continuacin construiremos y le daremos forma al botn, aadiendo el siguiente


cdigo en el mtodo ConstruirVentana:

33. La explicacin del cdigo anterior es similar a los anteriores:


-

La primera lnea construye el botn btnSumar.


A continuacin se asigna el texto Sumar al botn.
Luego se asigna la posicin y el tamao del botn con el mtodo setBounds.
Finalmente se aade el botn al panel de contenido de la ventana.

127

34. Ejecuta el programa y observa el aspecto de la ventana.


35. Ahora se aadir otro botn llamado btnRestar. Declara la variable JButton:

36. Tienes que escribir el siguiente cdigo:

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

128

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

129

EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO

Eventos desde cdigo


La ventana de diseo de NetBeans nos permite crear cada componente, colocarlo en la
ventana y acceder a los eventos que necesitemos fcilmente para programar en ellos las
acciones que se tengan que realizar.
Sin embargo, si el diseo de la ventana se ha realizado directamente desde cdigo, ser
necesario crear tambin desde cdigo los distintos eventos a usar, y asociarlos al
componente correspondiente.
Para programar eventos hay que tener en cuenta lo siguiente:
-

Un evento pertenece a un objeto Oyente (Listener) o a un objeto Adaptador


(Adapter)

El objeto oyente/adaptador hay que asociarlo al elemento sobre el que sucede el


evento.

Por ejemplo: Programar la pulsacin de un botn btnSumar.


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

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

Eventos de Accin:
o

actionPerformed
Activar un componente (pulsacin de botn, enter en un cuadro de
texto)

Eventos de Teclado:
o

keyPressed
Se puls una tecla, pero no se solt.

130

o
o

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

Eventos de Ratn:
o mousePressed
Se puls un botn del ratn.
o mouseReleased
Se solt un botn del ratn.
o mousePressed
Se puls y solt un botn del ratn.
o mouseEntered
El ratn entr en la superficie del control.
o mouseExited
El ratn sali de la superficie del control.

Eventos de Ventana:
o
o
o
o

windowOpened
Se abri la ventana
windowClosing
Se cerr la ventana
windowActivated
Se activ la ventana
windowDeactivated
Se desactiv la ventana

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

131

PROGRAMACIN DE EVENTOS DE ACCIN


Un evento de accin hace referencia a la activacin de un objeto (un botn, un cuadro de
texto, un combo, etc...)
Solo existe un tipo de evento de accin, llamado actionPerformed.
El evento actionPerformed pertenece a un objeto oyente llamado ActionListener.
Eventos de Accin
Eventos

Oyente/Adaptador
Se programan dentro de...

actionPerformed

ActionListener

La forma de programar el evento actionPerformed de un componente xxx es la siguiente:


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

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


cdigo para crear el evento:

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

Una explicacin del cdigo:


El componente cuyo evento
se quiere programar. En
este ejemplo, el botn
btnSumar

El mtodo addActionListener
permite asignar el oyente al
botn.

El evento actionPerformed
pertenece a un objeto oyente
llamado ActionListener.

btnSumar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnSumarActionPerformed(evt);
}
});
El evento actionPerformed, es en
Dentro del procedimiento actionPerformed se
hace una llamada a otro procedimiento. El
nombre de este otro procedimiento puede ser
cualquiera, pero usaremos el nombre del
componente seguido de ActionPerformed
132

realidad un procedimiento, que tiene


como parmetro un objeto del tipo
ActionEvent al que llamaremos evt por
convencin.

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

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

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

txtNum1 y txtNum2
son los cuadros de
texto.

btnSumar es el
botn Sumar

btnRestar es el
botn Restar

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

133

4. Para recordar, he aqu el cdigo programado hasta ahora. Tenemos una llamada
desde el constructor a un mtodo CreacionVentana donde diseamos cada uno de
los elementos de la ventana:
/** Creates new form ventanaprincipal */
public ventanaprincipal() {
initComponents();
CreacionVentana();
}

En el constructor hacemos una


llamada a nuestro mtodo
CreacionVentana

public void CreacionVentana() {


this.setTitle("Programa Operaciones");
this.setSize(500,300);
this.setLocation(100,100);

Programamos algunos detalles


de la ventana principal

etiNum1 = new JLabel();


etiNum1.setText("Nmero 1:");
etiNum1.setBounds(10,10,100,20);
this.getContentPane().add(etiNum1);

Creamos la etiqueta Nmero 1

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

txtNum2 = new JTextField();


txtNum2.setText("0");
txtNum2.setBounds(110,60,100,20);
this.getContentPane().add(txtNum2);
btnSumar = new JButton();
btnSumar.setText("Sumar");
btnSumar.setBounds(10,120,100,20);
this.getContentPane().add(btnSumar);
btnRestar = new JButton();
btnRestar.setText("Restar");
btnRestar.setBounds(150,120,100,20);
this.getContentPane().add(btnRestar);

Creamos el segundo

Creamos el botn Sumar

Creamos el botn Restar

5. Ahora asignaremos un evento actionPerformed al botn btnSumar. Esto lo haremos


al final del mtodo CreacionVentana, El cdigo que debe aadir para el evento
actionPerformed del botn btnSumar es el siguiente:

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

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

134

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

Este es el final del


mtodo
CreacionVentana

Hay que
programar el
mtodo al que
llama el evento

Este es el cdigo
que tienes que
aadir

8. Es precisamente en este nuevo procedimiento que hemos creado donde se programa


el evento actionPerformed del botn btnSumar. Lo que se pretende que haga el
programa es que aparezca un JOptionPane con la suma de los nmeros
introducidos. Para ello, aade el siguiente cdigo:

135

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

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

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

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

11. Y ahora, hay que programar el procedimiento al que llama el evento


actionPerformed. Es aqu donde se programa la respuesta al evento. En nuestro
ejemplo, queremos que al pulsar el botn Restar se resten los nmeros introducidos.

136

public void btnRestarActionPerformed(ActionEvent evt) {


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

12. Ejecuta el programa y comprueba el funcionamiento del botn Restar.


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

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

Programacin del mtodo


btnSumarActionPerformed
(respuesta a la pulsacin del
botn btnSumar)

Programacin del mtodo


btnRestarActionPerformed
(respuesta a la pulsacin del
botn btnRestar)

137

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

138

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

Eventos desde cdigo


Se estudi en la hoja de teora anterior la forma de programar eventos desde cdigo.
Concretamente se estudi como programar eventos de accin. En esta hoja se estudiar
como programar eventos de ratn.
Los eventos de ratn son los siguientes:
-

mouseEntered
o Indica que el ratn entr en la superficie del elemento (etiqueta, botn, etc)
mouseExited
o Indica que el ratn sali de la superficie del elemento (etiqueta, botn, etc)
mousePressed
o Indica que un botn del ratn ha sido presionado sobre el elemento.
mouseReleased
o Indica que un botn del ratn ha sido soltado sobre el elemento.
mouseClicked
o Indica que se ha pulsado/soltado un botn del ratn.

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

139

Como enlazar eventos de ratn con un componente


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

Veamos este mismo cdigo comentado:


Los eventos de ratn
pertenecen al adaptador
llamado MouseAdapter

Para asignar el adaptador al elemento


XXX se usa el mtodo addMouseListener
XXX.addMouseListener(new MouseAdapter() {

public void mouseEntered(MouseEvent evt) {


XXXMouseEntered(evt);
}
public void mouseExited(MouseEvent evt) {
XXXMouseExited(evt);
}
public void mousePressed(MouseEvent evt) {
XXXMousePressed(evt);
}
public void mouseReleased(MouseEvent evt) {
XXXMouseReleased(evt);
}

Estos son los eventos de


ratn que pertenecen al
adaptador MouseAdapter.
En realidad no hay que
ponerlos todos, solo hay
que aadir los que
necesites.

public void mouseClicked(MouseEvent evt) {


XXXMouseClicked(evt);
}
});

Cada evento recibe como parmetro un


objeto del tipo MouseEvent al que por
convencin se le suele llamar 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.

Este objeto suele contener informacin


sobre la pulsacin del ratn (qu botn se
ha pulsado, cuantas veces, etc...)

Es luego en estos procedimientos donde


se programa la respuesta a cada evento.

140

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

3. Inserta una llamada dentro del constructor a un procedimiento CreacionVentana de la


siguiente forma:
La llamada...

Y el procedimiento.

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


variables globales:

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


procedimiento CreacionVentana:

Detalles de la ventana

Se disea la primera
etiqueta

Se disea la segunda
etiqueta

141

6. Ejecuta ya el programa para observar el resultado de nuestro diseo. El aspecto


debe ser el siguiente:

7. El objetivo del programa es simple. Queremos que al entrar el ratn dentro de la


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

142

10. Observa el cdigo:


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

Debes
programar
este cdigo

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

143

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

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

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

144

EJERCICIO GUIADO. JAVA: EVENTOS DESDE CDIGO. IDEAS GENERALES

Eventos desde cdigo. Consideraciones Generales


Se finalizar el estudio de los eventos desde cdigo, planteando de forma general el cdigo
necesario para programarlos.
A la hora de programar eventos sobre un componente concreto, ser necesario tener en
cuenta lo siguiente:
-

Primero hay que enlazar el componente con el oyente o adaptador correspondiente al


evento.

El oyente o adaptador contendr aquellos eventos que interesen programar.

Cada evento tiene un parmetro asociado con informacin sobre el evento.

Cada evento realiza una llamada a un procedimiento y es en este procedimiento


donde se programa la respuesta al evento.

La sintaxis general de programacin de eventos es la siguiente:

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

Para poder programar un evento es necesario conocer lo siguiente:


-

El componente sobre el que se programar.


El tipo oyente o adaptador al que pertenece el evento.
El mtodo usado para asignar el oyente al componente.
El nombre del evento.
El tipo de evento para el parmetro.

145

Ejemplo 1. Eventos del Ratn


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

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

Ejemplo 2. Eventos del teclado


Los eventos de teclado controlan las pulsaciones de tecla. Entre ellos, podemos mencionar a
los siguientes:
-

keyPressed, que define la pulsacin de una tecla.


keyReleased, que define el momento en que se suelta una tecla.
keyTyped, que define el pulsar-soltar una tecla.

Los eventos de teclado pertenecen al adaptador KeyAdapter.


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

146

Sabiendo lo anterior, si se quisieran programar los eventos de teclado de un cuadro de texto


llamado txtDato el cdigo necesario sera el siguiente:
txtDato.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent evt) {
txtDatoKeyPressed(evt);
}
public void keyReleased(KeyEvent evt) {
txtDatoKeyReleased(evt);
}
public void keyTyped(KeyEvent evt) {
txtDatoKeyTyped(evt);
}
});

Como puedes observar, la programacin de eventos siempre se hace de la misma forma,


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

147

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

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

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

148

EJERCICIO GUIADO. JAVA: VECTORES

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

nombrevector[];

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

Por ejemplo, supongamos que queremos crear un vector de enteros llamado v. La


declaracin ser la siguiente:
int v[];

Como puedes ver, en la declaracin de un vector no se indica la dimensin, de ste, es


decir, el nmero de elementos que tiene. Esto se hace en la construccin del vector.

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

nombrevector es el nombre del vector a construir.


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

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

149

Acceso a los elementos de un vector


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

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

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

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

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

150

Creacin de un vector e inicializacin con datos al mismo tiempo


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

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

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


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

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

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

//aqu se crea un vector de etiquetas llamado veti

veti=new JLabel[3]; //aqu se construye el vector, asignando 3 etiquetas


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

Realiza el siguiente ejercicio guiado para entender el ejemplo:

151

Ejercicio guiado

1. Crea un nuevo proyecto en java.


2. Empecemos definiendo desde cdigo las caractersticas de la ventana. Crearemos el
mtodo CreacionVentana, y lo llamaremos desde el constructor del proyecto:

3. Vamos a situar en la ventana 10 cuadros de verificacin (JCheckBox). Para ello,


usaremos un vector de 10 JCheckBox. Este vector se declarar en la zona de
variables globales (ser necesario aadir el tpico import):

4. La construccin de los vectores de componentes, se realiza en el mismo constructor


(en nuestro caso en el mtodo CreacinVentana, que es llamado desde el
constructor). Construiremos el vector de forma que contenga 10 JCheckBox:

152

5. Se acaba de construir un vector con 10 cuadros de verificacin. Ahora, es necesario


construir cada uno de los cuadros del vector y asignarle ciertas propiedades. Esto se
hace con un for que recorre los elementos del vector. (Aade el siguiente cdigo
dentro de CreacionVentana):

6. Analiza este cdigo que se acaba de aadir:


a. Observa como cada elemento del vector debe ser construido:
vcuadros[i] = new JCheckBox();

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


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

c. Los cuadros de verificacin se colocan uno debajo de otro. Estudia la lnea


siguiente y observa como vara la posicin vertical de cada cuadro:
vcuadros[i].setBounds(10, 10+30*i,

153

100, 20);

7. Ejecuta el programa y observa el resultado:

Eemplo de vector de componentes

O Opcin O
O Opcin 1
0 0pcin2
0 01)Cin3
0 01)Cin4
0 0pcin5
0 0pcin6
0 0pcin7
0 0pcin8
0 0pcin9

154

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

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

155

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

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

11. Ahora programaremos la respuesta al evento actionPerformed de forma que el


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

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

156

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

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

157

EJERCICIO GUIADO. JAVA: VECTORES Y EVENTOS

Asignacin de eventos a los elementos de un vector de componentes


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

Ejercicio guiado

1. Crea un nuevo proyecto en java.


2. Empecemos definiendo desde cdigo las caractersticas de la ventana. Crearemos el
mtodo CreacionVentana, y lo llamaremos desde el constructor del proyecto:

3. Vamos a situar en la ventana 5 botones, y para ello usaremos un vector de botones,


que tendremos que declarar en la zona de variables globales:

4. Dentro del procedimiento CreacionVentana construiremos el vector y construiremos


cada uno de los botones que contiene, asignando las distintas caractersticas de
cada uno. Debes aadir el siguiente cdigo a CreacionVentana:

158

5. En el cdigo anterior se crea un vector de cadenas (String) con el texto de cada


botn.
Luego se construye el vector de botones, asignndole 5 botones.
A continuacin, usando un for, construimos cada botn del vector, le asignamos el
texto correspondiente, le asignamos su posicin y su tamao, y lo colocamos en el
panel de contenido de la ventana.

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

7. Ahora, interesara asignar un evento actionPerformed a cada botn. Esto se har


aprovechando el que todos los botones pertenezcan a un vector, usando un bucle for.
Aade el siguiente cdigo al final de CreacionVentana:

159

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

8. Ejecuta el programa y observa el resultado. Cuando pulsas cualquiera de los


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

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

160

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

161

EJERCICIO GUIADO. JAVA: INTRODUCCIN A LA POO

Introduccin a la Programacin Orientada a Objetos


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

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

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

162

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

- permite poner visible / invisible el cuadro de texto


- permite activar / desactivar el cuadro de texto
- permite hacer que se pueda escribir o no en el cuadro de texto
- permite introducir un texto en el cuadro de texto
- permite cambiar el tamao y posicin del objeto
- permite asociar un texto de ayuda al cuadro de texto

Un objeto nos da informacin sobre l. Para pedirle informacin a un objeto usaremos mtodos del
tipo get. Por ejemplo, para pedirle al cuadro de texto el texto que contiene, usaremos el mtodo
getText:
String cadena = txtCuadro.getText();
Otros mtodos que le piden informacin al cuadro de texto son:
getWidth
getHeight
getSelectedText
getToolTipText
etc

- te dice la anchura que tiene el cuadro de texto


- te dice el alto que tiene el cuadro de texto
- te devuelve el texto que est seleccionado dentro del cuadro de texto
- te dice el texto de ayuda que tiene asociado el cuadro de texto

Tambin se le puede dar al objeto simplemente rdenes para que haga algo. Por ejemplo, podemos
ordenar al cuadro de texto txtCuadro que seleccione todo el texto que contiene en su interior a travs
del mtodo selectAll:
txtCuadro.selectAll();
Otros mtodos que ordenan al cuadro de texto son:
repaint
copy
cut
paste
etc

- le ordena al cuadro de texto que se vuelva a pintar


- le ordena al cuadro de texto que copie el texto que tenga seleccionado
- le ordena al cuadro de texto que corte el texto que tenga seleccionado
- le ordena al cuadro que pegue el texto que se hubiera copiado o cortado

163

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

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

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

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

164

La Clase como generadora de objetos


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

En el ejemplo se le ha dado, usando el mtodo setBackground, un color a cada etiqueta. Y se ha


cambiado el texto de cada una. Se le da forma a cada etiqueta.

EJERCICIO
Hasta ahora ha usado objetos aunque no tenga mucha conciencia de ello. Por ejemplo ha usado
botones. Como ejercicio se propone lo siguiente:
-

Cul es el nombre de la clase de los botones normales que usa en sus ventanas?
Cmo declarara un botn llamado btnAceptar, y otro llamado btnCancelar?
Cmo construira dichos botones?
Indique algunos mtodos para cambiar propiedades de dichos botones (mtodos set)
Indique algunos mtodos para pedirle informacin a dichos botones (mtodos get)
Indique algn mtodo para dar rdenes a dichos botones (algn mtodo que no sea ni set ni
get)

165

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

166

EJERCICIO GUIADO. JAVA: POO. CLASES PROPIAS

Objetos propios del lenguaje


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

167

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

168

CASO PRCTICO: MULTICINES AVENIDA

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

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

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

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

//declaracin

salaVO = new SalaCine(); //construccin

Propiedades de los objetos de la clase SalaCine


A la hora de decidir las propiedades de un objeto de creacin propia, tenemos que preguntarnos,
qu informacin me interesa almacenar del objeto? Trasladando esta idea a nuestro caso prctico,
qu informacin me interesara tener de cada sala de cine?
Para este ejemplo supondremos que de cada sala de cine nos interesa tener conocimiento de las
siguientes caractersticas (propiedades):
-

Aforo: define el nmero de butacas de la sala (un nmero entero).


Ocupadas: define el nmero de butacas ocupadas (un nmero entero).
Pelcula: define la pelcula que se est proyectando en el momento en la sala (una cadena de
texto)
Entrada: define el precio de la entrada (un nmero double)

169

Valores por defecto de los objetos SalaCine


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

(la cadena vaca)

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

Mtodos de los objetos SalaCine


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

Mtodos de cambio de propiedades (Mtodos set)


setAforo
setOcupadas
setLibres
setPelicula
setEntrada

- asignar un aforo a la sala de cine


- asignar una cantidad de butacas ocupadas a la sala de cine
- asignar una cantidad de butacas libres a la sala de cine
- asignar un ttulo de pelcula a la sala de cine
- fijar el precio de las entradas a la sala de cine

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

170

Para crear el objeto, se usara el siguiente cdigo:


//Se construye el objeto
SalaCine salaVO;
salaVO = new SalaCine();
//Se le asignan caractersticas
salaVO.setAforo(50);
salaVO.setPelicula(Metrpolis);
salaVO.setEntrada(3);

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

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

Mtodos para pedirle informacin al objeto (Mtodos get)


Se programarn los siguientes mtodos get en la clase SalaCine:
getAforo
getOcupadas
getLibres
getPorcentaje
getIngresos
getPelicula
getEntrada

- devuelve el aforo que tiene el objeto


- devuelve el nmero de butacas ocupadas que tiene el objeto
- devuelve el nmero de butacas que tiene libres el objeto
- devolver el porcentaje de ocupacin de la sala
- devolver los ingresos producidos por la sala (entradas vendidas por precio)
- devolver el ttulo de la pelcula que se est proyectando
- devolver el precio de la entrada asignado al objeto

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

Mtodos para dar rdenes al objeto


Se programarn los siguientes mtodos para dar rdenes a los objetos de la clase SalaCine.
vaciar
-

Este mtodo pondr el nmero de plazas ocupadas a cero y le asignar a la pelcula la


cadena vaca.

171

entraUno
-

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

RESUMEN SALACINE
He aqu un resumen de la Clase de objetos SalaCine, la cual se programar en la prxima hoja:
Clase de objetos: SalaCine
Propiedades de los objetos SalaCine:
Aforo
Ocupadas
Pelcula
Entrada

- nmero entero (int)


- nmero entero (int)
- cadena (String)
- nmero decimal (double)

Valores por defecto de los objetos del tipo SalaCine:


Aforo: 100
Ocupadas: 0
Pelcula: (cadena vaca)
Entrada: 5
Mtodos de los objetos del tipo SalaCine:
Mtodos de asignacin de propiedades (set)
setAforo
setOcupadas
setLibres
setPelicula
setEntrada

- modifica la propiedad Aforo


- modifica la propiedad Ocupadas
- modifica la propiedad Ocupadas tambin
- modifica la propiedad Pelcula
- modifica la propiedad Entrada

Mtodos de peticin de informacin (get)


getAforo
getOcupadas
getLibres
getPorcentaje
getIngresos
getPelicula
getEntrada

- devuelve el valor de la propiedad Aforo


- devuelve el valor de la propiedad Ocupadas
- devuelve el nmero de butacas libres
- devuelve el porcentaje de ocupacin de la sala
- devuelve los ingresos obtenidos por la venta de entradas
- devuelve el valor de la propiedad Pelcula
- devuelve el valor de la propiedad Entrada

Mtodos de orden
Vaciar
entraUno

- vaca la ocupacin de la sala y borra la pelcula


- le indica al objeto que ha entrado una persona ms en la sala

172

EJERCICIO PRCTICO

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

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

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

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

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

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

173

EJERCICIO GUIADO. JAVA: POO. PROGRAMACIN DE UNA CLASE

Programacin de una Clase


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

CLASE SALACINE
Nombre de la Clase: SalaCine
Propiedades de los objetos SalaCine:
Aforo
Ocupadas
Pelcula
Entrada

- nmero entero (int)


- nmero entero (int)
- cadena (String)
- nmero decimal (double)

Valores por defecto de los objetos del tipo SalaCine:


Aforo: 100
Ocupadas: 0
Pelcula: (cadena vaca)
Entrada: 5
Mtodos de los objetos del tipo SalaCine:
Mtodos de asignacin de propiedades (set)
setAforo
setOcupadas
setLibres
setPelicula
setEntrada

- modifica la propiedad Aforo


- modifica la propiedad Ocupadas
- modifica la propiedad Ocupadas tambin
- modifica la propiedad Pelcula
- modifica la propiedad Entrada

Mtodos de peticin de informacin (get)


getAforo
getOcupadas
getLibres
getPorcentaje
getIngresos
getPelicula
getEntrada

- devuelve el valor de la propiedad Aforo


- devuelve el valor de la propiedad Ocupadas
- devuelve el nmero de butacas libres
- devuelve el porcentaje de ocupacin de la sala
- devuelve los ingresos obtenidos por la venta de entradas
- devuelve el valor de la propiedad Pelcula
- devuelve el valor de la propiedad Entrada

Mtodos de orden
Vaciar
entraUno

- vaca la ocupacin de la sala y borra la pelcula


- le indica al objeto que ha entrado una persona ms en la sala

174

PROGRAMACIN DE UNA CLASE

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

Estructura bsica de la Clase


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

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

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

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

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

175

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

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.

Mtodos del tipo set


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

Es void, es decir, no devuelve nada (el significado de la palabra public se ver ms adelante)

176

El mtodo recibe como parmetro una variable del mismo tipo que la propiedad que
queremos modificar (en este caso int) y un nombre que se recomienda que no sea igual al de
la propiedad (en nuestro caso, afo, de aforo)

Puedes observar que lo que se hace simplemente en el mtodo es asignar la variable pasada
como parmetro a la propiedad.

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

Al asignar un nmero de localidades ocupadas, estamos asignando indirectamente el nmero de


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

177

public class SalaCine {


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

Mtodos Set

//Mtodo setEntrada
public void setEntrada(double entra) {
Entrada = entra;
}
//Mtodo setLibres
public void setLibres(int lib) {
int ocu;
ocu = Aforo lib;
Ocupadas = ocu;
}

Mtodos del tipo get


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

178

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

179

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

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

Mtodos Get

//Mtodo getOcupadas
public int getOcupadas() {
return Ocupadas;
}

180

//Mtodo getPelicula
public String getPelicula() {
return Pelcula;
}
//Mtodo getEntrada
public double getEntrada() {
return Entrada;
}

Mtodos Get

//Mtodo getLibres
public int getLibres() {
int lib;
lib = Aforo Ocupadas;
return lib;
}

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

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

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

181

El mtodo entraUno es tambin muy sencillo de programar. Este mtodo le indica al objeto que ha
entrado un nuevo espectador. Sabiendo esto, el objeto debe aumentar en uno el nmero de
localidades ocupadas:
//Mtodo entraUno
public void entraUno() {
Ocupadas++;
}
Aadiendo estos dos ltimos mtodos, la programacin de la clase SalaCine quedara finalmente
como sigue:
public class SalaCine {
int Aforo;
int Ocupadas;
String Pelcula;
double Entrada;

Propiedades (variables globales)

//Constructor
public SalaCine() {
Aforo = 100;
Ocupadas = 0;
Pelicula = ;
Entrada = 5.0;
}

Constructor

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

182

Mtodos Set

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

Mtodos Get

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

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

Mtodos de orden y otros


mtodos.

//Mtodo entraUno
public void entraUno() {
Ocupadas++;
}

183

EJERCICIOS RECOMENDADOS

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

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

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

184

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

El Constructor es un procedimiento que no devuelve nada pero que no es void. El


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

185

EJERCICIO GUIADO. JAVA: POO. USAR CLASES PROPIAS EN UN PROYECTO


Aplicacin de una Clase Propia
Una vez programada una Clase de creacin propia, podremos usar esta en uno de nuestros proyectos
para crear objetos de dicha clase. En este ejercicio guiado veremos un ejemplo sobre cmo usar de
forma prctica la clase SalaCine en un proyecto java hecho con NetBeans.

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

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

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

186

Botones:
btnCentralNueva
btnCentralOcupacion
btnCentralVaciar
btnCentralIngresos
btnCentralCambiar

Etiqueta:
etiCentralPelicula

Panel:
panelCentral

Panel:
panelVOriginal

Botones:
btnOriginalNueva
btnOriginalOcupacion
btnOriginalVaciar
btnOriginalIngresos
btnOriginalCambiar

Botn
btnIngresosTotales
187

Etiqueta:
etiOriginalPelicula

3. Antes de empezar la programacin de cada botn del programa, incluiremos en el proyecto la


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

5. Elegiremos la opcin Nuevo / Clase Java

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

188

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

El fichero de la clase SalaCine

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

189

Esta instruccin, generada por NetBeans,


indica que la clase SalaCine est
programada dentro del paqueteprincipal

Inicio de la clase

Preparacin del constructor

9. Ahora ya solo tendremos que completar la programacin de la clase, aadiendo las


propiedades, completando el constructor, y aadiendo los distintos mtodos que
programamos en la hoja anterior. Debes modificar el fichero SalaCine para que quede as:

190

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

/** Creates a new instance of SalaCine */


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

191

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

192

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

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

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

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

Creamos dos objetos


sala de cine

15. Es en el constructor de nuestra ventana principal donde construiremos nuestros objetos de


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

193

Construimos los
objetos.

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

Modificamos las
caractersticas del objeto
central (sala central)

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

194

Modificamos las
caractersticas del objeto
vo (sala versin original)

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

Cambia el ttulo
de la pelcula de
la sala central.

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

El cdigo de este botn hace lo siguiente:


-

Le pide al usuario que introduzca un ttulo para la pelcula, usando un


JOptionPane.showInputDialog. El ttulo introducido se recoge en una variable de cadena
llamada titulo.

Luego se asigna dicho ttulo a la sala central del multicines. Esta lnea es interesante, ya que
se usa el mtodo setPelicula del objeto central para asignar el ttulo de la pelcula.

Y finalmente se coloca el ttulo en la etiqueta para que el usuario pueda verlo.

195

21. Ejecuta el programa y observa el funcionamiento del botn.


22. Ahora se programar el botn btnCentralNueva:

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

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

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

196

Observa el cdigo:
-

Primero se crea una variable de cadena llamada info (informacin)

A continuacin, se van concatenando textos a la variable de cadena. Recuerda que los \n


permiten aadir saltos de lnea.

Observa como se va pidiendo informacin al objeto a travs de mtodos get y se va


concatenando esta informacin a la variable info.

Finalmente se presenta el texto de la variable info en un JOptionPane.

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

Cambia el ttulo
de la pelcula
asignada a la sala
central

Pulsa este botn varias


veces, para simular la
venta de varias
entradas.

Pulsa aqu para ver


informacin actualizada
sobre la ocupacin de la

197

25. A continuacin se programar el botn Vaciar de correspondiente a la sala central


(btnCentralVaciar) Este botn debe situar la ocupacin de la sala a cero y quitar la pelcula
asignada a la sala central.
Programa en el actionPerformed del botn lo siguiente:

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

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

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

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

198

Asigna una pelcula y


vende varias
entradas

luego comprueba el
% de ocupacin y los
ingresos

prueba a vaciar la sala y


luego vuelve a comprobar
la ocupacin y los
ingresos

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

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

199

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

200

EJERCICIO GUIADO. JAVA: POO. HERENCIA


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

CLASE BASE
Herencia

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

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

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

201

EJERCICIO GUIADO

Planteamiento Inicial

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

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

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

202

Desgraciadamente no existe un botn de este tipo en Java, as que no podemos acudir a la


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

JButton
Herencia

BotonContador

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

Programacin de la Clase BotonContador

Creacin de la clase derivada


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

public class BotonContador extends JButton {

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

203

Creacin de las propiedades de la clase derivada


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

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

public class BotonContador extends JButton {


int pulsaciones;
public BotonContador() {
pulsaciones=0;
}
}
Aadir mtodos propios a la clase derivada
Se aadirn los nuevos mtodos que queremos que la clase BotonContador posea. Estos son los
siguientes:
setPulsaciones
getPulsaciones
incrementa
decrementa
reiniciar
aumentar
disminuir

- asigna un nmero de pulsaciones al botn.


- devuelve el nmero de pulsaciones del botn.
- suma uno a las pulsaciones del botn
- resta uno a las pulsaciones del botn
- pone a cero las pulsaciones del botn
- aumenta en una cantidad las pulsaciones del botn.
- disminuye en una cantidad las pulsaciones del botn.

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

204

public class BotonContador extends JButton {


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

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

205

Uso de la clase BotonContador

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

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

1. Crea un proyecto llamado Contadores, que tenga un paquete principal llamado


paqueteprincipal y un JFrame llamado ventanaprincipal:

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

3. Antes de empezar con el diseo de la ventana principal programa la clase BotonContador.


Debes hacer doble clic sobre el fichero BotonContador.java e introducir en l la clase
BotonContador que hemos diseado anteriormente usando herencia.
El fichero BotonContador.java debera quedar as:

206

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

207

4. Ahora programaremos el diseo de la ventana. Lo haremos desde cdigo. Entra en el mdulo


ventanaprincipal.java y pasa a la zona de cdigo:

5. En la zona de cdigo programaremos el tpico mtodo CreacionVentana, llamado desde el


constructor, donde se programar el diseo de la ventana:

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

7. En el mtodo CreacionVentana definiremos caractersticas de la ventana y construiremos


estos botones y los situaremos en la ventana:

208

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

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

209

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

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

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

210

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

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

16. Ejecuta el programa y prueba lo siguiente:


-

Pulsa varias veces el botn A y el B. Vers que no sucede nada (aunque internamente cada
uno de los botones est guardando el nmero de pulsaciones en su propiedad pulsaciones)

Pulsa ahora el botn Ver Pulsaciones y comprobars como este botn te muestra las veces
que pulsaste cada botn.

211

Pulsa los botones varias


veces

y luego pulsa el botn


Ver Pulsaciones.
Aparecer un JOptionPane
informando sobre las
pulsaciones realizadas.

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

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

212

Despus de pulsar los


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

EJERCICIO

Se propone al alumno que aada las siguientes modificaciones al programa:


-

Aade desde cdigo un nuevo botn Botn C (de tipo BotonContador) que al pulsarse
aumente su nmero de pulsaciones interno en 2 (usa el mtodo aumentar propio de la clase
BotonContador).

Cuando se pulse el botn Ver Pulsaciones tambin debera verse el nmero de pulsaciones
del botn C.

Cuando se pulse Reiniciar, el nmero de pulsaciones del Botn C debera situarse a cero
tambin.

Aade desde diseo un cuadro de texto y un botn normal (JButton) llamado Iniciar. En el
cuadro de texto se introducir un nmero, y al pulsar el botn Iniciar, los valores internos de
los tres botones A, B y C se inicializarn al nmero introducido:

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

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

CLASE BASE
Herencia

CLASE
DERIVADA

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

214

EJERCICIO GUIADO. JAVA: POO. HERENCIA. DIALOGOS PROPIOS


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

Cuadro de Dilogo Propio


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

215

EJERCICIO GUIADO

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

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

3. En la ventana que aparece, escogeremos en la parte izquierda la opcin Formularios GUI


Java, y en la parte derecha escogeremos la opcin Formulario JDialog. Luego activa el botn
Siguiente.

216

4. A continuacin tendremos que indicar el nombre que tendr la clase correspondiente a


nuestro cuadro de dilogo propio. En nuestro caso llamaremos a esta clase dialogoFecha.

217

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

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

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

Constructor

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

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

218

9. Asigna nombre a cada elemento:


-

El cuadro de texto para el da se llamar: txtDia


El cuadro de texto para el mes se llamar: txtMes
El cuadro de texto para el ao se llamar: txtAnio
El botn Aceptar se llamar btnAceptar
El botn Cancelar se llamar btnCancelar

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

Propiedades:
Dia
- entero
Mes
- entero
Anio
- entero
BotonPulsado - entero
Mtodos:
getFecha()
-

Este mtodo devolver una cadena (String) con la fecha en este formato:
dia/mes/ao

getFechaLarga()
-

Este mtodo devolver una cadena con la fecha en el siguiente formato:


Dia de Mes(en letras) de Ao

getBotonPulsado()
-

Este mtodo devolver el valor de la propiedad BotonPulsado. Esta propiedad


podr tener un 0 o un 1. Tendr un 0 si se pulsa el botn Aceptar, y un 1 si se
pulsa el botn Cancelar.

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

219

Propiedades de la clase
dialogoFecha

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

Como puedes observar en el cdigo, asigno el 1 a la propiedad BotonPulsado y luego uso el


mtodo dispose para cerrar el cuadro de dilogo.

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

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

220

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

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

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

17. Y ya para terminar con la programacin de nuestro dialogoFecha, programaremos el mtodo


getBotonPulsado, que bsicamente devuelve la propiedad BotonPulsado, la cual contiene un

221

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


sencilla:

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

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

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

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


etiFechaNacimiento.

20. El programa funcionar de la siguiente forma:


-

Al pulsar el botn Introducir Fecha Nacimiento aparecer un cuadro de dilogo del


tipo dialogoFecha, donde el usuario introducir la fecha de nacimiento.

Al pulsar Aceptar, dicha fecha aparecer en la etiqueta etiFechaNacimiento.

Al pulsar Cancelar, la etiqueta etiFechaNacimiento se borrar.

222

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

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

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

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

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

223

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

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

2) Al pulsar Aceptar o Cancelar,


el cuadro de dilogo modifica sus
propiedades internas (dia, mes,
ao y botn pulsado) y se cierra

EJERCICIO

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

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

224

EJERCICIO GUIADO. JAVA: POO. REUTILIZACIN DE CDIGO


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

EJERCICIO GUIADO 1

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

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

225

Proyecto Fecha

Proyecto Reutilizacion

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


principal.

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

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

226

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

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

227

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

6. Supongamos que necesitamos tambin la clase BotonContador creada en la hoja guiada n


31. Solo tendremos que abrir el proyecto llamado Contadores, que se program en dicha
hoja

7. Y luego copiar la clase BotonContador desde Contadores a Reutilizacion. Hgalo y luego


cierre la clase Contadores. Su ventana de proyectos debera quedar as:

228

8. A partir de este momento, puede crear botones contadores y cuadros de dilogo de


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

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

229

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

Desactiva la opcin Previsualizar todos los cambios y pulsa Siguiente.


13. Una vez movidas las dos clases al paquete elementosventana, su proyecto debe quedar as:

Ahora tiene mejor clasificadas sus clases en su proyecto.


14. Guarde el proyecto, pero no lo cierre, ya que se usar a continuacin.

230

EJERCICIO GUIADO 2

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

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

231

Observars que ha aparecido un nuevo proyecto, llamado MisClases.

3. A este nuevo proyecto le agregaremos el paquete elementosventana que tenemos en el


proyecto Reutilizacion. Solo hay que copiar:

4. Y luego Pegar

232

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

6. Se podra agregar ms paquetes de clases a la biblioteca. A medida que vayamos


programando clases tiles para nuestro trabajo, deberamos incluirlas en la biblioteca.
Se consigue as tener todas las clases reunidas en un solo proyecto.

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


continuacin.

233

EJERCICIO GUIADO 3

1. Para facilitar la inclusin de una biblioteca en un proyecto, se suele compactar la biblioteca en


un fichero de tipo JAR. Para conseguir esto, configura el proyecto MisClases como proyecto
principal.

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


principal:

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

234

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

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

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

235

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

11. Resumiendo:
-

Un programador crea muchas clases propias a lo largo de su trabajo.


Estas clases pueden ser usadas en otros proyectos.
Es conveniente reunir las clases en paquetes, y reunir paquetes en bibliotecas
(tambin llamadas libreras)
Las bibliotecas se pueden compactar en un solo fichero .JAR
Al incluir un fichero de biblioteca en un proyecto, puedes usar las clases que estn
contenidas en dicha biblioteca.

236

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

237

EJERCICIO GUIADO. JAVA: PROGRAMACIN MDI


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

238

EJERCICIO GUIADO 1

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

Diseo de la ventana principal.


Diseo de las ventanas internas.
Programacin de la ventana principal / internas.

Diseo de la ventana principal

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

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

Asigna los siguientes nombres a cada elemento del men:

239

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

4. En la zona central de la ventana principal colocaremos un panel, pero no ser un JPanel,


como siempre, sino otro tipo de panel. Debes colocar un panel del tipo JDesktopPane:

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

240

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

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

Llamada a un mtodo
ConfiguracionVentana

Programacin de dicho
mtodo.

Como ves, en el constructor se llama a un mtodo ConfiguracionVentana y en este mtodo se


asigna un tamao por defecto a la ventana de 800x600 y se maximiza.

241

Diseo de las ventanas internas


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

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

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

242

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

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

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

La etiqueta se llamar etiImagen

243

Y ocupar todo el JInternalFrame

12. En las hojas guiadas anteriores, se ha hablado de la programacin orientada a objetos, y se


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

Mtodo para acceder a


la etiqueta etiImagen

244

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

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

245

Programacin de la ventana principal


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

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

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

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

246

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

247

Colocamos el camino de la imagen en la barra de ttulo de la ventana interna:


vi.setTitle(camino);
Finalmente hacemos visible la ventana interna.
vi.setVisible(true);

18. Ejecuta el programa y prueba a abrir varios ficheros de imagen.


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

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

248

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

La clase JInternalFrame que aadamos, tendr el nombre que queramos asignarle y


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

249

EJERCICIO GUIADO. JAVA: PROGRAMACIN MDI CONTINUACIN


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

EJERCICIO GUIADO 1
En este ejercicio guiado inicial, programaremos la opcin Cerrar del proyecto Visor de Fotos. Esta
opcin debe ser capaz de cerrar la ventana interna que est activa en ese momento.
Se sabe cual es la ventana interna activa porque aparece por encima de las dems, y porque tiene su
barra de ttulo de color azul, mientras que las dems aparecen en gris. La forma de seleccionar una
ventana interna es simplemente hacer clic sobre ella.

Ventana interna activa

250

1. Abre el proyecto VisorFotos que realiz en la hoja anterior.


2. Accede a la ventana principal del proyecto, haciendo doble clic sobre la clase
ventanaprincipal.
3. Accede al evento actionPerformed de la opcin del men Cerrar y programa lo siguiente:

4. Ejecuta el programa y comprueba el funcionamiento de la opcin Cerrar. Se recomienda que


abra varias imgenes en su programa y luego seleccione una de ellas. Active la opcin Cerrar
y observe como la ventana interna se cierra.
5. El funcionamiento del cdigo que acaba de programar es el siguiente:
El panel interno panelInterno es un objeto del tipo JDesktopPane. Estos paneles son paneles
especiales preparados para contener ventanas internas (JInternalFrame) y poseen algunos
mtodos muy tiles para manipular las ventanas internas que contienen.
Uno de los mtodos que ms usaremos ser getSelectedFrame. Este mtodo devuelve la
ventana interna seleccionada ahora mismo, o null si no hay ninguna seleccionada.
En el cdigo anterior, observars que creamos un objeto vactiva del tipo ventanainterna, y
dentro de l metemos la ventana interna seleccionada en este momento, ejecutando el
mtodo getSelectedFrame:
ventanainterna vactiva = (ventanainterna) panelInterno.getSelectedFrame();

Ahora ya podemos trabajar con vactiva sabiendo que se refiere a la ventana activa. Lo que se
hace a continuacin es cerrar la ventana activa vactiva usando el mtodo dispose tpico de los
objetos de ventana.
Esto se hace, claro est suponiendo que haya alguna ventana activa, por eso se comprueba
que getSelectedFrame no haya devuelto null, porque en ese caso es que no hay ventana
interna activada y por tanto no se puede cerrar.

6. Este cdigo es muy comn a la hora de trabajar en aplicaciones MDI. Primero se comprueba
cual es la ventana activa y luego se acta sobre ella. Veamos ahora otro ejemplo. Aade al
men la opcin Info:

251

7. Accede al evento actionPerformed de esta nueva opcin y programa lo siguiente:

8. Este cdigo muestra el camino del fichero de la imagen que est seleccionada en este
momento. Observa que el proceso es el mismo.
Primero se extrae la ventana activa, usando el mtodo getSelectedFrame, almacenndola en
una variable llamada vactiva.
ventanainterna vactiva = (ventanainterna) panelInterno.getSelectedFrame();

Si esta variable es null, entonces es que no hay ninguna ventana activa.


Si es distinta de null, se trabaja con ella. En el ejemplo anterior extraemos el texto de la barra
de ttulo de la ventana y lo mostramos en un JOptionPane. (Recuerda que hemos programado
la apertura de las ventanas internas de forma que en la barra de ttulo aparezca el camino de
la imagen)

9. Ejecuta el programa y comprueba el funcionamiento de la opcin del men Info.


10. Se ha visto que a travs del mtodo getSelectedFrame propio de los JDesktopPane se puede
acceder a la ventana activa. Pero, cmo puedo acceder a otra ventana interna aunque no
est activa?
Para hacer esto, la clase JDesktopPane posee un mtodo llamado getAllFrames la cual
devuelve un vector conteniendo todas las ventanas internas que hay actualmente en el
JDesktopPane.

11. Para practicar con el mtodo indicado en el punto anterior, aade al men Archivo una nueva
opcin llamada Cerrar Todo:

252

12. Accede al evento actionPerformed de la nueva opcin y programa lo siguiente:

13. Analicemos el cdigo anterior.


Lo primero que tienes que observar es el uso de getAllFrames. Este mtodo devuelve un
vector conteniendo todas las ventanas internas actuales. En nuestro cdigo, almacenamos
estas ventanas en un vector llamado v.
JInternalFrame v[] = panelInterno.getAllFrames();
A continuacin, recorremos todo el vector y vamos cerrando cada ventana almacenada en el
vector.
Como puedes observar, este cdigo hace que se cierren todas las ventanas de imagen
abiertas.

14. Ejecuta el programa y comprueba el funcionamiento de la opcin Cerrar Todo.


15. Este cdigo es un ejemplo de actuacin sobre todas las ventanas internas abiertas. A
continuacin usaremos esta misma idea para organizar las ventanas dentro del panel interno.
Aade las siguientes opciones al men:

16. La opcin Cascada organizar las ventanas internas abiertas en cascada. Para ello entra en
el evento actionPerformed de la opcin y programa lo siguiente:

253

17. Analicemos el cdigo.


Observa de nuevo el uso de getAllFrames para almacenar todas las ventanas internas
abiertas en un vector v:
JInternalFrame v[] = panelInterno.getAllFrames();
A continuacin se recorre el vector y se asigna a cada ventana interna (cada elemento del
vector) un tamao con el mtodo setSize y una posicin con el mtodo setLocation. Las
posiciones de cada ventana van variando para situar cada ventana una encima de la otra.
El vector se recorre al revs, desde la ltima ventana a la primera para mejorar la
visualizacin de dichas ventanas.

18. Ejecuta el programa y prueba el funcionamiento de la opcin Cascada. Se recomienda que


primero abra varias ventanas y luego pulse esta opcin.

254

CONCLUSIN
En la programacin MDI siempre actan dos elementos:
- Un panel interno JDesktopPane, el cual contendr las ventanas internas.
- Una clase del tipo JInternalFrame, la cual definir el diseo de las ventanas internas.
El panel interno posee diversos mtodos que permiten acceder a las ventanas
actualmente abiertas dentro de l. Entre estos mtodos podemos destacar:
- getSelectedFrame, que devuelve la ventana interna activa en el momento actual.
- getAllFrames, que devuelve un vector de JDesktopPane, conteniendo todas las
ventanas internas abiertas en el panel interno.
Gracias a estos dos mtodos podemos acceder a las ventanas internas y actuar sobre
ellas.

255

EJERCICIO GUIADO. BASES DE DATOS

Recapitulando GUI y PROCESO DE DATOS


Un programa bsicamente recibe una serie de datos, que introduce el usuario, luego realiza
una serie de clculos con ellos, y finalmente presenta los resultados en pantalla.
El usuario usa una serie de elementos para introducir los datos en el programa y para darle
las rdenes al programa para que realice los clculos. Estos elementos son las ventanas con
todos sus componentes: botones, cuadros de dilogos, etiquetas, listas desplegables, etc
El programa realiza los clculos con dichos datos y los resultados los presenta en elementos
de la ventana para que el usuario pueda verlos de forma cmoda. Estos elementos donde
aparecen resultados pueden ser etiquetas, cuadros de mensaje, etc
Hay que distinguir por tanto entre el GUI y el Proceso de Datos.
El GUI (interfaz grfica de usuario) es el conjunto de elementos que permiten al usuario
comunicarse con el programa. Estos elementos le permiten al usuario introducir datos, dar
rdenes al programa y visualizar los resultados obtenidos. Para entendernos, el GUI es
bsicamente el diseo de las ventanas del programa.
Un buen diseo del GUI es vital. La interfaz de usuario debe hacer que el programa sea
intuitivo, fcil de usar. Un programa incmodo, por muy bueno que sea, ser rechazado por
el usuario.
Aparte del GUI, internamente el programa debe realizar una serie de clculos para obtener
los resultados pedidos por el usuario. No hace falta decir que la programacin de estos
clculos debe ser precisa y correcta, ya que en caso contrario el programa no servira para
nada, por muy buena que fuera la interfaz de usuario.
Todo lo anterior se puede representar grficamente de la siguiente forma:

Datos, rdenes

Datos, rdenes

Resultados

Resultados
Usuario

Clculos,
procesos,
acciones

GUI
Interfaz de usuario
Ventanas, botones,
mens, etc

256

Programacin
interna:
Procedimientos,
funciones, clases,
etc

BASES DE DATOS
Ahora se va a dar una vuelta de tuerca ms a lo indicado anteriormente aadiendo a todo
este entorno el concepto de Base de Datos.
Hay que tener en cuenta que la mayora de las aplicaciones que solicitan las empresas son
programas cuya funcin principal es la de mantener datos de la propia empresa.
Estos programas suelen tener siempre las mismas funciones bsicas. Deben ser capaces
de:
-

Almacenar datos producidos por la empresa: facturas, datos de clientes, productos,


gastos, ingresos, trabajadores, etc

Visualizar dichos datos.

Modificar / Eliminar dichos datos.

Consultar dichos datos. Es decir, visualizar solo aquellos datos que cumplan una
condicin. Por ejemplo: visualizar las facturas del mes de enero, o mostrar los
productos que estn en stock, mostrar los trabajadores que hayan trabajado ms de
100 horas, etc

Realizar clculos con los datos. Por ejemplo, calcular el total de ingresos entre dos
fechas, calcular lo que hay que declarar de iva, etc

As pues, la mayor parte de las aplicaciones que encarga una empresa son aplicaciones que
deben gestionar una serie de datos. Estos datos deben estar guardados en un fichero o
ficheros. A este conjunto de datos que debe manipular el programa se le denomina BASE
DE DATOS.
Una Base de Datos no es solamente un conjunto de datos almacenados en un mismo sitio.
Hay que tener en cuenta que para que estos datos sean fciles de manipular, es necesario
que tengan una organizacin determinada. Una Base de Datos mal organizada se convierte
simplemente en un cajn de sastre donde resulta imposible encontrar lo que se busca.
As pues, es necesario tener en cuenta la forma en que se organizarn los datos dentro de la
base de datos, o dicho de otra forma, el diseo de la base de datos.
En las prximas hojas guiadas se vern conceptos bsicos para el diseo y creacin de una
base de datos, as como un lenguaje de consulta llamado SQL que nos permitir acceder a
los datos de una base de datos y realizar determinadas acciones sobre la base de datos.

257

Acceso a la BASE DE DATOS desde la aplicacin


Aadiendo el concepto de Base de Datos a la idea de usuario, GUI y Proceso de Datos,
podemos representar grficamente un programa como sigue:

Datos, rdenes,
consultas a la
base de datos

Datos, rdenes,
consultas a la
base de datos

Resultados

Resultados
Usuario

Clculos,
procesos,
acciones,
Acceso a la
base de datos

GUI
Interfaz de usuario
Ventanas, botones,
mens, etc

Resultados
de la
consulta
a la base
de datos

BASE

Programacin
interna:
Procedimientos,
funciones, clases,
etc

SQL

Consultar la base
de datos.
Aadir, modificar,
eliminar datos.

DE
DATOS

Analicemos el grfico anterior:


1. El usuario le pide algo al programa. Por ejemplo el usuario quiere obtener un listado
de clientes, o quiere saber cuanto se ha ingresado el ltimo mes
2. Para ello, el usuario activa los elementos del GUI necesarios. Es decir, activar la
opcin del men que corresponda, o el botn de la barra de herramientas, etc. Dicho
de otra manera, el usuario da una orden.
3. Es posible que el usuario tenga que introducir algn dato. Por ejemplo, si quiere
saber los ingresos del mes de enero, tendr que introducir enero para que el
programa sepa de que mes hay que calcular los ingresos. Para ello el usuario usar
un cuadro de texto del GUI, o un desplegable, etc
4. Hay que tener en cuenta que para obtener un listado de clientes, o el total de
ingresos de un mes, hay que consultar la base de datos. El usuario no se preocupar
de eso ya que ser el programa el que haga el trabajo.
5. El GUI traspasa la peticin del usuario al mdulo de Proceso de Datos. Este mdulo
es el corazn del programa, el que se encarga de ejecutar las rdenes. Esta parte del

258

programa analizar la orden y acto seguido buscar los datos necesarios en la base
de datos.
6. Para acceder a la base de datos, el mdulo de Proceso de Datos usar un lenguaje
ideado para el acceso a bases de datos llamado SQL.
7. Gracias al lenguaje SQL, el mdulo de Proceso de Datos obtendr los datos
necesarios que peda el usuario (por ejemplo el listado de clientes) o bien los datos
necesarios para realizar el clculo (los ingresos de cada da del mes)
8. Una vez obtenido los resultados, el mdulo de Proceso de Datos se los enviar al
GUI y los presentar de forma agradable para el usuario.
9. El usuario mirar su pantalla, y ver aparecer en la ventana del programa (en el GUI)
el resultado que haba pedido.

Teniendo en cuenta lo visto, para la creacin de un programa hay que:


-

Disear un GUI agradable, cmodo y fcil de usar.


Disear la base de datos de forma que el acceso a datos sea rpido.
Hacer el programa de forma que responda a las peticiones del usuario transmitidas
por el GUI accediendo a la base de datos y obteniendo informacin de ella, o bien
realizando acciones en ella.

GESTOR DE BASE DE DATOS


Un gestor de base de datos es un programa que nos permite crear bases de datos,
mantenerlas, realizar consultas en ellas, etc
A travs de un gestor de base de datos podemos crear la base de datos que usar nuestro
programa.
Existen diversos programas gestores de base de datos, pero el que se usar ser el
programa Microsoft Access.

DISEO DE BASE DE DATOS. MODELO ENTIDAD - RELACIN


Antes de empezar a crear la base de datos usando el programa Access (o cualquier otro
gestor de base de datos que vaya a usar) es necesario pensar en el diseo que tendr dicha
base de datos. O dicho de otro modo, como se organizarn los datos en la base de datos.
Para facilitar la tarea de organizar los datos en una base de datos, se usa una
representacin grfica llamada Modelo Entidad Relacin, o simplemente Modelo E-R.
Podramos comparar el Modelo E-R a los Diagramas de Flujo. El Modelo E-R nos facilita el
diseo de bases de datos mientras que los Diagramas de Flujo nos facilitan el diseo de
algoritmos.

259

EJERCICIO GUIADO N 1

Veremos en este ejercicio guiado como disear una base de datos a partir de la informacin
aportada por una empresa, y un ejemplo de como representar dicha base de datos usando
el Modelo E-R.

Supuesto Inicial
La empresa MANEMPSA (Mantenimiento de empresas S.A.) se encarga de realizar todo tipo
de reparaciones y limpieza en los locales de sus clientes.
A esta empresa le interesa almacenar los datos de sus clientes. Concretamente le interesa
almacenar el CIF de la empresa del cliente, el nombre de dicha empresa, la direccin y dos
telfonos de contacto.
Por otro lado, MANEMPSA quiere guardar los datos de los trabajadores que estn en
plantilla. Le interesa saber el nombre y apellidos de dichos trabajadores, el DNI, el sueldo y
la fecha en que entraron en la empresa.
MANEMPSA quiere controlar los servicios que realiza cada trabajador. Concretamente,
MANEMPSA quiere almacenar la fecha en que se hizo el servicio, el tipo de servicio que se
hizo (fontanera, limpieza, electricidad, etc) La cantidad cobrada por el servicio y un
comentario donde se indique qu acciones se realizaron.
Hay que indicar que cada servicio lo realiza un solo trabajador, y que cada servicio se realiza
a una sola empresa.
Cada trabajador tiene asignado un coche de la empresa. Hay un coche por cada trabajador y
cada trabajador siempre usa el mismo coche. A MANEMPSA le interesa almacenar
informacin de cada coche. Le interesa almacenar la matrcula, la marca, el modelo y el ao
de compra.
MANEMPSA le encarga un programa para gestionar toda esta informacin. Se pide que
disee la base de datos correspondiente que se usar en el programa. Represente dicha
base de datos usando el Modelo E-R.

1. Concepto de Entidad.
Entidad. Una entidad es un objeto que se quiere representar a travs de una serie de
caractersticas.
Las entidades son aquellos elementos que juegan un papel importante en la base de
datos. Son los elementos sobre los que queremos almacenar informacin.

2. Lo primero que hay que hacer es distinguir las entidades del supuesto. Es decir,
averiguar los elementos que se quieren almacenar en la base de datos.
En el supuesto, las entidades son: los clientes, los trabajadores, los servicios que
realizan los trabajadores y los coches de los trabajadores.

260

3. Atributos de una Entidad.


A la empresa le interesa almacenar informacin sobre las entidades. Es decir, le
interesa almacenar informacin sobre los clientes, los trabajadores, los servicios y los
coches.
La informacin que se quiere almacenar de cada entidad se denomina atributos de
una Entidad.
Por ejemplo, de los clientes, se quiere almacenar las siguientes propiedades: el CIF
de la empresa, el nombre, etc...
A continuacin se indican los atributos que se almacenarn de cada entidad, teniendo
en cuenta el supuesto:
Entidad Clientes
Atributos: CIF, nombre empresa, direccin, telfono1, telfono2.
Entidad Trabajadores
Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada.
Entidad Servicios
Atributos: fecha, tipo, cantidad, comentario.
Entidad Coches
Atributos: matrcula, marca, modelo, ao de compra.

4. Atributos clave.
Un Atributo Clave es aquel atributo cuyo valor no se repite y no puede estar vaco
para todos los elementos de una entidad.
Los Atributos Clave distinguen a cada elemento de una entidad.
Por ejemplo, en el caso de la entidad Clientes, el atributo clave ser el CIF, ya que no
puede haber dos clientes con CIF iguales, y todos los clientes tendrn CIF. El CIF
permite distinguir a un cliente de otro.
Es conveniente asignar un atributo clave para cada entidad. En algunos casos
podemos elegir uno de los atributos de la entidad como atributo clave, en otros casos
ninguno de los atributos de la entidad podr ser atributo clave y entonces tendremos
que aadir uno nosotros.
Veamos los atributos clave de cada entidad:
Entidad Clientes: El atributo clave ser el CIF.
Entidad Trabajadores: Se puede elegir como atributo clave el DNI.
Entidad Coches: Se puede elegir como atributo clave la matrcula.

261

Entidad Servicios.
En el caso de la entidad Servicios, tenemos que ninguno de los atributos que posee
puede ser atributo clave. Observa:
-

Dos servicios distintos pueden ser realizados en la misma fecha, por lo que dos
servicios pueden tener fechas repetidas: la fecha no puede ser atributo clave.

Dos servicios distintos pueden ser del mismo tipo, por los que dos servicios pueden
tener el mismo tipo: el atributo tipo no puede ser atributo clave.

Dos servicios distintos podran tener el mismo comentario, o no tener comentario en


absoluto: el atributo comentario no puede ser atributo clave.

Dos servicios distintos podran haber costado lo mismo, por lo que el atributo
cantidad no puede ser atributo clave.
No existe para la entidad Servicios un atributo que identifique cada servicio. En estos
casos se suele aadir un atributo que sea atributo clave, es decir, un cdigo o
identificador.
En nuestro ejemplo, aadiremos un atributo nmero que ser el nmero de servicio
realizado. Cada servicio tendr un nmero distinto, por lo que el atributo nmero ser
el atributo clave.
As pues, los atributos de la entidad Servicios sern los siguientes:
Entidad Servicios
Atributos: fecha, tipo, cantidad, comentario, nmero.
Y el atributo nmero ser su atributo clave.

5. Relaciones entre entidades.


Las entidades se relacionan entre s. Es necesario distinguir en el supuesto cuales
son estas relaciones. Veamos:
Un Trabajador realiza Servicios. Por lo tanto, las entidades Trabajadores y Servicios
ser relacionan.
Un Servicio se realiza a un Cliente. Por lo tanto las entidades Servicios y Clientes se
relacionan.
Un Coche lo usa un Trabajador. Por lo tanto las entidades Coche y Trabajadores se
relacionan.
Estas son las relaciones:
Coches --- Trabajador --- Servicios --- Clientes

262

6. Cuando se establecen las relaciones, hay relaciones que estn implcitas. Por
ejemplo, no se ha establecido una relacin entre Trabajadores y Clientes:
Un Trabajador hace trabajos a Clientes.
No est establecida una relacin directa entre ambas entidades, pero s se relacionan
a travs de la entidad Servicios:
Trabajador --- Servicios --- Clientes
As pues, en realidad, trabajadores y clientes se relacionan, a travs de la entidad
servicios.

7. Cardinalidad de las relaciones o Tipo de relaciones.


Segn la forma en que se relacionen dos entidades, tenemos tres tipos de relaciones:
Relaciones 1 a 1
En este tipo de relacin, un elemento de la primera entidad se relaciona con un
elemento de la segunda entidad, y viceversa.
En nuestro ejemplo, la relacin entre Coches y Trabajadores es del tipo 1 a 1, ya que
un coche pertenece a un solo trabajador, y ese trabajador solo usa ese coche.
Relaciones 1 a Muchos
En este tipo de relacin, un elemento de la primera entidad se relaciona con muchos
elementos de la segunda, pero un elemento de la segunda, se relaciona con uno solo
de la primera.
En nuestro ejemplo, la relacin Trabajadores Servicios es del tipo 1 a Muchos.
Observa: un trabajador realiza a lo largo de su vida laboral muchos servicios, pero un
servicio es realizado solo por un trabajador (por lo que nos dice el supuesto).
La relacin entre Clientes y Servicios es tambin del tipo 1 a Muchos. Observa: un
cliente solicita a lo largo de su existencia muchos servicios a la empresa, pero cada
servicio se realiza a un solo cliente (por lo que nos dice el supuesto).
Relaciones Muchos a 1
Este tipo de relacin es el mismo que el anterior. Basta con darle la vuelta a la
relacin.
Por ejemplo, se ha visto que la relacin Trabajadores Servicios es del tipo 1 a
Muchos. Por tanto, la relacin Servicios Trabajadores es del tipo Muchos a 1.
Relaciones Muchos a Muchos
En este tipo de relacin un elemento de la primera entidad se relaciona con muchos
elementos de la segunda entidad, y viceversa.
En nuestro supuesto no tenemos ninguna relacin de este tipo, pero supongamos la
siguiente relacin entre Profesores y Cursos:

263

Un profesor puede dar varios cursos, y un curso es impartido por varios profesores
Esta relacin sera del tipo Muchos a Muchos.

8. Averiguar el tipo de relaciones.


Para averiguar el tipo de cada relacin, es necesario estudiar bien el enunciado del
supuesto, y pedir informacin al cliente que nos encarga el programa, de lo contrario,
tendremos que hacer suposiciones para asignar un tipo a cada relacin.
En nuestro supuesto, las relaciones tienen el siguiente tipo:
Coches -1---1- Trabajadores -1---M- Servicios -M---1- Clientes
Relacin Coches Trabajadores. Tipo 1 a 1.
Relacin Trabajadores Servicios. Tipo 1 a Muchos.
Relacin Servicios Clientes. Tipo Muchos a 1.

9. Intercambio de atributos clave entre entidades relacionadas.


Para hacer efectivas las relaciones de la base de datos, es necesario intercambiar los
atributos claves entre las entidades relacionadas siguiendo ciertas reglas.
Las reglas son las siguientes:
-

Primera Regla. Si dos entidades se relacionan de forma 1 1, entonces debe


pasarse el atributo clave de una de ellas a la otra, y viceversa.
En nuestro ejemplo, las entidades Coches y Trabajadores se relacionan de forma 1 a
1. Esto implica que es necesario aadir el atributo clave de Coches a Trabajadores, y
viceversa.
As pues, ser necesario aadir el atributo matrcula a Trabajadores, y el atributo DNI
a Coches.
Por tanto, las entidades Trabajadores y Coches quedarn as:
Entidad Trabajadores
Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula
Entidad Coches
Atributos: matrcula, marca, modelo, ao de compra, DNI

Segunda Regla. Si dos entidades se relacionan de forma 1 Muchas, entonces, se


debe pasar el atributo clave de la entidad de la parte de la relacin 1, a la entidad de
la parte de la relacin Muchas.

264

En nuestro ejemplo, las entidades Trabajadores --- Servicios se relacionan de forma 1


a Muchas, por tanto, ser necesario traspasar el atributo clave de la entidad
Trabajadores a la entidad Servicios, con lo que quedarn as:

Entidad Trabajadores
Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula
Entidad Servicios
Atributos: fecha, tipo, cantidad, comentario, nmero, DNI.
Por otro lado, las entidades Servicios --- Clientes se relacionan de forma Muchas a 1.
Por tanto, ser necesario traspasar el atributo clave de la entidad Clientes a la
entidad Servicios, con lo que quedarn as:
Entidad Servicios
Atributos: fecha, tipo, cantidad, comentario, nmero, DNI, CIF.
Entidad Clientes
Atributos: CIF, nombre empresa, direccin, telfono1, telfono2.

10. Claves Forneas.


La razn de traspasar el atributo clave de una entidad a otra es que exista un
elemento de unin, en ambas entidades relacionadas.
Cuando una entidad posee un atributo clave de otra entidad, se dice que ese atributo
es una clave fornea.
Despus de realizar estos traspasos, nuestras entidades quedan con los siguientes
atributos.
Nota: se subraya con lnea continua el atributo clave en cada entidad, y se subraya
con lnea de puntos las claves forneas de cada entidad.

Entidad Coches
Atributos: matrcula, marca, modelo, ao de compra, DNI
Entidad Trabajadores
Atributos: nombre, apellidos, DNI, sueldo, fecha de entrada, matricula
Entidad Servicios
Atributos: fecha, tipo, cantidad, comentario, nmero, DNI, CIF.

265

Entidad Clientes
Atributos: CIF, nombre empresa, direccin, telfono1, telfono2.

No confundas el concepto de atributo clave, con el concepto de clave fornea.

11. Modelo E-R.


Una vez definidas las entidades, los atributos, atributos claves, relaciones, tipos de
relaciones, y claves forneas, todo esto se puede representar de forma grfica como
sigue:

apellidos
nombre

sueldo
tipo

DNI

fecha

cantidad
fecha

matrcula

comentario
nmero
DNI

Servicios

Trabajadores
M

Clientes

Coches
DNI

matrcula
ao

marca

CIF

Tfno2

CIF
Tfno1

nombre

modelo

direccin

El grfico anterior es lo que se llama un Modelo Entidad Relacin y es una


representacin de la base de datos que acabamos de disear.
En este grfico observars lo siguiente:
-

Las entidades se representan en recuadros.


Los atributos de cada entidad se representan en valos.
El atributo clave de cada entidad se subraya.
Las relaciones entre entidades se representan usando lneas con rombos.
Se indica el tipo de relacin (1 a 1, o 1 a Muchos) aadiendo a la lnea de la relacin
un 1 o una M para indicar el tipo de relacin.

266

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.

267

EJERCICIO GUIADO. BASES DE DATOS. Traspaso a tablas del Modelo E-R

Bases de Datos Relacionales


Como se ha comentado en la hoja anterior, una base de datos consiste en un conjunto de
datos bien organizados.
La forma de organizar estos datos es a travs de tablas. Estas tablas contendrn la
informacin que se desea almacenar.
Estas tablas se relacionan entre s, de forma que podamos extraer ms informacin uniendo
las tablas.
A las bases de datos que se organizan a travs de tablas que se relacionan entre s se las
denomina Bases de Datos Relacionales, y son las bases de datos que ms se usan.

Traspaso a Tablas de un Modelo E-R


El Modelo E-R representa el diseo de una base de datos. Este modelo es ideal para
tomarlo como base a la hora de crear las tablas que formarn parte de la base de datos.
En esta hoja guiada se ver como crear las tablas de una base de datos tomando como
referencia el Modelo E-R .
Una vez que tenemos la base de datos representada en forma de tablas, solo tendremos
que introducirlas en un programa Gestor de Bases de Datos como por ejemplo Access.

268

EJERCICIO GUIADO N 1
Dado el Modelo E-R creado en la hoja anterior y que se muestra a continuacin, crearemos
las tablas necesarias que formarn parte de la base de datos:

apellidos
nombre

sueldo
tipo

DNI

fecha

cantidad
fecha

matrcula

comentario
nmero
DNI

Servicios

Trabajadores
M

Clientes

Coches
DNI

matrcula
ao

marca

CIF

Tfno2

CIF
Tfno1

nombre

modelo

direccin

1. Tablas de la base de datos.


Primero hay que tener en cuenta que existirn tantas tablas en la base de datos
como entidades haya en el Modelo E-R.
Por tanto, podemos decir que la base de datos del supuesto tendr cuatro tablas:
Tabla Coches, Tabla Trabajadores, Tabla Servicios, Tabla Clientes.
2. Cabecera de la tabla. Campos.
Toda tabla tendr una cabecera. La cabecera de una tabla define la informacin que
guardamos de cada elemento. A esta informacin que se guarda de cada elemento
se la denomina Campo.
Los Campos se corresponden con las distintas columnas de la tabla. En un Modelo
E-R los campos vienen representados por los atributos de las entidades.
Al igual que existe un atributo clave para cada entidad, tambin existe un campo
clave para cada tabla.

269

3. Teniendo en cuenta lo anterior, las tablas de la base de datos tendrn las siguientes
cabeceras (se subraya el campo clave) :

Tabla Coches
Matrcula

Marca

Modelo

Ao

DNI

Tabla Trabajadores
DNI

Nombre

Apellidos

Sueldo

Fecha

Matrcula

Tabla Servicios
Nmero

Fecha

Tipo

Cantidad

Comentario DNI

CIF

Tabla Clientes
CIF

Nombre

Direccin

Tfno 1

Tfno 2

4. Estas tablas ya se pueden relacionar gracias a que contienen las distintas claves
forneas, las cuales aadimos en el momento de analizar las relaciones en el Modelo
E-R.
Sin embargo, de momento, no es necesario hacer nada ms.

270

5. Veamos un ejemplo del aspecto que podra tener la base de datos en un momento
dado. Como podrs observar, las tablas estarn rellenas de informacin:

Tabla Coches
Matrcula
3322-ASR
4433-ABB

Marca
SEAT
CITROEN

Modelo
Ibiza
Saxo

Ao
2000
2001

DNI
21.123.123-A
12.321.567-B

Tabla Trabajadores
DNI
Nombre
21.123.123-A Ana
12.321.567-B Juan

Apellidos
Ruiz
Prez

Sueldo
1200
1120

Fecha
02-03-2002
04-05-2002

Matrcula
3322-ASR
4433-ABB

Tabla Servicios
Nmero

Fecha

Tipo

Cantidad

1
2

12-04-2004
22-05-2005

Limpieza
Fontanera

300
238

21-12-2005

Electricidad

130

10-11-2006

Fontanera

250

Comentario DNI
Arreglo
tuberas
Revisin
cableado

CIF

21.123.123-A
12.321.567-B

B11223212
B22334466

21.123.123-A

B33221111

12.321.567-B

B11223212

Tabla Clientes
CIF
B11223212
B22334466
B33221111

Nombre
Seguros Segasa
Academia La Plata
Papelera Cuatro

Direccin
C/Ancha 2
C/La Plata 10
C/Larga 8

Tfno 1
956344334
956302323
956305060

Tfno 2
629234323

Si observas las tablas y sus claves forneas, puedes llegar a conclusiones que
afectan a varias tablas. Por ejemplo:
Observando las tablas Coches y Trabajadores, puedes llegar a la conclusin de que
Ana conduce el SEAT y Juan el Citroen.
Observando las tablas Servicios, Clientes y Trabajadores, puedes llegar a la
conclusin de que el servicio de Fontanera realizado el 22 de mayo de 2005 lo
realiz el trabajador Juan a la empresa Academia La Plata.
Etc.
Estas conclusiones se producen al relacionar las tablas gracias a la existencia de
campos de unin entre ellas (claves forneas)

271

CONCLUSIN
Las Bases de Datos que se usarn son del tipo Relacional.
Una Base de Datos Relacional est formada por tablas, que son los elementos que
contienen la informacin.
Una vez realizado el Modelo E-R, resulta muy sencillo hacer el traspaso a tablas. Solo
se debe tener en cuenta lo siguiente:
- Cada entidad se corresponde con una tabla.
- Los atributos de una entidad son los campos de una tabla.
- La existencia de claves forneas en las tablas garantizan que se puedan relacionar.

272

EJERCICIO GUIADO. BASES DE DATOS. Relaciones Muchas a Muchas

El problema de las relaciones Muchas a Muchas


En las hojas anteriores se ha visto que entre las entidades se pueden establecer relaciones
de tres tipos:
Relaciones 1 a 1.
Relaciones 1 a Muchas (o Muchas a 1).
Relaciones Muchas a Muchas.

De forma premeditada, se ha evitado tanto en las explicaciones como en los ejercicios la


aparicin de relaciones Muchas a Muchas, ya que estas relaciones presentan muchos
problemas a la hora de realizar su traspaso a tablas para luego crear la base de datos e
introducirla en un programa gestor de bases de datos.
As pues las relaciones Muchas a Muchas se consideran relaciones prohibidas que deben
ser evitadas a toda costa.
Bsicamente, las relaciones Muchas a Muchas pueden ser anuladas convirtindolas en
relaciones 1 a Muchas (o Muchas a 1) De hecho, una buena base de datos solo contendr
relaciones 1 a 1 o 1 a Muchas, y se considera que ha sido mal diseada si aparece alguna
relacin Muchas a Muchas.
En esta hoja guiada se ver qu hacer cuando aparezca una relacin Muchas a Muchas

273

EJERCICIO GUIADO N 1

SUPUESTO ACADEMIA
Interesa almacenar cierta informacin sobre una academia. Concretamente se quiere
almacenar la siguiente informacin:
Interesa almacenar informacin sobre los alumnos de la academia. Interesa almacenar el
nombre del alumno, los apellidos, el DNI y la fecha de nacimiento.
Interesa almacenar informacin sobre los cursos que se da en la academia. Interesa
almacenar el cdigo del curso, el nombre del curso, el nmero de horas y el nombre del
profesor que lo imparte.
En la academia hay una pequea biblioteca. Interesa almacenar informacin sobre los libros
de esta biblioteca. Se almacenar el cdigo del libro, el ttulo, el autor y el tema del libro.
Hay que tener en cuenta que la biblioteca est abierta a los alumnos de la academia y se les
puede hacer prstamos.

PASO A MODELO ENTIDAD RELACIN


1. Entidades participantes:
Estudiando el supuesto anterior, se ve claro que existen tres entidades claras:
alumnos, cursos y libros.
2. Atributos de cada entidad y Atributo clave:
No es complicado deducir los atributos de cada entidad. Son los siguientes
(subrayado el atributo clave):
Alumnos
Nombre
Apellidos
DNI
Fecha de nacimiento
Cursos
Cdigo del curso
Nombre del curso
Nmero de horas
Nombre del profesor
Libros
Cdigo del libro
Ttulo
Autor
Tema

274

3. Relaciones:
Veamos las relaciones:
Los alumnos hacen cursos por lo que la entidad Alumnos est relacionada con
Cursos.
Por otro lado los libros se prestan a los alumnos por lo que la entidad Alumnos est
relacionada con la entidad Libros.
Y no hay ms relaciones en la base de datos.

4. Tipos de relaciones.

Veamos la relacin los alumnos hacen cursos:


Un alumno puede apuntarse a muchos cursos. Por otro lado, en un curso se apuntan
muchos alumnos. Es una relacin Muchas a Muchas:

Alumnos

Cursos

Veamos ahora la relacin los libros se prestan a los alumnos:


Un alumno puede pedir prestado varios libros mientras est en la academia, por otro
lado, un mismo libro puede ser prestado a varios alumnos (No a la vez, claro est. El
libro es prestado a un alumno, y cuando es devuelto se le presta a otro alumno)
Por tanto tenemos tambin relacin Muchas a Muchas:

Alumnos

Libros

5. Prohibicin de las relaciones Muchas a Muchas.


Tal como se ha explicado al principio de la hoja guiada, las relaciones Muchas a
Muchas estn prohibidas y tienen que ser eliminadas del Modelo Entidad Relacin.
En nuestro caso tenemos dos relaciones Muchas a Muchas que sern reconvertidas
a relaciones Muchas a 1 (o 1 a Muchas) para hacerlas desaparecer.

275

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

Entidad Intermedia
(ignorada)

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.

276

8. Estudio de las nuevas relaciones.


Cuando aadimos la entidad intermedia a la relacin Muchas a Muchas, aparecen
dos relaciones nuevas que suelen ser del tipo 1 a Muchas.
Veamos:
Relacin los alumnos se matriculan.
Un alumno puede matricularse muchas veces (se puede apuntar a muchos cursos).
As pues un alumno realiza o rellena varias matrculas.
Sin embargo, una matrcula pertenece a un solo alumno.
Por tanto es una relacin 1 a Muchas:

Alumnos

Matrculas

Cursos

Relacin una matrcula es para un curso.


Cada vez que se rellena una matrcula es para un solo curso. (Si pudieras leer el
formulario que rellena el alumno, veras que en el papel se indica el curso al que se
apunta, y solo es uno)
Por otro lado, para un curso se rellenan varias matrculas (tantas como alumnos
quieren apuntarse al curso)
Por tanto es una relacin 1 a Muchas:

Alumnos

Matrculas

Cursos

9. Solucin del problema Muchas a Muchas:


Finalmente, al descubrir la entidad intermedia de la relacin Muchas a Muchas, esta
relacin ha desaparecido y se ha convertido en dos relaciones 1 a Muchas,
solucionndose el problema.

10. Atributos de la Entidad Intermedia.


Habr que asignar primero un atributo clave a la entidad intermedia. En el ejemplo,
ser interesante asignar un nmero de matrcula, de forma que no haya dos
matrculas con el mismo nmero.
En la entidad matrculas se puede almacenar otras informaciones, como por ejemplo
lo que paga el alumno por hacer el curso.

277

Tambin se podra almacenar la nota final obtenida por el alumno.


Finalmente, tambin hay que asignar a la entidad intermedia las claves forneas.
Recuerda que en las relaciones 1 a Muchas, hay que pasar la clave de la parte 1 a la
parte Muchas.
Si observas la relacin

Alumnos

Matrculas

Cursos

tendremos que pasar el campo DNI desde la entidad alumnos a matrculas, y el


campo cdigo curso desde la entidad cursos a matrculas, debido a la regla
correspondiente a las relaciones 1 a Muchas.
Por lo tanto, la entidad Matrculas del ejemplo quedar con los siguientes atributos:

Matrculas
Nmero (atributo clave)
Pago
Nota final
DNI (clave fornea de alumnos)
Cdigo Curso (clave fornea de cursos)

11. Solucin de la relacin libros son prestados a alumnos


Veamos la solucin de la otra relacin problemtica Muchas a Muchas:

Alumnos

Libros

12. Entidad intermedia


Si estudiamos bien la relacin entre alumnos y libros de la biblioteca, nos daremos
cuenta que existe una entidad intermedia que hace referencia a cada prstamo del
libro.
Es decir, la entidad intermedia que hemos pasado por alto es Prstamos, la cual
guardar informacin sobre los prstamos de los libros.
Con esta entidad, la relacin queda as:

Alumnos

Prstamos

278

Libros

13. Estudio de las nuevas relaciones


Relacin Alumnos Prstamos: Los alumnos piden prstamos de libros
Un alumno puede solicitar varios prstamos mientras est en la academia. Pero cada
prstamo en concreto se hace a un alumno: Relacin 1 a Muchas.
Relacin Prstamos Libros: Un prstamo es de un libro
Un libro puede participar en muchos prstamos (realizados a distintos alumnos en
momentos diferentes), pero cada prstamo en concreto hace referencia a un libro
solamente. Relacin 1 a Muchas.

Alumnos

Prstamos

Libros

Para entender estas relaciones, imagine que cada vez que se solicita un prstamo se
tiene que rellenar una ficha. En esta ficha se escribe el nombre del alumno y el
nombre del libro prestado.
Un alumno tendr muchas fichas (si ha pedido prestado muchos libros), pero una
ficha concreta solo tiene el nombre de un alumno.
Por otro lado, un libro aparecer en muchas fichas (ya que el libro es prestado
muchas veces), pero en una ficha concreta solo aparece el nombre de un libro.
La idea de ficha es equivalente a la idea de prstamo. O aun mejor, se podra
hablar de ficha de prstamos.

14. Atributos de la nueva entidad.


As pues, con la creacin de la entidad prstamos se ha solucionado el problema de
la relacin Muchas a Muchas.
Ahora hay que determinar los atributos que tendr la nueva entidad prstamos.
Atributo clave.
Se puede asignar un nmero de prstamo a cada prstamo para distinguirlos entre
s.
Claves forneas.
Hay que aadir a la entidad prstamos los atributos DNI y cdigo de libro, debido a
las reglas de claves forneas de las relaciones 1 a Muchas (recuerde que hay que
pasar el atributo clave desde la parte 1 a la parte Muchas en estas relaciones)
Otros atributos interesantes.
Se puede aadir a esta entidad atributos como fecha de prstamo, fecha de
devolucin para controlar an mejor la informacin de cada prstamo en concreto.

279

Por lo tanto, la entidad Prstamos del ejemplo quedar con los siguientes atributos:

Prstamos
Nmero (atributo clave)
Fecha prstamo
Fecha devolucin
DNI (clave fornea de alumnos)
Cdigo Libro (clave fornea de libros)

15. Despus de ha ver resuelto las dos relaciones problemticas Muchas a Muchas, el
Modelo Entidad Relacin resultante ser el siguiente (subrayados con lnea continua
los atributos clave, subrayados con rayas los atributos claves forneas):

horas
nota

profesor
cdigo
curso

pago

Cursos

nmero

M
cdigo
curso

DNI

Matrculas

nombre

autor
fecha
DNI

tema

1
1

Alumnos

Prstamos

1
Libros

nombre
apellidos

cdigo
libro

nmero

ttulo
cdigo
libro

DNI
fecha
prstamo

fecha
devolucin

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.

280

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.

281

EJERCICIO GUIADO. BASES DE DATOS. ACCESS

Gestor de Base de Datos.


En las hojas guiadas anteriores se ha explicado como disear una base de datos.
Disear una base de datos consiste en organizar la informacin, en cierta manera catica,
que nos proporciona el cliente que nos encarga el programa.
Para organizar dicha informacin usamos una representacin grfica denominada Modelo
Entidad Relacin en la que representamos cada uno de los elementos que participan en la
base de datos (entidades), sus caractersticas principales (atributos) y las relaciones que
existen entre ellos.
Una vez finalizado el esquema Entidad Relacin de la base de datos, se realiza una
representacin en forma de tablas a partir de l.
As pues, disear una base de datos consiste en tomar la informacin catica proporcionada
por el cliente y organizar esta informacin en tablas.
El objetivo de esto, es facilitar la creacin de la base de datos en el programa gestor de base
de datos que se vaya a usar.
Un programa gestor de base de datos permite crear una base de datos a partir de sus tablas.
Y adems permite el mantenimiento de dichas tablas (aadir datos, eliminar datos, modificar
datos, realizar consultas, etc)
Es necesario tener claro el diseo (organizacin en tablas) de la base de datos antes de
poder crear esta usando el programa gestor de base de datos elegido.

Microsoft Access
Existen mltiples programas gestores de bases de datos que se pueden usar para crear las
bases de datos de sus aplicaciones.
En los ejercicios guiados que vendrn a continuacin se usar el gestor Microsoft Access, el
cual permitir la creacin de forma sencilla de bases de datos adecuadas para las
aplicaciones de base de datos que se realizarn en java.
Este programa permite la definicin de las tablas, la creacin de consultas y el acceso a la
base de datos usando el lenguaje SQL, vital para el manejo de la base de datos desde la
aplicacin.
Por otro lado facilita mucho el manejo de la base de datos, la instalacin de sta en el
ordenador del cliente y las modificaciones posteriores, adems de ser un gestor de base de
datos muy extendido y conocido.
En los ejemplos que vendrn a continuacin, se usar la versin 2003 de Microsoft Access.

282

EJERCICIO GUIADO N 1

En hojas anteriores se cre la base de datos de la empresa MANEMPSA, una empresa


encargada de proporcionar servicios de mantenimiento a otras empresas.
Despus de realizar el Modelo Entidad Relacin y de hacer el traspaso a tablas, el
resultado fue el siguiente:

Tabla Coches
Matrcula

Marca

Modelo

Ao

DNI

Tabla Trabajadores
DNI

Nombre

Apellidos

Sueldo

Fecha

Matrcula

Tabla Servicios
Nmero

Fecha

Tipo

Cantidad

Comentario DNI

CIF

Tabla Clientes
CIF

Nombre

Direccin

Tfno 1

Tfno 2

En este ejercicio guiado se crear la base de datos MANEMPSA formada por las tablas
anteriores usando el programa Access.
Para ello, siga los pasos que se indican a continuacin:
1. Abra el programa Access.

283

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.

284

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

Para ello, haga lo siguiente:

285

Ao

DNI

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.

General
Tamao del campo
Formato

Mscara de entrada

mulo

ISO
.

~=================================~

1-------------------l

286

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.

287

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.

288

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:

289

12. Ya estn aadidos todos los campos de la tabla, ahora hay que indicar cual de ellos
es el campo clave. El campo clave de la tabla es la matrcula, tal como se defini a la
hora de crear el modelo e-r. As pues, haz clic sobre matrcula y pulsa el botn con
forma de llave amarilla, llamado Clave Principal. Aparecer una llave pequea al lado
del campo y de esta forma el campo matrcula quedar marcado como campo clave.

13. El diseo de la tabla Coches est casi terminado, solo hay que darle el nombre y
guardarla. Para ello, cierra la ventana de diseo de la tabla e indica que quieres
guardar los cambios.

14. Introduce el nombre de la tabla: Coches.

290

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.

291

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.

292

22. Introduzca el campo Sueldo. El tipo de datos que usaremos para este campo ser
Nmero, pero cambiaremos en la parte inferior el tipo de nmero de Entero Largo a
Doble. El tipo de nmero Doble permitir representar nmeros con decimales:

Nota: Existe en Access un tipo de datos propio de aquellos campos que almacenarn
cantidades monetarias. Este tipo de datos se denomina Moneda, pero no ser usado en
los ejemplos. En sustitucin, se usar el tipo Nmero que cumple perfectamente con el
mismo cometido.
23. Aade ahora el campo Fecha, el cual hace referencia a la fecha de entrada en la
empresa del trabajador.
Para los campos que indiquen fecha, existe un tipo de datos llamado Fecha / Hora.
Ser interesante poner un comentario a este campo para indicar que se refiere a la
fecha de entrada en la empresa y no a la fecha de nacimiento del trabajador, por
ejemplo:

293

24. Aade ahora el campo Matrcula.


Se recuerda que este campo es una clave fornea y hace referencia a la matrcula
del coche que conduce el trabajador. Este campo tambin se encuentra en la tabla
Coches (es el campo clave de la tabla Coches), as pues se definir aqu de la misma
forma que est definido en la tabla Coches: tipo texto y 10 de tamao:

25. Haz que el campo DNI sea el campo clave:

26. Cierra la ventana de diseo y guarda la tabla con el nombre Trabajadores:

294

27. Ya tenemos creadas dos de las cuatro tablas de la base de datos:

28. Ahora le toca el turno a la tabla Clientes, la cual se muestra a continuacin:


Tabla Clientes
CIF

Nombre

Direccin

Tfno 1

Tfno 2

29. Activa la opcin Crear Tabla en Vista Diseo.


30. Aade el campo CIF. Su tipo de datos ser Texto (recuerda que lleva una letra) y
asignaremos un tamao de 15.

295

31. Aade los campos Nombre y Direccin. Ambos campos sern claramente de tipo
Texto. Asignaremos a ambos un tamao de 100 caracteres.

32. Aade el campo Tfno1 y asgnale el tipo de datos Texto y un tamao de 15. Haz lo
mismo con el campo Tfno2:

Nota: Los campos Telfonos suelen causar mucha confusin, ya que se pueden definir con
el tipo de datos Nmero o Texto.
Tenga en cuenta que si quiere almacenar un telfono de esta forma:
956 30 30 30
o de esta otra:
(956) 30-30-30
Tendra que definirlo como Texto, ya que contiene caracteres no numricos (los espacios,
los parntesis, los guiones)
Si, en cambio, define el telfono como Nmero, solo podr almacenar nmeros as:
956303030
Sin poder usar ni espacios, ni guiones, ni otro carcter que no sea un dgito.
En el ejemplo se han definido como Texto para permitir el uso de caracteres no numricos.

296

33. Defina como campo clave el CIF:

34. Cierre y guarde la tabla con el nombre Clientes. Ya tiene tres de las cuatro tablas de
la base de datos.

35. Queda por aadir la tabla Servicios a la base de datos. Se muestra esta tabla a
continuacin:
Tabla Servicios
Nmero

Fecha

Tipo

Cantidad

36. Activa la opcin Crear Tabla en Vista Diseo.

297

Comentario DNI

CIF

37. Aade el campo Nmero. Su tipo de datos ser Autonumrico:


El tipo de datos Autonumrico hace que cada elemento que se aada a la tabla tenga
un nmero correlativo.
Este tipo de datos nos ahorra el tener que estar asignando un nmero cada vez que
se aada un servicio, ya que el nmero es asignado automticamente.
El problema es que no podemos controlar el nmero que se asigna a cada servicio.
Por ejemplo, si el siguiente servicio debe tener el nmero 54 y queremos asignarle el
nmero 100, no podremos hacerlo.
Para nuestro ejemplo, el tipo de datos Autonumrico ser suficiente.

38. Aade el campo Fecha. Su tipo de datos ser Fecha / Hora, evidentemente.

39. Aade el campo Tipo. El tipo de la reparacin es un texto, as que asigna el tipo de
datos Texto. Su tamao ser de 50.

40. Aade el campo Cantidad. Este campo hace referencia al coste de la reparacin.
Ser un campo Numrico de tipo Doble, ya que puede llevar decimales.

298

41. El campo Comentario contendr un texto donde se explicar el servicio realizado.


Debes tener en cuenta aqu que no se puede asignar una longitud mayor de 255
caracteres a un campo de tipo Texto. Por lo tanto, si est previsto que se escriba
mucho texto en el campo Comentario, este tipo de datos no ser el adecuado.
Existe otro tipo de datos mucho mejor para aquellos campos que vayan a contener
grandes cantidades de texto. Este tipo de datos se denomina Memo, y ser as como
definamos el campo Comentario:

42. Ahora hay que aadir los dos ltimos campos, los cuales son claves forneas que
permitirn relacionar la tabla Servicios con las tablas Clientes y Trabajadores. Estos
campos son el DNI y el CIF.
43. Aade el DNI. Tendr que ser de tipo Texto y un tamao de 15:

44. Ahora aade el CIF. Ser tambin de tipo Texto y tendr un tamao de 15:

45. Los campos estn ya definidos. Ahora activa la opcin campo clave para el campo
Numero.

299

46. Finalmente cierre y guarde la tabla con el nombre Servicios. Y ya tendr creadas las
cuatro tablas de la base de datos.

300

47. Como prueba, se pueden introducir algunos datos en las tablas de esta base de
datos directamente desde aqu. Introduciremos dos trabajadores. Haz doble clic
sobre la tabla Trabajadores, e introduce los siguientes datos:

Luego cierra la ventana de la tabla Trabajadores.


48. Ahora introduciremos los coches de la empresa. Para ello haz doble clic sobre la
tabla Coches e introduce en ella los siguientes datos de los coches:

Luego cierra la ventana de introduccin de coches.

301

49. Haz ahora doble clic sobre la tabla Clientes. Introduciremos los datos de varios de los
clientes de la empresa:

Despus de introducir los datos de los clientes cierra la ventana de la tabla Clientes.
50. Finalmente introduzca los datos de algunos de los servicios prestados. Abra para ello
la tabla Servicios e introduzca los siguientes datos (observa como los nmeros
aparecen de forma automtica en el campo Nmero, esto es debido al tipo de datos
Autonumrico)

51. Los datos que se introducen en una tabla se denominan registros, as pues, si la
tabla Servicios contiene la informacin de 4 servicios, se dice que la tabla Servicios
contiene 4 registros.
El concepto de registro hace referencia a las filas de una tabla.
52. Ya tenemos terminada la base de datos MANEMPSA. Hemos creado las tablas que
contiene e incluso hemos introducidos algunos registros en las tablas para no
dejarlas vacas. Ya puede cerrar el programa Access.
53. La base de datos que ha creado es un fichero llamado MANEMPSA. Al crearlo lo
guard dentro de la carpeta Mis Documentos. Eche un vistazo al contenido de la
carpeta Mis Documentos y busque all el fichero MANEMPSA. Si hace doble clic
sobre el fichero volver a abrir la base de datos.

302

NOTA: Al abrir un fichero de base de datos de Access de la versin 2003 el programa


le har varias preguntas, las cuales tendr que contestar de la siguiente forma:
Advertencia de seguridad, las expresiones no seguras no estn bloqueadas Desea
bloquearlas? NO
Desea abrir el archivo? SI
Desea abrir el archivo o cancelar la operacin? Abrir

54. A la hora de programar una aplicacin java de bases de datos, se har que nuestro
programa acceda al fichero de base de datos que acaba de crear con Access. As
pues no pierda de vista el fichero de base de datos que acaba de crear, ya que se
usar en posteriores hojas guiadas.

NOTA. El programa Microsoft Access es muy amplio y contiene mltiples opciones de


manejo de bases de datos, aunque solo lo usaremos para la creacin de tablas y de
consultas.
Se recomienda al alumno buscar informacin adicional sobre este programa. En Internet
podr encontrar mltiples tutoriales de aprendizaje de Access.

303

CONCLUSIN
La informacin catica proporcionada por el cliente que encarga el programa se
organiza en tablas. Estas tablas conforman la base de datos.
La base de datos hay que introducirla en un programa gestor de bases de datos, como
por ejemplo Access.
En Access se crea el fichero que contendr la base de datos, y dentro de l se disean
las distintas tablas de la base de datos.
Es necesario indicar el tipo de datos que tiene cada campo de una tabla. Puedes usar
los siguientes tipos de datos segn necesites:
- Texto.
Campos que almacenarn todo tipo de caracteres, sobre todo letras.
- Nmero.
Campos que almacenarn solo dgitos numricos.
Son nmeros con un formato correcto desde el punto de vista matemtico.
- Fecha / Hora.
Campos para almacenar fechas.
- Memo.
Campos para almacenar grandes cantidades de texto.
- Autonumrico.
Campo que contendr nmeros correlativos.

Las tablas contendrn filas de informacin llamadas registros. Es posible introducir


registros directamente en las tablas creadas desde Access.
El fichero de base de datos creado desde Access ser usado por la aplicacin java de
base de datos.

304

EJERCICIO GUIADO. BASES DE DATOS. CONSULTAS EN ACCESS

Operaciones bsicas en una base de datos


El trabajo con una base de datos consiste bsicamente en hacer lo siguiente:
-

Aadir nuevos registros a las tablas (guardar nueva informacin)


Eliminar registros de las tablas (eliminar informacin de la base de datos)
Modificar registros (modificar la informacin guardada)
Consultar las tablas.

Consultas
En esta hoja guiada nos centraremos en la realizacin de consultas.
Una consulta consiste en visualizar aquella informacin de la base de datos que cumple
determinados requisitos.
Por ejemplo, podra interesar el visualizar las ventas realizadas entre una fecha inicial y otra
final, o ver las ventas hechas a un cliente en concreto, o ver el listado de trabajadores que
tienen turno de maana, etc
Hay que tener en cuenta que las tablas de una base de datos contendrn mucha
informacin, pero no siempre necesitaremos acceder a toda ella. Por eso, la realizacin de
consultas es una accin habitual en una base de datos.
Por otro lado, la creacin de consultas nos permite averiguar determinada informacin que
no est tan accesible cuando la base de datos es muy grande.
Por ejemplo, podramos querer ver quienes son los trabajadores que cobran ms de una
cantidad de sueldo determinada, o qu clientes no han pagado determinadas ventas, etc

Consultas en Access
Access permite la creacin de consultas de forma sencilla. Estas consultas son almacenadas
en la base de datos como si fueran otras tablas, aunque en realidad, no son tablas reales.
En esta hoja guiada se ver la forma de crear consultas permanentes en una base de datos
de Access.

305

EJERCICIO GUIADO N 1

1. Abra el fichero de base de datos MANEMPSA que hizo en la hoja anterior, contenido
en la carpeta Mis Documentos.
2. Para crear una consulta active la opcin Consultas en la parte izquierda:

3. Aparecer un listado nuevo de opciones y un listado con las consultas que hay
creadas hasta ahora (ninguna, claro est)

No hay consultas
an

306

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:
: Consulta de seleccin

------------------------------------

11]~

Mostra r tabla

IC:fegar

<J l

Clientes.
Coches
Servicios
Trabajadores

307

Cerrar

6. Supongamos que queremos consultar la tabla Servicios. Por tanto, haga clic sobre
ella y active el botn Agregar: Observar como aparece un recuadro en la parte
superior izquierda con los campos de la tabla Servicios:

Aparece un recuadro con los


campos de la tabla Servicios

7. Como no queremos consultar ms tablas podemos pulsar el botn Cerrar.

8. Supongamos que queremos ver aquellos servicios que hayan tenido un coste mayor
de 200 euros. Interesa ver la fecha del servicio, el tipo y la cantidad.

308

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:
~ Consulta1 : Consulta de seleccin

----

Servicios

-..

Fecha
Tipo
Cantidad
Comentario

echa
Servicios

Tipo
Servicios

Mostrar:
Criterios:

o:

309

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.

310

11. Bsicamente, para hacer una consulta hay que indicar la tabla que se quiere
consultar, los campos que se quieren visualizar y la condicin que se tiene que
cumplir:

Tabla a consultar

Campos a visualizar

Condiciones

12. Para ver el resultado de la consulta, puede pulsar el botn Vista que se encuentra en
la parte superior izquierda de la ventana:

13. Al hacer esto ver un listado con los servicios que costaron ms de 200 euros.
Observe que solo se visualiza la fecha, el tipo de servicio y la cantidad:

311

14. Puede hacer clic en el botn Vista de nuevo (que ahora ha cambiado de forma) para
volver a la pantalla de diseo de la consulta:

15. Ahora estamos de nuevo dentro de la ventana de diseo:

16. Vamos a mejorar un poco ms la consulta. Interesara que apareciera el nombre del
trabajador que ha realizado el servicio, as pues hay que aadir una nueva tabla a la
consulta: la tabla Trabajadores, ya que es esta tabla la que contiene dicho dato.
17. Para aadir una tabla a la consulta pulse el botn Mostrar Tabla:

312

18. Aparecer de nuevo el listado de tablas inicial:

19. Elige la tabla Trabajadores y pulse el botn Agregar. Observars como aparece un
nuevo recuadro en la parte superior izquierda con los campos de la tabla
Trabajadores.

20. La lnea que aparece entre ambas tablas es la relacin establecida a travs del
campo de unin DNI. Debido a que la tabla servicios tiene incluida la clave fornea
DNI, ambas tablas pueden ser relacionadas.

313

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):

314

22. Comprueba de nuevo el resultado de la consulta pulsando el botn Vista. Observa


como ahora tenemos ms informacin de cada servicio (ahora sabemos tambin el
nombre del trabajador).

23. Vuelve a la ventana de diseo pulsando el botn Vista:

24. Tambin sera interesante que apareciera el nombre del cliente al que se le ha
realizado el servicio. Para ello, tendremos que aadir la tabla Clientes que es la que
contiene este campo.
Activa de nuevo el botn Mostrar Tabla y agrega la tabla Clientes.

315

25. Observa la relacin automtica que aparece entre Clientes y Servicios. Esto es
gracias al campo de unin que es el campo CIF.

26. Es posible reorganizar las tablas para que las relaciones se vean mejor. Haz clic
sobre ellas y arrstralas hasta que queden en el orden Clientes Servicios
Trabajadores:

27. Aade el campo Nombre de la tabla Clientes y comprueba el resultado.

316

28. Vuelve a la vista de diseo.

29. Una vez que una consulta est finalizada, la podremos guardar para usos
posteriores. Para ello, cierra la consulta pulsando en el botn cerrar de la ventana de
diseo.

317

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.

318

32. Vuelve a la ventana principal cerrando la ventana de visualizacin de la consulta.

33. En Access puedes disear y guardar todas aquellas consultas que puedan resultar
ms interesantes para el trabajo diario.
Las consultas, aunque no son tablas, se comportan como tal. Bsicamente, se puede
decir que una consulta es una subtabla, que muestra una parte de la informacin de
la base de datos.

319

CRITERIOS EN CONSULTAS

En el ejercicio guiado anterior, se realiz una consulta que mostraba los servicios de ms de
200 euros de coste. Para ello, en la vista diseo de la consulta se agreg lo siguiente:

Campos

Coste

Criterios

>200

A continuacin se muestran otras formas de indicar criterios en las consultas

Criterios para campos numricos

Campos

Coste

Criterios

200

Campos

Coste

Criterios

>200

Campos

Coste

Criterios

>=200

Campos

Coste

Criterios

<200

Campos

Coste

Criterios

<=200

Buscar aquellos registros cuyo Coste sea igual a 200

Buscar aquellos registros cuyo Coste sea mayor a 200

Buscar aquellos registros cuyo Coste sea mayor o igual a 200

Buscar aquellos registros cuyo Coste sea menor a 200

Buscar aquellos registros cuyo Coste sea menor o igual a 200

320

Campos

Coste

Criterios

<>200

Campos

Coste

Criterios

Between 200 and 300

Buscar aquellos registros cuyo Coste sea distinto de 200

Buscar aquellos registros cuyo Coste est entre 200 y 300

Criterios para campos de tipo Fecha/Hora


En el caso de los campos de tipo Fecha los operadores que se usan son los mismos que
para los campos numricos, solo que el significado es distinto en algunos casos. Ejemplos:

> 10-12-2007

Posterior al 10 del 12 del 2007

>= 10-12-2007

Posterior al 10 del 12 del 2007 (incluyendo dicha fecha)

< 10-12-2007

Anterior al 10 del 12 del 2007

<= 10-12-2007

Anterior al 10 del 12 del 2007 (incluyendo dicha fecha)

<> 10-12-2007

Distinto de 10 del 12 del 2007

Between 10-12-2007 and 20-12-2007

Entre el 10 del 12 del 07 y el 20 del 12 del 07

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

Campos

Nombre

Criterios

Jos*

Buscar aquellos registros cuyo Nombre sea exactamente Jos


Manuel:
-

Encontrara a los que tengan de nombre Jos Manuel.


No encontrara a los que se llamaran Jos a secas, o
Manuel a secas.

Buscar aquellos registros cuyo Nombre empiece por Jos:


-

Encontrara a los Jos Manuel, Jos Mara, Jos Luis, etc.


No encontrara a los Manuel Jos, Antonio Jos, etc.

321

Campos

Nombre

Buscar aquellos registros cuyo Nombre termine en Jos:


-

Criterios

*Jos

Campos

Nombre

Criterios

*Jos*

Encontrara a los Manuel Jos, Antonio Jos, Mara Jos,


etc.
No encontrara a los Jos Manuel, Jos Antonio, etc.

Buscar aquellos registros cuyo Nombre contenga la palabra


Jos en cualquier parte:
-

Encontrara a los Jos Manuel, Antonio Jos, Mara


Jos, Antonio Jos de los Santos, etc.

Criterios complejos
Si se quiere buscar a aquellos registros que cumplan varios criterios a la vez, tendrn que
escribirse dichos criterios en la misma fila. Por ejemplo:

Campos

Criterios

Nombre

*Jos

Sueldo
Busca aquellas personas que tengan un nombre que
termine en Jos y cobren ms de 1000 euros.

>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

Criterios

*Jos

>1000
300

Muestra aquellas personas que tengan un nombre que


termine en Jos y cobren ms de 1000 euros.
Muestra tambin aquellas personas que cobran 300 euros
Y muestra tambin aquellas personas que se llamen
Antonio.

Antonio

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.

322

CONCLUSIN
Una consulta muestra una parte de informacin de toda la base de datos.
Se muestran determinados campos y tambin aquellos registros que cumplan un
criterio determinado.
En Access se pueden disear consultas y almacenarlas permanentemente.
Access tiene una zona de consultas donde encontrar el listado de las consultas ya
creadas y donde podr crear nuevas consultas.
Para crear una consulta en Access bsicamente hay que seguir tres pasos:
- Indicar las tablas que contienen los campos necesarios.
- Indicar los campos que se quieren visualizar.
- Indicar el criterio de seleccin de registros.
Las relaciones creadas en Access y almacenadas pueden ser usadas luego desde la
aplicacin programada en Java, como si fueran tablas normales y corrientes.

323

EJERCICIO GUIADO. BASES DE DATOS. SQL

Lenguaje de Consulta SQL


El lenguaje SQL (lenguaje de consulta estructurado) es un lenguaje que permite actuar
sobre una base de datos.
Con este lenguaje se pueden construir rdenes que permiten hacer lo siguiente (entre otras
cosas):
-

Aadir registros a las tablas.


Modificar registros de las tablas.
Eliminar registros de las tablas.
Realizar Consultas sobre las tablas.

Gracias a este lenguaje, se construirn rdenes desde nuestra aplicacin java, que se
aplicarn a la base de datos, actuando sobre ella.

Las rdenes de aadir, modificar, eliminar realizan cambios dentro de la base de datos, pero
no devuelven nada al programa java.

Programa
Java

RDENES SQL
aadir, modificar, eliminar

Base de
Datos

Por otro lado, cuando se da una orden de realizar una consulta, la base de datos nos
devuelve el resultado de dicha consulta:

Consulta SQL
Programa
Java

Base de
Datos
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.
A continuacin se comentarn las reglas bsicas de este lenguaje.

324

Creacin de consultas en SQL

Se empezar estudiando como realizar consultas sobre una base de datos usando el
lenguaje SQL (ms adelante se ver como realizar consultas de accin: aadir, modificar
eliminar)

Cdigo base en SQL para realizar consultas


Para consultar una base de datos usar un cdigo general como el que sigue:
SELECT campos a visualizar
FROM tablas donde se encuentran dichos campos
WHERE condiciones que deben cumplir los registros
ORDER BY forma de ordenar la consulta;
Como puede ver, una consulta en SQL tiene cuatro partes (SELECT, FROM, WHERE y
ORDER BY) de las cuales solo las dos primeras son obligatorias.
Se debe mantener el orden indicado. Es decir, primero SELECT, luego FROM, luego
WHERE y luego ORDER BY.
Este cdigo debe terminar siempre con punto y coma ;
A continuacin se vern ejemplos de uso de este cdigo general.

Visualizar una tabla entera (todos los campos y todos los registros)
Ejemplo: Visualizar la tabla Clientes
SELECT *
FROM clientes;
Observa, el * significa ver todos los campos. En el FROM se indica la tabla que se quiere
ver. Observa como hay que terminar con un ;

Visualizar algunos campos de una tabla (algunos campos y todos los registros)
Ejemplo: Visualizar CIF, nombre y Direccion de todos los clientes
SELECT clientes.CIF, clientes.nombre, clientes.direccion
FROM clientes;

Observa como se indican los campos a visualizar en la clusula SELECT. Se indica la tabla
y luego el nombre del campo, separados por un punto.

325

Visualizar solo aquellos registros de la tabla que cumplan una condicin


Ejemplo: Visualizar todos los campos de aquellos trabajadores que cobren un sueldo
superior a los 1000 euros
SELECT *
FROM trabajadores
WHERE trabajadores.sueldo > 1000;

Observa el uso de la clusula WHERE para aplicar una condicin al resultado.

Ejemplo: Visualizar el nombre, apellido y sueldo de aquellos trabajadores que cobren un


sueldo entre 800 y 2000 euros
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo
FROM trabajadores
WHERE trabajadores.sueldo BETWEEN 800 AND 2000;

Observa el uso de BETWEEN AND para indicar que el sueldo est entre 800 y 2000
Nota. Ms adelante en este ejercicio guiado se muestran las distintas posibilidades
que tenemos a la hora de indicar criterios en la clusula WHERE

Visualizar el contenido de una tabla ordenado


Ejemplo: Visualizar la tabla de trabajadores ordenada por sueldo de menor a mayor
SELECT *
FROM trabajadores
ORDER BY trabajadores.sueldo ASC;

Observa el uso de la clusula ORDER BY para indicar que se ordene por sueldo. La palabra
ASC indica ascendente (de menor a mayor)

Ejemplo: Visualizar nombre, apellidos y sueldo de los trabajadores ordenados por sueldos
de mayor a menor
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo
FROM trabajadores
ORDER BY trabajadores.sueldo DESC;

Observa el uso de DESC para indicar una ordenacin descendente.

326

Ejemplo: Visualizar nombre, apellidos y sueldo de los trabajadores que cobren ms de 1000
euros, ordenados por apellidos y nombre
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo
FROM trabajadores
WHERE trabajadores.sueldo > 1000
ORDER BY trabajadores.apellidos ASC, trabajadores.nombre ASC;

Observa aqu como ordenar por dos campos, primero por apellidos y luego por nombre. Esto
significa que aquellos trabajadores que tengan el mismo apellido sern ordenados por
nombre.

Visualizar datos de varias tablas


Ejemplo: Visualizar todos los servicios. Interesa que aparezca el nombre del trabajador que
hizo el servicio, la fecha del servicio realizado y el tipo de servicio
SELECT trabajadores.nombre, servicios.fecha, servicios.tipo
FROM trabajadores, servicios
WHERE trabajadores.DNI=servicios.DNI;

Observa aqu como se indica en la clusula FROM las dos tablas de las que extraemos
datos. Es importante que te fijes tambin en como se unen ambas tablas igualando en la
clusula WHERE el campo de unin de ambas tablas, que en el ejemplo es el DNI.

Ejemplo: Visualizar todos los servicios. Interesa que aparezca el nombre del trabajador que
hizo el servicio, el tipo de servicio y el nombre del cliente al que se le hizo el servicio
SELECT trabajadores.nombre, servicios.tipo, clientes.nombre
FROM trabajadores, servicios, clientes
WHERE trabajadores.DNI=servicios.DNI AND clientes.CIF=servicios.CIF;

Observa aqu una consulta sobre tres tablas, las cuales aparecen en el FROM. Es necesario
indicar en la clusula WHERE los campos de unin. La tabla Trabajadores se relaciona con
la tabla Servicios a travs del campo DNI, y la tabla Trabajadores se relaciona con Clientes a
travs del campo CIF. Observa el uso de AND para unir varias condiciones.

Ejemplo: Visualizar los servicios que hayan costado ms de 200 euros. Interesa ver la fecha
del servicio, el nombre del cliente y el coste ordenado por cantidad
SELECT servicios.fecha, clientes.nombre, servicios.cantidad
FROM servicios, clientes
WHERE servicios.CIF=clientes.CIF AND servicios.cantidad>200
ORDER BY servicios.cantidad;

Observa como la clusula WHERE contiene por un lado la condicin de unin de ambas
tablas y por otro lado la condicin que se busca (cantidad > 200)

327

FORMA DE INDICAR CRITERIOS EN LA CLUSULA WHERE


Se van a indicar a continuacin una serie de reglas que se deben seguir a la hora de crear
condiciones en la clusula WHERE de una consulta SQL

Operadores Relacionales
Operador
=

Ejemplos
WHERE cantidad = 200

Significa
Igual que

WHERE tipo = Limpieza


WHERE fecha = #8-5-2006#

>

WHERE cantidad > 200

Mayor que
(para nmeros)

WHERE fecha > #8-5-2006#

Posterior a
(para fechas)
>=

WHERE cantidad >= 200

Mayor o igual que


(para nmeros)

WHERE fecha >= #8-5-2006#

Esa fecha o posterior


(para fechas)
<

WHERE cantidad < 200

Menor que
(para nmeros)

WHERE fecha < #8-5-2006#

Anterior a
(para fechas)
<=

WHERE cantidad <= 200

Menor o igual que


(para nmeros)

WHERE fecha <= #8-5-2006#

Esa fecha o anterior


(para fechas)
<>

WHERE cantidad <> 200

Distinto de
(para fechas, nmeros y
textos)

WHERE fecha <> #8-5-2006#


WHERE tipo <> Limpieza

Entre valor1 y valor2


(aplicable a nmeros y
fechas)

WHERE cantidad BETWEEN 100 AND 200

Like cadena*

Que empiece por cadena


(aplicable a textos)

WHERE nombre LIKE Jose*

Like *cadena

Que termine por cadena


(aplicable a textos)

WHERE nombre LIKE *Jose

Between...and

WHERE fecha BETWEEN #8-5-2006# AND #1-12-2006#

328

Like *cadena*

Que contenga cadena


(aplicable a textos)

WHERE nombre LIKE *Jose*

IS NULL

Que el campo est vaco


(aplicable a nmeros, textos,
fechas)

WHERE telefono IS NULL

NOT ... IS NULL

Que el campo no est vaco


(aplicable a nmeros, textos,
fechas)

WHERE NOT telefono IS NULL

Operadores Lgicos
Operador

Significa

Ejemplos

AND

Obliga a que se cumplan las


dos condiciones que une.

WHERE cantidad > 200 AND tipo = Limpieza

(Debe cumplirse que la cantidad sea mayor de 200 y que


el tipo de servicio sea Limpieza)

OR

NOT

Basta con que se cumpla


una sola de las dos
condiciones que une.

WHERE cantidad > 200 OR tipo = Limpieza

Si no se cumple la
condicin, la condicin
global se cumple.

WHERE NOT cantidad > 200

(Basta con que la cantidad sea mayor de 200, o que el tipo


de servicio sea Limpieza para que se cumpla la condicin)

(Se cumple la condicin si la cantidad NO es mayor de


200)

Forma de indicar los valores


Como puedes observar en los ejemplos anteriores, tendrs que tener en cuenta las
siguientes reglas para indicar valores:
Valores numricos
Indica los valores numricos tal cual, teniendo en cuenta que debes usar el punto decimal
cuando quieras representar decimales.
Ejemplo:
WHERE cantidad > 200.12
Valores de texto
Los valores de texto se indican rodendolos entre comillas simples:
Ejemplos:
WHERE nombre = Jose

329

WHERE direccin LIKE *avenida*

Valores de fecha
Las fechas se indican rodendolas entre almohadillas #. Se debe tener en cuenta que las
fechas deben indicarse separadas por guiones o barras / y que su formato debe ser el
siguiente:
Mes Dia Ao

Ejemplos:
WHERE fecha > #02-01-2005#
(Significa que la fecha debe ser posterior al 1 de febrero de 2005)
WHERE fecha <> #10-12-2006#
(Significa que la fecha debe ser distinta del 12 de Octubre de 2006)

Forma de indicar los campos


Normalmente los campos que se usan en el WHERE (y en otras clusulas) se indican de la
siguiente forma:
Tabla.Campo
Por ejemplo,
WHERE trabajadores.sueldo > 1000
(Sueldo es un campo de la tabla trabajadores)
Si tenemos la seguridad de que no existe otro campo de otra tabla que se llame igual,
entonces podemos prescindir del nombre de la tabla.
Por ejemplo,
WHERE sueldo > 1000
(No existe otro campo sueldo en otras tablas de la consulta)
En el caso de que el nombre del campo contenga espacios, entonces tendremos que rodear
el campo con corchetes.
Por ejemplo,
WHERE [sueldo del trabajador] > 1000
(El campo se llama sueldo del trabajador)

330

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:

331

4. En el cuadro de eleccin de tablas no agregaremos ninguna. As pues pulsaremos


directamente el botn Cerrar.

5. El resultado es que aparece la ventana de diseo de consultas. En la parte superior


izquierda de esa ventana podrs ver un botn con el texto SQL. Este botn nos
permitir crear la consulta usando el lenguaje SQL. Plsalo.

6. Aparecer una pantalla casi en blanco donde escribir la consulta SQL. Observe que
ya aparece la clusula SELECT escrita:

7. Para empezar mostraremos el contenido de la tabla Trabajadores. Para ello, debe


escribir la siguiente consulta SQL:
SELECT *
FROM trabajadores;

332

8. Para ver el resultado de esta consulta debe pulsar el botn Vista que se encuentra en
la parte superior izquierda de la ventana:

9. El resultado es que ver el contenido de la tabla Trabajadores:

10. Acaba de crear una consulta dentro de Access usando el lenguaje SQL. Para
modificar de nuevo la consulta SQL tendr que desplegar el botn Vista y activar de
nuevo la opcin SQL:

11. De esta manera entrar de nuevo en el editor de consultas SQL de Access, donde
an permanecer la consulta creada:

12. Ahora modificaremos la consulta para que solo nos muestre los campos nombre,
apellidos, sueldo y fecha. Para ello tendr que escribir la siguiente consulta:
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo, trabajadores.fecha
FROM trabajadores;

333

13. Usa el botn Vista para ver el resultado de la consulta. Observa como ahora solo
vemos los campos indicados:

14. Vuelve a la zona de edicin de consultas SQL y cambia la consulta para que quede
as:
SELECT trabajadores.nombre, trabajadores.apellidos, trabajadores.sueldo, trabajadores.fecha
FROM trabajadores
WHERE trabajadores.apellidos LIKE '*ez';

Como ves, hemos aadido una clusula where, para buscar solo aquellos
trabajadores cuyo apellido termine en ez.

15. Comprueba el resultado:

334

16. Vuelve a la zona de edicin SQL. Vamos a complicar un poco la consulta.


Supongamos que queremos ver los servicios que han realizado cada uno de estos
trabajadores. Para ello tendremos que incluir a la tabla servicios en la consulta.
Supongamos que queremos ver el tipo de servicio realizado y el coste de cada
servicio. Por otro lado, de cada trabajador solo queremos ver el nombre y los
apellidos.
Hay que tener en cuenta que es necesario aadir en el WHERE una condicin que
iguale el campo de unin entre la tabla trabajadores y la tabla servicios. Este campo
de unin es el DNI.
La consulta debe quedar as:
SELECT trabajadores.nombre, trabajadores.apellidos, servicios.tipo, servicios.cantidad
FROM trabajadores, servicios
WHERE trabajadores.apellidos LIKE '*ez' AND trabajadores.DNI=servicios.DNI;

(Observa la inclusin en el FROM de la tabla servicios, y como se ha aadido una


condicin de unin entre la tabla trabajadores y servicios a travs del campo DNI)

17. Visualiza el resultado de la consulta (botn Vista) Aparecer lo siguiente:

Como ves, aparecen todos los servicios y el nombre y apellidos del trabajador que
hizo cada uno. Solo aparecen los servicios de los trabajadores cuyo apellido termine
en ez.

18. Vuelve a la vista de edicin SQL. Vamos a complicar an ms la consulta. Esta vez
vamos a hacer que aparezca el nombre del cliente al que se le hizo el servicio.
Esto implica la inclusin de una nueva tabla (clientes) y la necesidad de relacionar la
tabla servicios con la tabla clientes segn el modelo E-R de esta base de datos. El
campo de unin es el CIF.

335

Modifica la consulta para que quede de la siguiente forma:


SELECT trabajadores.nombre, trabajadores.apellidos, servicios.tipo, servicios.cantidad,
clientes.nombre
FROM trabajadores, servicios, clientes
WHERE trabajadores.apellidos LIKE '*ez' AND trabajadores.DNI=servicios.DNI AND
servicios.CIF=clientes.CIF;

(Observa la inclusin de la tabla clientes en la clusula FROM, y la adicin de una


nueva condicin de unin, entre la tabla servicios y la tabla clientes en la clusula
WHERE. Esta condicin de unin une ambas tablas usando el campo CIF)

19. Veamos el resultado de la consulta:

Como se puede observar, aparece el listado de los servicios realizados por los
trabajadores cuyo apellido termine en ez. Aparece informacin incluida en tres tablas
distintas: trabajadores, servicios y clientes.

20. Vuelve a la zona de diseo SQL. Aadiremos una ltima modificacin a la consulta y
la finalizaremos.
Ahora estableceremos un orden. Concretamente, ordenaremos el resultado de la
consulta segn apellidos del trabajador. Para ello tendremos que aadir una clusula
ORDER BY:
SELECT trabajadores.nombre, trabajadores.apellidos, servicios.tipo, servicios.cantidad,
clientes.nombre
FROM trabajadores, servicios, clientes
WHERE trabajadores.apellidos LIKE '*ez' AND trabajadores.DNI=servicios.DNI AND
servicios.CIF=clientes.CIF
ORDER BY trabajadores.apellidos ASC;

336

21. Ejecuta la consulta y observa el resultado. Ahora el listado de servicios aparece


ordenado segn el apellido del trabajador que lo realiza, alfabticamente.

22. Hemos finalizado con la consulta. Cirrela y gurdela. Puede ponerle de nombre
Servicios realizados por trabajadores ez.

23. Este ha sido un ejemplo de consulta realizada en Access usando el lenguaje de


consulta SQL. Este lenguaje ser vital para hacer que nuestra aplicacin java
manipule la base de datos correspondiente.

NOTA.
En Internet se pueden encontrar mltiples manuales sobre SQL. Se recomienda buscar
informacin sobre el tema para ampliar los conocimientos aqu expuestos.

La sintaxis del lenguaje SQL puede variar segn el programa de base de datos que se use.
En este ejercicio guiado se ha usado la sintaxis del SQL incluido en el programa Access.
Tenga en cuenta que puede haber variaciones entre este SQL y el incluido en otro gestor de
base de datos, aunque estas variaciones son mnimas.

337

CONCLUSIN
El lenguaje de consulta SQL permite manipular la base de datos.
A travs de este lenguaje, se pueden crear rdenes que permitan:
- Introducir nuevos datos en la base de datos.
- Eliminar datos de la base de datos.
- Modificar datos de la base de datos.
- Realizar consultas sobre la base de datos.
Para realizar consultas en la base de datos usando el lenguaje SQL es necesario usar
instrucciones SELECT, las cuales tienen la siguiente forma general:
SELECT campos a visualizar
FROM tablas a las que pertenecen dichos campos
WHERE condiciones a cumplir, condiciones de unin de tablas
ORDER BY campos por los que se ordena
El programa ACCESS permite crear consultas usando el lenguaje SQL, por lo que
puede ser una buena herramienta para practicar este lenguaje.
Nuestro programa de bases de datos java, usar este lenguaje para manipular la base
de datos correspondiente.

338

EJERCICIO GUIADO. BASES DE DATOS. SQL

Acciones en SQL
En la hoja guiada anterior se ha visto como se pueden crear instrucciones usando el
lenguaje SQL para consultar una base de datos, y, de esta forma, extraer informacin de
ella.
Pero el lenguaje SQL no se queda simplemente ah, sino que proporciona instrucciones que
pueden realizar acciones sobre la base de datos. Estas acciones son (entre otras):
-

Aadir nuevos registros a una tabla.


Eliminar registros de una tabla.
Modificar datos de una tabla.

Programa
Java

RDENES SQL
aadir, modificar, eliminar

Base de
Datos

En esta hoja guiada veremos como ejecutar instrucciones SQL que permitan aadir, eliminar
o modificar registros de las tablas de la base de datos.

339

Alta de registros en SQL


Se empezar estudiando como aadir nuevos registros en una base de datos usado el
lenguaje SQL.
Cdigo base en SQL para aadir nuevos registros
Para aadir un registro en una tabla se usa la siguiente sintaxis:
INSERT INTO tabla
VALUES (valor1, valor2, valor3, ..., valor n);
En la clusula INSERT INTO se indica la tabla que en la que se quiere introducir una nueva
fila (registro), y en la clusula VALUES se indican los valores de la fila que se quiere insertar.
Estos valores tienen que estar indicados en el orden en el que estn definidos los campos
en la tabla correspondiente.
Por ejemplo:
INSERT INTO trabajadores
VALUES (30.234.234-A, Mara, Lpez, 1250.45, #01/02/2006# 4455-RSD);

En esta instruccin se est introduciendo un nuevo trabajador en la tabla trabajadores.


Concretamente se est introduciendo un trabajador con las siguientes caractersticas:
DNI: 30.234.234-A
Nombre: Mara
Apellidos: Lpez
Sueldo: 1250,45
Fecha de entrada: 02/01/2006
Matrcula: 4455-RSD
Los valores estn indicados en el mismo orden en el que estn los campos en la tabla: DNI,
Nombre, Apellidos, Sueldo, Fecha, Matrcula.
Si se quiere introducir un nuevo registro, pero indicando solo los valores de algunos campos,
se puede usar entonces esta otra sintaxis para la instruccin INSERT INTO:
INSERT INTO tabla
(campo a, campo b, campo c)
VALUES (valor del campo a, valor del campo b, valor del campo c);
En este caso solo se introducen los valores correspondientes a tres campos, el resto de los
campos del registro se quedarn vacos.
Por ejemplo:
INSERT INTO trabajadores
(DNI, Apellidos, Sueldo)
VALUES (30.234.234-A, Lpez, 1250.45);
En este caso introducimos a un trabajador de apellido Lpez, con DNI 30.234.234-A que
cobra 1250,45 euros. Tanto la matrcula de su coche como su nombre y la fecha quedan en
blanco.

340

Formato de los valores.


Recuerda que debes seguir ciertas reglas para introducir valores:
Las cadenas se escriben entre comillas simples. Por ejemplo: Lpez
Se usa el punto decimal en los nmeros reales: Por ejemplo: 1250.45
Las fechas se indicarn entre almohadillas # y hay que indicar primero el mes, luego el da y
finalmente el ao. Por ejemplo: #12-20-2007# es 20 de diciembre de 2007.
En el caso de querer especificar explcitamente que un campo est vaco, se puede indicar
el valor NULL.
Ejemplo:
INSERT INTO trabajadores
(DNI, Apellidos, Sueldo)
VALUES (30.234.234-A, NULL, 1250.45);
Los apellidos del trabajador estn vacos en este ejemplo.

341

EJERCICIO GUIADO N 1

1. Entra en la base de datos MANEMPSA de la carpeta Mis Documentos.


2. Crearemos una consulta SQL para aadir registros a la tabla trabajadores. Para ello,
accede a la zona de consultas.

3. Crea una consulta en vista Diseo y no agregues ninguna tabla. Simplemente pulsa
el botn Cerrar.

4. Pulsa el botn SQL que se encuentra en la parte superior izquierda de la ventana


para crear una consulta SQL.

342

5. Aparecer entonces el editor de consultas SQL. En l, escribe la siguiente instruccin


SQL:
INSERT INTO trabajadores
VALUES ('33.444.333-B','Antonio','Romero',1300.5,#01/02/2006#,NULL);

Vers que lo que se pretende es introducir un nuevo trabajador. Este trabajador


tendr los siguientes datos:
DNI: 33.444.333-B
Nombre: Antonio
Apellidos: Romero
Sueldo 1300,5
Fecha de entrada: 2-1-2006
(Observa como en la clusula VALUES se indica la fecha en formato mes-dia-ao)
Matrcula de su coche: No se indica (NULL)

6. Este tipo de consulta es de accin. Esto significa que no debe mostrar nada,
simplemente ejecuta una accin sobre la base de datos (en este caso, aadir un
registro nuevo en la tabla trabajadores) Para ejecutar esta consulta de accin activa
el botn Ejecutar:

7. Access avisar de que vas a aadir un nuevo registro, y te pide confirmacin. Acepta
la accin:

8. Se acaba de ejecutar la consulta. Para comprobar el resultado tendremos que ver el


contenido de la tabla Trabajadores y observaremos que hay un nuevo trabajador
aadido. Primero cierra la consulta, pero no la guardes.

343

9. Accede a la zona de tablas de la base de datos.

10. Abre la tabla trabajadores. Observa el nuevo trabajador que se ha aadido:

11. Cierra la base de datos.

344

Modificacin de registros en SQL


Es posible usar el lenguaje SQL para modificar los datos de una tabla. Se puede incluso
modificar los datos de aquellos registros que cumplan una condicin en concreto.
Cdigo base en SQL para modificar registros
Para modificar los datos de los registros de una tabla se usar el siguiente cdigo general:
UPDATE tabla a modificar
SET campo1 = nuevovalor1, campo2 = nuevovalor2, , campon = nuevovalorn
WHERE condicin;

En la clusula UPDATE se indica la tabla cuyos registros se van a modificar.


La clusula SET permite indicar los cambios que se realizarn. Se debe indicar el campo
que se va a cambiar y el nuevo valor que se introducir en el campo. Como puede observar,
se pueden indicar varios campos a modificar.
La clusula WHERE permite indicar una condicin. Esto har que solo se cambien los
valores de aquellos registros que cumplan la condicin. La clusula WHERE es opcional, y si
no se indicara se cambiaran todos los registros de la tabla.
Ejemplo:
UPDATE trabajadores
SET sueldo = 1200, matricula=3355-AAA
WHERE fecha < #01/01/2004#;

En este ejemplo se les asigna un sueldo de 1200 euros y el coche con matrcula 3355-AAA a
todos aquellos trabajadores que hayan entrado en la empresa antes del 1-1-2004.
Ejemplo:
UPDATE trabajadores
SET sueldo = 1300;

En este ejemplo, se les asigna a todos los trabajadores un sueldo de 1300 euros ya que no
se ha indicado clusula WHERE.

Si se quisiera hacer un cambio puntual a un registro en concreto, tendremos que hacer uso
de su campo clave para indicar la condicin. Recuerda que el campo clave es el que
identifica de forma nica a un registro de la tabla.
Por ejemplo:
UPDATE trabajadores
SET sueldo = 1300
WHERE DNI=33.444.333-A;

En este ejemplo se estoy asignando un sueldo de 1300 al trabajador con DNI 33.444.333-A,
y a ningn otro (ya que se supone que no habr otro con dicho DNI)

345

EJERCICIO GUIADO N2
1. Entra en la base de datos MANEMPSA.
2. Accede a la zona de consultas y crea una consulta en vista diseo.
3. No agregues ninguna tabla y pulsa directamente el botn Cerrar.
4. Pulsa el botn SQL para entrar en la zona de edicin de consulta SQL.

5. Escribe la siguiente instruccin SQL:


UPDATE trabajadores
SET sueldo = 800, matricula=1111-AAA
WHERE DNI=33.444.333-B;

Como puedes observar, en esta instruccin SQL vamos a asignarle un sueldo de 800
euros y el coche con matricula 1111-AAA al trabajador con DNI 33.444.333-B, que es
precisamente el trabajador que aadimos en el ejercicio guiado anterior.
6. Ejecuta esta consulta de accin pulsando el botn Ejecutar:
7. Access avisar de que va a actualizar una fila en la tabla trabajadores y pedir
confirmacin para hacerlo. Acepte la confirmacin.
8. El resultado de esta instruccin SQL de accin es que se habrn modificado los
datos del trabajador con DNI 33.444.333-B. Para comprobarlo accederemos a la
tabla trabajadores y observaremos su contenido.
9. Cierre la consulta que est realizando (no hace falta que la guarde)
10. Acceda a la zona de tablas de la base de datos y entre en la tabla trabajadores,
observe su contenido. El trabajador con DNI 33.444.333-B habr cambiado:

11. Cierra la base de datos.

346

Eliminacin de registros en SQL


Al igual que podemos aadir nuevos registros (filas) a las tablas usando SQL, tambin
podemos usar este lenguaje para eliminar registros de las tablas.
Cdigo base en SQL para eliminar registros
Para eliminar registros de una tabla se usar el siguiente cdigo general:

DELETE FROM tabla de la que se quiere eliminar


WHERE condicin de los registros que se eliminarn;
En la clusula DELETE FROM se indica la tabla de la que eliminaremos registros.
En la clusula WHERE se indica la condicin que deben cumplir los registros que
eliminaremos.
Por ejemplo:

DELETE FROM trabajadores


WHERE sueldo>1000;
En este ejemplo se estn eliminando de la tabla trabajadores aquellos trabajadores cuyo
sueldo sea superior a 1000.
Si se quiere eliminar un solo registro de la tabla, ser necesario hacer referencia a su campo
clave. Recuerda que el campo clave es el que identifica de forma nica a cada registro.
Por ejemplo, si queremos eliminar un trabajador en concreto, indicaremos su DNI en la
condicin:

DELETE FROM trabajadores


WHERE DNI=33.444.555-A;
Esta instruccin SQL borra al trabajador con DNI 33.444.555-A (solamente a l, ya que se
supone que no habr otro trabajador que tenga ese mismo DNI)
En la clusula WHERE de una instruccin DELETE, las condiciones se indican tal como se
vio en la hoja anterior para las instrucciones SELECT.
Si se quiere eliminar todo el contenido de una tabla, se puede usar una instruccin DELETE
sin indicar ninguna condicin. Por ejemplo:

DELETE FROM trabajadores;


Esta instruccin eliminara todos los registros de la tabla trabajadores.

347

EJERCICIO GUIADO N 3

11. Entra en la base de datos MANEMPSA.


12. Accede a la zona de consultas y crea una consulta en vista diseo.
13. No agregues ninguna tabla y pulsa directamente el botn Cerrar.
14. Pulsa el botn SQL para entrar en la zona de edicin de consulta SQL.

15. Escribe la siguiente instruccin SQL:


DELETE FROM trabajadores
WHERE DNI = '33.444.333-B';

Como puedes observar, esta instruccin eliminar al trabajador con DNI 33.444.333B, que es precisamente el trabajador que se aadi en el ejercicio guiado 1.

16. Ejecuta esta instruccin de accin activando el botn Ejecutar:

17. Access avisar de que va a eliminar una fila de la tabla trabajadores, y pedir
confirmacin. Confirme la eliminacin.
18. Para comprobar el ejemplo tendr que acceder a la tabla trabajadores y comprobar
que el trabajador con DNI 33.444.333-B ya no est. Para ello cierre la consulta (no
hace falta que la guarde) y acceda a la zona de tablas.
19. Abra la tabla trabajadores. Observe como el trabajador ha desaparecido:

20. Cierre Access.

348

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

349

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Acceso a Base de Datos desde una aplicacin Java


El objetivo de todas las hojas guiadas anteriores dedicadas a las bases de datos, es
finalmente aprender a crear un fichero que contenga toda la informacin que la empresa
necesita gestionar. Es decir, crear un fichero de base de datos.
Este fichero se incluir con el programa java que se realice. Nuestro programa java acceder
a este fichero continuamente para aadir nuevos datos, o modificar datos, eliminar datos, o
extraer datos segn lo ordene el usuario del programa.
En esta hoja guiada, se vern los pasos necesarios para conectar un proyecto java con un
fichero de base de datos creado en Access.

Pasos Generales para preparar una Aplicacin Java para acceder a una Base de Datos
Para preparar nuestra aplicacin Java para que pueda acceder a una Base de Datos, es
necesario realizar tres pasos:
1. Cargar el controlador de la base de datos.
El controlador define el tipo de base de datos que se va a usar (base de datos de Access, o
de MySQL, o de cualquier otro gestor de base de datos)
En nuestro caso, tendremos que indicar el controlador para base de datos de Access.
2. Crear un objeto conexin (Connection)
Para crear este objeto hay que indicar la situacin del fichero de base de datos, el usuario y
la contrasea de dicha base de datos. El objeto conexin abre el fichero de la base de datos.
3. Crear un objeto sentencia (Statement)
El objeto sentencia se crea a partir del objeto conexin anterior. Los objetos sentencia
permiten realizar acciones sobre la base de datos usando instrucciones SQL.
Es decir, a travs del objeto sentencia introduciremos datos en la base de datos,
eliminaremos datos, haremos modificaciones, y extraeremos datos de la base de datos.
As pues, este objeto es vital. Este objeto es el que realmente permite el acceso a los datos
de la base de datos y la manipulacin de dicha base de datos.

350

EJERCICIO GUIADO N 1
PLANTEAMIENTO
En este ejercicio se pretende crear una pequea aplicacin de bases de datos que permita
simplemente mostrar los datos de los trabajadores almacenados en la base de datos
MANEMPSA.

1. Entre en NetBeans. Crea un nuevo proyecto llamado AccesoBD. Dentro de este


proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un
JFrame llamado ventanaprincipal:

2. En la parte superior de la ventana aade un botn con el texto Ver Datos


Trabajadores que se llame btnVerDatos.

3. Se pretende simplemente que al pulsar el botn btnVerDatos aparezcan en un


JOptionPane datos sobre los trabajadores almacenados en la base de datos.

351

SITUACIN DEL FICHERO DE BASE DE DATOS


4. Antes de empezar con la programacin de nuestra aplicacin, introduciremos el
fichero de base de datos en la carpeta del proyecto java que estamos haciendo. Para
ello, accede a la carpeta del proyecto AccesoBD. Esta carpeta se encontrar all
donde ests guardando tus proyectos:

5. Entra dentro de esta carpeta y observars una serie de carpetas creadas por el
propio NetBeans. (Entre ellas, la ms interesante es la llamada src, la cual es la que
contiene los ficheros con el cdigo java)

6. Para tener todo bien organizado, crearemos una carpeta llamada Base dentro de la
carpeta de proyecto, de manera que su contenido quede as:

7. Ahora lo nico que tiene que hacer es copiar el fichero de base de datos
MANEMPSA.MDB que se encuentra en Mis Documentos dentro de la carpeta Base.
(La extensin de los ficheros de base de datos de Access es MDB)

352

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.

353

PREPARACIN DE LA APLICACIN JAVA PARA EL ACCESO A LA BASE DE


DATOS
10. Para poder acceder y manipular una base de datos, es necesario tener dos objetos:
-

Un objeto del tipo Connection, al que llamaremos conexion. Este objeto define la
conexin con la base de datos.

Un objeto del tipo Statement, al que llamaremos sentencia. Este objeto permite
manipular la base de datos.

11. As pues, lo primero que haremos ser definir estos objetos como globales en la
clase de la ventana principal, para as poderlos usar desde cualquier lado:

Aparecern subrayados ya que ser necesario indicar el import para las clases
Connection y Statement. Estos import son respectivamente:
java.sql.Connection
y
java.sql.Statement
Agrega los import correspondientes para eliminar los errores.
12. Una vez definidos los objetos conexin y sentencia, necesarios para el acceso a la
base de datos, prepararemos nuestro programa para que pueda acceder a la base de
datos MANEMPSA.MDB. Esto se har en el constructor.
13. En primer lugar, aade al constructor una llamada a una funcin PrepararBaseDatos:

354

14. Crea el mtodo PrepararBaseDatos debajo del constructor y empieza a programar lo


siguiente:

El cdigo que acabas de programar es el primer paso a realizar para el acceso a una
base de datos: La Carga del Controlador.
Recuerda que el controlador le indica a Java que tipo de base de datos usaremos:
Access, MySQL, etc
El controlador que le indica al java que usaremos una base de datos de Access viene
definido a travs de la siguiente cadena de texto:
sun.jdbc.odbc.JdbcOdbcDriver

Y la forma de activar dicho controlador es a travs de la instruccin:


Class.forName(controlador).newInstance();
Donde controlador es una variable de cadena que contiene la cadena anterior.

Bsicamente, lo que hacen estas dos lneas de cdigo, es preparar a Java para
poder usar Access.
En el caso de que se quisiera usar una base de datos realizada en otro programa que
no fuera Access, habra que cambiar la cadena de texto correspondiente a su
controlador.
Por ejemplo, para usar una base de datos creada con el gestor de base de datos
MySQL se usa la cadena: com.mysql.jdbc.Driver.
En nuestro caso siempre usaremos Access.
Tambin puedes observar que es obligatorio encerrar el cdigo de la carga del
controlador entre try catch para capturar cualquier error imprevisto.

355

15. Ahora aade el siguiente cdigo a continuacin del anterior:

El cdigo que acabas de aadir se corresponde con el segundo paso para acceder a una base de
datos: Crear el objeto Conexin.
El objeto conexin es el que efecta la conexin real con la base de datos. Se podra decir que es el
objeto que permite abrir la puerta del fichero de base de datos para entrar en l. Para construir este
objeto conexin (el cual ya est declarado en la parte global de la clase) hacen falta tres datos:

El nombre del usuario que manipular la base de datos. En el caso de Access no necesitamos
indicar ningn nombre de usuario, por eso vers la instruccin:

String user = ;

El password del usuario que manipular la base de datos. En el caso de Access tampoco
necesitaremos ningn password, por eso vers la instruccin:

String password = ;

La DSN de la base de datos. DSN significa nombre del origen de datos y es una cadena de texto
algo compleja que contiene informacin sobre el fichero de base de datos que queremos usar. La
parte inicial de la cadena de la DSN siempre ser igual para las bases de datos de Access:
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="

Sin embargo, lo que nos interesa realmente de esta cadena es su parte final, donde hay que indicar el
camino del fichero de base de datos al que accederemos. En nuestro caso, indicaremos el camino de
MANEMPSA.MDB, el fichero de la base de datos.
Observa como indicamos el camino del fichero: Base\\MANEMPSA.MDB
Base es la carpeta donde hemos guardado el fichero, dentro de nuestro proyecto java, y
MANEMPSA.MDB como ya sabes es el fichero de Access que contiene la base de datos. Observa la
necesidad de escribir dos barras.
En el cdigo podrs ver la creacin de la DSN:
String DSN = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+
"Base\\MANEMPSA.MDB";
Finalmente se usa la instruccin
conexion=DriverManager.getConnection(DSN,user,password);
para crear la conexin. Ser necesario aadir un import para la clase DriverManager.
Al igual que con el primer paso, es necesario rodear la creacin de la conexin con un trycatch
para capturar cualquier error inesperado que se pueda producir en este paso.

356

16. Ahora aade el siguiente cdigo a continuacin del anterior:

Este cdigo que acabas de aadir se corresponde con el tercer paso necesario para poder
acceder a una base de datos: Creacin del objeto Sentencia.
El objeto sentencia ser el que nos permita ejecutar rdenes SQL sobre la base de datos. Es
decir, el objeto que nos permite actuar y manipular la base de datos. Este objeto es vital, y
es el objetivo de toda esta preparacin.
El objeto sentencia se crea a partir del objeto conexin creado en el paso anterior, usando la
siguiente instruccin:
sentencia=conexion.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);

Y como sucedi en los dos pasos anteriores, es necesario rodear esta instruccin con un
trycatch para capturar cualquier tipo de error inesperado que se pudiera producir.

17. As pues ya tenemos preparado nuestro programa para acceder a la base de datos.
Esta preparacin se realiza en el momento en que se ejecuta el programa, ya que
hemos introducido este cdigo en el constructor.
Es cierto que este cdigo puede resultar bastante abstracto y complejo, pero tiene la
gran ventaja de que siempre es igual.
Para nuestros ejercicios, solo tendremos que cambiar el nombre de la base de datos
que se est usando en ese momento. El resto del cdigo queda igual.
Observa:

357

El mtodo PrepararBaseDatos
siempre ser igual, solo cambiar el
nombre de la base de datos a usar.

18. El objetivo de todo este cdigo de preparacin para el acceso al fichero de la base de
datos es obtener un objeto llamado sentencia que nos posibilitar la manipulacin de
los datos de la base de datos, usando rdenes SQL.
En este ejercicio guiado usaremos el objeto sentencia para averiguar informacin
acerca de los trabajadores.

358

REALIZAR CONSULTAS SQL USANDO EL OBJETO SENTENCIA

19. Cuando se pulse el botn Ver Datos de Trabajadores tendremos que extraer los
datos de la tabla trabajadores para poder mostrarlos. Para ello, escribe el siguiente
cdigo dentro del evento actionPerformed del botn btnVerDatos:

Observa el cdigo:
ResultSet r = sentencia.executeQuery(select * from trabajadores order by nombre);

El objeto sentencia se usa para dar rdenes a la base de datos. Esas rdenes se dan
usando el lenguaje de consulta SQL.
Se usa el mtodo executeQuery del objeto sentencia para ejecutar la consulta SQL
select * from trabajadores order by nombre. Esta consulta extraer
todos los datos de la tabla trabajadores ordenados por nombre.
El mtodo executeQuery recibe como parmetro una cadena representando la
consulta SQL. No es necesario indicar el punto y coma final de la consulta SQL.
El resultado de la consulta se guarda en un objeto del tipo ResultSet al que se ha
llamado simplemente r. Los objetos ResultSet almacenan el resultado de una
consulta SQL. (Ser necesario incluir el import necesario para la clase ResultSet)
Y como puedes observar, es necesario rodear la ejecucin de una consulta SQL con
un trycatch para capturar errores inesperados al realizar la consulta.

359

LOS OBJETOS RESULTSET

20. Debes imaginarte el objeto ResultSet r como una tabla que contiene el resultado de
la consulta SQL que se ha ejecutado. En nuestro caso, la consulta SQL que hemos
ejecutado ha extrado toda la tabla trabajadores. Por tanto nuestro ResultSet contiene
toda la tabla trabajadores.
El objeto r por tanto podra representarse as:

Trabajadores
DNI

Nombre Apellidos Sueldo Fecha Matricula


BOF
21.123.123-A Ana
Ruiz
1200 02/03/2002 3322-ASR
22.333.444-C Francisco Lpez
1000 01/06/2006 1144-BBB
12.321.567-B Juan
Prez
1120 04/05/2002 4433-ABB
EOF

21. La fila BOF significa comienzo de fichero y representa una fila anterior al primer
registro del ResultSet.
La fila EOF significa final de fichero y representa una fila posterior al ltimo registro
del ResultSet.
La flecha indica la posicin actual donde estamos situados dentro de la tabla del
ResultSet.
22. Aade la siguiente lnea al cdigo del actionPerformed:

El mtodo next del ResultSet har que avancemos una fila en el ResultSet. Es decir,
ahora estaremos situados en la primera fila del ResultSet (la flecha avanza una
posicin)

Trabajadores
DNI

Nombre Apellidos Sueldo Fecha Matricula


BOF
21.123.123-A Ana
Ruiz
1200 02/03/2002 3322-ASR
22.333.444-C Francisco Lpez
1000 01/06/2006 1144-BBB
12.321.567-B Juan
Prez
1120 04/05/2002 4433-ABB
EOF

360

23. Ahora que estamos situados en la posicin del primer trabajador (Ana), podemos
extraer informacin referente a sus campos. Aade el siguiente cdigo al
actionPerformed del botn:

Lo que se ha hecho primero es declarar una variable de cadena llamada info.


Luego, a esta variable se le ha asignado una concatenacin de cadenas:
info="El trabajador se llama "+r.getString("nombre")+" "+r.getString("apellidos")+
" y cobra "+r.getString("sueldo");

Lo interesante de esto es el mtodo getString del objeto ResultSet r. El mtodo


getString permite extraer una cadena con el valor del campo indicado como
parmetro.
En nuestro caso:
r.getString(nombre)
r.getString(apellidos)
r.getString(sueldo)

Extrae el nombre del trabajador actual (Ana)


Extrae los apellidos del trabajador actual (Ruiz)
Extrae el sueldo del trabajador actual (1200)

Luego se muestra la cadena info en un simple JOptionPane.

361

24. Ya puedes ejecutar el programa.

Pulsa el botn
Y aparecer
informacin sobre el
primer trabajador de la
base de datos

25. Sigamos haciendo cambios en el cdigo del botn para entender mejor el
funcionamiento de los ResultSet. Aade la siguiente lnea:

362

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 Fecha Matricula


BOF
21.123.123-A Ana
Ruiz
1200 02/03/2002 3322-ASR
22.333.444-C Francisco Lpez
1000 01/06/2006 1144-BBB
12.321.567-B Juan
Prez
1120 04/05/2002 4433-ABB
EOF

27. Esto quiere decir que si se ejecuta el programa se mostrar informacin sobre
Francisco Lpez. Comprubalo:

28. Los objetos ResultSet poseen diversos mtodos para cambiar la posicin actual en la
tabla del ResultSet. Dicho de otro modo: para mover la flecha. Veamos algunos de
estos mtodos (se supone que el objeto ResultSet se llama r):
r.next();
r.previous();
r.first();
r.last();
r.beforeFirst()
r.afterLast()
r.absolute(n)

Mueve la flecha a la siguiente fila


Mueve la flecha a la fila anterior
Mueve la flecha a la primera fila
Mueve la flecha a la ltima fila
Mueve la flecha a la fila BOF
Mueve la flecha a la fila EOF
Mueve la flecha a la fila n del ResultSet.
Las filas se empiezan a numerar por 1.

363

29. Haga el siguiente cambio en el actionPerformed simplemente para experimentar:

En este caso la flecha se coloca en EOF (afterLast) y luego retrocede una fila
(previous). Por tanto, al ejecutar el programa se mostrarn los datos del ltimo
trabajador. Compruebalo.

Trabajadores
DNI

Nombre Apellidos Sueldo Fecha Matricula


BOF
21.123.123-A Ana
Ruiz
1200 02/03/2002 3322-ASR
22.333.444-C Francisco Lpez
1000 01/06/2006 1144-BBB
12.321.567-B Juan
Prez
1120 04/05/2002 4433-ABB
EOF

364

30. Otro experimento. Cambie ahora el cdigo de esta forma:

Este cdigo coloca la flecha en la fila 2 ( absolute(2) ), luego avanza una fila
(next), luego retrocede una fila (previous) y finalmente retrocede una fila
(previous)
As pues, finalmente, la flecha queda colocada en la primera fila. Por lo tanto se
muestran los datos del primer trabajador. Comprubalo.

Trabajadores
DNI

Nombre Apellidos Sueldo Fecha Matricula


BOF
21.123.123-A Ana
Ruiz
1200 02/03/2002 3322-ASR
22.333.444-C Francisco Lpez
1000 01/06/2006 1144-BBB
12.321.567-B Juan
Prez
1120 04/05/2002 4433-ABB
EOF

365

31. Como ves, podemos movernos dentro del contenido del ResultSet gracias a todos
estos mtodos, para luego poder extraer los datos de la fila correspondiente.
Ahora, estudiaremos la forma de recorrer todas las filas del ResultSet para as extraer
la informacin de todos sus registros.
32. Vamos a modificar nuestro cdigo para que se muestren todos los trabajadores del
ResultSet. Para ello, realiza el siguiente cambio:

En este cdigo se ha inicializado la variable info a la cadena vaca y luego se ha


aadido un bucle bastante interesante:
r.beforeFirst();
while (r.next()) {
info=info+r.getString("nombre")+" "+r.getString("apellidos")+"
"+r.getString("sueldo")+"\n";
}

Analicemos este bucle:


-

Lo primero que se hace es colocar explcitamente la flecha en la fila BOF, es decir,


antes del primer trabajador:
r.beforeFirst();

Luego tenemos un bucle mientras que comienza as:


while (r.next()) {

El mtodo next intenta colocar la flecha en la siguiente fila, y si lo hace bien, devuelve
el valor verdadero. Cuando no se puede avanzar ms, el mtodo next devolver
falso.
As pues, este while significa mientras se haya podido avanzar una fila, haz lo
siguiente. O dicho de otro modo, este bucle se repetir para cada fila de la tabla del
ResultSet.

366

Si analizamos el contenido del bucle, bsicamente veremos una concatenacin de


cadenas dentro de la variable info. En cada vuelta del bucle se concatenar el
nombre, apellidos y sueldo de cada trabajador.
info=info+r.getString("nombre")+" "+r.getString("apellidos")+"
"+r.getString("sueldo")+"\n";

Finalmente se visualiza la variable info en un JOptionPane.

33. Ejecuta el programa y comprueba su funcionamiento.


Al pulsar el botn
Aparecen los datos de todos
los trabajadores de la base
de datos.

34. El bucle que acabas de programar es un cdigo clsico para manipular un


ResultSet. Siempre que quieras recorrer todas las filas del ResultSet hars algo
como esto:
r.beforeFirst();
while (r.next()) {
manipulacin de la fila
}

35. Se ha visto que para obtener un dato de la fila actual se usa el mtodo getString
indicando como parmetro el dato que se quiere obtener.
Por ejemplo:
r.getString(sueldo);
Obtiene el sueldo del trabajador sealado actualmente con la flecha. Este sueldo se
obtiene convertido en cadena.

367

36. Los ResultSet poseen otros mtodos para obtener los datos convertidos en nmeros
como son:
getInt(campo)
y
getDouble(campo)
para obtener el dato en entero o double, respectivamente.
Esto nos permite el realizar operaciones con los datos extrados del ResultSet.

37. Como ejemplo de esto ltimo, realice la siguiente mejora al programa:

En este nuevo cdigo se ha aadido una variable double acumuladora llamada


totalsu, donde sumaremos todos los sueldos.
Dentro del bucle, se van acumulando el sueldo de cada trabajador. Observa el uso de
getDouble para obtener el campo sueldo de forma numrica, en vez de usar
getString:
totalsu=totalsu+r.getDouble("sueldo");
Y finalmente usamos otro JOptionPane para ver la suma de los sueldos calculada.
Ejecuta el programa y comprueba su funcionamiento.

368

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.

369

CONCLUSIN
Para crear un programa Java que pueda usar una base de datos ser necesario
realizar los siguientes pasos:
- Colocar el fichero de base de datos en una subcarpeta de la carpeta del proyecto
java.
- Preparar el acceso a la base de datos (en el constructor)
* Se crearn dos objetos: conexin (Connection) y sentencia (Statement)
* Se cargar el controlador del tipo de base de datos a usar
* Se crear el objeto conexin indicando el fichero de la base de datos.
* Se crear el objeto sentencia a partir del objeto conexin
- Se usar el objeto sentencia para ejecutar consultas SQL en la base de datos.
- Las consultas SQL ejecutadas en la base de datos se almacenan en objetos del tipo
ResultSet

- Un objeto ResultSet tiene forma de tabla conteniendo el resultado de la consulta SQL


* Los objetos ResultSet tienen mtodos para seleccionar el registro de la tabla
* Los objetos ResultSet tienen mtodos que permiten extraer el dato de un
campo en concreto.

370

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Recapitulando
Para hacer una aplicacin java que acceda a una base de datos se tiene que
-

Introducir la base de datos en una subcarpeta del proyecto.


Preparar la base de datos desde el constructor.
Usar el objeto sentencia cada vez que se quiera consultar la base de datos o actuar
sobre ella.
Los resultados de las consultas ejecutadas sobre la base de datos se recogern en
objetos ResultSet que contendrn los datos devueltos por la consulta.
Cerrar la conexin a la base de datos cuando ya no haya que usarla ms.

Consultar la Base de Datos


En la hoja anterior se vio que se puede usar el objeto sentencia para ejecutar una consulta
SQL en la base de datos. Al hacer esto se consigue un objeto ResultSet que contiene el
resultado de la consulta.
El contenido del ResultSet tiene forma de tabla, y podemos extraer la informacin
colocndonos en la fila correspondiente del ResultSet y luego usando los mtodos:
getString
getDouble
getInt
segn queramos extraer el dato en forma de cadena, de nmero real o nmero entero.
En esta hoja guiada se insistir sobre la forma de manipular los datos contenidos en un
ResultSet

371

EJERCICIO GUIADO N 1
PLANTEAMIENTO
Se quiere realizar una pequea aplicacin de base de datos que nos muestre informacin
sobre los servicios realizados en la empresa MANEMPSA. Para ello, siga los pasos que se
indican a continuacin:

1. Entre en NetBeans. Crea un nuevo proyecto llamado ServiciosBD. Dentro de este


proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un
JFrame llamado ventanaprincipal:

2. En la parte superior de la ventana aade un botn con el texto Ver Datos Servicios
que se llame btnServicios.

3. Se pretende simplemente que al pulsar el botn btnServicios aparezcan en un


JOptionPane datos sobre los servicios almacenados en la base de datos.

SITUACIN DEL FICHERO DE BASE DE DATOS


4. Como se vio en la hoja anterior, interesa colocar el fichero de la base de datos que se
va a usar en una subcarpeta de la carpeta de proyecto que se est haciendo.
As pues, entre en la carpeta de proyecto ServiciosBD

5. Y dentro de ella crea una carpeta Base. Dentro de la carpeta Base copia el fichero de
base de datos MANEMPSA.MDB, el cual se encuentra dentro de la carpeta Mis
Documentos.

372

Copia aqu dentro


el fichero de base
de datos
MANEMPSA.MDB

6. Ahora ya podemos volver al NetBeans y continuar con nuestro trabajo.

PREPARACIN DE LA APLICACIN JAVA PARA EL ACCESO A LA BASE DE DATOS


7. Preparar nuestro proyecto para que permita el acceso a la base de datos
MANEMPSA.MDB es un proceso complejo, aunque afortunadamente siempre se
hace igual.
Solo tiene que aadir el siguiente cdigo a su ventana principal:

Declara los objetos


globales conexin y
sentencia

Haz la llamada al mtodo


PrepararBaseDatos

373

Recuerda que el mtodo PrepararBaseDatos


siempre ser igual, solo tienes que indicar aqu el
nombre de la base de datos a usar.

REALIZAR CONSULTAS SQL USANDO EL OBJETO SENTENCIA


8. Ahora que hemos preparado nuestro proyecto para poder usar la base de datos
MANEMPSA.MDB, ya podemos programar el botn para visualizar los servicios.
Entra dentro del actionPerformed de este botn y programa lo siguiente:

374

Si observas el cdigo, lo que hace es ejecutar la consulta SQL


select * from servicios order by cantidad
la cual extrae todos los servicios almacenados en la tabla servicios ordenados por
cantidad de menor a mayor.
El resultado de esta consulta se almacena en un ResultSet y se usa un bucle tpico
que recorre el ResultSet y muestra el tipo de cada servicio y la cantidad:
while (r.next()) {
info=info+r.getString("tipo")+" "+r.getString("cantidad")+"\n";
}

Puedes ejecutar el programa para ver como funciona.

9. Aunque no es vital para el programa, aadamos el cierre de la conexin de la base


de datos en el windowClosing de nuestra ventana:

375

EXTRAER FECHAS DEL RESULTSET


10. Se va a mejorar el programa de forma que se muestre de cada servicio el tipo, la
cantidad y la fecha en que se hizo. Por tanto, haz el siguiente cambio en el cdigo del
actionPerformed del botn btnServicios:

Simplemente estamos cambiando la concatenacin de la cadena info de forma que


aparezca la fecha de cada servicio, el tipo y la cantidad.

11. Ejecuta el programa y observa el resultado.

376

Como se puede ver, las


fechas aparecen en orden
cambiado (ao-mes-dia)
Y adems incluyen el formato
de hora.

12. Como se ha podido observar, las fechas extradas del ResultSet tienen un formato
distinto al que usamos normalmente.
Para mejorar la presentacin de las fechas extradas del ResultSet haz los siguientes
cambios en el cdigo:

377

El cdigo se ha mejorado de forma que la fecha aparezca en un formato espaol


correcto. Ejecuta el programa para comprobar el resultado:

Observa como ahora las


fechas aparecen
correctamente

378

13. Estudiemos el cdigo que acabamos de aadir:


Lo primero que se ha hecho es crear varias variables de cadenas para contener el
da, mes y ao de la fecha as como la fecha completa.
String
String
String
String

cadfecha; //cadena para fechas


caddia; //cadena para el dia
cadmes; //cadena para el mes
cadanio; //cadena para el ao

Dentro del bucle extraemos la fecha del ResultSet y la almacenamos en la variable


cadfecha:
cadfecha=r.getString("fecha");
Ahora mismo, la variable cadfecha contendr una cadena como la siguiente:
2

Para extraer el ao de la cadena, extraemos los caracteres comprendidos entre la


posicin 0 y la posicin 3. Esto se hace usando el mtodo substring de la siguiente
forma:
cadanio=cadfecha.substring(0,4);
Para extraer el mes de la cadena, tendremos que extraer los caracteres
comprendidos entre la posicin 5 y la posicin 6. Esto se hace usando el mtodo
substring de la siguiente forma:
cadmes=cadfecha.substring(5,7);
Para extraer el dia de la cadena, tendremos que extraer los caracteres comprendidos
entre la posicin 8 y la posicin 9 de la cadena. Esto se hace usando el mtodo
substring de la siguiente forma:
caddia=cadfecha.substring(8,10);
Una vez extrados dia, mes y ao, de la cadena, podemos concatenarlos formando
una fecha en formato dia/mes/ao de la siguiente forma:
cadfecha=caddia+"/"+cadmes+"/"+cadanio;
As pues, finalmente tenemos una variable cadfecha que ser la que se visualizar en
el JOptionPane:
info=info+cadfecha+" "+r.getString("tipo")+" "+
r.getString("cantidad")+"\n";

379

PRESENTACIN DE COMAS DECIMALES


14. Ahora mejoraremos el programa para que los costes de los servicios aparezcan con
coma decimal, en vez de punto decimal:

Haremos que aqu aparezcan


comas, en vez de puntos

Modifica el cdigo de la siguiente forma:

380

Se ha aadido una variable de cadena llamada cadcoste que almacenar el coste de


cada servicio.
En el cdigo del bucle, recogemos la cantidad en dicha variable y luego usamos el
mtodo de cadena replace para reemplazar los puntos por comas:
cadcoste=r.getString("cantidad");
cadcoste=cadcoste.replace(".",",");

Finalmente, mostramos la cadena de coste en la concatenacin:


info=info+cadfecha+" "+r.getString("tipo")+" "+cadcoste+"\n";

Ejecuta el programa y observa el resultado:

381

Ahora ya tenemos las comas


decimales

VALORES NULOS
15. Es posible que algn campo de algn registro de la tabla est vaco. Es decir, que
sea nulo. Si esto ocurre, entonces al extraer dicho dato de la tabla usando getString
aparecer el valor null en el JOptionPane.
16. Para comprobar esta circunstancia, agrega un nuevo botn a la ventana principal con
el texto Ver Datos de Clientes. Llmalo por ejemplo btnClientes.
17. Al pulsar este botn aparecer el listado de clientes de la empresa. Concretamente
debe aparecer el nombre del cliente, el telfono 1 y el telfono 2. Para ello aade el
siguiente cdigo dentro del evento actionPerformed del botn.

382

Este cdigo es prcticamente igual que el anterior. Simplemente ejecuta una consulta
SQL usando el objeto sentencia que permite extraer el contenido de la tabla clientes,
y luego recorre el ResultSet mostrando los campos nombre, telfono 1 y telfono 2 en
un JOptionPane.
18. Ejecuta el programa ahora y prueba a pulsar este nuevo botn. Observa el resultado.
Cada vez que un cliente no tenga un telfono, aparecer el valor null en el
JOptionPane:

383

19. Vamos a arreglar esto de forma que aparezca el texto no tiene en vez de la cadena
null. Modifique el cdigo como se indica:

Como puedes ver, lo que se hace ahora es comprobar si el valor extrado del
ResultSet es null, y en ese caso, se concatena la cadena no tiene. En caso contrario
se concatena el valor del campo.

384

CONCLUSIN
A travs del objeto sentencia podemos ejecutar una consulta SQL en una base de
datos.
El resultado de la consulta se almacena en un objeto del tipo ResultSet.
Al extraer el valor de un campo fecha desde el objeto ResultSet observaremos que
tiene el siguiente formato:
Ao Mes Dia Hora : Minutos : Segundos
As pues puede ser necesario realizar cambios en esta cadena.
Al extraer el valor de un campo numrico real, obtendremos un nmero con punto
decimal. Quizs sea necesario cambiar este punto por una coma decimal.
Cuando un campo est vaco, al intentar extraer su valor obtendremos el valor null.

385

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Recapitulando. Ejecucin de consultas desde la aplicacin.


Para ejecutar una consulta sobre la base de datos desde tu aplicacin java se tiene que
ejecutar una instruccin usando el objeto sentencia de la siguiente forma:
ResultSet r = sentencia.executeQuery(consulta_sql);
La consulta_sql es una cadena que tiene forma de consulta SQL bien escrita (sin fallos). Por
ejemplo:
String consulta;
consulta=select * from trabajadores;
ResultSet r = sentencia.executeQuery(consulta);

En este cdigo que se acaba de mostrar, se crea una cadena llamada consulta. Se le asigna
a esta cadena una instruccin SQL para extraer todos los trabajadores, y finalmente se
ejecuta dicha instruccin SQL usando el objeto sentencia.
La cadena consulta puede ser construida a travs de concatenaciones de cadenas. Observa
atentamente este ejemplo. Es parecido al anterior pero tiene una ligera diferencia:

//Supongamos que txtTabla es un cuadro de texto


String consulta;
consulta=select * from + txtTabla.getText();
ResultSet r = sentencia.executeQuery(consulta);

En este caso, la cadena consulta es la concatenacin de


select * from
con
lo que contenga el cuadro de texto txtTabla - es decir, txtTabla.getText()

La gran ventaja de esto, es que el usuario podr escribir el nombre de una tabla cualquiera
dentro del cuadro de texto txtTabla y al ejecutarse este cdigo se extraer el contenido de
dicha tabla.
Es decir, el usuario podr decidir lo que quiere consultar. El usuario afecta a la construccin
de la consulta SQL, y por tanto, tiene cierto control sobre esta consulta.

La construccin de consultas SQL a partir de la concatenacin de cadenas y datos


proporcionados por el usuario es algo muy usado en los programas de base de datos. En
esta hoja guiada se insistir en esta idea.

386

EJERCICIO GUIADO N 1
PLANTEAMIENTO
Se quiere realizar una aplicacin de base de datos que nos muestre informacin sobre los
trabajadores de la empresa MANEMPSA.
Esta aplicacin le dar al usuario la capacidad de elegir la informacin que quiere extraer de
la base de datos. Es decir, el usuario tendr cierto control sobre las consultas que se
realicen.

1. Entre en NetBeans. Crea un nuevo proyecto llamado TrabajadoresBD. Dentro de


este proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un
JFrame llamado ventanaprincipal:

2. Aade a la ventana un JTextPane y un botn de momento:

El botn se llamar btnTodos y el JTextPane se llamar txtPanel.

387

3. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que
prepararlo haciendo lo siguiente:
-

Crear la subcarpeta Base y copiar en ella el fichero de base de datos


MANEMPSA.MDB que tiene en la carpeta Mis Documentos.

Aadir al programa los objetos conexin (Connection) y sentencia (Statement)


como globales.

Crear el procedimiento PrepararBaseDatos y llamarlo desde el constructor.

Cerrar la conexin desde el evento windowClosing

Realice estos cuatro pasos que se han indicado antes de continuar.


4. Ya se puede programar el botn btnTodos. Se pretende que al pulsar este botn
aparezca en el panel txtPanel el contenido de la tabla trabajadores. Para ello,
programe el siguiente cdigo dentro del actionPerformed del botn btnTodos:

388

Si analiza este cdigo, ver que es igual al que hemos realizado en hojas anteriores.
Bsicamente lo que hace es lo siguiente:
-

Ejecuta la consulta select * from trabajadores order by sueldo

Luego extrae del ResultSet los campos nombre, apellidos, sueldo y fecha.

Hay que indicar que al campo sueldo se le cambia el punto decimal por la coma
decimal.

Por otro lado, la fecha se transforma para que tenga el formato dia/mes/ao

Finalmente se muestra el resultado de la consulta en el JTextPane: txtPanel.


(Antes de mostrarlo se borra todo lo que hubiera en el panel)

5. Ejecuta el programa y prueba el funcionamiento de este botn:

389

Al pulsar el botn, se
muestran los datos de
todos los trabajadores.

6. Se va a mejorar el programa. Aada un cuadro de texto llamado txtSueldo y luego


tres botones llamados respectivamente btnMayor, btnMenor y btnIgual. La parte
inferior de la ventana quedar as:

7. Se pretende que estos botones funcionen de la siguiente forma:


-

El usuario introducir un sueldo en el cuadro de texto txtSueldo.


Luego, si pulsa el botn Igual, aparecer en el panel todos los trabajadores
que tengan un sueldo igual al introducido.
En cambio, si pulsa el botn Mayor, aparecer en el panel todos los
trabajadores que tengan un sueldo mayor que el introducido.
Y si pulsa el botn Menor, aparecer en el panel todos los trabajadores que
tengan un sueldo menor que el introducido.

Se empezar programando el botn Igual.

390

8. Programe en el actionPerformed del botn btnIgual lo siguiente. (Nota: El cdigo


siguiente es prcticamente igual al anterior, solo se hace un pequeo cambio. Puede
copiar y pegar y luego hacer la modificacin que se indica)

Estudiemos detenidamente el cdigo remarcado:


String consulta;
consulta = select * from trabajadores where sueldo = +txtSueldo.getText();
ResultSet r = sentencia.executeQuery(consulta);

Aqu se crea una variable de texto llamada consulta y luego se concatena en ella la cadena:
select * from trabajadores where sueldo =

con
lo que contenga el cuadro de texto sueldo es decir txtSueldo.getText()

Si el cuadro de texto del sueldo contuviera un 1000, entonces la cadena resultante sera:
select * from trabajadores where sueldo = 1000

Es decir, se construye una consulta que busca los sueldos de 1000 euros.

391

9. Prueba a ejecutar el programa. Escribe un valor 1000 en el cuadro de texto y luego


pulsa el botn Igual. El resultado ser que aparecen solo los trabajadores que tengan
1000 de sueldo.

Al pulsar el botn
Igual se construye
una consulta usando
el contenido del
cuadro de texto
txtSueldo.
Al ejecutarse la
consulta se muestran
los trabajadores de
1000 euros.

10. Programa ahora el botn Mayor que de la siguiente forma (El cdigo es
prcticamente igual al anterior, as que puedes usar copiar y pegar. Se indica con
una flecha la pequea diferencia)

392

Como se puede observar, el cdigo es igual. Simplemente cambia el operador en la


cadena que se concatena. Ahora se usa un mayor que.
Es decir, si el usuario introdujera un 1000 en el cuadro de texto del sueldo, el
resultado de la concatenacin en la variable consulta sera la siguiente cadena:
select * from trabajadores where sueldo > 1000

11. Prueba a ejecutar el programa introduciendo el valor 1000 en el sueldo y luego


pulsando el botn Mayor que. El resultado ser que aparece en el panel de texto los
trabajadores que cobran ms de 1000 euros.
12. Como prctica, programe el botn Menor que de forma que muestre aquellos
trabajadores que cobren menos de la cantidad introducida en el cuadro de texto
txtSueldo.

393

13. Vamos a seguir mejorando el programa. Aada ahora el siguiente cuadro de texto y
los siguientes botones:

El cuadro de texto se llamar txtNombre mientras que el botn Igual a se llamar


btnNombreIgual y el botn Contiene a se llamar btnContiene.

14. Estos botones funcionarn de la siguiente forma:


-

El usuario introducir un nombre en el cuadro de texto txtNombre.

Si luego pulsa el botn Igual a, entonces aparecern todos aquellos


trabajadores que tengan exactamente dicho nombre.

Si en cambio pulsa el botn Contiene a, entonces aparecern todos aquellos


trabajadores cuyo nombre contenga la palabra que se haya escrito en el
cuadro de texto.

15. Empezaremos programando el botn Igual a. Para ello, escriba el siguiente cdigo
dentro del botn (este cdigo es parecido a los anteriores, puede usar copiar y pegar
y luego realizar las modificaciones pertinentes)

394

Observa la modificacin del cdigo. Puedes ver que la consulta SQL se consigue
concatenando tres cadenas (se han puesto en color para facilitar la comprensin):
Primera cadena: select * from trabajadores where nombre =
Segunda cadena: lo que contenga el cuadro de texto: txtNombre.getText()
Tercera cadena:
Supongamos que el cuadro de texto contiene la palabra Ana, el resultado de la
concatenacin sera:
select * from trabajadores where nombre = Ana

Es decir, el resultado de la concatenacin sera una consulta SQL que muestra aquellos
trabajadores que tengan de nombre Ana.
NOTA:
Recuerda que cuando se especifica un valor de tipo texto en una consulta SQL, es
necesario que est rodeado de comillas simples ()
Esa es la razn por la que se tienen que concatenar dos

395

16. Ejecuta el programa y prueba a escribir en el cuadro de texto del nombre Ana. Luego
pulsa el botn Igual a

Se escribe Ana en el
cuadro de texto y al
pulsar el botn Igual
a se construye una
consulta SQL que
muestra a los
trabajadores con el
nombre Ana.

17. Ahora programaremos el botn Contiene a de forma que el usuario escriba un texto
en el cuadro del nombre, y al pulsar el botn Contiene a aparezcan todos aquellos
trabajadores cuyo nombre contenga el texto escrito.
Por ejemplo, si el usuario introduce el texto an en el cuadro, al pulsar Contiene a
aparecern los trabajadores que se llamen: Juan, Antonio, Antonia, Manolo, Ana, etc
(todos contienen el texto an)

18. Para ello programe lo siguiente en el actionPerformed del botn Contiene a (es un
cdigo muy parecido al anterior, solo tiene que realizar una pequea modificacin)

396

En este caso, para crear la consulta se concatenan tres cadenas (se indican en color para
facilitar la comprensin)
Primera cadena: select * from trabajadores where nombre like %
Segunda cadena: lo que contenga el cuadro de texto: txtNombre.getText()
Tercera cadena: %
Supongamos que escribimos en el cuadro de texto del nombre la palabra an, el resultado de
la concatenacin sera el siguiente:
select * from trabajadores where nombre like %an%
La condicin nombre like %an% significa que contenga la palabra an.
NOTA:
Cuando se estudiaron las consultas SQL, se vio que el operador like funcionaba a travs de
asteriscos. Es decir, la forma correcta de indicar la condicin anterior sera la siguiente:
nombre like *an*
Sin embargo, hay que decir que el asterisco se debe usar solamente cuando estamos
manipulando una base de datos de Access desde dentro. En el caso de que queramos
acceder a ella desde una aplicacin java se usarn porcentajes % en vez de asteriscos.

397

19. Ejecuta el programa y prueba a escribir en el cuadro de texto del nombre el texto fra.
Luego pulsa el botn Contiene a y comprueba el resultado. Deben aparecer todos
aquellos trabajadores cuyo nombre contenga el texto fra. Por ejemplo, Francisco.

Se escribe fra, se
pulsa el botn
Contiene a, y
entonces el
programa construye
una consulta que
muestra los
trabajadores cuyo
nombre contenga
fra.

20. Sigamos mejorando el programa. Aade estos cuadros de texto y estos botones:

txtDia

txtMes

txtAnio

btnAnterior

398

btnDespues

21. El objetivo de estos elementos aadidos es el siguiente:


-

El usuario introducir una fecha (da, mes y ao) en los cuadros de texto
txtDia, txtMes, txtAnio.

Luego, si pulsa el botn Anterior, aparecern los trabajadores que hayan


entrado en la empresa antes de la fecha indicada.

Si pulsa el botn Despus, en cambio, aparecern los trabajadores que hayan


entrado en la empresa despus de la fecha indicada.

22. Empezaremos programando el botn Anterior. Accede a su actionPerformed e


incluye el siguiente cdigo (es un cdigo similar al anterior, solo tienes que realizar un
pequeo cambio):

Presta mucha atencin al cdigo remarcado. En l, se construye una consulta que permite
mostrar aquellos trabajadores cuya fecha de entrada en la empresa sea anterior a la
indicada en los cuadros de texto.
Esto se consigue concatenando varias cadenas (se indican a continuacin en distintos
colores para facilitar la comprensin)

399

Primera cadena: select * from trabajadores where fecha < #


Segunda cadena: lo que contiene el cuadro de texto del mes: txtMes.getText()
Tercera cadena: /
Cuarta cadena: lo que contiene el cuadro de texto del da: txtDia.getText()
Quinta cadena: /
Sexta cadena: lo que contiene el cuadro de texto del ao: txtAnio.getText()
Sptima cadena: #
Por ejemplo, supongamos que:
-

en el cuadro txtDia se introdujo un 20.


en el cuadro txtMes se introdujo un 12.
En el cuadro txtAnio se introdujo un 2005.

Entonces, la cadena resultante de la concatenacin ser:


select * from trabajadores where fecha < #12/20/2006#

Es decir, la cadena resultante es una consulta SQL que busca los trabajadores cuya fecha
de entrada en la empresa sea anterior al 20 del 12 del 2006

NOTA:
Recuerda que para que Access entienda las fechas al hacer una consulta SQL, es necesario
indicarlas en el formato mes/dia/ao.
Por otro lado, recuerda que las fechas deben estar rodeadas por almohadillas #

23. Ejecuta el programa y prueba a introducir una fecha en las casillas correspondientes.
Luego pulsa el botn Anterior y observa como aparecen los trabajadores que
entraron antes de la fecha indicada.

400

Introduce un da,
mes y ao en los
cuadros
correspondientes.
Al pulsar el botn
Anterior, el
programa
mostrar los
trabajadores que
hayan entrado
antes de esa
fecha.

24. Como ejercicio se propone que programe el botn Despus. Al pulsar este botn, se
mostrarn los trabajadores que hayan entrado antes de la fecha indicada en los
cuadros de texto. El cdigo es prcticamente igual al cdigo del botn Anterior.

401

CONCLUSIN
A travs del objeto sentencia podemos ejecutar una consulta SQL en una base de
datos.
Esta consulta SQL viene expresada como una cadena.
Se puede construir una consulta SQL a travs de la concatenacin de varias cadenas.
Estas cadenas pueden ser datos introducidos por el usuario en cuadros de textos u
otros controles.
Al hacer que el usuario pueda participar en la construccin de la consulta aportando
sus propios datos, le damos la posibilidad de que l decida la informacin que se
quiere extraer de la base de datos. De esta manera se consigue que el programa sea
ms potente.
A tener en cuenta lo siguiente acerca de las consultas SQL ejecutadas desde una
aplicacin java para acceder a una base de datos de Access:
- Los valores tipo texto se indicarn entre comillas simples
- El operador like se usa con porcentajes (%) en vez de con asteriscos (*)
- Las fechas van rodeadas por almohadillas (#)
- Las fechas tienen que indicarse con el formato mes/dia/ao

402

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Recapitulando. Consultas de seleccin. Consultas de Accin.


Al estudiar SQL, vimos que existan dos tipos de instrucciones.
-

Consultas de seleccin (SELECT)


Estas consultas permiten extraer datos de la base de datos. Dicho de otro modo,
permiten visualizar informacin de la base de datos que cumpla un criterio.
Estas consultas no afectan a la base de datos, simplemente muestran informacin
sobre la propia base de datos.

Consultas de accin. (INSERT, DELETE, UPDATE)


Estas consultas realizan una accin sobre la base de datos. Esta accin puede ser:
o
o
o

Insertar un nuevo registro en una tabla (INSERT)


Borrar un registro o registros de una tabla (DELETE)
Modificar los datos de un registro o registros de la tabla (UPDATE)

Ejecucin de consultas de seleccin y de consultas de accin.


Hasta ahora se han realizado programas java que ejecutaban consultas de seleccin sobre
la base de datos.
Recuerda que para ejecutar estas consultas se usa el mtodo executeQuery del objeto
sentencia y el resultado de la consulta se almacena en un objeto ResultSet:
ResultSet r = sentencia.executeQuery(select . . .);

En esta hoja guiada veremos la ejecucin de consultas de accin sobre la base de datos
desde la aplicacin java. Este tipo de consultas se ejecutan usando el mtodo
executeUpdate del objeto sentencia, y no devuelven un resultado concreto, ya que
simplemente actan sobre la base de datos modificando de alguna manera su contenido.
As pues, para realizar un alta en la base de datos se usar:
sentencia.executeUpdate(insert . . .);
Para realizar una modificacin en la base de datos se usar:
sentencia.executeUpdate(update . . . );
Para realizar una eliminacin en la base de datos se usar:
sentencia.executeUpdate(delete . . . );

403

EJERCICIO GUIADO N 1
PLANTEAMIENTO
Se quiere realizar una aplicacin de base de datos que manipule los datos de los
trabajadores de la base de datos MANEMPSA. Esta aplicacin permitir ver el listado de
trabajadores y adems permitir introducir nuevos trabajadores.
1. Entre en NetBeans. Crea un nuevo proyecto llamado GestionTrabajadores. Dentro de
este proyecto crea un paquete principal llamado paqueteprincipal y dentro de l un
JFrame llamado ventanaprincipal:

2. Aade a la ventana un JTextPane y un botn de momento:

El botn se llamar btnTrabajadores y el JTextPane se llamar panelTexto.

404

3. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que
prepararlo haciendo lo siguiente:
-

Crear la subcarpeta Base y copiar en ella el fichero de base de datos


MANEMPSA.MDB que tiene en la carpeta Mis Documentos.

Aadir al programa los objetos conexin (Connection) y sentencia (Statement)


como globales.

Crear el procedimiento PrepararBaseDatos y llamarlo desde el constructor.

Cerrar la conexin desde el evento windowClosing

Realice estos cuatro pasos que se han indicado antes de continuar.


4. Ya se puede programar el botn btnTrabajadores. Se pretende que al pulsar este
botn aparezca en el panel panelTexto el contenido de la tabla trabajadores.
Para ello, en el actionPerformed del botn btnTrabajadores programe lo siguiente:

5. Como puede ver, es una llamada a un mtodo al que se le ha dado el nombre


MostrarTodos. Este mtodo se encargar de mostrar todos los trabajadores en el
panelTexto.
Programe el mtodo MostrarTodos de la siguiente forma:

405

El cdigo de este mtodo no debe resultarle ya desconocido.


Bsicamente lo que hace es ejecutar una consulta SQL que recoge todos los datos de la
tabla trabajadores y luego muestra dichos datos en el panel de la ventana.
Se muestra el listado procurando que las fechas aparezcan con el formato dia-mes-ao, que
los sueldos aparezcan con la coma decimal y que si el campo matrcula fuera nulo o la
cadena vaca , entonces aparezca el texto sin coche.
La razn por la que se ha programado este cdigo en un mtodo aparte llamado
MostrarTodos en vez de hacerlo directamente en el actionPerformed del botn se entender
ms adelante, cuando avancemos en el ejercicio guiado.

6. Ejecute el programa y pruebe el botn btnTrabajadores. Compruebe que realiza su


cometido.

406

7. Ahora que ya tenemos un programa capaz de visualizar a los trabajadores, aada los
siguientes elementos a la ventana principal:

Panel: panelAlta
Cuadros de Texto:
txtDNI
txtNombre
txtApellidos
txtSueldo

txtDia
txtMes
txtAnio
txtMatricula
Botn: btnAlta

8. El objetivo de estos elementos es el siguiente:


El usuario introducir los datos de un nuevo trabajador en las casillas indicadas.
Luego, al pulsar el botn de Alta, se introducir en la tabla trabajadores los datos del
nuevo trabajador y aparecer en el panel la lista actualizada de trabajadores
incluyendo al nuevo que se ha aadido.
Para ello tendrs que programar en el botn Alta lo siguiente:

407

Analicemos este cdigo detenidamente.


Lo primero que hay que tener en cuenta es que se realiza una concatenacin de cadenas
dentro de la variable consulta.
Observa el uso de += para concatenar. Ten en cuenta que es lo mismo poner esto:
consulta += +txtDNI.getText()+,;

que poner esto:


consulta = consulta + +txtDNI.getText()+,;

Solo que el uso de += acorta las instrucciones.


Si se analiza la concatenacin de las cadenas, se observar que el resultado es una
instruccin SQL del tipo INSERT INTO. Es decir, una instruccin SQL que permite la
insercin de un nuevo registro en la tabla trabajadores.
Por ejemplo, supongamos que introducimos los siguientes valores en los cuadros de texto:
txtDNI
txtNombre
txtApellidos
txtSueldo
txtDia
txtMes
txtAnio
txtMatricula

11.111.111-A
Mara
Ruiz
1100
10
4
2001
4433RET

La concatenacin en la variable consulta resultara lo siguiente (en azul los valores de los
cuadros de texto, en rosa las cadenas que se concatenan):
insert into trabajadores values (11.111.111-A,Mara,Ruiz,1100,#4/10/2001#,4433RET)

408

Es decir, se sigue la misma estrategia que en la hoja anterior. Se concatenan trozos de


cadenas y datos introducidos por el usuario hasta conseguir una cadena con forma de
instruccin SQL.
En este ejemplo, la instruccin SQL construida por concatenacin es una instruccin
INSERT INTO que permite introducir en la tabla trabajadores los datos de un nuevo
trabajador.
El objeto que se encarga de ejecutar dentro de la base de datos la instruccin SQL recin
construida es el objeto sentencia:
sentencia.executeUpdate(consulta);
Como se puede observar, para ejecutar instrucciones SQL de accin ya no se usa el mtodo
executeQuery, sino que se usa el mtodo executeUpdate.
Una vez ejecutada la introduccin del nuevo registro en la base de datos, se llama al
procedimiento MostrarTodos el cual se encarga de mostrar todo el contenido de la tabla
trabajadores en el panel de texto. Gracias a este mtodo, veremos como se rellena el panel
y observaremos al nuevo registro recin introducido.
La razn de que se programara aparte el mtodo MostrarTodos para mostrar el listado
completo de trabajadores ha sido debido a la intencin de llamar a este mtodo desde otros
lugares del programa. Es decir, la intencin ha sido centralizar cdigo y evitar su repeticin.
Hay que tener en cuenta que todo este cdigo est rodeado de un try ... catch para evitar
cualquier error inesperado. Ten en cuenta que pueden producirse errores fcilmente si
introducimos valores incorrectos en los cuadros de texto.

9. Finalmente ejecute el programa y compruebe su funcionamiento aadiendo varios


trabajadores a la tabla:

409

Introduce datos y
pulsa el botn
Alta.

En la parte
superior aparecer
el listado completo
incluyendo al
nuevo trabajador
introducido.

410

CONCLUSIN
Se pueden ejecutar instrucciones SQL del tipo INSERT INTO (insertar registros)
usando el objeto sentencia.
Para este tipo de instrucciones hay que usar el mtodo executeUpdate.
Normalmente, ser necesario construir una cadena de consulta a travs de la
concatenacin de subcadenas y datos introducidos por el usuario en cuadros de
texto.
Este tipo de instrucciones SQL no devuelven ningn ResultSet, ya que no extraen
datos de las tablas, sino que modifican el contenido de stas.

411

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Consultas de Accin. Bajas.


En la hoja guiada anterior se vio como se podan ejecutar consultas SQL de accin del tipo
INSERT INTO (para insertar registros en las tablas de la base de datos)
En esta hoja guiada se practicar con otras consultas SQL de accin. Concretamente con
las del tipo DELETE (usadas para eliminar registros de las tablas de la base de datos)
Al igual que ocurre con las consultas INSERT INTO, las consultas DELETE haya que
ejecutarlas usando el mtodo executeUpdate del objeto sentencia.
sentencia.executeUpdate(delete . . . );
Al ejecutar estas consultas se cambiar el contenido de las tablas de la base de datos y no
se devolver ningn ResultSet.

412

EJERCICIO GUIADO N 1
PLANTEAMIENTO
Se mejorar el proyecto realizado en la hoja anterior de forma que no solo admita la
insercin de nuevos trabajadores en la tabla trabajadores de la base de datos MANEMPSA,
sino que tambin permite eliminar a trabajadores de la tabla.

1. Entre en NetBeans. Abre el proyecto llamado GestionTrabajadores que se program


en la hoja anterior.
2. Aade en la parte inferior de la ventana un nuevo panel:

Panel: panelBajas
Cuadro de texto: txtDNIEliminar
Botn: btnEliminar

3. La mejora que se pretende hacer es la siguiente:


-

El usuario introducir en el cuadro de texto txtDNIEliminar el DNI del


trabajador que quiere eliminar.

Al pulsar el botn Eliminar el trabajador con dicho DNI se eliminar de la


tabla.

Antes de eliminar al trabajador, se le pedir al usuario una confirmacin, para


evitar un borrado accidental.

Si el DNI introducido no se correspondiera con ningn trabajador de la tabla,


entonces se mostrar un mensaje indicndolo.

413

4. Para hacer esto, entre en el actionPerformed del botn Eliminar y programe lo


siguiente:

Se va a analizar este cdigo. Estdielo con detenimiento:


Lo primero interesante que encontrar es la construccin de una consulta de seleccin
(SELECT) usando la tpica concatenacin de cadenas:
consulta="select * from trabajadores where DNI='"+txtDNIEliminar.getText()+"'";
ResultSet r=sentencia.executeQuery(consulta);

Esto se hace para extraer aquellos trabajadores que tengan el DNI introducido en el cuadro
de texto txtDNIEliminar. La idea es saber si existe en la tabla algn trabajador con dicho DNI.
Al ejecutar esta consulta, el ResultSet r se llenar con trabajadores que tengan ese DNI.
Observe el cdigo que viene a continuacin:
if (!r.first()) {
Este if significa: si no puedo colocarme en el primer elemento del ResultSet r.

414

Si no es posible colocarse en el primer elemento del resultado de la consulta ser porque no


hay un primer elemento, o dicho de otra forma, porque el ResultSet est vaco, o dicho de
otra forma ms, porque no se encontr a nadie que tuviera el DNI indicado.
Si esto fuera as, no existe un trabajador con dicho DNI y por tanto no puede ser borrado. As
pues se muestra un mensaje con un JOptionPane indicando dicha circunstancia.
En caso contrario, existe ese trabajador y por tanto podemos borrarlo. Observa el contenido
del else:
resp=JOptionPane.showConfirmDialog(null,"Confirma el borrado?",
"Borrar",JOptionPane.YES_NO_OPTION);
if (resp==JOptionPane.YES_OPTION) {

Este trozo de cdigo le pregunta al usuario si quiere borrar realmente al trabajador. Si la


respuesta es s (YES_OPTION) se efectuar el borrado tal como se indica a continuacin:
consulta="delete from trabajadores where DNI='"+txtDNIEliminar.getText()+"'";
sentencia.executeUpdate(consulta); //se ejecuta la eliminacion
MostrarTodos(); //y se muestra la tabla de nuevo

Como puede observar, se construye a travs de una concatenacin, una consulta de accin
SQL del tipo DELETE, que nos permitir borrar el trabajador con el DNI introducido.
Luego se ejecuta dicha instruccin usando el mtodo executeUpdate del objeto sentencia
(recuerde que usar siempre executeUpdate para ejecutar consultas de accin: altas,
eliminacin y modificacin)
Finalmente se llama de nuevo al mtodo que creamos en la hoja anterior que muestra todo
el contenido de la tabla trabajadores, y de esta forma podremos comprobar el borrado del
trabajador.
En caso de que el usuario no haya confirmado el borrado, el cdigo muestra un mensaje
Borrado cancelado por el usuario.
Por otro lado, todo este cdigo es susceptible de sufrir errores inesperados, por lo que est
rodeado por un try ... catch.

5. Ejecute el programa y pruebe a eliminar trabajadores de la tabla. Se recomienda que


pruebe a introducir DNIs inexistentes, para ver que ocurre. Pruebe tambin la
confirmacin del borrado: responda a veces que s y otras veces que no.

415

Introduzca el DNI del trabajador


que quiere borrar y luego pulse
Eliminar.
Al hacerlo el listado se actualizar
y ya no mostrar el trabajador con
dicho DNI ya que habr sido
borrado.
Si el DNI no existiera el borrado no
se producira y mostrara un
mensaje de error.

416

CONCLUSIN
Se pueden ejecutar instrucciones SQL del tipo DELETE (borrar registros) usando el
objeto sentencia.
Para este tipo de instrucciones hay que usar el mtodo executeUpdate.
Normalmente, ser necesario construir una cadena de consulta DELETE a travs de la
concatenacin de subcadenas y datos introducidos por el usuario en cuadros de
texto.
Este tipo de instrucciones SQL no devuelven ningn ResultSet, ya que no extraen
datos de las tablas, sino que modifican el contenido de stas.
Para realizar borrados ser necesario habitualmente el comprobar que los registros a
borrar existen en la tabla. Esto se har ejecutando una consulta SELECT y
comprobando si el ResultSet resultante contiene algn registro, usando el mtodo
first.
Tambin se recomienda pedir confirmacin al usuario antes de realizar borrados en
las tablas.

417

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Consultas de Accin. Modificaciones.


Las consultas SQL de accin son:
-

INSERT INTO (permiten introducir nuevos registros en las tablas)


DELETE (permiten eliminar registros de las tablas)
UPDATE (permiten modificar los registros de las tablas)

Estas consultas SQL se ejecutan desde el programa a travs del mtodo executeUpdate
propio del objeto sentencia.
Estas instrucciones SQL afectan al contenido de la base de datos y no devuelven ningn
resultado. Es decir, no extraen datos, y por tanto no devuelven un ResultSet.
En las hojas anteriores se ha visto como ejecutar consultas INSERT INTO y DELETE. En
esta hoja guiada veremos como ejecutar consultas de accin de modificacin: UPDATE.

418

EJERCICIO GUIADO N 1
PLANTEAMIENTO
Se mejorar el proyecto realizado en la hoja anterior de forma que no solo permita aadir y
borrar trabajadores de la tabla trabajadores de la base de datos MANEMPSA, sino que
tambin permita realizar modificaciones en los datos de los trabajadores de dicha tabla.

1. Entre en NetBeans. Abre el proyecto llamado GestionTrabajadores que se program


en la hoja anterior.
2. Modifique la ventana principal aadiendo un nuevo panel con los siguientes
componentes:
Nuevo panel

El panel se llamar
panelModificar
El botn es btnBuscar
Los cuadros de texto se
llaman respectivamente:
txtModDNI
txtModNombre
txtModApellidos
txtModSueldo
txtModDia
txtModMes
txtModAnio
txtModMatricula
El botn es btnModificar

419

3. La mejora que se pretende hacer es la siguiente:


-

El usuario introducir en el cuadro de texto txtModDNI el DNI del trabajador


cuyos datos se quieren modificar.

Al pulsar el botn Buscar, el resto de cuadros de texto se rellenarn con los


datos del trabajador al que pertenece dicho DNI. (Si dicho DNI no existiera, se
mostrara un mensaje de error)

Cuando aparezcan los datos del trabajador en los cuadros de texto, el usuario
podr realizar las modificaciones pertinentes.

Al pulsarse el botn Efectuar Modificacin se modificarn los datos en la


tabla.

4. Primero programaremos el botn de bsqueda. Entre en el actionPerformed de este


botn y programe lo siguiente:

Estudiemos atentamente el cdigo anterior:

420

Lo primero que hace el cdigo es construir una consulta de seleccin que busque a todos los
trabajadores que tengan el DNI introducido en el cuadro de texto txtModDNI.
Ejecuta la consulta y almacena el resultado en un tpico ResultSet. Luego comprueba a
travs del siguiente if si no existe un trabajador con dicho DNI en el ResultSet:
if (!r.first()) {

En ese caso muestra un mensaje de error indicando que no se ha encontrado dicho


trabajador.
En caso contrario muestra los datos del trabajador encontrado en los cuadros de texto. Para
ello, se extrae del ResultSet cada campo y se coloca en el cuadro de texto correspondiente.
Por ejemplo:
txtModNombre.setText(r.getText(nombre));

Recoge el valor del campo nombre, y lo sita en el cuadro de texto txtModNombre.


En el caso de la fecha de entrada del trabajador, se extrae la fecha y luego se extrae de la
cadena el da, el mes y el ao, situando cada dato en su cuadro de texto correspondiente.
cadefe = r.getString("fecha");
caddia=cadefe.substring(8,10);
cadmes=cadefe.substring(5,7);
cadanio=cadefe.substring(0,4);
txtModDia.setText(caddia);
txtModMes.setText(cadmes);
txtModAnio.setText(cadanio);

Recuerda que cuando se extrae una fecha de un ResultSet, su formato es:


ao-mes-dia-hora:minutos
Por ejemplo: 2001-12-23-00:00
As pues, si el DNI introducido pertenece a uno de los trabajadores de la tabla, sus datos
aparecern en los cuadros de texto cuando se pulse el botn Buscar.

421

5. Ejecuta el programa y comprueba su funcionamiento. Escribe un DNI en el cuadro del


DNI de bsqueda y pulsa Buscar.

Se introduce un DNI y
luego se pulsa Buscar.
Si existe un trabajador con
ese DNI, sus datos
aparecern en los cuadros
de texto.

6. Se supone que cuando aparezcan los datos del trabajador en los cuadros de texto el
usuario los modificar segn le interese. Luego, al pulsar el botn Efectuar
Modificacin los nuevos datos sern actualizados en la tabla.

7. Para hacer esto, entre en el actionPerformed del botn Efectuar Modificacin y


programe lo siguiente:

422

Se va a analizar este cdigo. Estdielo con detenimiento:


Debe observar que lo primero que se hace en este cdigo es crear una consulta de
actualizacin (UPDATE) a travs de una concatenacin de cadenas.
Si observa la concatenacin, ver que el resultado es una instruccin SQL de tipo UPDATE
en la que los datos que se actualizan son precisamente los datos introducidos en los cuadros
de texto del panel de modificacin.
Por ejemplo, si estos fueran los valores de los cuadros de texto del panel de modificacin:
txtModDNI
11.111.111-A
txtModNombre
Juan
txtModApellidos
Perez
txtModSueldo 1100
txtModDia 4
txtModMes 12
txtModAnio 2001
txtModMatricula 1234-ABC
La instruccin ya construida por concatenacin sera la siguiente:
update trabajadores
set nombre=Juan,apellidos=Perez,sueldo=1100,fecha=#12/4/2001#, matricula=1234-ABC
where dni=11.111.111-A

Esta instruccin SQL de tipo UPDATE incluye una clusula WHERE con una condicin de
forma que solo se modifica aquel trabajador que tenga el DNI introducido en el cuadro de
texto txtModDNI.
Una vez construida la consulta UPDATE, esta se ejecuta usando el objeto sentencia y luego
se muestra el contenido de la tabla trabajadores en el panel a travs de una llamada al
mtodo MostrarTodos.
Todo este cdigo est rodeado de un try...catch para evitar errores inesperados.

8. Comprueba el funcionamiento del programa ejecutndolo. Debes introducir un DNI y


pulsar el botn Buscar para que se rellenen los cuadros de texto con los datos del
trabajador.
Luego cambia algn dato de los que han aparecido en los cuadros de texto y pulsa el
botn Efectuar Modificacin.
Si observas el panel de texto deber aparecer la lista completa de trabajadores y en
ella podrs observar la modificacin que se ha realizado en el trabajador
correspondiente.

423

Se introduce un DNI y se le
da a Buscar.
Los cuadros de texto se
rellenan con los datos del
trabajador.
Se realiza la modificacin
que se quiera en los
cuadros de texto.
Finalmente se pulsa
Efectuar Modificacin para
que se realice la
modificacin.
En el panel aparecer la
lista actualizada de los
trabajadores.

424

CONCLUSIN
Se pueden ejecutar instrucciones SQL del tipo UPDATE (modificar registros) usando
el objeto sentencia.
Para este tipo de instrucciones hay que usar el mtodo executeUpdate.
Normalmente, ser necesario construir una cadena de consulta UPDATE a travs de la
concatenacin de subcadenas y datos introducidos por el usuario en cuadros de
texto.
Este tipo de instrucciones SQL no devuelven ningn ResultSet, ya que no extraen
datos de las tablas, sino que modifican el contenido de stas.
Es una buena idea dar alguna opcin de bsqueda que permita encontrar al registro a
modificar y que sus datos aparezcan en varios cuadros de texto, de forma que el
usuario tenga ms facilidad a la hora de realizar los datos.

425

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Tablas (JTable)
Como se ha estudiado en las hojas guiadas anteriores, se pueden extraer datos de la base
de datos a travs de consultas SQL de tipo SELECT. Los datos extrados se almacenan en
objetos de tipo ResultSet.
Luego, solo hay que analizar el contenido del objeto ResultSet para extraer los datos que
contiene y trabajar con ellos.
En las hojas anteriores hemos extrado los datos del ResultSet y los hemos presentado en
un JOptionPane o en un JTextPane. Sin embargo, una mejor opcin para presentar el
contenido de un ResultSet es usar objetos del tipo JTable, ya que estos objetos tienen forma
de tabla.
En esta hoja guiada se estudiarn los objetos JTable (sin tener en cuenta a las bases de
datos) Una vez que entendamos el funcionamiento de los objetos JTable, los usaremos en
posteriores hojas guiadas para presentar dentro de ellos el contenido de consultas SQL.

426

EJERCICIO GUIADO N 1

1. Crear un nuevo proyecto en NetBeans. En la ventana principal de dicho proyecto


agregue un objeto JTable:

El nombre del objeto JTable ser simplemente tabla. Debes tener en cuenta que los
objetos JTable se aaden siempre dentro de un panel de desplazamiento JScrollPane:

2. El objeto tabla que se acaba de introducir tiene por defecto cuatro columnas con los
nombres Ttulo 1, Ttulo 2, Ttulo 3 y Ttulo 4, y contiene cuatro filas vacas.
Puede ejecutar el programa para ver el funcionamiento del objeto tabla. Pruebe a
introducir algn dato en las celdas de la tabla...

427

Haz doble clic para


introducir datos en
las celdas...

3. Aprenderemos ahora a configurar determinados aspectos de la tabla que vamos a


usar. Para ello aada al constructor una llamada a un mtodo PrepararTabla que
programaremos a continuacin.

4. Programa ahora el mtodo PrepararTabla de la siguiente forma:

428

La primera lnea del cdigo define un array de String con los ttulos de la tabla, es decir, con
las columnas de la tabla.
A continuacin, se construye un objeto del tipo DefaultTableModel, o dicho de otra manera,
un modelo de tabla. El objeto m est declarado como variable global.
MODELOS (recordatorio)
Hay que recordar que existen objetos en java que contienen un objeto modelo, encargado de
contener los datos del objeto. Un ejemplo de ello son las listas y los combos (cuadros
desplegables)
Para definir los datos contenidos en el objeto, primero haba que definir el modelo y luego
asignar el modelo al objeto.
El caso de las tablas es igual. Para introducir datos en la tabla primero hay que configurar su
objeto modelo (que ser de la clase DefaultTableModel) y luego asignrselo a la tabla.
En el cdigo, se define como global un objeto llamado m, de tipo DefaultTablaModel. Luego,
al construir el objeto se deben indicar dos parmetros: null y el vector de ttulos de columnas:
DefaultTableModel m = new DefaultTableModel(null,titulos);
El valor null hace que la tabla aparezca vaca en un principio, mientras que el vector ttulos
define las columnas que tendr la tabla.
Una vez construido de esta forma el objeto modelo m, este se asigna al objeto tabla:
tabla.setModel(m);
La razn por la que se ha declarado el objeto modelo m como global es que ser usado en
otros mtodos del programa.

5. Ejecuta el programa y observa el resultado:

429

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:

430

7. Dentro del botn btnNueva programa lo siguiente

Este cdigo aadir una nueva fila en blanco a la tabla. Estudiemos cada lnea:
La primera lnea recoge el modelo de la tabla a travs del mtodo getModel. El modelo es
recogido en la variable global m que creamos anteriormente. Observa como es necesario
realizar un cast (en rojo) a la hora de asignar el modelo a la variable m:
m = (DefaultTableModel) tabla.getModel();
El resultado de esta instruccin es que volvemos a tener disponible el modelo de la tabla en
la variable m, y por tanto, podemos manipular los datos contenidos en la tabla a travs de
esta variable.
Por ejemplo, se usar el modelo m para aadir una fila en blanco en la tabla. Para ello, basta
con crear un vector de cadenas de 5 elementos (ya que hay cinco columnas):
String filavacia[]=new String[5];
Y luego, a travs del mtodo addRow (aadir fila), aadir una fila correspondiente a los
valores del vector:
m.addRow(filavacia);
Debido a que el vector est vaco, la fila que se aade est vaca tambin. Si el vector
contuviera algn dato, estos datos apareceran en la fila que se aade (esto se ver a
continuacin)

7. Ejecuta el programa y pulsa varias veces el botn Nueva Fila. Observars como se
van aadiendo filas vacas a la tabla.

431

Pulsa el botn y se
aadirn filas en
blanco...

8. Para entender bien el funcionamiento de la insercin de filas en la tabla, aada otro


botn llamado btnNuevoElemento con el texto Nuevo Elemento:

9. En este botn programe lo siguiente:

Puedes observar que el cdigo es parecido al anterior, solo que en este caso se aade una
fila correspondiente a un vector relleno de datos. Esto quiere decir que cuando se aada
esta fila al modelo aparecer con los datos del vector.

432

10. Ejecuta el programa y comprueba su funcionamiento, observars que al pulsar el


nuevo botn aparecen filas rellenas.

Cuando se pulsa el
botn Nuevo Elemento
aparecen filas ya
rellenas.

11. Sigamos experimentando con la tabla. Ahora aadiremos un botn btnEliminar con el
texto Eliminar Fila:

12. Este botn eliminar la fila que est seleccionada en ese momento. Para ello
programe en este botn el siguiente cdigo:

433

Estudiemos este cdigo. En primer lugar usamos un mtodo que poseen los objetos JTable
llamado getSelectedRow que nos dice el nmero de la fila que est seleccionada en este
momento.
Si no hubiera ninguna fila seleccionada, el mtodo getSelectedRow devuelve el valor 1.
Esto lo usamos en el if que viene a continuacin para mostrar un mensaje de error diciendo
que es necesario seleccionar la fila que se va a borrar.
En el caso de que haya alguna fila seleccionada (es decir, que no se haya devuelto el valor
1) entonces efectuamos el borrado.
Para borrar recogemos el modelo de la tabla y usamos un mtodo llamado removeRow para
borrar la fila seleccionada (la cual se pasa como parmetro)

13. Ejecuta el programa y aade varias filas. Luego prueba a seleccionar alguna y pulsar
el botn Eliminar. Observa tambin lo que sucede cuando intentas eliminar una fila
cuando no hay ninguna seleccionada.

Al pulsar eliminar fila


se eliminar la fila
que est
seleccionada de la
tabla.
Si no hubiera ninguna
fila seleccionada
aparecera un
mensaje de error.

434

14. Sigamos aprendiendo nuevas cualidades de las tablas. Aada lo siguiente a su


ventana:

txtFila txtColumna

btnVerValor

etiValor

15. Lo que se pretende es lo siguiente: El usuario introducir un valor en la fila y la


columna, por ejemplo: Fila 3, columna 4, y al pulsarse el botn Ver Valor aparecer
en la etiqueta Valor el contenido de la casilla situada en la posicin 3, 4 (fila 3
columna 4)
As pues programe lo siguiente en el botn Ver Valor:

Estudiemos el cdigo.
Primero, se recogen los valores introducidos en los cuadros de texto de la fila y columna y se
convierten a enteros:
fila = Integer.parseInt(txtFila.getText());
col = Integer.parseInt(txtColumna.getText());

Luego, se extrae el modelo de la tabla y se usa un mtodo llamado getValueAt. Este mtodo
permite extraer el valor de una casilla de la tabla, indicando la fila y columna de esa celda. El
resultado lo hemos almacenado en una variable valor de tipo cadena. Es necesario realizar
un cast (en rojo):

435

valor = (String) m.getValueAt(fila,col);


Finalmente, una vez extrado el valor de la celda de la posicin fila, col este se coloca en la
etiqueta etiValor.
Este cdigo es susceptible de dar error, por ejemplo si el usuario introduce unos valores de
fila y columna incorrectos. Por eso ha sido incluido dentro de un try...catch.

16. Ejecuta el programa y aade varias filas. Introduce algunos valores en las filas.
Luego prueba a introducir un valor de fila y columna y pulsa el botn Ver Valor:

Se introdujo la
posicin: 2, 1.
Por tanto se quiere ver
el valor de la casilla 2,1
(tanto las filas como las
columnas empiezan en
0)

17. Sigamos experimentando. Aade lo siguiente a la ventana:

btnIntroducir

txtNuevoValor

436

18. Se pretende lo siguiente. El usuario introducir un valor de fila y de columna en los


cuadros de texto correspondientes. Luego, el usuario introducir un valor en el
cuadro de texto txtNuevoValor. Finalmente pulsar el botn btnIntroducir.
El resultado ser que se introduce el valor escrito en la posicin de la tabla indicada
por la fila y columna introducida.
Para hacer esto, programe lo siguiente dentro del botn btnIntroducir:

Estudiemos el cdigo detenidamente.


Lo primero que se hace es extraer de los cuadros de texto la fila, columna y el valor. La fila y
columna son convertidas a enteros.
fila = Integer.parseInt(txtFila.getText());
col = Integer.parseInt(txtColumna.getText());
valor = txtNuevoValor.getText();

Luego se extrae (como siempre) el modelo de la tabla y se usa un mtodo suyo llamado
setValueAt que permite introducir un valor en una celda de la tabla. Concretamente, se
introduce el valor escrito por el usuario en la celda con fila y columna indicadas:
m=(DefaultTableModel) tabla.getModel();
m.setValueAt(valor,fila,col);

Este cdigo es susceptible de tener errores de ejecucin (por ejemplo que el usuario
introduzca un valor equivocado en la fila y columna) por eso est rodeado de un try...catch.

19. Ejecuta el programa. Aade varias filas en blanco. Luego introduce un valor para la
fila y la columna y escribe un valor que quieras introducir. Al pulsar el botn Introducir
dicho valor aparecer en la celda correspondiente:

437

Introduce una fila y


columna.
Luego introduce un dato.
Y al pulsar el botn
Introducir el resultado es
que el dato se introduce
en la celda indicada por la
fila y columna.
Recuerda que las filas y
columnas empiezan a
numerarse por 0 en un
JTable.

438

CONCLUSIN
Existe una clase llamada JTable que permite crear objetos con forma de tabla.
Estos objetos son ideales para mostrar el contenido de las tablas de una base de
datos, aunque pueden ser usados de forma independiente tambin para mostrar
cualquier tipo de datos.
Los objetos JTable contienen un modelo de datos de tipo DefaultTableModel.
Cada vez que se quiera trabajar con una tabla ser necesario construir su modelo y
asignrselo a la tabla.
Cada vez que se quiera modificar de alguna forma los datos de una tabla, ser
necesario acceder a su modelo y trabajar con l.
A travs del modelo de una tabla podemos aadir nuevas filas a la tabla, eliminar filas,
extraer datos de las celdas de la tabla o aadir datos a las celdas de la tabla.

439

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Representacin de Tablas en un JTable


En la hoja guiada anterior vimos que existe un tipo de objeto llamado JTable que nos permite
introducir tablas en nuestras aplicaciones.
Estos objetos son ideales para mostrar el contenido de una tabla de la base de datos o del
resultado de una consulta.
Recuerda que para extraer datos de la base de datos realizamos una consulta SQL de tipo
SELECT cuyo resultado se almacena en un objeto ResultSet.
Un ResultSet bsicamente es una tabla almacenada en memoria (y por tanto no visible) Sin
embargo, en esta hoja guiada veremos como trasladar el contenido de un ResultSet a un
JTable para que el usuario pueda visualizar los datos de forma cmoda.
El proceso ser bsicamente el siguiente:

Base de
Datos

ResultSet

440

JTable

EJERCICIO GUIADO N 1

1. Crear un proyecto java y prepararlo para que pueda acceder a la base de datos
MANEMPSA.MDB:
a. Crear una subcarpeta Base y copiar dentro de ella el fichero de base de datos
MANEMPSA.MDB
b. Declarar los dos objetos globales: conexin y sentencia.
c. Programar el mtodo PrepararBaseDatos de forma que el programa acceda a
la base de datos y se construyan los objetos conexin y sentencia.
d. Programar el evento windowClosing de la ventana principal de forma que se
cierre la conexin.

2. Una vez hecho esto, aade a la ventana principal un objeto JTable y llmalo
simplemente tabla.
3. Aade en la parte inferior un botn llamado btnTrabajadores. La ventana principal
quedar as:

4. Agregaremos al proyecto un objeto modelo de tabla (DefaultTableModel) llamado m


que sea global. Tambin aadiremos en el constructor una llamada a un mtodo
PrepararTabla y programaremos dicho mtodo de la siguiente forma:

441

Si observas el cdigo, vers que en el mtodo PrepararTabla se crea un vector de


cadenas con cuatro elementos pero que no contiene nada.
Luego se crea el modelo de tabla a partir de este vector vaco.
Y se asigna finalmente a la tabla.
El resultado de esto es que la tabla aparecer vaca y sin ttulos (En realidad, como
ttulos aparecen letras: A, B, C, etc)

5. Ejecuta el programa para ver su aspecto de momento.

442

Debido a que
hemos asignado un
vector de ttulos sin
contenido, las
columnas tienen
como ttulo letras.

6. Bien, ahora programaremos el botn btnTrabajadores de forma que al pulsarlo se


muestre el contenido de la tabla Trabajadores. Programe lo siguiente:

Estudiemos el cdigo detenidamente.


Lo primero que se hace es extraer el contenido de la tabla Trabajadores de la base de datos,
ejecutando una consulta SQL usando el objeto sentencia. El resultado de dicha consulta se
almacenar en un objeto ResultSet llamado r.
ResultSet r = sentencia.executeQuery("select * from trabajadores");

443

A continuacin, se extraer informacin del ResultSet y se introducir en la tabla. Lo primero


que se hace es crear el modelo de la tabla definiendo la cabecera. Observa el cdigo.
String titulos[] = {"DNI","Nombre","Apellidos","Sueldo","Fecha","Matrcula"};
m=new DefaultTableModel(null,titulos);
tabla.setModel(m);

Como ves, lo que hacemos es definir un vector de cadenas con los ttulos correspondientes
a los campos de la tabla, y luego usamos este vector para crear el modelo de la tabla.
Finalmente asignamos el modelo creado a la tabla.

7. Ejecute el programa de momento. Observe como al pulsar el botn Trabajadores la


cabecera de la tabla pasa a contener los campos indicados en el vector ttulos.

8. Ahora ya solo nos queda recoger todo el contenido del ResultSet y mostrarlo en la
tabla. Para ello, modifique el cdigo del actionPerformed del botn Trabajadores para
que quede como sigue:

444

Si estudiamos el cdigo, veremos que se extrae la tabla trabajadores entera introducindola


en un ResultSet llamado r, a travs de una instruccin SELECT de SQL.
Luego construimos un modelo de tabla (DefaultTableModel) llamado m usando un vector de
ttulos, que se corresponde a los campos de la tabla trabajadores.
Una vez hecho esto, creamos un vector de seis elementos, correspondiente a los seis datos
que contiene cada fila, y empezamos a recorrer el ResultSet usando el tpico:
while (r.next()) {
En cada vuelta del bucle tomamos los valores de la fila del ResultSet y los almacenamos en
el vector (en la posicin correspondiente)
Luego se aade el vector que se ha construido al modelo de la tabla.
As pues, en cada vuelta se aadir un registro ms al modelo m. Estos registros son
extrados del ResultSet.
Cuando el bucle ha terminado, el modelo de la tabla contiene exactamente lo mismo que el
ResultSet. Es decir, contiene la tabla trabajadores, ya que este fue el resultado de la
consulta SQL ejecutada.
Ya solo tenemos que asignar el modelo de la tabla al JTable correspondiente, es decir, a la
tabla, con lo que esta visualizar los datos del modelo.
Todo este proceso se rodea con un try...catch para evitar errores inesperados.

445

9. Para entender el cdigo anterior aqu tienes un pequeo grfico explicativo:


Base de Datos ResultSet Vector Modelo de Tabla JTable

De la base de datos extraemos datos a un ResultSet. (Esto se hace


ejecutando una consulta SQL de tipo SELECT a travs del objeto
sentencia)

Del ResultSet extraemos los datos a un modelo de tabla. (Esto se


hace recorriendo el ResultSet y almacenando cada registro en un
vector)

Almacenamiento del vector en el modelo de tabla. (Cada vector


extraido del ResultSet se inserta como fila en el modelo de tabla)

Se asigna el modelo de tabla al objeto JTable. (Al hacer esto el


objeto JTable muestra el contenido del modelo)

10. Ejecute el programa y observe el resultado al pulsar el botn Trabajadores. Como ve,
el objeto tabla muestra entonces el contenido de la tabla Trabajadores.

11. Si observa la tabla ver que la fecha aparece en el formato estndar de


almacenamiento:
Ao-mes-dia hora:min:seg
Y que los sueldos aparecen con punto decimal.
Mejore estos detalles haciendo los siguientes cambios en el botn Trabajadores:

446

Como se puede observar, antes de almacenar los sueldos en el modelo de la tabla se


reemplazan el punto decimal por una coma.
Y en el caso de la fecha, se extrae de la cadena el ao, mes y da y se concatenan
en un formato ms habitual: dia/mes/ao.
12. Ejecuta ahora el programa y observa como se muestran las fechas y los sueldos:

447

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.

448

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Gestin de una tabla


En la hoja guiada anterior se vio como mostrar el contenido de una tabla de la base de datos
en un JTable de la aplicacin java.
Se puede aprovechar esta idea de forma que todas las operaciones que realicemos sobre
una tabla se vean inmediatamente reflejadas en el JTable de la aplicacin java.
Por ejemplo, si eliminamos un registro sera interesante que automticamente viramos la
tabla actualizada en el JTable.
En esta hoja guiada se mejorar la aplicacin de la hoja guiada anterior, dotndola de
opciones para la gestin de la tabla Trabajadores.

449

EJERCICIO GUIADO N 1

1. Abrir la aplicacin de la hoja guiada anterior.


2. El primer objetivo ser hacer que al ejecutar el programa aparezca automticamente
el contenido de la tabla Trabajadores en el JTable. Para ello, realice los siguientes
cambios en el cdigo del programa:

Aade una llamada a un mtodo


MostrarTrabajadores, en el
constructor del programa.

3. Crea el mtodo MostrarTrabajadores:

4. Copia en l el cdigo del actionPerformed del botn btnTrabajadores:

450

5. Lo que produce esta modificacin del cdigo es que al ejecutarse el programa se


ejecute el mtodo MostrarTrabajadores con lo que se ejecutar el cdigo que hicimos
en la hoja anterior para mostrar los datos de la tabla trabajadores en el JTable.
Ejecuta el programa y comprueba el resultado.

6. Puesto que la tabla trabajadores se muestra al empezar el programa, la existencia


del botn Trabajadores no tiene sentido, as pues elimina el botn Trabajadores de la
ventana.

7. Aade ahora en la parte inferior un panel llamado panelAcciones y un botn Eliminar


Trabajador llamado btnEliminar:

8. Se pretende que el usuario seleccione uno de los trabajadores de la tabla y al pulsar


el botn Eliminar dicho trabajador se elimine de la base de datos. Esta eliminacin
por supuesto se ver reflejada en el JTable.
Para ello, programe en el botn Eliminar lo siguiente:

451

Estudiemos con detenimiento el cdigo programado.


Lo primero que se hace es recoger la fila seleccionada de la tabla usando el mtodo
getSelectedRow. Si el valor devuelto es 1 entonces es que no hay ninguna fila
seleccionada. El programa avisa de esta circunstancia.
Si se seleccion a un trabajador, entonces podemos borrar. Pero antes, es interesante pedir
confirmacin. Esto es lo que se hace con el JOptionPane.showConfirmDialog.
Si el usuario acepta la eliminacin del trabajador, entonces la llevamos a cabo. Observa el
proceso:
-

Extraemos del modelo del JTable el dni del trabajador seleccionado (este dni se
encuentra en la fila seleccionada filsel- columna 0 la primera columna-):
m = (DefaultTableModel) tabla.getModel();
dni = (String) m.getValueAt(filsel,0);

Ahora se construir una instruccin de accin SQL del tipo DELETE para que se elimine
el trabajador con el dni extrado. Esto se hace concatenando y ejecutando la instruccin
SQL a travs del objeto sentencia:

sentencia.executeUpdate("delete from trabajadores where dni='"+dni+"'");

452

Y finalmente se llama al procedimiento MostrarTabla para que se extraiga de la base de


datos y muestre de nuevo la tabla trabajadores. Esto actualizar el JTable, y se podr
ver que el trabajador ha sido eliminado.

Todo esto est dentro de un try...catch para capturar errores inesperados.

9. Ejecuta el programa y prueba a eliminar algn trabajador. Observa como el JTable se


actualiza cuando se produce la eliminacin.

10. Ahora aade otro botn llamado btnNuevo:

11. Cuando se pulse el botn Nuevo se pretende que aparezca un formulario donde se
puedan introducir los datos de un nuevo trabajador. Esto se conseguir aadiendo un
cuadro de dilogo a nuestro proyecto. Para ello, agrega un JDialog al proyecto. Este
dilogo se llamar dialogoNuevo.

12. Haga doble clic en el Inspector sobre el dialogoNuevo para disearlo. Debe quedar
como sigue, con los nombres que se indican a continuacin:

453

txtNuevoDni
txtNuevoNombre
txtNuevoApellidos
txtNuevoSueldo
txtNuevoDia txtNuevoMes txtNuevoAnio
txtNuevoMatricula

btnNuevoAceptar
btnNuevoCancelar

13. La idea es la siguiente. Cuando el usuario pulse el botn Nuevo, aparecer este
cuadro de dilogo. El usuario introducir los datos del nuevo trabajador y pulsar
Aceptar, y entonces estos datos se introducirn en la tabla trabajadores.
Si el usuario pulsa Cancelar, entonces no se har nada.
El JTable se actualizar para mostrar el resultado de la insercin del nuevo
trabajador.
As pues, entre en el actionPerformed del botn btnNuevo y programe lo siguiente:

Este cdigo empieza asignando un tamao al cuadro de dilogo dialogoNuevo.


Luego, se define el dialogoNuevo como Modal. Esto significa que hasta que no se
termine de trabajar con este cuadro de dilogo no se podr continuar usando el
programa principal.
Luego se muestra dicho cuadro de dilogo.
Y finalmente se actualiza el JTable por si se hubiera introducido un nuevo trabajador.

454

14. Ahora programemos los botones del cuadro de dilogo dialogoNuevo. Empecemos
por el botn Cancelar:

Como ves, tan sencillo como descargar el cuadro de dilogo. El botn Cancelar debe
limitarse a quitar de la pantalla el cuadro de dilogo dialogoNuevo.

15. Y finalmente se programar el botn Aceptar del cuadro de dilogo. Recuerda que
este botn es el que introduce en la base de datos a un nuevo trabajador. Programa
dentro de este botn lo siguiente:

Vamos a analizar detenidamente este cdigo.


Lo primero que puedes observar es un conjunto de lneas que copian el contenido de los
cuadros de texto en variables de cadena. Al hacer esto, cambiamos la coma decimal por
punto decimal en el caso del sueldo y configuramos la fecha en el formato que entiende
SQL: mes/dia/ao.
Luego, con estas variables, se construye por concatenacin una instruccin SQL de tipo
INSERT que permita introducir los datos del nuevo trabajador en la tabla trabajadores.
Se ejecuta dicha instruccin SQL. Y se cierra el cuadro de dilogo.
Por supuesto, es necesario un try...catch para evitar problemas inesperados.

455

16. Ejecuta el programa y prueba a introducir nuevos trabajadores.

17. Nuestro programa ya puede hacer altas y bajas. Solo queda que pueda realizar
modificaciones. Para ello aade un nuevo botn a la ventana, llamado btnModificar:

18. Se pretende que el usuario seleccione en la tabla el trabajador cuyos datos quiere
modificar, y luego pulse este botn para efectuar la modificacin.
Al pulsar este botn debe aparecer un cuadro de dilogo donde el usuario pueda
cambiar fcilmente los datos.
Ese cuadro de dilogo ser muy parecido al que hemos hecho antes, as que
bsicamente solo tendrs que hacer una copia de dicho cuadro de dilogo y
modificarlo un poco. A continuacin se explica como hacerlo.

19. Haz clic con el derecho sobre el cuadro de dilogo dialogoNuevo y activa Copiar :

456

20. Luego activa Pegar sobre Otros Componentes:

21. Aparecer un nuevo cuadro de dilogo que es una copia del anterior. Este cuadro
tendr como nombre dialogoNuevo1.

22. Sin embargo, le cambiaremos el nombre para que sea ms acorde con su funcin. Le
llamaremos dialogoModificar. Cmbiale el nombre:

23. Vamos a modificar un poco el diseo del dialogoModificar. Haz doble clic sobre l y
realiza las siguientes modificaciones en el diseo:

457

Cambia el ttulo. Ahora es Modificar


Trabajador
Los nombres para los cuadros de texto y
botones sern:
txtModDni (Desactiva su propiedad editable)
txtModNombre
txtModApellidos
txtModSueldo
txtModDia txtModMes txtModAnio
txtModMatricula
btnModAceptar btnModCancelar

24. Empezaremos programando el botn Modificar. Al pulsar este botn se debe mostrar
el cuadro de dilogo anterior relleno con los datos del trabajador que se quiere
modificar. Se supone que el usuario ha seleccionado a este trabajador en la tabla
anteriormente.
Entra en el actionPerformed del botn Modificar y programa lo siguiente:

458

Estudiemos el cdigo.
Primero se comprueba el nmero de la fila seleccionada. Si no hubiera ninguna se muestra
un mensaje de error, ya que es necesario modificar la fila del trabajador que se quiere
modificar.
En el caso de que haya una fila seleccionada, se extraen los datos del modelo del JTable y
se almacenan en varias variables de cadena.
Una vez hecho esto, esas mismas variables se almacenan en los cuadros de texto del
cuadro de dilogo dialogoModificar.
Y finalmente se prepara el cuadro de dilogo dialogoModificar y se muestra en la pantalla.
Una vez realizada la modificacin (no programada an) se muestran los trabajadores en la
tabla llamando al mtodo MostrarTrabajadores.

25. Puedes comprobar el funcionamiento del programa de momento. Prueba a


seleccionar una fila de la tabla y al pulsar el botn Modificar.

459

Selecciona...
Y luego pulsa
modificar.

460

El resultado es que
aparece el cuadro de
dilogo
dialogoModificar ya
relleno con los datos
del trabajador que se
seleccion.

26. Lo bueno que tiene el rellenar el cuadro de dilogo dialogoModificar con los datos del
trabajador que se quiere modificar es que no tenemos que escribir todos los datos, y
solo modificar el campo que nos interese.
El usuario realizar los cambios en los cuadros de textos ya rellenos y luego pulsar
el botn Aceptar para que se produzca la modificacin.
Si se pulsa Cancelar no sucede nada. Simplemente se cerrar el cuadro de dilogo.

27. Se empezar programando el botn Cancelar. Este botn debe limitarse a cerrar el
cuadro de dilogo dialogoModificar:

28. Ahora nos centraremos en el botn Aceptar. Este botn debe realizar la modificacin,
introduciendo todos los datos de los cuadros de texto en la tabla trabajadores.
El cdigo siguiente tomar como referencia el DNI del trabajador que se est
modificando. Es importante que este DNI no cambie, ya que entonces estaramos
modificando los datos de otro trabajador.

461

Esta es la razn por la que el cuadro de texto txtModDni se ha configurado como no


editable, para evitar que el usuario pueda cambiarlo accidentalente.
Programa el siguiente cdigo en el botn Aceptar:

Estudiemos el cdigo.
Lo primero que se hace es recoger en variables los datos introducidos en los cuadros de
texto.
Luego, con estas variables, se construye una instruccin SQL del tipo UPDATE que
permite modificar los datos del trabajador con el dni indicado en el cuadro de dilogo.
Finalmente se cierra el cuadro de dilogo.
Todo este cdigo es susceptible de sufrir fallos por lo que est rodeado de un try...catch.

29. Ejecuta el programa y comprueba el funcionamiento de la actualizacin de


trabajadores. Prueba a realizar varias actualizaciones. Observa como el JTable se
actualiza con las nuevas modificaciones realizadas.

462

CONCLUSIN
La ms simple de las aplicaciones de base de datos debe ser capaz de realizar las
siguientes operaciones sobre una tabla:
-

Altas
Bajas
Modificaciones

Es muy interesante que la aplicacin muestre en pantalla continuamente un JTable


con el contenido de la tabla de la base de datos sobre la que se est trabajando.
El JTable nos permite visualizar los datos de la tabla y seleccionar rpidamente el
registro que queramos manipular.
Para la insercin de nuevos registros en la tabla se recomienda la creacin de un
cuadro de dilogo que muestre un formulario donde el usuario pueda introducir los
datos del nuevo registro cmodamente.
Para la modificacin de un registro, se recomienda la creacin de otro cuadro de
dilogo que muestre los datos del registro que se quiere modificar.

463

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Filtrados sobre una tabla


En la hoja guiada anterior se realiz una pequea aplicacin de base de datos que permita
realizar altas, bajas y modificaciones sobre la tabla trabajadores de la base de datos
MANEMPSA.
En todo momento se mostraba en un JTable el listado de trabajadores de la empresa.
La eliminacin y modificacin de un trabajador se poda realizar simplemente haciendo clic
sobre la fila del trabajador correspondiente en el JTable y luego activando el botn Eliminar o
Modificar.
Sin embargo, en el momento en que tengamos una gran cantidad de trabajadores
almacenados en la tabla, puede resultar un poco complicado encontrar al trabajador en
concreto que se quiere eliminar o modificar.
Aparte, puede ser necesario a veces ver solo determinados registros de la tabla y no toda la
tabla entera.
Se hace necesario pues aadir al programa ciertas opciones de filtrado que nos permitan
visualizar en el JTable solo aquellos registros que ms nos interesen.
En esta hoja guiada se mejorar el programa de la hoja anterior de forma que permita al
usuario ciertas opciones de filtrado.

464

EJERCICIO GUIADO N 1

1. Abrir la aplicacin de la hoja guiada anterior.


2. Primero debes aadir un botn btnFiltar a la ventana:

3. Al pulsar este botn aparecer un cuadro de dilogo que contenga opciones de


filtrado, de forma que el usuario pueda decidir qu trabajadores quiere ver.
Por lo tanto, tendr que aadir un nuevo cuadro de dilogo (JDialog) y asgnele el
nombre dialogoFiltrar.

4. Haz doble clic sobre este dilogo y diselo de la siguiente forma:

txtFiltrarDni
txtFiltrarNombre
txtFiltrarApellidos
comboSueldo
txtFiltrarSueldo
comboFecha
txtFiltrarDia txtFiltrarMes txtFiltrarAnio
txtFiltrarMatricula
btnFiltrarAceptar
btnFiltrarVerTodos
btnFiltrarCancelar

465

NOTA: Los dos combos del cuadro de dilogo deben contener los siguientes elementos:
=

>

<

>=

<=

<>

Es decir, cuando se desplieguen aparecer esto:

5. La idea es la siguiente. Cuando el usuario pulse el botn Filtrar, se mostrar este


cuadro de dilogo. Entonces el usuario introducir las condiciones de bsqueda y
pulsar Aceptar, y entonces se visualizarn en el JTable aquellos registros que
cumplan la condicin.
Si el usuario pulsa el botn Ver Todos, entonces se mostrarn en el JTable todos los
trabajadores.
Si el usuario pulsa el botn Cancelar, entonces el cuadro de dilogo de filtrado se
cierra sin ms.

6. Empezaremos programando el botn Filtrar de la ventana principal. Introduzca en l


el siguiente cdigo:

466

Lo nico que hace este cdigo es asignar un tamao al cuadro de dilogo,


configurarlo como modal, y finalmente presentarlo en pantalla.

7. Ejecute el programa si quiere ver el funcionamiento de este botn.

Se pulsa el botn
Filtrar y aparece el
cuadro de dilogo de
filtrado.

8. Programemos ahora el botn Cancelar del cuadro de dilogo de filtrado. La


programacin de este botn es muy sencilla:

Como puede ver consiste simplemente en cerrar el cuadro de dilogo de filtrado.

9. Se programar ahora el botn Aceptar, pero antes, es necesario entender como


funcionar el cuadro de dilogo de filtrado.
El usuario introducir los datos que quiere buscar. Ten en cuenta que no tiene por
qu rellenar todas las casillas. Adems, puede hacer uso de los combos asignados a
los campos sueldo y fecha. Por ejemplo, supongamos que el usuario introdujera los
siguientes datos:

467

Si en este momento el usuario pulsara el botn Aceptar, se tendran que mostrar aquellos
trabajadores que cumplan todas las siguientes condiciones: que tengan de nombre Juan,
que ganen ms de 2000 euros de sueldo y que conduzcan un coche cuya matricula
contenga la cadena CA.
Las casillas que estn vacas no se tendrn en cuenta a la hora de hacer el filtrado.
Si el usuario introduce una cadena en un campo de tipo texto, se buscar a todos aquellos
trabajadores que contengan dicha cadena. Por ejemplo, si introduzco Juan en el nombre, el
programa buscar a los trabajadores cuyo nombre contenga la palabra Juan. De esta
manera la bsqueda ser mucho ms cmoda, al no tener que introducir el texto completo, y
producir ms resultados (se encontrarn a los que se llamen Juan, Juan
Antonio,Juana, etc.

468

10. El botn Aceptar tendr que construir una consulta SELECT que incluya estas
condiciones, y luego ejecutarla. Finalmente tendr que mostrar el resultado de la
consulta en el JTable.
El cdigo de este botn ser largo, as que veamos poco a poco como programarlo.
Empiece programando lo siguiente dentro del botn Aceptar:

Como puede ver, empezamos recogiendo el contenido de los cuadros de texto en


distintas variables. Tambin recogemos los valores seleccionados en los combos del
sueldo y fecha.
En el caso de la fecha, recogemos de los cuadros de texto el da, mes y ao y los
concatenamos para formar una fecha que Access pueda aceptar: mes/dia/ao.
En el caso del sueldo cambiamos la coma decimal (ya que suponemos que el usuario
introducir el valor en formato espaol) por el punto, para que no haya problemas a la
hora de ejecutar la consulta SQL.

469

11. Siga programando en el botn Aceptar de la siguiente forma:

Agrega estas dos variables


en la parte inicial del mtodo.

........... cdigo anterior...........

Y en la parte
final del mtodo
aade el
siguiente
cdigo...

Es necesario estudiar muy detenidamente el cdigo que tenemos programado hasta ahora
antes de continuar.
Se han aadido dos variables:
-

La variable sql es una variable de cadena que contendr la instruccin SELECT que
efectuar el filtrado (la consulta)

La variable ncond (nmero de condiciones) es una variable numrica que va


contando cuantas condiciones hay. Ten en cuenta que habr una condicin cada vez
que un cuadro de texto est relleno con algn dato.
Esta variable es muy importante, ya que nos permite saber si tenemos que
concatenar una condicin con where o con and. Ten en cuenta que la primera
condicin que se aade vendr precedida por where, pero las dems estarn
precedidas por and.
La primera condicin que se aade a la instruccin SELECT tendr que tener esta
forma (en rojo):
select * from trabajadores where condicion1

La condicin 2, condicin 3, etc llevan el and delante. Por ejemplo, la segunda


condicin tendra esta forma (en azul):
select * from trabajadores where condicion1 and condicion2

470

Si aadiramos una tercera condicin tambin llevara el and (en verde):


select * from trabajadores where condicion1 and condicion2 and condicion3

Etc.
Resumiendo, la primera condicin vendr antecedida de where, mientras que el
resto de las condiciones vendrn antecedidas del and.

Si se observa el cdigo aadido al final del mtodo, en l se empieza construyendo el


comienzo de la consulta SELECT: select * from trabajadores y luego se aaden
condiciones segn si el cuadro de texto correspondiente est vaco o no.
Cada vez que se encuentra un cuadro de texto no vaco, se aade una condicin y se
aumenta en 1 el contador de condiciones, es decir, la variable ncond.
Observa como cuando se aade una condicin, se comprueba con un if el nmero de
condiciones (ncond) para saber si hay que concatenar la condicin con el where o con el
and.
Debes observar tambin como nos decantamos por el uso de LIKE ya que este es ms
verstil. Y se recuerda una vez ms que cuando usemos LIKE desde java en vez de
asteriscos usaremos el smbolo tanto por ciento (%)
Estudia bien este cdigo para entenderlo. Solo se ha indicado las posibles condiciones para
el DNI y para el Nombre. Sin embargo ser necesario aadir ms if para el resto de los
campos.

12. Aada al final del cdigo anterior el siguiente cdigo:

Este cdigo comprueba si hay algn dato en el cuadro de texto apellidos, y, si es as,
entonces crea una condicin para filtrar por apellidos.
Se incrementa el contador de condiciones en uno y si estamos ante la primera
condicin esta se concatena usando where, y si no, esta se concatena usando
and.

471

13. Aada al final del cdigo anterior el siguiente cdigo:

Este es el cdigo que aade una condicin para el sueldo (suponiendo que haya
algn dato en el cuadro de texto del sueldo)
Como en los casos anteriores, se suma uno al contador de condiciones y, si estamos
ante la primera condicin se concatena con where, y si no, se concatena con and.
Hay que destacar aqu que, al ser el sueldo un campo numrico, no se usa LIKE, sino
que se usa el operador que el usuario haya escogido dentro del combo del sueldo.
Recuerda que ese operador puede ser uno de los siguientes: =, >, <, >=, <= ,
<>

14. Aada al final del cdigo anterior el siguiente cdigo:

Este es el cdigo que aade una condicin para la fecha (suponiendo que haya algn
dato en los cuadros de texto correspondientes a las fechas)
Aqu hay que tener en cuenta que los valores de los cuadros de texto del da, mes y
ao se concatenan dentro de una variable fecha usando la / como separador. Si los
cuadros de texto dia, mes y ao estuvieran vacos, la variable fecha contendra la
cadena //. Por eso preguntamos si la variable fecha es distinta de // para saber si
es necesario aadir una condicin para la fecha.
Como en los casos anteriores, se suma uno al contador de condiciones y se
comprueba si estamos ante la primera condicin. En este caso se concatena la
condicin usando where y en caso contrario se concatena la condicin usando
and.
Observa que para crear la condicin se usa el operador que el usuario haya elegido
en el combo de la fecha, el cual puede ser uno de los siguientes: =, >, <, >=, <=
, <>

Ya que estamos manejando fechas recuerda que hay que aadir las almohadillas en
la condicin.

472

15. Aada el siguiente cdigo al final del cdigo anterior.

En este caso tenemos la construccin de la condicin correspondiente a la matrcula


del coche del trabajador. Por supuesto, esta condicin solo se construye si se ha
escrito algo en el cuadro de texto de la matrcula.
Como en los casos anteriores se suma uno al contador de condiciones y si estamos
ante la primera condicin entonces la condicin se construir usando where, y en
caso contrario aadiremos esta condicin usando and.
Como en los dems campos de tipo texto, para construir esta condicin se ha
preferido usar LIKE junto con los % (asteriscos en Access), que da ms posibilidades
de bsqueda.

16. El resultado final de todo este largo cdigo es que la variable sql contendr una
instruccin SELECT que realizar un filtrado sobre la tabla trabajadores de la base de
datos de forma que se extraigan a los trabajadores que cumplan las condiciones
indicadas por el usuario en el cuadro de dilogo de filtrado.
Lo que hay que hacer ahora es ejecutar dicha instruccin SELECT. Y como ya sabe,
esto se hace a travs del objeto sentencia. Programe lo siguiente a continuacin del
cdigo anterior:

En este cdigo se ejecuta la consulta creada y el resultado se introduce en un


ResultSet r.
Ahora hay que mostrar el contenido del ResultSet r en el JTable de la ventana
principal.
Como ve, el cdigo da un error. Esto es debido a que es obligatorio rodear el cdigo
con un try...catch, ya que es susceptible de error. (Esto se har ms adelante)

473

17. Ahora mostraremos el ResultSet r en el JTable, as que aada el siguiente cdigo a


continuacin:

Este cdigo ya debe resultar conocido, ya que se us tambin en el mtodo


MostrarTrabajadores, encargado de mostrar toda la tabla trabajadores en el JTable.
Si observa este cdigo ver que lo que hace es definir un vector de ttulos para el
JTable. A partir de este vector de ttulos se crea el modelo del JTable
(DefaultTableModel)
Luego se recorre el ResultSet r, que contiene ahora mismo el resultado del filtrado
realizado, y se extrae cada fila almacenndola en un vector al que se ha llamado fila.
Cada fila extrada se introduce en el modelo m de la tabla.
Finalmente cuando se han traspasado todas las filas desde el ResultSet r al modelo
m, se asigna dicho modelo al JTable. Esto quiere decir que el JTable debera mostrar
ya el resultado del filtrado.
La razn de que aparezcan tantos errores es porque an no hemos aadido el
try...catch. Esto lo haremos al final.

18. El cdigo programado hasta ahora analiza los datos introducidos en el cuadro de
dilogo de filtrado y construye una consulta SELECT que extrae los trabajadores que
cumplan las condiciones indicadas. Estos datos se muestran finalmente en un
JTable. Lo nico que queda por hacer es cerrar el cuadro de dilogo.
Aade por tanto el siguiente cdigo:

474

19. Todo el cdigo programado en el botn Aceptar es bastante delicado y pude dar gran
cantidad de errores, por lo que ser necesario rodearlo dentro de un try...catch:

.... resto del cdigo...

20. El cdigo que se acaba de programar es un poco enrevesado y largo, pero le da al


programa una potencia tremenda, ya que permite al usuario realizar fcilmente
bsquedas y filtrados en la tabla trabajadores.
Ejecuta el programa y haz lo siguiente:

475

Pulsa Filtrar para ver el


cuadro de dilogo de filtrado.

Queremos buscar a los


trabajadores que tengan una
a en el nombre y cobren
menos de 1500 euros.
(Recuerda activar el combo)

Pulsa Aceptar para ver el


resultado.

476

21. Como habr podido observar en este ejemplo, se pueden realizar bsquedas en la
tabla trabajadores gracias al cdigo programado. Esto es muy til sobre todo en el
momento en que la tabla contenga muchos registros.
Pruebe a ejecutar ms veces el programa y realice varios filtrados.

22. Solo queda por programar el botn Ver Todos del cuadro de dilogo de filtrado. Al
pulsar este botn se pretende que se visualicen todos los registros de la tabla
trabajadores. El cdigo de este botn es bastante sencillo:

Como ves aprovechamos el mtodo ya programado MostrarTrabajadores que se


encarga de mostrar todos los trabajadores en el JTable. Luego solo tenemos que
descargar el cuadro de dilogo de filtrado.

23. Ejecuta el programa y prueba lo siguiente:


-

Haz el filtrado que quieras sobre la tabla trabajadores. Acepta y observa el filtrado en
la tabla.
Vuelve a filtrar pero esta vez pulsa el botn Ver Todos. Observars como vuelven a
verse todos los trabajadores en la tabla.
Ejemplo:

Se acaba de realizar un
filtrado, la tabla muestra
solo los trabajadores que
cumplen la condicin...
Pulsa ahora Filtrar

477

Pulsa Ver Todos para


volver a ver todos los
trabajadores.

Y el resultado ser que se


quita el filtrado y se vuelven
a mostrar todos los
trabajadores

478

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.

479

EJERCICIO GUIADO. JAVA. ACCESO A BASE DE DATOS

Ordenacin y clculos
Se van a aadir ciertas mejoras al programa que se viene realizando en las ltimas hojas
guiadas. En esta hoja programaremos ciertas opciones de ordenacin as como
realizaremos determinados clculos sobre la tabla trabajadores.

480

EJERCICIO GUIADO N 1

1. Abrir la aplicacin de la hoja guiada anterior.


2. Vamos a modificar el cuadro de dilogo de filtrado de forma que no solo sea capaz
de filtrar, sino que tambin permita que el listado que se ha filtrado aparezca
ordenado segn un campo.
Para ello, aada lo siguiente al dilogo de filtrado:

panelOrdenacion
cboCamposOrdenacion
radioASC
radioDESC

NOTA N1: El combo cboCamposOrdenacion contendr los siguientes elementos: (Sin


Ordenacin), DNI, Nombre, Apellidos, Sueldo, Fecha, Matricula:

481

NOTA N2: Es necesario aadir un ButtonGroup al programa, al que llamaremos


grupoOrdenacion. Los botones de opcin radioASC y radioDESC deben pertenecer a dicho
grupo.

3. La idea es la siguiente. Cuando el usuario quiera hacer un filtrado podr indicar que
el listado aparezca ordenado por algn campo, seleccionndolo en el combo de
ordenacin. Tambin puede indicar la forma de ordenacin (ascendente o
descendente) a travs de los botones de opcin.
Al pulsar Aceptar el listado de trabajadores no solo saldr filtrado, sino que tambin
saldr ordenado.
Para ello tendremos que realizar modificaciones en el cdigo del botn Aceptar.
Aade el siguiente cdigo en el actionPerformed del botn Aceptar (justo antes de la
ejecucin de la consulta):

Estudiemos el cdigo. Lo primero que se hace es extraer el valor del combo


desplegable de los campos de ordenacin.
Si este combo no contiene el valor (Sin ordenacin) significar que se desea
realizar una ordenacin por el campo seleccionado. As pues se concatena a la
variable sql la clusula order by con el campo que se ha seleccionado en el combo.
Se controla tambin la forma de ordenacin teniendo en cuenta el botn de opcin
que est activado, y segn esto, se aade la cadena ASC o DESC para ordenar
ascendentemente o descendentemente.

482

4. Ejecuta el programa y prueba a hacer un filtrado eligiendo un campo para ordenar y


observa el resultado:

En este ejemplo se pretende visualizar


a todos los trabajadores que
contengan una a en su nombre...

... y el listado saldr ordenado por el


campo sueldo descendentemente.

483

5. Una ventaja de esto es que se puede mostrar el listado completo de trabajadores


ordenado por el campo que se quiera siempre y cuando no se indique ninguna
condicin:

En este ejemplo apareceran todos los


trabajadores, ya que no se ha indicado
ninguna condicin.

... y el listado saldr ordenado por el


nombre ascendentemente.

484

6. Ahora vamos a aadir una nueva mejora al programa. La idea es que se visualice
junto al JTable de trabajadores los siguientes datos: el nmero de trabajadores que
se muestra y la media de los sueldos.
Para ello, aade las siguientes modificaciones en el diseo de la ventana principal:

Etiquetas con borde:

etiNumeroTrab

etiSueldoMedio

7. Ahora programaremos un mtodo que sea capaz de calcular el nmero de


trabajadores y el sueldo medio a partir del contenido de un ResultSet.
Este mtodo recibir un ResultSet como parmetro, y lo que har ser analizar el
contenido de este ResultSet para calcular y luego mostrar el nmero de trabajadores
y el sueldo medio.
Accede al cdigo de tu programa y aade el siguiente procedimiento:

485

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.

486

8. Interesa que cada vez que se muestren todos los trabajadores en el JTable se
realicen estos clculos, as pues debe aadir la siguiente lnea en el mtodo
MostrarTrabajadores.

Esa lnea es una llamada al mtodo que acabamos de programar, y har que despus de
que se presenten en el JTable todos los trabajadores se rellenen las etiquetas de los
clculos.

9. Tambin interesa que cuando se realice un filtrado aparezca el nmero de


trabajadores y el sueldo medio correspondiente al listado que se acaba de filtrar.
Para ello debes aadir la siguiente lnea al cdigo del botn Aceptar del cuadro de
dilogo de filtrado:

487

De nuevo se realiza la llamada al mtodo de los clculos justamente despus de


colocar en la tabla el listado de trabajadores, en este caso filtrado.

10. Ejecuta el programa y observa como al iniciar el programa ya aparecen en las


etiquetas los clculos (ya que el constructor llama al mtodo MostrarTrabajadores
que a su vez llama al mtodo HacerCalculos)
Tambin puedes comprobar como al hacer un filtrado se muestran los clculos
correspondientes al listado filtrado, ya que en el botn Aceptar del dialogo de filtrado
se hace una llamada al mtodo HacerCalculos.

Al iniciarse el programa
aparece el listado
completo de
trabajadores y se
calcula el nmero de
trabajadores y el sueldo
medio...

488

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...

489

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.

490

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Informes
Toda aplicacin de base de datos necesita imprimir documentos tales como listados, fichas,
grficos, etc. Estos documentos se rellenan con datos tomados directamente desde la base
de datos. A estos documentos se les denomina de forma general informes.
Para crear estos documentos es necesario usar algn programa de creacin de informes.
Estos programas permiten definir la estructura general del informe (sin tener en cuenta los
datos)
Una vez creado el informe, este se enlaza con nuestra aplicacin, de forma que cuando el
usuario pulse la opcin de imprimir, el informe se rellene con los datos de la base de datos y
luego sea enviado a la impresora.
Para la creacin de informes para nuestras aplicaciones usaremos un programa gratuito
llamado IReport. El fichero de instalacin para este programa lo encontrar en la
subcarpeta Herramientas de la carpeta compartida.
Para descargar las ltimas versiones de este programa puede acudir a la pgina
http://www.jasperforge.org/sf/projects/ireport
En esta hoja guiada se vern las ideas bsicas de manejo del programa IReport.

491

EJERCICIO GUIADO N 1. INSTALACIN DE IREPORT

1. En primer lugar copie el fichero de instalacin del programa IREPORT a su


ordenador, e instale el programa.
2. Una vez instalado, ejectelo. La pantalla principal del IReport es la siguiente (es
relativamente parecida a la pantalla principal de NetBeans):

En esta zona
aparecern los
informes que se
estn diseando.

En esta parte
aparecern las
propiedades del
objeto seleccionado.

Aqu aparecern
los distintos
elementos que
forman el informe.

Esta es la zona de
diseo, donde se
definen las
caractersticas del
informe.

Y aqu tenemos la
salida, lugar donde
aparecen los
mensajes informativos
y de error.

3. Cierre el programa IReport. Lo usaremos ms adelante.

492

Aqu tendremos un
listado con los
campos de las
tablas que
podremos incluir en
el informe, entre
otras cosas.

EJERCICIO GUIADO N 2. CREACIN DE UN DSN

Definicin de DSN
DSN significa Data Source Name, es decir, Nombre del origen de datos.
Un DSN define cierta informacin sobre una base de datos, como por ejemplo el tipo de
base de datos que es y donde se encuentra almacenada en el ordenador.
Toda esta informacin se agrupa bajo un nombre, y ese nombre precisamente es lo que se
denomina un DSN.
Cuando un programa necesita acceder a una base de datos en concreto, solo hay que
indicarle el nombre del DSN que tiene la informacin de dicha base de datos. De esta forma,
el programa sabe acceder a la base de datos.
El IReport es un programa que necesita saber el DSN de la base de datos que va a manejar,
por eso es necesario aprender a crear DSNs para base de datos si queremos usar IReport.
En este ejercicio guiado n 2 aprenderemos los pasos a seguir para crear un DSN para una
base de datos. En nuestro caso, crearemos un DSN para la base de datos MANEMPSA.

1. Para crear un DSN acceda al Panel de Control.


2. Dentro del Panel de Control active el icono Herramientas Administrativas.

3. Dentro de Herramientas Administrativas active el icono Orgenes de datos.

4. En la pestaa DSN de Usuario pulse el botn Agregar para aadir un nuevo DSN.

493

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.

494

6. Ahora seleccionaremos el fichero de la base de datos MANEMPSA haciendo clic en


el botn Seleccionar:

7. Usando la ventana de exploracin que aparece, busca la base de datos MANEMPSA


que se encuentra en Mis Documentos. Seleccinala y pulsa Aceptar.

495

8. Esta es toda la informacin que necesitaremos para crear el DSN de la base de datos
MANEMPSA. Ahora ya solo queda darle un nombre al DSN. El nombre ser
BaseEjemplo. Escribe el nombre del DSN en la casilla correspondiente:

9. Pulsa Aceptar las veces que sea necesario y el DSN BaseEjemplo habr sido creado.
Esto quiere decir, que un programa determinado podr acceder a la base de datos
MANEMPSA simplemente indicndole el DSN BaseEjemplo.
Este es el caso del programa IReport. Como vers en los pasos siguientes,
tendremos que usar el DSN BaseEjemplo que acabamos de crear para poder realizar
informes sobre la base de datos MANEMPSA.
10. Una vez creado un DSN para una base de datos, este se queda almacenado en el
ordenador. Esto significa que no necesitaremos volver a crear un DSN para la base
de datos MANEMPSA.
11. El DSN se queda almacenado en el ordenador hasta que el propio usuario lo borre.
Para practicar, veremos como borrar el DSN que acabamos de crear (aunque
finalmente no lo borraremos porque lo usaremos ms adelante). Para ello entre en
Panel de Control, Herramientas Administrativas, Orgenes de Datos:

496

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)

497

EJERCICIO GUIADO N 3. CONEXIN DE IREPORT CON UNA BASE DE DATOS

1. Para poder crear informes con datos de una base de datos, es necesario realizar una
conexin entre el programa iReport y la base de datos. Este proceso se tendr que
realizar antes de crear cualquier informe sobre dicha base de datos, y solo hace falta
hacerlo una vez. Para este proceso, se usar el DSN de la base de datos.
En este ejercicio guiado conectaremos el programa iReport con la base de datos
MANEMPSA.
Para ello entre otra vez en el programa iReport.

2. Para crear esta conexin, active la opcin Datos Conexiones / Fuentes de Datos

3. Debe activar el botn Nuevo para crear una nueva conexin...

498

4. Para base de datos de Access, debes activar la opcin Conexin Base de Datos
JDBC y pulsar Prximo.

(gJ

[!! Propiedades de conexin

Creacin de nuevo datasource


Select the datasource type
onex1n Base Datos JDBC
Fuente datos fichero XML
Fuente de datos Rutinas Java (JavaBeans)
Fuente datos fichero CSV
JRDataSource Proveedor
JRDDataSource Cliente
Fuente datos vacio
Hibernar conexin
Cargado salto conexin hivernacin
Conexin EJBQL
Conexin Servidor XMLA
Conexin Mondrian OLAP
Modo ejecutar pregunta
Remote XML file datasource

Prueba

I[P'Oximo:>JII

499

Cancelar

5. Ahora le daremos un nombre a la conexin que realizaremos con la base de datos


MANEMPSA. El nombre ser simplemente: Conexin con MANEMPSA.

fll Propiedades de conexin

(g)

(4.
~

Con exi n B ase Datos JDBC

Nombre conexin con MANEMPSAI

...

~v i

Controlador JDBC lcom.mysql.jdbc.Driver


JDBC URL
~lago

ljdbc:mysql://localhost/MYDATABASE

JDBC URL

Direccin Server

Base Datos

1 1 Mago

Nombre usuario

O Salvar la password

Password

iATENCIN! las contraseas se almacenan en texto limpio. Si ahora no especificas


~ una contrasea, el iReport te pedir una solamente cuando sea requerida y no
ser guardada.

1 Prueba

111 Salvar

500

11 Cancelar

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

el Propiedades de conexin

(gJ

Conexin Base Datos JDBC


Nombre !conexin con MANEMPSA
Controlador JDBC
JDBC URL
Mago JDBC URL
Direccin Server net, sourcel'one .jtds. j<lbc. Driver
Base Datos
Nombre usuario
Password
iATENCIN! las contraseas se almacenan en texto limpio. Si ahora no especificas
~ una contrasea, el iReport te pedir una solamente cuando sea requerida y no
ser guardada.

1 Prueba

IICPvi ' ] 1 Cancelar

501

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:

502

8. Finalmente, activaremos la opcin Salvar el password para evitar que se nos pida
constantemente una contrasea para acceder a la base de datos (La casilla de la
contrasea password- se deja en blanco ya que la base de datos MANEMPSA no
tiene contrasea)

9. Se acaba de establecer una conexin entre el informe que estamos haciendo y la


base de datos MANEMPSA. Es muy interesante comprobar que todos los pasos que
hemos seguido son correctos. Para ello, pulse el botn Prueba, y si todo ha ido bien,
debe aparecer un mensaje indicndolo:

503

10. La conexin con la base de datos MANEMPSA est ya configurada. Solo tiene que
pulsar el botn Salvar para que quede guardada.
11. Al pulsar el botn Salvar volver a la pantalla inicial. En ella podr observar que se ha
creado una conexin (la conexin con MANEMPSA) Siguiendo estos mismos pasos
puede crear todas las conexiones que quiera con las bases de datos de su
ordenador.
Una vez creada una conexin, esta se queda guardada y podr ser usada para la
creacin de informes sobre la base de datos con la que conecta.

Conexin
creada.

Listado de
conexiones a
base de
datos (solo
hay una de
momento)

12. Cierra el cuadro de conexiones. Ya tenemos el programa iReport preparado para la


creacin de informes con la base de datos MANEMPSA.

504

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:

505

4. Hasta el momento solo hemos configurado una conexin en el iReport (la conexin
con MANEMPSA), as que ser la nica que aparezca al desplegar el listado de
conexiones.
5. Una vez elegida la base de datos (indicando su conexin correspondiente) tenemos
que extraer de ella los datos que queremos que aparezcan en el informe (listado) Y
para ello tendremos que hacerlo indicando una consulta SQL de tipo SELECT.
Ya que queremos hacer un listado con todos los trabajadores de la base de datos
tendremos que introducir una consulta SELECT que extraiga a dichos trabajadores:

6. Ya podemos ir al siguiente paso del asistente pulsando el botn Prximo.


7. En este nuevo paso tendremos que indicar los campos que queremos que aparezcan
en el listado. Para ello solo tendremos que seleccionar cada campo y pulsar el botn
> para aadirlo. En nuestro ejemplo debes aadir los campos: DNI, Nombre,
Apellidos y Sueldo nicamente.
Nota:
El botn > aade de uno en uno.
El botn >> los aade todos.
El botn < quita un campo del informe.
El botn << los quita todos.

506

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

507

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.

508

12. Una vez finalizado el asistente, volveremos a la pantalla principal de iReport. En ella,
ver como ha aparecido el diseo del informe que acaba de crear.

Diseo del informe

En prximas hojas guiadas se estudiar la forma de modificar el diseo y de crear un


informe desde cero.
13. Vamos a guardar el informe. Para ello activa la opcin Fichero Guardar. El nombre
que le daremos al informe ser trabajadores:

509

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:

510

15. Al hacer esto aparecer por fin el listado que ha creado. Este listado aparece en una
ventana nueva y tendr un aspecto similar al siguiente:

Como puede observar, aparecen los campos que indic en el asistente. El informe es
tabulado (es decir, tiene forma de listado) y en l aparecen los trabajadores que
tenga en su base de datos MANEMPSA.
Debe tener en cuenta que si ha cambiado el contenido de la base de datos
MANEMPSA entonces es posible que le aparezcan otros trabajadores.
Observe como el ttulo del listado no es muy adecuado. Lo cambiaremos a
continuacin.

16. Cierre la ventana del informe (no la del iReport) y volver a la pantalla principal de
iReport.
17. Haga doble clic sobre el ttulo del informe y cmbielo por Listado de Trabajadores:

511

18. Vuelva a visualizar el resultado del informe:

19. Ahora el informe tendr mejor aspecto:

20. Acabamos de crear nuestro primer informe. Un listado con los datos de los
trabajadores. Ya puede cerrar el programa iReport. Guarde todos los cambios.

512

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.

513

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Diseo de Informes
En la hoja anterior se aprendi a realizar un informe usando el mago de informes. Este
asistente crea un informe predefinido a partir de los campos de la tabla que indiquemos.
El mago de informe es una forma rpida de crear informes, aunque el resultado quizs no
sea exactamente lo que buscbamos. Es posible que nos interese cambiar los colores, el
tipo de letra, el formato de los nmeros, etc.
En la hoja guiada anterior vimos un ejemplo de esto. Una vez creado el informe, se tuvo que
cambiar el ttulo ya que el ttulo incluido por defecto no era el adecuado.
En esta hoja guiada se aprendern algunas tcnicas para modificar un informe una vez que
haya sido creado con el mago de informes. Veremos como modificar las propiedades de
cada elemento del informe.

514

EJERCICIO GUIADO N 1. CREACIN Y MODIFICACIN DE UN INFORME

En este ejercicio guiado se crear un informe usando el mago de informes. Concretamente,


se crear un informe que muestre el listado de los coches de la empresa MANEMPSA.
Luego, una vez creado dicho listado, lo modificaremos.
1. Abra el programa iReport.
2. Active la opcin Fichero Mago de Informes.

3. Aparecer el asistente para la creacin de informes. En el primer paso tiene que


elegir la conexin correspondiente a la base de datos MANEMPSA (que es donde se
encuentra la tabla coches)

515

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.

516

7. Pulse el botn Prximo para pasar al siguiente paso del asistente:


8. Estamos en el paso 3 del asistente. En este paso hay que indicar el agrupamiento del
informe. En nuestro ejemplo no usaremos agrupamiento as que pulse simplemente
el botn Proximo.
9. En el paso 4 del asistente tendremos que elegir la distribucin del informe.
Escogeremos una distribucin tabulada y de tipo ClassicT.

10. Active Prximo para ir al 5 y ltimo paso del asistente y pulse Terminar.
11. Acabamos de crear el informe. Observe su diseo.

12. Ahora es conveniente guardarlo para evitar problemas. Pulse la opcin Fichero
Guardar y gurdelo con el nombre listadocoches en la carpeta Mis Documentos.

517

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.

518

16. Empezaremos cambiando el ttulo del informe. Para ello haremos doble clic sobre el
ttulo y escribiremos Listado de Coches:

17. Puede cambiar el aspecto de cada elemento del informe seleccionndolo con un clic
y luego modificando sus propiedades, las cuales aparecern en la parte derecha de
la ventana. Por ejemplo, seleccione en la cabecera del listado el campo matrcula:

18. En la zona de propiedades (parte derecha) active por ejemplo la propiedad negrilla y
el tipo de letra Comic Sans:

519

19. Si observa el elemento seleccionado (Matrcula en la cabecera) observar que est


ahora en negrita y con el tipo de letra Comic:

20. Selecciona ahora el ttulo, por ejemplo (solo tienes que hacer un clic sobre l)

520

21. Ahora activa las siguientes propiedades:

Activa la propiedad primer plano (en el botn con


los tres puntos) y escoge un color verde.
Activa la propiedad fondo y escoge un color
amarillo.
Desactiva la propiedad Transparente.

Pon un tamao de 28, y negrilla.


Activa la itlica (cursiva) y el subrayado.
Asigna una alineacin izquierda.

521

22. Si observas el ttulo del informe, vers que tendr el siguiente aspecto ahora:

23. Vamos a colocar el recuadro del ttulo a la izquierda. Para ello, haz clic sobre el ttulo
y sin soltar el botn del ratn arrstralo a la parte izquierda del informe, para que
quede as:

24. Visualiza el informe para ver el resultado:

25. El informe tendr el siguiente aspecto:

Como ve, hemos cambiado la forma y


posicin del ttulo.
Observa. No aparece el campo matrcula!, Esto es debido
a que es demasiado grande y no cabe aqu.

522

26. Vamos a solucionar el problema del campo Matrcula. Cierra la ventana del listado y
en la ventana de diseo haz que el campo matrcula tenga un tamao de letra de 10:

27. Si ahora visualizas el listado de nuevo, vers como s aparece el campo matrcula:

28. Sigamos cambiando cosas en el diseo del informe. Ahora vas a seleccionar el
campo matrcula correspondiente no a la cabecera, sino al listado de datos:

Este cuadro se corresponde al conjunto de datos


de la columna matrcula.

29. Haz que sus propiedades sean las siguientes:


Negrita: Activado
Tamao de letra: 8
Tipo de letra: Courier New
Primer Plano: Azul

523

30. Una vez cambiadas las propiedades, si visualizas el informe, deber tener el
siguiente aspecto:

Si observas el listado vers que todos los datos de la


columna matrcula tiene ahora las propiedades
asignadas.

31. As pues, el diseo del informe que haya creado con el mago de informes puede ser
modificado luego. Bsicamente solo tiene que seleccionar el elemento a modificar y
luego cambiar sus propiedades.
Debe tener en cuenta que los elementos del diseo pueden cambiarse de lugar y que
pueden cambiarse de tamao.
En la parte superior de la ventana de iReport tiene una barra de herramientas que
puede usar tambin para realizar cambios en los elementos:

32. Ha terminado de realizar el informe. Puede cerrar iReport y guardar los cambios si
hiciera falta.

524

CONCLUSIN
La forma ms sencilla de crear un informe con iReport es a travs del mago de
informes.
Una vez creado el informe, puede realizar modificaciones en su diseo seleccionando
cada elemento y cambiando sus propiedades en la zona de propiedades.
Tambin puede mover y cambiar de tamao los distintos elementos del informe.
De esta forma, puede crear rpidamente un listado para luego personalizarlo.

525

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Creacin de un informe desde cero


En hojas anteriores hemos visto que la forma ms rpida de crear un informe es usando el
mago de informes de iReport. Luego, con el informe resultante, solo tenamos que cambiar
las propiedades de cada elemento del informe.
En esta hoja veremos como crear un informe empezando desde cero, lo que nos servir
adems para entender las distintas zonas en que se divide un informe.
La creacin de informes desde cero es algo tedioso y lento, aunque por otro lado nos da
total libertad a la hora de distribuir cada elemento en el informe.
En muchos casos tendr que crear los informes desde cero, ya que el cliente le insistir en
usar un determinado formato para los listados, las facturas y todos aquellos documentos que
deben imprimirse desde el programa. Insistir en mantener los colores propios de la
empresa (la imagen corporativa) y dems caractersticas propias de la empresa. Para hacer
esto a veces lo mejor es crear el informe desde el principio.
En esta hoja se ver un ejemplo de creacin de informe desde cero.

526

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME DESDE CERO

1. Entre en iReport
2. Nuestro objetivo ser crear un informe que muestre el listado de servicios realizados
por el trabajador Juan Prez, cuyo nmero de DNI es 12.321.567-B.
3. Para ello, active la opcin Fichero Nuevo Documento.

4. El nombre del informe ser serviciosjuan:

5. Al pulsar OK, observar que aparece un informe en blanco:

527

6. Este informe est dividido en zonas, cada una con un cometido distinto (lo iremos
estudiando a medida que realicemos el informe)
7. En la barra de herramientas debe indicar la conexin a la base de datos que quiere
usar. En nuestro caso la conexin se llama Conexin con Manempsa.

8. Ahora hay que indicar la consulta SQL que nos permita acceder a los datos
necesarios para el informe. Esto se tiene que hacer activando la opcin Datos
Consulta de Informe:

528

9. En la ventana que aparece tendr que introducir la siguiente consulta SQL:


select * from trabajadores, servicios
where trabajadores.dni=servicios.dni and trabajadores.dni=12.321.567-B
order by servicios.fecha

Si en la parte inferior aparece el


listado de campos seleccionados
en la consulta, entonces es
indicativo de que todo va bien.

529

10. Pulsa OK. Acabamos de indicarle al informe que estamos realizando la base de datos
de donde tomaremos los datos y la consulta para extraer dichos datos. Si observa la
parte izquierda de la ventana del iReport, ver una opcin Campos:

11. Pulse en el + para visualizar el listado de campos disponibles. Ver todos los campos
seleccionados en la consulta SQL que acaba de introducir.

12. Nos interesa que en el listado de los servicios de Juan aparezca el nmero, el tipo de
servicio y la cantidad. Para ello, tendr que aadir estos datos a la zona de Detalle
(Detail).
La zona de detalle es la zona en la que aparecern los datos del listado, y por tanto
es all donde tiene que aadir los campos a mostrar.
Arrastra el campo nmero desde la zona de campos a la zona de detalle:

530

13. Haz lo mismo con los otros campos que queremos mostrar: el tipo y la cantidad: El
detalle quedar as:

14. Visualice el informe resultante.


serviciosjuan.

iReport le pedir que guarde el informe. Llmelo

531

15. Una vez guardado ver como queda el informe que acaba de hacer:

16. No est muy conseguido, pero solo acabamos de empezar. Recuerde que la zona de
Detalle (Detail) es el sitio donde colocar los campos del listado de datos.
17. Nuestra zona de Detalle es muy grande, por eso los datos salen tan separados.
Puede achicar una zona haciendo clic en la lnea de separacin y arrastrando.
Pruebe a hacerlo hasta que la zona de Detalle quede as (es posible que necesite
mover los campos):

532

Clic en la lnea de separacin y


arrastra.

18. Si visualiza ahora el informe ver que tiene mejor aspecto (los servicios de Juan
aparecen ms unidos):

533

19. Ahora sera interesante que el listado tuviera una cabecera. Para ello, haz clic en el
botn de la barra de herramientas llamado Texto Esttico y luego haz clic en la zona
del informe llamada Column Header y arrastre el ratn:

20. Haz doble clic sobre el recuadro que ha aparecido y escriba dentro de l N
Servicio.

21. La zona del informe llamada Encabezado de Columna (Column Header) es la zona
donde colocar los encabezamientos del listado. Acabamos de colocar el
encabezamiento de la columna nmero. Ahora repita el proceso para colocar los
otros dos encabezados de columnas:

22. Para destacarlos un poco (ya que son los encabezados), haremos que estn en
negrita y que su tamao sea un poco ms grande (para ello use las propiedades de
dichos elementos) El resultado debe ser similar al siguiente:

534

23. Visualiza el informe y observa el resultado:

24. Ya tiene un mejor aspecto, pero an puede mejorarse ms. A travs del botn Lnea
puede dibujar lneas en el informe. Dibuje una lnea en la zona del Encabezado de
Columna:

botn lnea

NOTA: Para que la lnea le salga recta puede dibujarla teniendo pulsada la tecla
Maysculas.

535

25. Visualice el informe:

26. Ahora vamos a colocar un ttulo al informe. El ttulo del informe se coloca en la zona
Ttulo (Title). En nuestro caso vamos a colocar el ttulo Ficha de Servicios. Para
introducir un texto tendr que usar el botn Texto esttico que ya us antes:

Haga clic en este botn y luego haga clic y arrastre en la zona del Ttulo. Se crear
un recuadro:

27. Haz doble clic sobre ese recuadro y escribe Ficha de Servicios.

536

28. Ahora asigna al ttulo las siguientes propiedades:


a.
b.
c.
d.
e.
f.

Un tamao de letra de 24
Agranda el cuadro de forma que ocupe prcticamente toda la zona de ttulo.
Centra el ttulo en el recuadro.
Subryalo.
Asigna un color de fondo gris claro.
Desactiva la opcin transparente.

Si todo va bien, su ttulo tiene que haber quedado as:

537

29. Visualice el listado. Su aspecto debe ser ms o menos el siguiente:

30. Ahora introduciremos algunos datos del trabajador (en nuestro caso de Juan Prez)
La zona que usaremos ser el Encabezado de Pgina (pageHeader)
Debe saber que en el encabezado de pgina se colocan aquellos datos que deban
aparecer en la parte superior de todas las pginas.
La diferencia entre Ttulo y Encabezado de Pgina es que lo que escriba en el ttulo
aparecer en la parte superior de la primera pgina (y ninguna ms), mientras que lo
que escriba en el encabezado de pgina aparecer en la parte superior de todas las
pginas del listado.
31. Vamos a empezar agrandando la zona del Encabezado de Pgina. Esto se hace
fcilmente arrastrando la lnea lmite inferior de la zona:

538

Haz clic en esta lnea y


arrastra hacia abajo.

32. Ahora que tenemos ms espacio en el encabezado de pgina vamos a dibujar en l


un recuadro. Esto lo puede hacer usando el botn Rectngulo de la barra de
herramientas:

Solo tiene que activar este botn y hacer clic y arrastrar en el encabezado. Intente
que quede as:

539

33. Ahora aada los siguientes cuadros de texto esttico dentro del recuadro que acaba
de hacer:

Recuerde que estos cuadros de texto se hacen usando el botn Texto esttico de la
barra de herramientas:

En el ejemplo, se ha asignado un tamao de letra de 12, y adems se ha puesto en


negrita el texto del primer cuadro.

34. Ahora, para que salgan los datos propios del empleado, aadiremos los campos
nombre, apellidos y DNI. Empezaremos por aadir el campo DNI. Esto se hace
arrastrando desde la zona de campos:

540

35. Haga lo mismo con el campo Apellidos y el campo Nombre. El informe quedar as:

36. Ahora se cambiarn algunas propiedades de los campos que hemos aadido:
a. Asigne un tamao de 12
b. El DNI debe aparecer en negrita.
c. Agrande los cuadros de los campos.
El resultado ser el siguiente:

541

37. Visualice el resultado del informe. Debe tener el siguiente aspecto:

Como puede ver, en la ficha del empleado aparecen sus datos reales.

542

38. Y ya para terminar agregaremos un logotipo al informe. Dicha imagen se colocar en


la zona del Encabezado de Pgina, al lado del recuadro. Para ello, tendr que usar el
botn de la barra de herramientas imagen:

Haga clic en este botn y luego haga clic y arrastre hasta crear un rectngulo en la
zona del Encabezado de Pgina. Debe quedar as:

39. La imagen del logotipo aparecer en el recuadro que acabamos de hacer. Es


necesario que se copie el fichero de la imagen en la misma carpeta que donde est
guardado el informe. En nuestro caso, en la carpeta Mis Documentos.
Usaremos la imagen nenfares.jpg que se suele encontrar en la carpeta Mis
Imgenes como logotipo para el informe. As pues, copie el fichero nenfares.jpg
desde la carpeta Mis Imgenes a la carpeta Mis Documentos.

543

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:

544

42. Ha podido observar en este ejemplo los pasos bsicos a seguir para crear un informe
desde cero. Como puede ver, es una forma ms trabajosa de crear un informe, pero
a cambio disponemos de ms libertad a la hora de disear el informe.

43. Para finalizar con esta hoja guiada, veamos para que sirve cada una de las zonas del
informe:
Encabezado de Pgina
(pageHeader)
Lo que se coloque aqu
aparecer en todas las pginas,
en la parte superior.
Encabezado de columna
(columnHeader)
Se usa para colocar el texto del
encabezado del listado (los
nombres de cada columna)
Detalle (detail)
Aqu aparecern todos los datos
del listado. Por tanto, aqu se
suelen colocar los campos que
se quieren visualizar.

Pie de columna (columnFooter)


Lo que se coloque aqu aparecer
siempre debajo del listado de
datos, en todas las pginas.
Ttulo (title)
Aqu se coloca el ttulo del
informe. Aparecer en la parte
superior de la primera pgina
nicamente.

Pie de Pgina (pageFooter)


Lo que se coloque aqu aparecer
en la parte inferior de todas las
pginas (menos en la ltima). Ideal
para colocar nmeros de pgina.

Resumen (summary)
Aparece cuando finaliza el listado de
datos (en la ltima pgina) Esta zona se
usa para colocar clculos estadsticos,
como suma de cantidades o cuentas y
promedios, etc... que deban aparecer al
final.

Pie de la ltima pgina (lastPageFooter)


Es un pie especial, ya que solo aparece en la
parte inferior de la ltima pgina.

545

CONCLUSIN
iReport permite la creacin de informes desde cero, lo que da ms versatilidad a la
hora de disear el listado.
Es necesario indicar la conexin a la base de datos y la consulta SQL para extraer los
datos que aparecern en el informe.
El informe se divide en zonas, y los elementos se colocarn en dichas zonas segn
donde queramos que aparezcan dichos elementos en el informe final.
Para introducir texto en el informe se usar la opcin texto esttico.
Si se quiere que aparezca un dato de la base de datos, entonces habr que introducir
un campo.
Tambin se pueden colocar lneas, recuadros, imgenes, etc.
Todos los elementos colocados pueden ser modificados a travs de sus propiedades.

546

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Clculos
Es muy habitual que un informe no solo muestre datos de las tablas de la base de datos,
sino que tambin muestre clculos realizados con esos datos.
Para hacer esos clculos se puede usar la potencia de SQL por un lado. Podemos generar
esos clculos directamente en la consulta SQL, con lo cual solo tendremos que mostrar los
resultados en el informe como si fueran otros campos.
Por otro lado tambin podemos realizar los clculos directamente en el informe.
En esta hoja se ver como crear un informe con clculos. Adems se aprendern algunos
conceptos nuevos en lo que se refiere a presentacin de datos y uso de las zonas del
informe.

547

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME CON CLCULOS

1. Entra en iReport.
2. Vamos a crear un informe desde cero donde aparezca el listado de servicios
realizados. Interesa en principio que aparezca la fecha del servicio el tipo del servicio
y la cantidad cobrada.
Para ello active la opcin Fichero Nuevo Documento.
3. Asigne el nombre informeservicios al informe.
4. Indique ahora que usar la conexin con la base de datos MANEMPSA. Para ello
puede elegir la Conexin con MANEMPSA en el desplegable de conexiones, en la
parte superior derecha de la ventana:

5. Ahora que hemos elegido la conexin, ahora indicaremos la consulta SQL que nos
permita extraer los datos que queremos mostrar en el informe. Para ello, activa la
opcin Datos Consulta de Informe.
6. En la pantalla que aparece debes introducir la siguiente consulta SQL:
select * from servicios order by fecha

548

7. Acepta la pantalla anterior. Ya podemos empezar a disear el informe. Empezaremos


por poner un ttulo. El ttulo ser Listado de Servicios. Agrande la letra del ttulo y
cntrelo.

8. Ahora aadiremos los textos de la cabecera. En la zona de Encabezado de columna


(columnHeader) aadiremos los siguientes cuadros de texto esttico:

9. Ahora para definir los datos del listado, tendremos que aadir campos a la zona del
detalle (detail). Debes arrastrar los campos fecha, tipo y cantidad:

10. La zona del detalle es demasiado grande, as que reduzca su tamao arrastrando la
lnea de separacin:

549

Arrastra la lnea del


detalle.

11. Visualice el listado. IReport le pedir que guarde antes de visualizar. Guarde el
listado con el nombre informeservicios en Mis Documentos.
12. El listado tendr la siguiente forma:

13. Observe como la fecha muestra tambin la hora. Antes de continuar, cambiaremos el
formato de la columna de la fecha para que esto no suceda. Para ello seleccione el
campo Fecha:

550

14. Vamos a modificar una de las propiedades llamada Patrn. Haz clic en el botn con
tres puntos de esta propiedad:

15. Esta propiedad permite cambiar la forma en que se presentan nmeros, fechas y
dems tipos de datos en el informe.
Elige en la zona de categoras la categora Date (Fecha) y luego escoge el patrn con
forma dia/mes/ao:

Aplica los cambios.


16. Vuelve a visualizar tu listado. Ahora vers como las fechas aparecen correctamente.
Recuerda esta propiedad, ya que la usars muchas veces. Sobre todo con fechas y
nmeros. En el caso de los nmeros, se puede usar para decidir algunas
caractersticas como los dgitos decimales o si mostrar el punto separador de miles.

17. Vamos a mejorar el listado aadiendo dos lneas. Una lnea justamente debajo de la
cabecera y otra en la parte del pie de columna (columnFooter):

551

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:

552

19. La zona del pie de pgina pageFooter es ideal para colocar en ella el nmero de
pgina del listado. (Tenga en cuenta que el listado puede ser muy largo y tener varias
pginas)
Lo que introduzca en la zona pageFooter aparecer en la parte inferior de cada
pgina en todas las pginas del listado excepto en la ltima pgina. En el caso de la
ltima pgina la zona que hace esta funcin es la zona llamada lastPageFooter
(ltimo pie de pgina)
Para que la zona pageFooter afecte a todas las pginas del informe incluyendo la
ltima, es necesario ocultar la zona lastPageFooter.
Veamos como se hace esto:
20. Haga clic con el botn derecho del ratn sobre la zona lastPageFooter y elija
Propiedades de banda.

21. Aparecer un cuadro de opciones donde se podr elegir el tamao de la zona. En


nuestro caso indicaremos un cero y aplicaremos. Luego cerraremos el cuadro de
opciones.

553

22. Se podr observar entonces como hemos ocultado la zona lastPageFooter. Al hacer
esto, la zona pageFooter tendr control sobre todas las pginas incluyendo la ltima.

23. Ahora arrastra el elemento especial Pgina X de Y desde la librera hasta el pie de
pgina. Observa:

24. La Librera contiene una serie de campos especiales que muestran cosas como el
nmero de la pgina o la fecha actual. Elementos que suelen ser muy comunes en
los informes.
25. Aprovecha la Librera para agregar en la parte derecha del pie la fecha actual.
Arrastra el elemento Fecha actual a la zona del pie. Entonces vers como aparece un
cuadro donde tendrs que elegir el formato de la fecha. Elige el formato completo.

26. El pie tiene que haber quedado ms o menos as:

554

27. Ahora visualice el informe y observe la parte inferior (si cambia el zoom al 50% podr
tener una vista global del informe):

Ver que en la parte inferior aparece el nmero de la pgina y la fecha en el formato


indicado.

555

28. Supongamos ahora que nos interesa tener una columna IVA en la que aparezca el
16% de IVA de cada una de las cantidades. Desgraciadamente, este campo no existe
en la tabla servicios, de la que hemos extrado los datos. Sin embargo, es posible
crear este campo directamente en la consulta SQL realizando el clculo.
Active la opcin Datos Consulta del Informe para acceder a la consulta que
introducimos al principio.

29. Cambie la consulta por la siguiente instruccin SELECT (respete maysculas y


minsculas):
select Fecha, Tipo, Cantidad, Cantidad*0.16 as IVA from servicios order by fecha

Esta consulta SELECT muestra la Fecha, Tipo y Cantidad de los servicios, pero adems,
ver que realiza un clculo: multiplica el campo Cantidad por 0.16 y le asigna al resultado del
clculo el nombre IVA.
Es decir, se crea un nuevo campo (campo calculado) llamado IVA y creado a partir del
producto del campo Cantidad por 0.16
select Fecha, Tipo, Cantidad, Cantidad*0.16 as IVA from servicios order by fecha
Nombre del campo calculado

Clculo que se realiza

Los campos calculados es una caracterstica del lenguaje SQL que aprovecharemos para
realizar clculos con los campos de las tablas.

556

30. Pulse Ok y observe la zona de campos. Ver como ha aparecido un nuevo campo
llamado IVA. Tan solo tiene que agregarlo a la zona de detalle como si fuera un
campo ms.

31. Por supuesto, sera interesante aadir un texto esttico en el encabezado de


columnas:

32. Visualice el informe resultante:

557

33. Para hacer otro ejemplo de campos calculados, entre en la consulta del informe y
modifique la instruccin SQL de forma que quede as:
select Fecha, Tipo, Cantidad, Cantidad*0.16 as IVA, IVA+Cantidad as Total
from servicios order by fecha

En este caso, se est aadiendo otro campo calculado (en rojo) llamado Total. Este
campo es la suma del IVA y la Cantidad. Es decir, es el total con Iva.
34. Al pulsar Ok observar en la zona de campos este nuevo campo. Aproveche esto
para agregar una nueva columna con los totales con iva:

35. Visualice el informe. Debe tener este aspecto:

558

36. Hemos aprendido a agregar campos calculados a partir de otros campos, y aadirlos
al listado. Ahora aprenderemos a realizar clculos de totales, o clculos resumen.
Por ejemplo, sera interesante calcular la suma de todas las cantidades, todos los IVA
y todos los totales ms IVA.
Estos totales suelen aparecer en la parte final del listado. En la zona llamada
Resumen (summary)
37. Empezaremos agregando en la zona summary una lnea corta:

38. Para agregar un total (una suma) se usa el elemento Total de la Librera. Haga clic en
l y arrstrelo a la zona del resumen.

39. Aparecer un cuadro de dilogo donde tendr que indicar el campo que quiere
sumar. Elija el campo Cantidad y acepte.

559

40. Aparecer un nuevo recuadro en el resumen. Colquelo al mismo nivel que la


columna de la cantidad.

41. Haga el mismo proceso para calcular la suma del IVA y del Total. Al final, el diseo
de la zona resumen debe tener el siguiente aspecto:

560

42. Los elementos situados en la zona del resumen aparecen al final del listado.
Visualice el informe y observe la parte final del listado.

43. El informe est terminado. Gurdelo y cirrelo.

561

CONCLUSIN
SQL permite la creacin de campos calculados a partir de otros campos en una
consulta SELECT.
Esta caracterstica es muy til por ejemplo en el caso de los informes, ya que nos
permite mostrar clculos en ellos.
iReport, adems, proporciona la posibilidad de realizar sumas totales de campos.
Recuerde tambin el uso de las distintas zonas del informe:
-

Title Ttulo: Usado para colocar el ttulo del informe. Aparece en la primera
pgina nicamente.

pageHeader Encabezado de pgina: En el se coloca aquello que deba aparecer


en la parte superior de todas las pginas.

columnHeader Encabezado de columna: Usado para colocar la cabecera del


listado.

Detail Detalle: Usado para colocar los datos (campos)

columnFooter Pie de Columna: En el se coloca aquello que deba aparecer en la


parte inferior del listado en todas las pginas.

pageFooter Pie de pgina: En esta zona se coloca aquello que deba aparecer en
la parte inferior de todas las pginas (menos la ltima, si est activado el
lastPageFooter) Se usa para colocar el nmero de pgina.

lastPageFooter Ultimo pie de pgina: Es el pie de pgina de la ltima pgina. Si


se desactiva, entonces es sustituido por el pageFooter.

Summary Resumen: Usado para colocar clculos de totales. Aparece al final del
listado.

562

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Informes Agrupados
Un informe agrupado se puede definir como varios listados en un mismo informe. Los
elementos de cada listado tienen una caracterstica en comn, o, dicho de otra forma,
pertenecen a un mismo grupo.
Por ejemplo, si tuviera un listado de trabajadores, podra mostrar dicho listado agrupado
segn profesin, y entonces tendramos el listado de albailes, el listado de profesores, el
listado de policas, el listado de bomberos, etc...
Es decir, el listado de trabajadores se dividira en grupos segn las distintas profesiones de
los trabajadores.
En esta hoja guiada se ver como realizar este tipo de listados.

563

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME AGRUPADO

1. Entra en iReport.
2. Crearemos un informe en el que aparezca el listado de servicios realizados.
Usaremos el mago de informes para hacer este listado.
Para ello active la opcin Fichero Mago de informes.
3. La conexin a usar ser Conexin con MANEMPSA. Y la consulta SQL ser la
siguiente:
select * from servicios order by tipo
(Nota: observe que hemos ordenado la consulta por tipo. Luego ver por qu)
Pulse el botn Prximo.
4. Los campos a aadir al listado sern: Nmero, Fecha, Tipo y Cantidad.
Pulse el botn Prximo.
5. Ahora ya estamos en el paso tercero del asistente. En este paso tendremos que
indicar la forma de agrupar el listado. En el desplegable grupo 1 indique el campo
tipo. Esto significa que el listado saldr agrupado por tipo de servicio.

Pulse Prximo.
6. Elija una disposicin Tabulada del tipo Classic_T. Pulse Prximo y Terminar.

564

7. Aparecer el diseo del informe que acaba de crear. Observe que entre las zonas
tpicas del informe ha aparecido una nueva zona de agrupamiento:

8. Visualice el informe y observe el resultado (al visualizarlo iReport le pedir que lo


guarde. Gurdelo con el nombre serviciosagrupados):

Como ve, aparecen varios sub-listados. Un listado con los servicios de electricidad, otro con
los servicios de fontanera, y otro con los servicios de limpieza. Tenemos un informe en
grupos.
NOTA: Es obligatorio que la consulta del informe est ordenada segn el campo por el que
vayamos a agrupar. Esta es la razn por la que la consulta se orden por tipo.

565

9. Ahora se mejorar un poco el listado que se ha hecho. En primer lugar modifique el


patrn del campo fecha, de forma que aparezca en formato da-mes-ao:

10. Tambin puede resultar interesante modificar el patrn de la Cantidad, de forma que
aparezca con dos decimales:

11. Finalmente asigne el ttulo Listado de Servicios al informe. Este debe tener ahora el
siguiente aspecto al visualizarlo:

566

NOTA:
Es posible agregar distintos niveles de agrupamiento a un informe. Usando el ejemplo del
inicio de esta hoja, podramos tener un listado de trabajadores agrupado por profesiones y
por estado civil. En este caso, aparecera un grupo por cada profesin, y, cada grupo, estara
a su vez subdividido en grupos segn el estado civil.
Por ejemplo, el grupo de bomberos podra tener el siguiente aspecto:
Bomberos
Casados
------Solteros
------Etc...
Para hacer esto basta con indicar varios campos en el paso de agrupamiento del asistente
mago de informes. Pero tenga en cuenta que tendr que ordenar la consulta SELECT segn
dichos campos.
En el ejemplo de los trabajadores, la consulta podra tener este aspecto:
select * from trabajadores order by profesin, estado
Se anima al alumno que experimente con esta posibilidad.

567

CONCLUSIN
Un informe agrupado es aquel en que los registros aparecen en distintos grupos.
Los elementos de un grupo tienen la misma caracterstica.
Se puede decir que un informe agrupado consiste en una serie de sub-listados.
Para crear los grupos se toma como referencia el valor de un determinado campo.
La mejor forma de crear un informe agrupado usando iReport es a travs del mago de
informes, ya que este asistente muestra un paso donde se puede elegir el campo
segn el que se quiere agrupar.
No olvide que cuando quiera agrupar un listado por un campo es obligatorio que la
consulta SELECT del informe ordene el listado por el campo por el que se quiere
agrupar.

568

EJERCICIO GUIADO. JAVA. INFORMES DE BASE DE DATOS

Conexin con Informes desde Java


Una vez creados los informes con iReport, tendremos que acceder a ellos desde nuestra
aplicacin Java.
En esta hoja guiada veremos los pasos bsicos necesarios para mostrar un informe desde
una aplicacin Java.
Nota: En esta hoja guiada se usar el informe creado en la hoja anterior, llamado
serviciosagrupados.

569

EJERCICIO GUIADO N 1. CREACIN DEL INFORME COMPILADO

1. Entra en iReport y abra el informe serviciosagrupados (se encontrar en la carpeta


Mis Documentos)
Los ficheros que contienen un informe son ficheros del tipo .jrxml. As pues, en la
carpeta Mis Documentos encontrar el fichero serviciosagrupados.jrxml, que es el
que tiene que abrir.

(Nota: Si le echa un vistazo a la carpeta Mis Documentos, ver tambin un fichero


llamado serviciosagrupados.bak. Este fichero es simplemente una copia de seguridad
que se crea automticamente al guardar el informe.)
2. Vamos a ver el aspecto del informe. Pulse el botn:
Ya sabe que este botn, llamado Ejecutar informe (usando conexin activa), permite
visualizar el informe relleno con los datos de la base de datos, segn la consulta SQL
que haya usado.

570

3. Sin embargo, este botn no solo sirve para visualizar el informe final, sino que
adems acta como compilador, generando un fichero del tipo .jasper.
Los ficheros .jasper son informes compilados, de forma que puedan ser usados en
aplicaciones java.
Cada vez que ha visualizado un informe, ha generado sin darse cuenta un fichero
.jasper, con el nombre del informe que estaba visualizando. En nuestro ejemplo,
acabamos de generar un fichero serviciosagrupados.jasper
4. Los ficheros .jasper generados se suelen almacenar dentro de la carpeta del
programa iReport, sin embargo, nosotros configuraremos el programa iReport para
que los ficheros compilados se almacenen directamente en la carpeta Mis
Documentos, de forma que estn ms accesibles.
Para ello, active la opcin Opciones Opciones:

571

5. En el cuadro de opciones que aparece active la pestaa Compilador.

6. En el primer recuadro que aparece se tiene que indicar el directorio donde


aparecern los ficheros compilados. Para ello, pulse el botn Explorar y seleccione la
carpeta Mis Documentos.
Si todo va bien, el resultado ser parecido al siguiente:

7. Pulse el botn Grabar. A partir de ahora cada vez que visualice un informe el fichero
compilado se guardar en la carpeta Mis Documentos. Lo vamos a comprobar.
Vuelva a visualizar su informe:
8. Acuda a la carpeta Mis Documentos y compruebe que en ella hay ahora un fichero
serviciosagrupados.jasper. Este es el fichero del informe compilado. Este fichero ser
el que usar para visualizar informes desde java.

572

EJERCICIO GUIADO N 2. CONEXIN CON UN INFORME DESDE JAVA

1. Entra en NetBeans y crea un nuevo proyecto Java. El proyecto se llamar


PruebaInformes y contendr un paqueteprincipal. Este paquete a su vez contendr
una ventanaprincipal.

2. Crea la carpeta Base dentro de la carpeta del proyecto y copia en ella la base de
datos MANEMPSA.
3. Prepara tu proyecto para que pueda acceder a la base de datos MANEMPSA (ya
sabes, crear el objeto conexin, sentencia, etc...)
4. Para que nuestro programa sea capaz de presentar informes, crearemos una carpeta
llamada Informes dentro de la carpeta del proyecto. Y dentro de dicha carpeta
copiaremos los ficheros .jasper de los informes que queremos utilizar. En nuestro
caso, copiaremos el fichero serviciosagrupados.jasper que creamos en el apartado
anterior.
Como ve, es algo parecido a lo que hacemos con la base de datos.
As pues crea la carpeta Informes dentro de la carpeta de proyecto y copia el fichero
serviciosagrupados.jasper dentro de ella.
5. Crea un botn en la ventana de tu proyecto. El botn contendr el texto Informe
Agrupado y su nombre ser btnInformeAgrupado.

573

6. El objetivo es hacer que aparezca el informe serviciosagrupados cuando se pulse


este botn. Para ello, programe lo siguiente en el actionPerformed del botn:

Este cdigo le muestra muchos errores, no se preocupe ahora de ellos. En los siguientes
pasos se corregirn. De momento lo que se va a hacer es explicar el cdigo de este evento:

Lo primero que observar es como se usa una variable rutaInforme para almacenar el
camino del informe que queremos mostrar. Observa que dicho informe se especifica con
el fichero .jasper generado con iReport, y que este fichero se encuentra dentro de la
subcarpeta informes.

A continuacin viene una lnea donde se crea un objeto informe del tipo JasperPrint:

JasperPrint informe = JasperFillManager.fillReport(rutainforme,null,conexin);

Esta lnea es la que genera el informe que se va a mostrar. El informe en java es un


objeto del tipo JasperPrint y es creado a travs de otro objeto del tipo JasperFillManager.

Es interesante que observes el uso de un mtodo llamado fillReport (rellenar informe)


que se encarga de rellenar el informe con datos.

Este mtodo necesita tres parmetros:


-

El sitio donde se encuentra el fichero del informe.


Los parmetros (Null en nuestro ejemplo. Los parmetros se estudiarn en
prximas hojas guiadas)
Y el objeto conexin, que le permite a java acceder a la base de datos para
recoger los datos que se presentarn en el informe.

Una vez creado el objeto informe, solo tenemos que presentarlo en pantalla. Los
informes se presentan a travs de un objeto del tipo JasperViewer. Los objetos
JasperViewer son ventanas donde se muestran los informes.

JasperViewer ventanavisor = new JasperViewer(informe,false);

Esta lnea de cdigo crea una ventana llamada ventanavisor donde se muestra el informe
informe. El parmetro false indica que al cerrarse la ventana del informe no debe acabar
el programa. Si este parmetro fuera true, al cerrar la ventana del informe se cerrara el
programa entero (esto no interesa).

574

El objeto ventanavisor es una ventana normal y corriente y puede ser visualizada con
setVisible. Por otro lado, se le asigna el ttulo Informe de servicios con el mtodo
setTitle.

Todo este cdigo debe estar rodeado de un try...catch para evitar errores inesperados.

7. Todos los errores del cdigo se producen debido a que es necesario indicar los
imports correspondientes a las clases JasperPrint, JasperFillManager, JasperViewer
que participan en el cdigo.
Un import es una lnea de cdigo que le dice a java en qu librera debe encontrar la
clase correspondiente.
Normalmente, al hacer clic sobre la lnea que da el error, aparece el icono de una
bombilla pequea en la parte izquierda de la ventana. Al hacer clic sobre esta
bombilla se nos informa de la librera que hace falta importar. Ya sabe que basta
hacer clic sobre esta librera para que se aada la instruccin import correspondiente
de forma automtica.
Sin embargo, si prueba esto mismo con las lneas errneas del cdigo anterior, ver
que no aparece ninguna bombilla. Esto es debido a que las libreras donde se
encuentran las clases JasperPrint, JasperFillManager y JasperViewer no vienen
incluidas en NetBeans, ya que son clases pertenecientes al programa iReport. As
pues, NetBeans no sabe donde encontrar estas clases.

8. Para evitar este error, es necesario incluir en el proyecto una serie de libreras
propias del programa iReport. Esto se hace de la siguiente forma:
9. Haga clic con el botn derecho del ratn sobre el apartado Bibliotecas de su proyecto
y luego active la opcin Agregar archivo JAR/carpeta.

10. Debe acudir a la carpeta del programa iReport para buscar en ella las bibliotecas
necesarias. Concretamente, la carpeta donde se encuentran estas bibliotecas es la
siguiente: Archivos de programa JasperSoft iReport-2.0.1 lib

575

Archivos de programa JasperSoft iReport-2.0.1 lib

9. Los ficheros que contienen las libreras necesarias para este programa son lo
siguientes: commons-collections-2.1, commons-logging-1.0.2 y jasperreports-2.0.1
Empezaremos aadiendo el fichero commons-collections-2.1. Seleccinelo y active
Abrir:

576

10. Observar que se ha agregado el fichero a la zona de bibliotecas:

11. Repita el proceso para agregar los otros dos ficheros necesarios. Al final, su zona de
Bibliotecas debe quedar as (observe los tres ficheros aadidos):

577

12. Gracias a la inclusin de estos ficheros, nuestro proyecto ya dispone de las libreras
de clases que contienen a las clases que necesitamos, que recuerda que son:
JasperPrint, JasperFillManager, JasperViewer
Si ahora haces clic sobre la primera lnea que da error, ver como ahora NetBeans ya
sabe el import que debe aadirse, y por tanto aparecer la bombilla. Pulse sobre la
bombilla:

13. Tiene que agregar el import para la clase JasperFillManager:


net.sf.jasperreports.engine.JasperFillManager
14. Ahora agregue el import para la clase JasperPrint:
net.sf.jasperreports.engine.JasperPrint
15. Y finalmente agregue el import para la clase JasperViewer:
net.sf.jasperreports.view.JasperViewer

16. Los errores han desaparecido. Ya puede ejecutar el programa.


17. Si pulsa sobre el botn Informe Agrupado aparecer el informe.
El informe aparece en una ventana (el visor de informes objeto JasperViewer) que
tiene una pequea barra de herramientas. En esta barra podr por ejemplo imprimir
el informe, o cambiar su zoom, entre otras cosas:

578

Ventana visor de informes (JasperViewer)


Herramientas: guardar, imprimir, zoom, etc...

18. Tal como se ha programado este botn, al pulsarse se visualiza el informe antes de
que el usuario decida imprimirlo o no. En algunos casos, puede ser interesante que el
informe se imprima directamente sin que se visualice antes.
Veamos como hacer esto. Primero aada otro botn btnImprimirDirectamente a su
ventana:

19. Ahora programe dentro de l lo siguiente:

579

El cdigo es similar al anterior, solo que se elimina todo uso del objeto JasperViewer
(ventana visualizadora) ya que el informe ya no debe salir en pantalla.
Adems se aade una nueva lnea:
JasperPrintManager.printReport(informe,true);

Esta lnea usa un objeto llamado JasperPrintManager que se encarga de imprimir el informe
informe usando el mtodo printReport.
Si el segundo parmetro tiene el valor true, entonces significa que aparecer el cuadro de
dilogo de impresin:

Si estuviera a false, este cuadro de dilogo no aparecera y el informe se enviara


directamente a la impresora configurada por defecto en el ordenador.
En nuestro caso, al tener el valor true, este cuadro s aparecer.
20. Ejecute el programa y pruebe el nuevo botn. No hace falta que imprima el informe.

580

CONCLUSIN
Para poder imprimir un informe creado con iReport desde una aplicacin Java es
necesario agregar ciertas libreras pertenecientes al programa iReport:
commons-collections-2.1, commons-logging-1.0.2 y jasperreports-2.0.1
Una vez agregadas estas libreras, el proceso para imprimir un informe es el siguiente:
-

Crear un objeto del tipo JasperPrint (el informe)


Crear un objeto visor (JasperViewer) que permita visualizar el informe.
O bien imprimir directamente el informe con un objeto JasperPrintManager.

581

EJERCICIO GUIADO. JAVA. INFORMES CON PARMETROS

Conexin con Informes desde Java: Parmetros


En la hoja guiada anterior se conect una aplicacin Java con un informe realizado con
iReport. La aplicacin contaba con un botn que al ser pulsado mostraba el informe.
Hay que tener en cuenta que los datos que se muestran en el informe dependen del
contenido de la base de datos. Es decir, si se aaden nuevos registros a las tablas, estos
registros aparecern en el informe (no ser necesario modificarlo de alguna forma)
Sin embargo, esta forma de trabajar puede ser poco interesante, ya que el usuario no tiene
ningn control sobre el informe que se muestra. En la hoja guiada anterior el informe
mostraba todos los servicios agrupados por tipo, pero, y si el usuario quisiera en un
determinado momento que solo se mostraran los servicios anteriores a una fecha, o que se
mostraran los servicios que costaran ms de una cantidad, etc...
El problema est en que la consulta SQL del informe es una consulta fija, y siempre sacar
los mismos datos. El usuario de nuestro programa no tiene forma de modificar esa consulta
para cambiar los datos deben aparecer en el informe.
Para poder hacer esto, es necesario usar parmetros en la consulta SQL del informe. Un
parmetro se podra definir como dato de la consulta que no est definido an. Es necesario
definir ese dato antes de ejecutar la consulta y extraer los datos que se mostrarn.
Puede ser el usuario de nuestro programa el que aporte ese dato que le falta a la consulta,
de manera que as tenga cierto control sobre la informacin que aparece en el listado.
En esta hoja se ver un ejercicio paso a paso de uso de parmetros en la consulta de
informe, y de esta manera entender la utilidad de esta caracterstica.

582

EJERCICIO GUIADO N 1. CREACIN DE UN INFORME CON PARMETROS

1. Entra en iReport y abre el informe llamado serviciosjuan, realizado en una de las


ltimas hojas guiadas. Este informe, concretamente, fue construido desde cero y
mostraba los servicios del trabajador Juan Prez:

2. Visualzalo para recordar su aspecto:

583

3. Este informe tiene un gran diseo pero est muy limitado, ya que solo es capaz de
mostrar el listado de servicios realizados por el trabajador Juan Prez (DNI
12.321.567-B) Si quisiramos sacar el listado de servicios de otro trabajador, este
informe no nos servira.
Es necesario hacer que este informe sea ms verstil, que sea capaz de mostrar el
listado de servicios de cualquier trabajador. Para ello, ser necesario crear un
parmetro en la consulta SQL.
4. Acceda a la consulta del informe a travs de la opcin Datos Consulta de informe y
obsrvela:

La consulta SQL extrae informacin de aquellos servicios que hayan sido realizados
por el trabajador con DNI 12.321.567-B.

5. Cambie la consulta para que quede as:

Lo que acaba de aadir es un parmetro llamado DNI. Observe su estructura:


$P{nombredelparmetro}
En nuestro caso el nombre que le hemos dado al parmetro es DNI, por lo tanto el
parmetro es:
$P{DNI}
Este parmetro indica que el DNI no est definido an. Ser el usuario el que
introduzca el DNI segn el cual habr que consultar en la base de datos.

584

6. Pulse OK. Cada vez que use un parmetro hay que definirlo en el programa iReport.
Esto se hace en la zona de campos. Observa que tenemos tambin una zona de
parmetros:

7. En la carpeta de parmetros haz clic con el botn derecho del ratn e indica la opcin
Add Parameter para aadir un nuevo parmetro:

8. En la ventana que aparece debes indicar el nombre que le has dado al parmetro. En
nuestro caso, el nombre asignado es DNI:

585

9. Ahora ya tiene definido un parmetro que se corresponde con el DNI del trabajador.
El usuario introducir ese DNI y ser sustituido en la consulta SQL. Si intenta
visualizar el informe, no podr ver nada, ya que el parmetro no tiene ahora ningn
valor. Al visualizar el informe aparecer el siguiente mensaje:

10. En cualquier caso, se tiene que haber generado el fichero .jasper correspondiente. Si
el iReport sigue configurado tal como se hizo en la hoja guiada anterior, dicho fichero
se tiene que haber guardado en Mis Documentos con el nombre serviciosjuan.jasper.
Este fichero lo usar en el siguiente ejercicio.

11. Cierre iReport, guarde los cambios y pase al siguiente ejercicio.

586

EJERCICIO GUIADO N 2. USO DE PARMETROS DE UN INFORME DESDE JAVA

1. Abra la aplicacin Java que realiz en la hoja guiada anterior. Aada en su ventana
un nuevo botn y un cuadro de texto.
El botn se llamar btnServiciosTrabajador y el cuadro de texto se llamar txtDNI.

2. El objetivo es hacer que el usuario introduzca un DNI en el cuadro de texto DNI y que
al pulsar el botn Servicios del Trabajador aparezca un informe con el listado de
servicios del trabajador con el DNI introducido.
Para hacer esto es necesario que el DNI introducido en el cuadro de texto txtDNI se
traslade directamente al informe creado anteriormente y se coloque en la posicin del
parmetro. Entonces la consulta SQL del informe se completar y se podr rellenar el
informe con los datos correctos.
3. De momento copie el fichero serviciosjuan.jasper dentro de la carpeta informes de su
carpeta de proyecto.
4. Nota Importante: Recuerde que el informe contiene una imagen proporcionada por el
fichero nenfares.jpg. Para que el informe funcione correctamente es necesario que
copie este fichero directamente en la carpeta de su proyecto (no dentro de la carpeta
informes)
5. Ahora programe el siguiente cdigo en el actionPerformed del botn Servicios
Trabajadores.

Estudiemos con detenimiento este cdigo.


En l ver dos lneas nuevas en las que se definen los valores de los parmetros:

587

Map parametros = new HashMap();


parametros.put(DNI,txtDNI.getText());

En la primera de estas dos lneas se define un objeto de tipo Map. Este objeto contendr el
nombre de cada parmetro que usar y el valor de dicho parmetro.
Observe la segunda lnea, en ella se define el parmetro llamado DNI y se le asigna a l el
valor del cuadro de texto del DNI, es decir, el DNI que haya escrito el usuario.
Si existieran ms parmetros habra que definirlos de la misma forma, por ejemplo:
parametros.put(sueldo,txtSueldo.getText());
parametros.put(codigo,A-54);
En este cdigo ficticio se crea un parmetro sueldo al que se le asigna el valor de un cuadro
de texto txtSueldo. Y se crea un parmetro codigo al que se le asigna el valor A-54.
En nuestro caso solo necesitamos usar un parmetro llamado DNI. Hay que tener en cuenta
que el nombre del parmetro debe ser el mismo que el nombre usado en iReport.

La siguiente lnea es la que crea el objeto informe (JasperPrint) Esta lnea crea el informe a
partir del fichero de informe compilado serviciosjuan.jasper, a partir de la base de datos
(representada por el objeto conexin) y lo ms interesante ahora es que se indica el conjunto
de parmetros a travs del objeto parametro creado antes.
JasperPrint informe = JasperFillManager.fillReport(rutaInforme,parametros,conexion);

Cuando el informe que se va a mostrar no tiene parmetros, entonces se usa el valor null, en
caso contrario, se usa el objeto parmetro (Map)

El resto del cdigo es igual que los anteriores, se crea el visor de informe conteniendo el
informe y se muestra en pantalla.

6. Ejecute el programa y pruebe a introducir un DNI existente en el cuadro de texto del


DNI. Si escribi correctamente el DNI, podr ver el listado de servicios realizados por
el trabajador con dicho DNI.
Como puede observar, ahora ya puede visualizar los datos de los servicios de
cualquier trabajador y no solo del trabajador Juan Prez.
El uso de parmetros en los informes da potencia y versatilidad a las aplicaciones, y
es algo muy usado.

588

Trabajos realizados por Ana Ruiz

NOTA
En los ejemplos guiados que se acaban de proponer, se usa una consulta SQL de informe
que contiene un parmetro equivalente a un dato. Concretamente, a un DNI. Este dato forma
parte de una condicin. Observa la consulta SELECT del informe que hemos usado:
parmetro
select * from trabajadores, servicios
where trabajadores.dni=servicios.dni and trabajadores.dni=$P{DNI}
order by servicios.fecha

Condicin

En este caso, el DNI ser proporcionado por la aplicacin java y la condicin se completar.
Sin embargo, hay que indicar que tambin se pueden crear parmetros que sustituyan a una
condicin completa, en vez de a un solo dato. Observa el siguiente ejemplo:
select * from trabajadores, servicios
where trabajadores.dni=servicios.dni and $P!{COND}
order by servicios.fecha

En este caso, el parmetro se llama COND y no sustituye a un simple dato, sino que
sustituye a toda la condicin. En este caso, la aplicacin java mandar una cadena que
tenga forma de condicin SQL, como por ejemplo: trabajadores.sueldo > 200, que
ser reemplazada en el lugar del parmetro.

589

Para que lo vea claro, el cdigo a usar en la aplicacin java para dar valor al parmetro
podra ser como sigue:
Map parametros = new HashMap();
parametros.put(COND, trabajadores.sueldo>200);

Observa que el valor del parmetro es una condicin entera.


Cuando se quiera usar un parmetro que represente a un dato, se usar la siguiente
sintaxis:
$P{nombreparmetro}
Cuando se quiera usar un parmetro que represente a una condicin, se usar la siguiente
sintaxis:
$P!{nombreparmetro}
(Observa el uso de la admiracin !)

590

CONCLUSIN
Cuando un informe tiene una instruccin SQL invariable, siempre mostrar los
mismos datos.
Puede resultar interesante que parte de la instruccin SQL del informe pueda variar,
de forma que se pueda extraer distinta informacin segn el dato que vara. Estos
datos variantes se denominan parmetros.
Un parmetro puede referirse a un dato concreto, o a una condicin.
Si el parmetro se refiere a un dato concreto, entonces tiene la siguiente forma:
$P{nombre}
Si el parmetro se refiere a una condicin, entonces tiene la siguiente forma:
$P!{nombre}
El parmetro debe ser sustituido por un valor que es proporcionado desde la
aplicacin java, y es entonces cuando la instruccin SQL se completa y se ejecuta.
En la aplicacin java es necesario crear un objeto de tipo Map que contenga los
distintos parmetros con los valores de cada uno para luego enviar este objeto al
informe que se quiere mostrar.
El uso de parmetros en informes hace que estos sean mucho ms verstiles y que el
programa tenga ms posibilidades.

591

EJERCICIO GUIADO. JAVA. CARPETA DISTRIBUIBLE

Distribucin e Instalacin de programas en Java


Una vez que se ha finalizado el programa, debemos prepararlo para la instalacin en el
ordenador del cliente. Para ello, es necesario tener en cuenta todos aquellos ficheros
externos que han sido necesarios para la programacin de la aplicacin: base de datos,
imgenes, informes, etc...
A continuacin se indican las cosas a tener en cuenta a la hora de realizar una distribucin
de nuestro proyecto.

1. En primer lugar es necesario pulsar el botn Limpiar y construir proyecto principal.


Este botn compila el programa y crea una carpeta llamada dist dentro de la carpeta
del proyecto, la cual ser la carpeta distribuible.

(Si hubiera un error de compilacin el proceso se detendra y aparecera un mensaje


de error)

2. Si realiza esta operacin con alguno de sus proyectos, puede acudir a la carpeta del
proyecto y observar la existencia de la carpeta dist:

3. Entre dentro de esta carpeta y observe su contenido:

592

4. Observar la existencia de un fichero con extensin .jar. Este fichero se puede decir
que es el ejecutable del programa.
El fichero .jar contiene todas las clases que ha programado en su proyecto.
Debe recordar que los programas java pueden ejecutarse en cualquier entorno. Por
ello, los ejecutables java no tienen una extensin .exe la cual es propia de los
entornos Windows.
Para que un ejecutable .jar pueda ser ejecutado en un determinado sistema, debe
estar instalado en l la mquina virtual de java.

5. Aparte del fichero ejecutable (.jar) el cual tendr el nombre del proyecto, ver tambin
una carpeta lib. Esta carpeta contendr aquellas libreras adicionales que se hayan
incluido en el proyecto.
6. Bases de datos.
Si su programa usa una base de datos, entonces ser necesario copiar dicha base de
datos en la carpeta del distribuible.
Si suele crear una carpeta para la base de datos, entonces copie la carpeta con la
base de datos en la carpeta distribuible:

7. Imgenes, Iconos.
Si est usando imgenes en su programa (para la presentacin, los iconos de los
botones de las barras de herramientas, etc.) tendr que introducir los ficheros de
estas imgenes dentro de la carpeta distribuible.
Si es ordenado, todas estas imgenes estarn dentro de una misma carpeta (llamada
por ejemplo imgenes) As pues, copie la carpeta que contiene las imgenes que
est usando dentro la carpeta distribuible:

593

8. Informes.
Si su programa usa informes, es necesario que los ficheros de estos estn dentro de
la carpeta del distribuible.
Los ficheros de informes necesarios para el funcionamiento del programa son los
ficheros compilados .jasper. Los dems no son necesarios incluirlos.
Estos ficheros estarn normalmente dentro de una carpeta llamada Informes, si es
usted ordenado. En ese caso, copie la carpeta con los informes dentro de la carpeta
del distribuible, la cual quedara ahora as:

9. Imgenes de informes.
Si los informes del programa usan imgenes, la situacin de estas en la carpeta
distribuible depende de la forma en que haya configurado dichas imgenes en el
iReport.
Normalmente, al crear una imagen en el informe, asignamos simplemente el nombre
del fichero de imagen, suponiendo que la imagen se encontrar en la misma carpeta
que el informe:

594

En este ejemplo, el informe usa un fichero de


imagen llamado logo.jpg que se encuentra en
la misma carpeta que donde se ha guardado el
informe.

10. Si estamos ante este caso, para que funcione los informes con imgenes de su
programa es necesario que introduzca las imgenes de los informes directamente en
la carpeta distribuible. En nuestro ejemplo la carpeta distribuible quedara as:

595

11. Sin embargo, para mantener una cierta organizacin de la carpeta distribuible, sera
interesante que las imgenes de los informes estuvieran tambin dentro de la carpeta
Imgenes. Si quisiera hacer esto, tendra que modificar sus informes con imgenes
de forma que se indicara la carpeta donde estar cada imagen. En nuestro ejemplo,
la imagen del informe se tendra que haber configurado as:

Se indica que las imagen logo.jpg


estar dentro de una subcarpeta
Imgenes.

596

12. Si modifica sus informes con imgenes de esta forma y los recompila, entonces
podr organizar su carpeta distribuible de esta manera:

La carpeta Informes contiene los .jasper

La carpeta Imagenes contiene todas las


imgenes del programa as como las
imgenes usadas por los informes.

13. Una vez incluidos todos estos elementos ya tendremos la carpeta distribuible
completada.
Solo tiene que copiar la carpeta dist en un CD, USB o disquete para trasladarla al
ordenador del cliente. Si quiere, puede cambiarle el nombre a dicha carpeta.
Antes de hacer esto, se recomienda que compruebe que el programa funciona,
ejecutando el fichero .jar de dicha carpeta. Compruebe que la ubicacin de la base de
datos, los informes y las imgenes es la correcta.

14. Para la instalacin del programa en el ordenador del cliente, solo tiene que copiar la
carpeta distribuible en el disco duro del ordenador del cliente.
Se recomienda que lleve la mquina virtual de java propia del sistema operativo del
cliente por si este no la tuviera instalada en su ordenador. Si este fuera el caso, se
tendra que instalar para que el proyecto pudiera ejecutarse.

597

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.

598

EJERCICIO GUIADO. JAVA. INSTALABLE.

Instalacin de programas Java


Se ha visto en la hoja guiada anterior que para trasladar el programa java realizado al
ordenador del cliente basta con crear una carpeta distribuible. Esta carpeta contiene el
fichero ejecutable .jar que permite ejecutar el programa.
El ordenador del cliente debe tener instalada la mquina virtual de java para que nuestro
programa funcione. Una vez instalada la mquina virtual de java en el ordenador del cliente,
basta con copiar la carpeta distribuible en su disco duro.
Aunque este proceso es muy sencillo, puede suceder que el cliente no sea capaz de
realizarlo, en el caso de que carezca de conocimientos informticos bsicos. En este caso,
podra ser interesante automatizar la instalacin del programa a travs de un fichero de
instalacin.
En esta hoja guiada se ver como crear un instalable para un programa java, usando un
programa llamado iZpack.

Qu es IZPACK
IZPack es una aplicacin que nos permite crear un fichero de instalacin a partir de una
aplicacin escrita en java. Esto nos permite que nuestras aplicaciones Java sean ms fciles
de distribuir e instalar.
IZPack crea un fichero .jar, que contiene todos los ficheros necesarios del programa. Basta
con ejecutar este fichero para que el programa java que ha creado se instale.
El programa IZPack se proporciona en la carpeta Herramientas de la carpeta compartida del
curso, aunque puedes bajarte la ltima versin de forma gratuita desde esta pgina web:
http://www.izforge.com/izpack/
Antes de empezar con esta hoja guiada instala el programa IZPack en tu ordenador.
El programa se instalar en la carpeta Archivos de Programa/Izpack, a no ser que se escoja
otro lugar. Dentro de la carpeta Izpack encontrar otra carpeta llamada Bin, y dentro de esta
encontrar un fichero .bat llamado compile que ser el que use para crear los instalables.

599

Creacin de un Instalable con IZPack. PREPARACIN.

1. Lo primero que debes hacer es crear la carpeta Distribuible (dist) de tu programa si


es que no la has creado ya.
Para ello debes abrir tu proyecto en NetBeans y seguir los pasos que se indicaron en
la hoja guiada anterior.
2. Una vez creada la carpeta del Distribuible, crea un fichero usando el Bloc de Notas
llamado Licencia.txt. Este fichero debe contener la licencia de uso del programa. Este
fichero lo guardars en la carpeta Distribuible.
3. Ahora crea usando el Bloc de Notas un fichero llamado Leeme.txt. Aqu introducirs
algn comentario sobre tu proyecto que consideres til para el cliente. Por ejemplo
datos de contacto (telfono, email), informacin sobre la versin del programa o
cualquier otra informacin que consideres interesante. Este fichero tambin lo
guardars en la carpeta Distribuible.
4. Busca un icono para tu programa y almacnalo tambin en la carpeta del Distribuible.
Este fichero ser del tipo ico (fichero de icono) y se guardar con el nombre icono.ico
en la carpeta del Distribuible.
5. Una vez creados estos dos ficheros de texto, tiene que crear un nuevo fichero
llamado install.xml. Este fichero lo crear usando el Bloc de Notas en la carpeta
Distribuible.
El contenido de este fichero estar escrito en un lenguaje llamado XML y ser el
siguiente (no se preocupe si no entiende el contenido, solo fjese en los textos
remarcados):

600

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>


<installation version="1.0">
<info>
<appname>Nombre del Programa</appname>
<appversion>Versin</appversion>
<authors>
<author name="Juan Prez" email="juanperez@hotmail.com"/>
</authors>
<url>http://www.mipagina.es/</url>
</info>

<guiprefs width="640" height="480" resizable="no"/>

<locale>
<langpack iso3="spa"/>
</locale>
<native type="izpack" name="ShellLink.dll" />

<resources>
<res id="LicencePanel.licence" src="Licencia.txt"/>
<res id="InfoPanel.info" src="Leeme.txt"/>
<res src="shortcutSpec.xml" id="shortcutSpec.xml"/>
</resources>

<panels>
<panel
<panel
<panel
<panel
<panel
<panel
<panel
<panel
</panels>

classname="HelloPanel"/>
classname="InfoPanel"/>
classname="LicencePanel"/>
classname="TargetPanel"/>
classname="PacksPanel"/>
classname="InstallPanel"/>
classname="ShortcutPanel" />
classname="SimpleFinishPanel"/>

<packs>
<pack name="Ficheros del Programa" required="yes">
<description>Ficheros y Carpetas del Programa</description>
<file src="lib" targetdir="$INSTALL_PATH"/>
<file src="base" targetdir="$INSTALL_PATH"/>
<file src="informes" targetdir="$INSTALL_PATH"/>
<file src="imagenes" targetdir="$INSTALL_PATH"/>
<file src="gestion.jar" targetdir="$INSTALL_PATH"/>
<file src="icono.ico" targetdir="$INSTALL_PATH"/>
</pack>
</packs>
</installation>

601

6. El fichero install.xml que acaba de crear en el punto anterior es siempre igual. Solo
tiene que cambiar una serie de datos (los marcados en verde), tal como se indica a
continuacin:
-

Datos del programador.


En la primera parte del fichero se indican los datos del programador y del
programa. Observe:
Pon aqu el nombre de tu
programa.

<info>
<appname>Nombre del Programa</appname>
<appversion>Versin</appversion>
Y aqu la versin
<authors>
<author name="Juan Prez" email="juanperez@hotmail.com"/>
</authors>
<url>http://www.mipagina.es/</url>
</info>
Escribe aqu tu nombre,
y tu email
Y tu pgina web

Carpetas de tu programa.
En la parte final del fichero tendrs que indicar las carpetas que forman tu
programa (es decir las carpetas que contiene la carpeta distribuible) Observa:

<packs>
<pack name="Ficheros del Programa" required="yes">
<description>Ficheros y Carpetas del Programa</description>
<file src="lib" targetdir="$INSTALL_PATH"/>
<file src="base" targetdir="$INSTALL_PATH"/>
<file src="informes" targetdir="$INSTALL_PATH"/>
<file src="imagenes" targetdir="$INSTALL_PATH"/>
<file src="gestion.jar" targetdir="$INSTALL_PATH"/>
<file src="icono.ico" targetdir="$INSTALL_PATH"/>
</pack>
</packs>
En este ejemplo se supone que la carpeta
distribuible (dist) contiene:
Tendr que indicar tambin el nombre
del fichero executable de su programa, el
- Una carpeta de librera (lib)
cual se encuentra tambin dentro de la
- Una carpeta para la base de
carpeta distribuible. En este ejemplo se
datos (base)
supone que el fichero se llama
- - Una carpeta para los informes
gestion.jar. Escriba usted el nombre de
(informes)
su programa.
- Una carpeta para las imgenes
(imgenes)
Y este es el fichero de icono que ha
introducido en la carpeta distribuible.

Usted tendr que indicar el nombre que le


haya dado a sus subcarpetas.

602

7. Ahora tiene que aadir un nuevo fichero dentro de la carpeta Distribuible que
configura la creacin de accesos directos en el men inicio cuando el programa se
instala en Windows. Este fichero se llamar shortcutSpec.xml.
Este fichero tiene el siguiente contenido (no es necesario que lo entienda, solo fjese
en los elementos resaltados):

<?xml version="1.0" encoding="ISO-8859-1"?>


<shortcuts>
<programGroup defaultName="Nombre del Programa" location="startMenu" />
<shortcut name="Nombre del Acceso Directo"
target="$INSTALL_PATH\gestion.jar"
workingDirectory="$INSTALL_PATH"
iconFile="$INSTALL_PATH\icono.ico"
programGroup="yes"
desktop="yes"
startMenu="no"
/>

<shortcut name="Desinstalar Taller Mecnico"


target="$INSTALL_PATH\uninstaller\uninstaller.jar"
workingDirectory="$INSTALL_PATH"
iconFile="$INSTALL_PATH\icono.ico"
startMenu="no"
programGroup="yes"
/>
</shortcuts>

8. Debes crear este fichero con el contenido anterior tal cual. Siempre es igual. Solo
tienes que variar los elementos seleccionados en verde tal como se indica a
continuacin:

<programGroup defaultName="Nombre del Programa" location="startMenu" />


<shortcut name="Nombre del Acceso Directo"
target="$INSTALL_PATH\gestion.jar"
workingDirectory="$INSTALL_PATH"
iconFile="$INSTALL_PATH\icono.ico"
programGroup="yes"
desktop="yes"
startMenu="no"
En la parte inicial debes indicar el nombre de
/>
tu programa, el nombre que le quieras dar al
acceso directo, el fichero ejecutable .jar de tu
programa (aqu suponemos que se llama
gestion.jar, tu tendrs que averiguar como se
llama el tuyo) y el nombre del fichero de icono.

603

<shortcut name="Desinstalar Taller Mecnico"


target="$INSTALL_PATH\uninstaller\uninstaller.jar"
workingDirectory="$INSTALL_PATH"
iconFile="$INSTALL_PATH\icono.ico"
startMenu="no"
programGroup="yes"
/>
Esta parte crea un icono para desinstalar el
</shortcuts>
programa. Debes indicar el nombre que le
quieres dar a este acceso directo.
Aqu lo hemos nombrado Desinstalar Taller
Mecnico, porque el programa gestiona un
taller. En vuestro caso tendris que indicar el
nombre adecuado segn vuestro programa.

604

Creacin de un Instalable con IZPack. GENERACIN DEL INSTALABLE.

1. Una vez realizados los pasos anteriores (siempre son los mismos) hay que generar el
fichero Instalable. Para ello debes entrar en el smbolo del sistema.

2. Debes acceder a la carpeta del programa IZPack. Para ello, debes ejecutar el
siguiente comando MS-DOS:
CD C:\ARCHIVOS DE PROGRAMA\IZPACK

El resultado ser que acceders a la carpeta del programa IZPACK:

3. Una vez dentro de la carpeta del programa IzPack, debes ejecutar el siguiente
comando:
bin\compile

camino\carpeta\install.xml -b

camino\carpeta

Donde camino\carpeta es el camino de la carpeta distribuible de tu proyecto.


Por ejemplo, supongamos que tienes la carpeta distribuible llamada dist en una
carpeta llamada proyectos en el disco duro. (c:\proyectos\dist) Entonces tendras que
indicar el siguiente comando para crear el instalable:
bin\compile

c:\proyectos\dist\install.xml -b

c:\proyectos\dist

4. Al ejecutar este comando, se generar un fichero llamado install.jar dentro de la


carpeta distribuible. Este es el fichero de instalacin.
5. Si ejecuta este fichero aparecer un programa de instalacin que le guiar a travs
de varios pasos por la instalacin de su programa. El resultado ser que instala su
programa en el men inicio e incluso, si activa la opcin correspondiente durante la
instalacin, se crear un acceso directo en el escritorio a su programa.

605

Creacin de un Instalable con IZPack. DISTRIBUCIN DEL INSTALABLE.

1. Una vez creada la carpeta de distribucin con el fichero install.jar dentro de ella, solo
hay que guardar esta carpeta en un CD y entregrselo al cliente.
2. El cliente solo tiene que introducir el CD, entrar dentro de l y ejecutar con un doble
clic el fichero de instalacin install.jar. Y el programa se instalar automticamente.
3. Es necesario que el cliente tenga instalada la mquina virtual de java en su
ordenador para que la instalacin sea posible. Por eso es recomendable incluir en el
CD la mquina virtual de java para que el usuario pueda instalarla tambin antes de
instalar su programa.

606

CONCLUSIN
La distribucin de un programa java es tan sencilla como copiar la carpeta distribuible
dist en el ordenador del cliente.
Sin embargo, si el cliente carece de conocimientos bsicos de informtica podemos
crear un fichero de instalacin dentro de la carpeta distribuible para que el usuario
solo tenga que entrar dentro de ella y hacer doble clic sobre el fichero de instalacin.
Para generar el fichero de instalacin, es necesario usar un programa llamado
IZPACK.
Se introducirn varios ficheros dentro de la carpeta distribuible, necesarios para la
creacin del instalable, y luego se generar el instalador.
Una vez creado el instalador dentro de la carpeta distribuible, esta se copiar en un
CD y se pasar al cliente. Es recomendable que el CD contenga la mquina virtual de
java para que el cliente tambin la pueda instalar.
Hay que tener en cuenta que si el cliente no tiene instalada la mquina virtual de java
no se podr realizar la instalacin del programa.

607

También podría gustarte