Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Entorno Java
Entorno Java
CONCLUSIN
Los cuadros de verificacin (JCheckBox) se usan cuando quieres
seleccionar varias opciones.
6. Ahora debes aadir tres botones de opcin (botones de radio) dentro del panel.
Estos botones son objetos del tipo JRadioButton.
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:
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);
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.
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
11
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);
12
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
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
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
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
19
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
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
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:
22
Se pulsa y se rellena
automticamente
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.
23
etiResultado.setText(cboNumeros.getSelectedItem().toString());
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
f.
Aade finalmente tres etiquetas conteniendo los nmeros 40, 200, 200. La
primera se llamar etiPrecioInstalacion, la segunda etiPrecioFormacion y la
tercera etiPrecioAlimentacionBD.
25
26
double
double
double
double
precio_base;
precio_instal; //precio instalacin
precio_for; //precio formacion
precio_ali; //precio alimentacion
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
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
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
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
31
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
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());
Movemos aqu.
Y aparece el valor
correspondiente aqu.
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
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.
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.
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);
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.
11. Prueba el programa y observa los valores que puede tomar el JSpinner.
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);
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
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
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.
40
41
Si llevas la barra de
desplazamiento al mnimo, su
valor ser de 50, ya que se
configur as con la propiedad
minimum
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)
***
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
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
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:
10. Aada dos opciones ms a la barra de mens. El inspector debe tener ahora el
siguiente aspecto:
45
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
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:
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:
48
24. Ahora aade dentro del menuColores tres JMenuItem llamados respectivamente:
menuItemRojo, menuItemVerde, menuItemAzul. Sus textos sern Rojo, Verde y
Azul.
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
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
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:
51
6. Puedes ver si los botones estn bien colocados observando el Inspector: Observa
como los botones colocados se encuentran dentro de la barra.
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");
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
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:
-
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.
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.
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
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
(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:
60
7. Haz clic con el derecho sobre la zona de otros componentes y activa la opcin
Agregar desde Paleta Swing JFileChooser:
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)
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");
}
El programa aprovecha esto para mostrar dicho camino en pantalla gracias al tpico
JOptionPane.
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()
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
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:
64
65
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.
66
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
68
69
9. Haz doble clic sobre el JFrame (en el Inspector) para poder ver globalmente la
ventana. En la pantalla debera aparecer esto:
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 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
71
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.
72
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.
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);
73
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
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);
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
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
77
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
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
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
79
Este es el procedimiento
que tienes que introducir en
el programa.
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:
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.
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();
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
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
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
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.
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
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.
87
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.
88
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
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
BorderLayout
25. Haz clic con el derecho sobre el JFrame y asigna una distribucin BorderLayout.
91
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.
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
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
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:
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
97
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
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
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
102
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
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
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
unidades;
precio;
total;
//total
cantiva; //cantidad iva
cantdes; //cantidad descuento
totalsiniva; //total sin iva
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:
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
108
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
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.
111
Pulsa sobre la
ventana.
La ventana se activa
colocndose por encima
del cuadro de dilogo.
112
f.
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
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.
113
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
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:
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.
117
118
Programacin
de la clase
ventanaprincipal
119
Clic aqu
para
ocultar el
cdigo
generado
9. Otro mtodo importante que hay que mencionar es el mtodo main. Este mtodo es
el que se ejecuta cuando arranca el programa. Se puede decir que el programa parte
de aqu.
La tarea que desempea este mtodo es la de generar la ventana principal y
mostrarla en pantalla.
El mtodo main, es similar a la funcin main del lenguaje C. En el caso del java, el
NetBeans genera automticamente el mtodo main, de forma que no tendremos que
hacer cambios en l.
Vamos ahora a disear la ventana de nuestro programa (sin usar la ventana de diseo, solo
a partir de cdigo). Al final de esta explicacin, la ventana del proyecto tendr el siguiente
aspecto:
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
121
Con setLocation
decides la posicin 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:
122
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:
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
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);
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:
124
125
Esta lnea se subrayar en rojo ya que ser necesario aadir el import para la
librera de los JTextField.
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:
127
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
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
131
Oyente/Adaptador
Se programan dentro de...
actionPerformed
ActionListener
btnSumar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnSumarActionPerformed(evt);
}
});
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
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();
}
Creamos el segundo
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)
Hay que
programar el
mtodo al que
llama el evento
Este es el cdigo
que tienes que
aadir
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)
136
Asignacin de un actionPerformed
al botn btnRestar.
(Se hace una llamada al mtodo
btnRestarActionPerformed)
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
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
140
EJERCICIO GUIADO
1. Crea un nuevo proyecto.
2. Accede al cdigo del proyecto.
Y el procedimiento.
Detalles de la ventana
Se disea la primera
etiqueta
Se disea la segunda
etiqueta
141
142
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
Componente.MetodoParaAadirOyente(new TipoOyente() {
public void evento1(TipoEvento evt) {
LlamadaAProcedimiento1(evt);
}
public void evento2(TipoEvento evt) {
LlamadaAProcedimiento2(evt);
}
...otros eventos...
});
145
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);
}
});
146
147
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
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.
Construccin de un vector
Para construir un vector que ya haya sido declarado se sigue la siguiente sintaxis:
nombrevector = new tipodatos[dim];
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
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;
}
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
Por ejemplo:
int v[] = {5, 2, 7, 6};
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[];
151
Ejercicio guiado
152
153
100, 20);
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;
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
158
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:
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
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
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
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
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
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
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
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
169
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.
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
//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
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();
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
Mtodos de orden
Vaciar
entraUno
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
CLASE SALACINE
Nombre de la Clase: SalaCine
Propiedades de los objetos SalaCine:
Aforo
Ocupadas
Pelcula
Entrada
Mtodos de orden
Vaciar
entraUno
174
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)
}
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.
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;
}
177
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;
}
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;
//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 = ;
}
//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
}
185
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
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.
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
Inicio de la clase
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;
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:
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.
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.
195
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:
-
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
197
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
luego comprueba el
% de 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
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
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.
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
}
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:
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
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
Usaremos la clase BotonContador en un simple proyecto de prueba para que puedas observar sus
posibilidades.
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:
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
6. Nuestro programa tendr dos botones del tipo BotonContador. Declara estos botones como
variables globales de la clase:
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.
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
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
EJERCICIO
Aade desde cdigo un nuevo botn Botn C (de tipo BotonContador) que al pulsarse
aumente su nmero de pulsaciones interno en 2 (usa el mtodo aumentar propio de la clase
BotonContador).
Cuando se pulse el botn Ver Pulsaciones tambin debera verse el nmero de pulsaciones
del botn C.
Cuando se pulse Reiniciar, el nmero de pulsaciones del Botn C debera situarse a cero
tambin.
Aade desde diseo un cuadro de texto y un botn normal (JButton) llamado Iniciar. En el
cuadro de texto se introducir un nmero, y al pulsar el botn Iniciar, los valores internos de
los tres botones A, B y C se inicializarn al nmero introducido:
Se introduce un nmero
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
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.
216
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
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()
-
getBotonPulsado()
-
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.
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.
221
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:
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.
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 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
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
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)
228
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:
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.
231
4. Y luego Pegar
232
233
EJERCICIO GUIADO 3
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.
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:
-
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
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:
-
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:
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.
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
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.
241
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
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.
243
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
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.
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
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.
249
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.
250
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
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();
11. Para practicar con el mtodo indicado en el punto anterior, aade al men Archivo una nueva
opcin llamada Cerrar Todo:
252
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
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
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:
-
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
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
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.
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
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 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.
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.
263
Un profesor puede dar varios cursos, y un curso es impartido por varios profesores
Esta relacin sera del tipo Muchos a Muchos.
264
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.
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.
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
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
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
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
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.
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.
Alumnos
Cursos
Alumnos
Libros
275
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.
Alumnos
Matrculas
Cursos
276
Alumnos
Matrculas
Cursos
Alumnos
Matrculas
Cursos
277
Alumnos
Matrculas
Cursos
Matrculas
Nmero (atributo clave)
Pago
Nota final
DNI (clave fornea de alumnos)
Cdigo Curso (clave fornea de cursos)
Alumnos
Libros
Alumnos
Prstamos
278
Libros
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.
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
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
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
285
Ao
DNI
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.
290
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
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
294
Nombre
Direccin
Tfno 1
Tfno 2
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
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
297
Comentario DNI
CIF
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
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:
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
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.
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.
304
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:
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:
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
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
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
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:
316
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
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
Campos
Coste
Criterios
200
Campos
Coste
Criterios
>200
Campos
Coste
Criterios
>=200
Campos
Coste
Criterios
<200
Campos
Coste
Criterios
<=200
320
Campos
Coste
Criterios
<>200
Campos
Coste
Criterios
> 10-12-2007
>= 10-12-2007
< 10-12-2007
<= 10-12-2007
<> 10-12-2007
Campos
Nombre
Criterios
Jos Manuel
Campos
Nombre
Criterios
Jos*
321
Campos
Nombre
Criterios
*Jos
Campos
Nombre
Criterios
*Jos*
Criterios complejos
Si se quiere buscar a aquellos registros que cumplan varios criterios a la vez, tendrn que
escribirse dichos criterios en la misma fila. Por ejemplo:
Campos
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
Antonio
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
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
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)
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
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
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;
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.
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
Operadores Relacionales
Operador
=
Ejemplos
WHERE cantidad = 200
Significa
Igual que
>
Mayor que
(para nmeros)
Posterior a
(para fechas)
>=
Menor que
(para nmeros)
Anterior a
(para fechas)
<=
Distinto de
(para fechas, nmeros y
textos)
Like cadena*
Like *cadena
Between...and
328
Like *cadena*
IS NULL
Operadores Lgicos
Operador
Significa
Ejemplos
AND
OR
NOT
Si no se cumple la
condicin, la condicin
global se cumple.
329
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)
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
6. Aparecer una pantalla casi en blanco donde escribir la consulta SQL. Observe que
ya aparece la clusula SELECT escrita:
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:
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.
334
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
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
22. Hemos finalizado con la consulta. Cirrela y gurdela. Puede ponerle de nombre
Servicios realizados por trabajadores ez.
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
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):
-
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
340
341
EJERCICIO GUIADO N 1
3. Crea una consulta en vista Diseo y no agregues ninguna tabla. Simplemente pulsa
el botn Cerrar.
342
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:
343
344
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.
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:
346
347
EJERCICIO GUIADO N 3
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.
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:
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
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.
351
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
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
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
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
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
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
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
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
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
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:
361
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
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)
363
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
364
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
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:
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
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.
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
370
Recapitulando
Para hacer una aplicacin java que acceda a una base de datos se tiene que
-
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:
2. En la parte superior de la ventana aade un botn con el texto Ver Datos Servicios
que se llame btnServicios.
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
373
374
375
376
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
378
379
380
381
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
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:
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.
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.
387
3. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que
prepararlo haciendo lo siguiente:
-
388
Si analiza este cdigo, ver que es igual al que hemos realizado en hojas anteriores.
Bsicamente lo que hace es lo siguiente:
-
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
389
Al pulsar el botn, se
muestran los datos de
todos los trabajadores.
390
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
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
393
13. Vamos a seguir mejorando el programa. Aada ahora el siguiente cuadro de texto y
los siguientes botones:
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
El usuario introducir una fecha (da, mes y ao) en los cuadros de texto
txtDia, txtMes, txtAnio.
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
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
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:
404
3. Para que este programa pueda trabajar con la base de datos MANEMPSA tendr que
prepararlo haciendo lo siguiente:
-
405
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
407
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
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
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.
Panel: panelBajas
Cuadro de texto: txtDNIEliminar
Botn: btnEliminar
413
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
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.
415
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
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.
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
Cuando aparezcan los datos del trabajador en los cuadros de texto, el usuario
podr realizar las modificaciones pertinentes.
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()) {
421
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.
422
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.
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
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
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
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.
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
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...
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
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.
434
txtFila txtColumna
btnVerValor
etiValor
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
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)
btnIntroducir
txtNuevoValor
436
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
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
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:
441
442
Debido a que
hemos asignado un
vector de ttulos sin
contenido, las
columnas tienen
como ttulo letras.
443
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.
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
445
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.
446
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.
Una vez que el modelo de tabla est relleno, asignar el modelo a un JTable.
448
449
EJERCICIO GUIADO N 1
450
451
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:
452
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:
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:
455
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
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
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.
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
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.
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
463
464
EJERCICIO GUIADO N 1
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:
=
>
<
>=
<=
<>
466
Se pulsa el botn
Filtrar y aparece el
cuadro de dilogo de
filtrado.
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:
469
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)
470
Etc.
Resumiendo, la primera condicin vendr antecedida de where, mientras que el
resto de las condiciones vendrn antecedidas del and.
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
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: =, >, <, >=, <= ,
<>
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
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:
473
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:
475
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:
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
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
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
panelOrdenacion
cboCamposOrdenacion
radioASC
radioDESC
481
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):
482
483
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:
etiNumeroTrab
etiSueldoMedio
485
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.
487
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
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
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.
492
Aqu tendremos un
listado con los
campos de las
tablas que
podremos incluir en
el informe, entre
otras cosas.
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.
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
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
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
498
4. Para base de datos de Access, debes activar la opcin Conexin Base de Datos
JDBC y pulsar Prximo.
(gJ
Prueba
I[P'Oximo:>JII
499
Cancelar
(g)
(4.
~
...
~v i
ljdbc:mysql://localhost/MYDATABASE
JDBC URL
Direccin Server
Base Datos
1 1 Mago
Nombre usuario
O Salvar la password
Password
1 Prueba
111 Salvar
500
11 Cancelar
el Propiedades de conexin
(gJ
1 Prueba
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)
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)
504
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:
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:
-
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.
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
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
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
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:
516
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
20. Selecciona ahora el ttulo, por ejemplo (solo tienes que hacer un clic sobre l)
520
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:
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:
523
30. Una vez cambiadas las propiedades, si visualizas el informe, deber tener el
siguiente aspecto:
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
526
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.
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
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:
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
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
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
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
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.
537
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
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:
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
Como puede ver, en la ficha del empleado aparecen sus datos reales.
542
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:
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.
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.
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
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
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
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
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:
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.
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.
554
27. Ahora visualice el informe y observe la parte inferior (si cambia el zoom al 50% podr
tener una vista global del informe):
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.
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
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.
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:
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
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.
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.
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.
Summary Resumen: Usado para colocar clculos de totales. Aparece al final del
listado.
562
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
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:
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
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
569
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
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
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
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:
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.
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
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
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:
578
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:
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:
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:
-
581
582
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.
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.
586
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.
587
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.
588
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);
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
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:
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
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:
596
12. Si modifica sus informes con imgenes de esta forma y los recompila, entonces
podr organizar su carpeta distribuible de esta manera:
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
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
600
<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:
-
<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.
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):
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:
603
604
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
3. Una vez dentro de la carpeta del programa IzPack, debes ejecutar el siguiente
comando:
bin\compile
camino\carpeta\install.xml -b
camino\carpeta
c:\proyectos\dist\install.xml -b
c:\proyectos\dist
605
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