Download instituto tecnológico de morelia programación ii

Document related concepts
no text concepts found
Transcript
0
SUBSECRETARÍA DE EDUCACIÓN SUPERIOR
DIRECCIÓN GENERAL DE EDUCACIÓN SUPERIOR
TECNOLÓGICA
INSTITUTO TECNOLÓGICO
DE MORELIA
INSTITUTO TECNOLÓGICO DE MORELIA
DIVISIÓN DE ESTUDIOS PROFESIONALES
DEPARTAMENTO DE SISTEMAS
COMPUTACIONALES
LIBROS DE TEXTO O PROTOTIPOS
DIDÁCTICO
PROGRAMACIÓN II
QUE PARA OBTENER EL TÍTULO DE:
INGENIERO EN SISTEMAS COMPUTACIONALES
PRESENTA:
SAÚL CHÁVEZ VELÁZQUEZ
ASESOR:
RAYMUNDO GUZMÁN MARINES
MORELIA, MICHOACÁN
20/06/09
Agradecimientos
Agradezco todo el apoyo de mi Asesor Raymundo Guzmán Marines sin el cual
no habría sido posible la culminación de este trabajo. Gracias por todo su
tiempo, su comprensión, sus consejos y su trabajo…
A mis padres, por todo su apoyo, sin él no podría haber llegado a este punto…
Y a quienes debo lo bueno que haya en mi.
A Verónica, por su ayuda, por el soporte que siempre me ha brindado, siempre
puedo contar con ella. ¡Gracias por todo!
A mi abuelita Angelina, quien siempre me ha servido como ejemplo de trabajo y
esfuerzo. Una persona admirable, si todos tuviéramos la mitad de su energía,
entusiasmo y amor por hacer las cosas bien seguramente el mundo estaría
lleno de gente exitosa.
Al Tecnológico de Morelia y a todos mis profesores, realmente me siento
orgulloso de ser egresado de esta institución, gracias a ellos aprendí algo que
considero muy importante, “siempre estar aprendiendo cosas nuevas y por uno
mismo”, “siempre dar más de lo necesario”, aunque en su momento no
“agradecía” precisamente las noches de desvelo trabajando para esos
“proyectos semestrales” ahora que formo parte de productiva de la sociedad
agradezco mucho todo lo que aprendí tanto en las aulas, como en las
incontables horas de trabajo fuera de la institución.
Dedico este trabajo a mi familia.
INTRODUCCIÓN
En el siguiente material se estudian los temas de la asignatura de
Programación II del plan 2004 de la licenciatura en Informática.
Todos los temas se desarrollan utilizando el lenguaje de programación Java;
pero, debido a la temática que se debe contemplar para respetar el programa,
algunos de los temas deben explicarse con otras herramientas como Visual
Basic. Sin embargo se hace una pequeña comparación entre lo que pide el
programa y el equivalente en lenguaje java.
El material comienza desde lo más básico del lenguaje: comentarios,
declaraciones, sintaxis, etc. Y avanza hasta el punto de almacenamiento en
bases de datos.
El flujo de trabajo es el siguiente: se comienza a trabajar en modo consola, con
algoritmos sencillos y almacenamiento en memoria, a partir del final de la
primera unidad se comienzan a analizar objetos gráficos y en la segunda
unidad se trabaja absolutamente en ambiente gráfico, aún utilizando como
modo de almacenamiento la memoria de la PC. Después, a partir de la tercera
unidad, el modo de almacenamiento cambia a “Archivos” y se pide al
estudiante, programe aplicaciones gráficas almacenando y extrayendo
información de archivos de texto plano. Finalmente, el modo de
almacenamiento cambia a “Bases de Datos” y se analizan ejemplos sencillos
con bases de datos muy simples. Al final del material y a modo de información
extra se analiza cómo crear tus propios controles ActiveX con Visual Basic.
Los ejercicios propuestos para cada unidad pretenden reforzar los temas vistos
en cada una de las mismas y están diseñados de tal manera que el alumno
siga la línea de aprendizaje descrita en el párrafo anterior procurando siempre
que inculcar en el alumno la necesidad de investigar más y profundizar más en
los temas que se analizan. Los ejemplos siguen la misma línea de aprendizaje,
todos los ejemplos están relacionados con una aplicación y situación inicial a la
cual se le va agregando funcionalidad de acuerdo al avance en el temario de la
materia.
Finalmente, se incluye un glosario de términos que ayude al estudiante a
disipar dudas sobre tecnicismos que desconozca y se provee de una completa
bibliografía, describiendo en las ligas de internet el tipo de material que se
puede localizar en cada una. Cabe mencionar que dicha bibliografía se revisó
recientemente para confirmar la existencia actual de las mismas.
i
ITM INDICE GENERAL
INDICE
INTRODUCCION
.
.
.
.
.
.
.
.
.
UNIDAD I. “FUNDAMENTOS DEL LENGUAJE”
1.1 Programación orientada a eventos. . .
1.1.1 Objetos. . . . . . . .
1.1.2 Eventos. . . . . . . .
1.1.3 Métodos. . . . . . . .
1.1.4 Propiedades. . . . . . .
1.2 Entorno integrado de desarrollo. . . .
1.3 Ventanas (proyecto, propiedades, ayuda).
1.4 Tipos de proyectos. . . . . . .
1.4.1 Configuración.
. . . .
23
1.5 Comentarios. . . . . . . . .
1.6 Constantes.
. . . . . . . .
1.7 Tipos de datos. . . . . . . . .
1.8 Variables. . . . . . . . . .
1.9 Operadores.
. . . . . . . .
1.10 Sentencias. . . . . . . . .
1.11 Matrices. . . . . . . . . .
1.12 Procedimientos y funciones.. . . .
1.13 Estructuras de control. . . . . .
1.14 Controles básicos y sus propiedades.
Ejercicios Propuestos.
. . . . . .
Proyectos integrales. . . . . . . .
.
.
.
.
.
.
.
.
i
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
6
10
13
15
18
23
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
24
25
26
32
36
45
46
49
55
64
72
75
.
.
77
. .
.
.
.
.
.
.
93
94
97
101
105
107
.
.
.
.
.
111
115
122
130
133
UNIDAD 2. “CONTROLES, EVENTOS, MÉTODOS Y COMPONENTES”
2.1 Controles estándar. . . . . . . . . . . . . .
2.2 Eventos del formulario.
. . . . . . . . . . .
87
2.3 Cajas de diálogo.
. . . . . . . . . . . . .
2.3.1 Modales y no modales.
. . . . . . . . .
2.3.2 Predefinidas. . . . . . . . . . . . . .
2.4 Componentes estándar. . . . . . . . . . . . .
Ejercicios Propuestos. . . . . . . . . . . . . . .
Proyecto integral . . . . . . . . . . . . . . .
UNIDAD 3. “SISTEMAS DE ARCHIVOS”
3.1 Acceso secuencial.
. . . . . .
3.2 Acceso directo. . . . . . . . .
3.3 Manejo de archivos. . . . . . .
3.4 Controlar errores en tiempo de ejecución.
Ejercicios Propuestos. . . . . . . .
Instituto Tecnológico de Morelia.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Página i
ITM INDICE GENERAL
Proyecto integral
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
135
UNIDAD 4. “ACCESO A DATOS”
4.1 Introducción. . . . . . .
4.2 Control de datos ADO. . . . .
4.3 Objetos ADO. . . . . . .
4.4 Herramientas de acceso a datos.
4.4.1 ADO.NET
. .
4.4.2 JDBC . . . .
4.4.3 ODBC . . . .
4.4.2 DAO . . . .
Ejercicios Propuestos.
. . . .
Proyecto integral . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
138
154
156
164
165
165
165
166
172
173
UNIDAD 5. “COMPONENTES Y CONTROLES DEFINIDOS POR EL USUARIO”
5.1 Modelo de componentes.
. . . . . . . . . . . . 175
5.2 Crear un componente Active X. . . . . . . . . . . . 175
5.3 Crear un Control Active X. . . . . . . . . . . . . 177
Ejercicios Propuestos.
. . . . . . . . . . . . . . 187
Proyecto integral . . . . . . . . . . . . . . . . 187
Apéndice 1 Instalación de Net Beans. . . .
.
.
.
.
.
.
.
.
.
187
Apéndice 2 Introducción a MySQL. . .
Conclusiones.
Bibliografía. .
.
.
.
.
.
.
.
.
.
.
.
.
191
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
202
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
204
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
209
Glosario de Términos.
Instituto Tecnológico de Morelia.
Página ii
ITM INDICE GENERAL
INDICE DE FIGURAS
UNIDAD I. “FUNDAMENTOS DEL LENGUAJE”
1.1 Ejemplo de cómo identificar Objetos.
.
.
1.2 Ejemplo de cómo identificar Objetos, Misma Clase.
1.3 Ejemplo utilizando JOptionPane.
. . . . .
1.4 Ejemplo usando ventanas para entrada de datos. .
1.5 Objeto en NetBeans. . . . . . . . . .
1.6 Botón con texto editado. . . . . . . . .
1.7 Pantalla principal de NetBeans 6.0. . . . . .
1.8 Ventana de Proyectos.. . . . . . . . .
1.9 Ventana elegir nombre y ubicación. . . . . .
1.10 Hola Mundo en Java. . . . . . . . .
1.11 Ventana Propiedades.
. . . . . . .
1.12 Ventana Help. . . . . . . . . . .
1.13 Búsqueda en Ayuda. . . . . . . . .
1.14 Ventana Proyectos. . . . . . . . . .
1.15 Ejemplo de una etiqueta. . . . . . . .
1.16 Ejemplo de ScrollBar no a la vista. . . . .
1.17 Ejemplo de ScrollBar a la vista. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
9
9
13
14
16
18
19
20
21
21
22
24
65
70
71
UNIDAD 2. “CONTROLES, EVENTOS, MÉTODOS Y COMPONENTES”
2.1 Ventana “Nuevo Proyecto”. . . . . . . . . . . .
2.2 Ventana de configuración de proyecto.
. . . . . . .
2.3 Área de trabajo de NetBeans.
. . . . . . . . .
2.4 Aplicación de escritorio vacía.
. . . . . . . . .
2.5 Paleta de controles. . . . . . . . . . . . . .
2.6 Programa en ejecución con botones de ejemplo. . . . . .
2.7 Ventana Propiedades. . . . . . . . . . . . . .
2.8 Cambio de propiedades de un objeto. . . . . . . . .
2.9 Cambio de propiedad “name”.
. . . . . . . . . .
2.10 Programa en ejecución con caja de texto.
. . . . .
2.11 Cambio de Propiedades de un objeto Textfield. . . . . .
2.12 Cambio de Propiedades de objetos CheckBox. . . . . .
2.13 Aplicación con botones de opción.
. . . . .
. .
2.14 Lista de eventos. . . . . . . . . . . . . . .
2.15 Ejemplo en ejecución. . . . . . . . . . . . .
2.16 Programa en ejecución.
. . . . . . . . . . .
2.17 Aplicación en ejecución. . . . . . . . . . . .
2.18 Aplicación en ejecución. . . . . . . . . . . .
2.19 Ventana “New File” crear caja de diálogo.
. . .. . .
2.20 Nuevo formulario para caja de diálogo vacio. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
77
78
78
79
79
80
81
82
83
83
84
85
87
88
89
90
92
93
95
95
Instituto Tecnológico de Morelia.
.
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Página iii
ITM INDICE GENERAL
2.21
2.22
2.23
2.24
2.25
2.26
2.27
Aplicación en ejecución. . . . . . . . .
Cómo ver la lista de cuadros de diálogo predefinidos.
Error por no importar librería. . . . . . . .
Herramienta útil para corregir errores sencillos. . .
Programa en ejecución.
. . . . . . . .
Programa en ejecución.
. . . . . . . .
Componentes Swing y AWT. . . . . . . .
UNIDAD 3. “SISTEMAS DE ARCHIVOS”
3.1 Programa en ejecución. . . .
3.2 Programa en ejecución. . . .
3.3 Ejemplo con RandomAccessFile.
3.4 Ejemplo usando JFileChooser. .
3.5 Selector de apertura. . . . .
3.6 Selector personalizado. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
UNIDAD 4. “ACCESO A DATOS”
4.1 Ventana: elegir nombre de página y puerto. . . .
4.2 Ventana: configuración de MySQL. . . . . . .
4.3 Iniciar ambos servidores. . . . . . . . . .
4.4 Pantalla principal del servidor Apache.
. . . .
4.5 Pantalla principal de phpMyAdmin. . . . . . .
4.6 ¿Cómo acceder a la tabla de Usuarios?. . . . .
4.7 Consulta de la tabla “user” de MySQL. . . . . .
4.8 Datos a llenar para dar de alta otro usuario.
. .
144
4.9 ¿Cómo agregar el driver para conectar…?.
. .
145
4.10 Ventana: agregar driver JDBC. . . . . . . .
4.11 Opción para conectar la base de datos. . . . .
4.12 Agregar los datos a la Base de datos.
. . . .
4.13 Conectar NetBeans con MySQL. . . . . . .
4.14 Ventana: Conexión establecida. . . . . . .
4.15 Ejemplo de botó que invoca una conexión.
. .
4.16 Opción necesaria para crear una Base de Datos. .
4.17 Crear tablas de la base de datos. . . . . . .
4.18 Ingresar datos de la tabla. . . . . . . . .
4.19 Ingresar datos de cada campo de la tabla.
. .
152
4.20 Vista de las tablas de nuestra nueva base de datos.
4.21 Programa en ejecución.
. . . . . . . .
4.22 Contenido de la base de datos.
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
96
98
98
99
100
101
102
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
113
115
119
123
123
125
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
140
140
141
141
142
143
143
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
145
146
146
147
147
149
150
151
151
. .
.
.
.
.
.
.
.
.
.
.
.
.
152
154
154
.
.
.
.
.
.
.
.
UNIDAD 5. “COMPONENTES Y CONTROLES DEFINIDOS POR EL USUARIO”
5.1 Tipos de proyectos en Visual Basic. . . . . . . . . . . 178
5.2 Propiedades del Proyecto. . . . . . . . . . . . . 179
Instituto Tecnológico de Morelia.
Página iv
ITM INDICE GENERAL
5.3 Evento “resize” del control ActiveX. . . . . . .
5.4 Ventana para activar el asistente de configuración. .
5.5 Ventana: Seleccionar miembros de la interfaz. . .
5.6 Ventana: Agregar miembros personalizados. . . .
5.7 Ventana crear miembros personalizados de la interfaz.
5.8 Ventana: establecer atributos de los miembros. . .
5.9 Utilización de nuestro control.. . . . . . . .
5.10 Objeto Active X. . . . . . . . . . . .
Instituto Tecnológico de Morelia.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
180
180
181
181
182
182
184
186
Página v
Unidad 1. Fundamentos del
Lenguaje.
Conceptos básicos.
ITM Unidad I Fundamentos del Lenguaje
1.1 Programación Orientada A Eventos
1.1.1 Objetos
Un objeto es una entidad provista de un conjunto de propiedades o atributos
(datos) y de comportamiento o funcionalidad (métodos). Corresponden a los
objetos reales del mundo que nos rodea, o a objetos internos del sistema (del
programa). Es una instancia de una clase.
Los objetos son entidades que combinan estado, comportamiento e identidad.
El estado está compuesto de datos, y el comportamiento por procedimientos o
métodos. La identidad es una propiedad de un objeto que lo diferencia del
resto. La programación orientada a objetos expresa un programa como un
conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto
permite hacer los programas y módulos más fáciles de escribir, mantener y
reutilizar.
De esta forma, un objeto contiene toda la información que permite definirlo e
identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente
a objetos de una misma clase, al poder tener valores bien diferenciados en sus
atributos. A su vez, los objetos disponen de mecanismos de interacción
llamados métodos que favorecen la comunicación entre ellos. Esta
comunicación favorece a su vez el cambio de estado en los propios objetos.
Esta característica lleva a tratarlos como unidades indivisibles, en las que no se
separan ni deben separarse el estado y el comportamiento.
Identificando objetos
•
Los objetos pueden ser físicos o conceptuales.
Una cuenta de cliente es un ejemplo de un objeto conceptual
porque no se puede tocar físicamente. Un cajero automático es
algo que mucha gente toca todos los días y es un ejemplo de un
objeto físico.
•
Los objetos tienen atributos (características).
Tal como tamaño, nombre, color, forma, etc. Los valores de los
atributos son referidos como el estado actual del objeto. Por
ejemplo, un objeto puede tener un atributo color con el valor de
rojo.
•
Los objetos tienen operaciones (las cosas que pueden hacer).
Instituto Tecnológico de Morelia.
Página 2
ITM Unidad I Fundamentos del Lenguaje
Tal como asignar un valor, desplegar una pantalla, o incrementar
rapidez. Las operaciones usualmente afectan los atributos de los
objetos.
Figura 1.1: Ejemplo de cómo Identificar Objetos.
Otro ejemplo seria una puerta… Sus atributos serian el color, tamaño, material,
etc. Sus operaciones o métodos serian cerrar_puerta(), abrir_puerta().
El identificar objetos ayuda a diseñar las clases (o plantillas) para cada tipo de
objetos en un sistema. En la Programación Orientada a Objetos (POO) cada
objeto de una clase es llamada una instancia de clase y tiene valores distintos
en sus atributos, pero son los mismos atributos y las mismas operaciones.
Figura 1.2: Ejemplo Diferentes Objetos, Misma Clase.
Para declarar un objeto, primero debemos declarar la clase, la sintaxis en Java
es la siguiente:
Declaración de clases:
En Java la declaración de clases toma la siguiente forma:
<modificador>* class <nombre_clase> {
<declarer_atributos>*
<declarar_constructor>*
<declarar_métodos>*
Instituto Tecnológico de Morelia.
Página 3
ITM Unidad I Fundamentos del Lenguaje
}
Ejemplo: En el archivo MiClase.class
package javaApplication1;
public class MiClase{
String mensaje;
}
Declaración de objetos:
Para declarar un objeto se sigue la siguiente sintaxis:
<nombre_clase> <nombre_objeto> = new <nombre_clase>();
Ejemplo: En el archivo Main.class
package javaApplication1;
public class Main {
public static void main(String[] args) {
//variable usada para explicar la herencia.
int i=0;
//Aquí se crea el objeto
MiClase imprimir=new MiClase();
imprimir.mensaje=”Hola a todos”;
System.out.println("El mensaje es:
imprimir.mensaje);
" +
}
}
Si corremos el archivo MiClase.class, la salida será: “El mensaje es: Hola a
todos”. Ambos archivos deberán contenerse en una aplicación creada dentro
de NetBeans, este proceso se explicara con detalle posteriormente. A grandes
rasgos, deberá ir al menú “file”, seleccionar “New Project” aparecerá la
ventana de las diferentes categorías, seleccionamos la categoría “Java” y
dentro de ella la opción “Java Application” el nombre del archivo Main.class
dentro del proyecto.
Una vez que tenemos nuestro proyecto, iremos al menú “file”, seleccionamos
la opción “New File”, en el campo “Categories” seleccionamos “Java” y en el
campo “File Types” seleccionamos “Java Class” en el caso del ejemplo la
clase se llama MiClase, debido a ello así se llama el archivo. Con esto
tendremos nuestros dos archivos creados y listos para introducir nuestro
código.
Proyecto: Durante el desarrollo de esta unidad se irán planteando ejercicios,
todos los ejercicios serán parte de un proyecto en el cual se tendrá como
resultado el uso de todas las herramientas que se analizarán durante el
desarrollo de la Unidad I.
Instituto Tecnológico de Morelia.
Página 4
ITM Unidad I Fundamentos del Lenguaje
Ejercicio 1.1: Inicie un proyecto en NetBeans, una aplicación normal (No de
escritorio) Esto creará a su clase principal. Ahora declare una clase, esta clase
será nuestra clase base en el proyecto y se llamará “Operaciones”, si lo desea
puede poner el nombre que desee pero posteriormente estaremos referencia a
esta clase con el nombre aquí propuesto, la clase Operaciones deberá
contener una variable para almacenar los resultados de las operaciones.
Herencia
La herencia es uno de los aspectos de la programación orientada a objetos que
se ha definido formalmente. Utilizando la herencia, se puede derivar una nueva
clase a partir de una antigua. La clase nueva se llama clase derivada y la clase
original, clase base. La idea es añadir lo que se quiera a la nueva clase para
darle más funcionalidad a la clase base.
La herencia es el mecanismo por el que se crean nuevos objetos definidos en
términos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se
puede crear la subclase Pato, que es una especialización de Ave.
class Pato extends Ave {
int numero_de_patas;
}
La palabra clave extends se usa para generar una subclase (especialización)
de un objeto. Un Pato es una subclase de Ave. Cualquier cosa que contenga la
definición de Ave será copiada a la clase Pato. Además, en Pato se pueden
definir sus propios métodos y variables de instancia. Se dice que Pato deriva o
hereda de Ave.
La sintaxis para declarar una clase derivada es similar a la de una clase
normal, únicamente debemos agregar la palabra reservada extends seguida
del nombre de la clase base.
<modificador>* class <nombre_clase> extends <nombre_clase_base>{
<declarer_atributos>*
<declarar_constructor>*
<declarar_métodos>*
}
Además, se pueden sustituir los métodos proporcionados por la clase base.
Utilizando nuestro el ejemplo de MiClase, aquí hay un ejemplo de una clase
derivada aumentando a la función Suma_a_i():
Instituto Tecnológico de Morelia.
Página 5
ITM Unidad I Fundamentos del Lenguaje
import MiClase;
public class MiNuevaClase extends MiClase {
public void Suma_a_i( int j ) {
i = i + ( j/2 );
}
}
Ahora cuando se crea una instancia de MiNuevaClase, esta contendrá todas
las características de la clase MiClase y además podrá utilizar el método
Suma_a_i(), de ahí que podamos utilizar la variable “i” sin haberla declarado
aquí. Debido a que se esta heredando de MiClase, MiNuevaClase puede hacer
uso de ella.
En Java no se puede hacer herencia múltiple. Por ejemplo, de la clase aparato
con motor y de la clase animal no se puede derivar nada, sería como obtener el
objeto toro mecánico a partir de una máquina motorizada (aparato con motor) y
un toro (animal). En realidad, lo que se pretende es copiar los métodos, es
decir, pasar la funcionalidad del toro de verdad al toro mecánico, con lo cual no
sería necesaria la herencia múltiple sino simplemente la compartición de
funcionalidad que se encuentra implementada en Java a través de interfaces.
Ejercicio 1.2: Defina cuatro clases que hereden las características de la clase
Operaciones. Las nuevas clases serán Suma, Resta, Multiplica y Divide. Hasta
este momento ninguna de nuestras clases posee métodos o propiedades.
1.1.2 Eventos
Un evento es un suceso en el sistema (tal como una interacción del usuario con
la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento
enviando el mensaje adecuado al objeto pertinente. También se puede definir
como evento, a la reacción que puede desencadenar un objeto, es decir, la
acción que genera.
Los lenguajes visuales orientados a eventos y con manejo de componentes
dan al usuario que no cuenta con mucha experiencia en desarrollo, la
posibilidad de construir sus propias aplicaciones utilizando interfaces gráficas
sobre la base de ocurrencia de eventos.
Para soportar este tipo de desarrollo interactúan dos tipos de herramientas, una
que permite realizar diseños gráficos (En nuestro caso NetBeans) y, un
lenguaje de alto nivel que permite codificar los eventos (Java). Con dichas
herramientas es posible desarrollar cualquier tipo de aplicaciones basadas en
el entorno.
Java es uno de los lenguajes de programación que más entusiasmo despiertan
entre los programadores, tanto expertos como novatos. En el caso de los
programadores expertos por la facilidad con la que desarrollan aplicaciones
Instituto Tecnológico de Morelia.
Página 6
ITM Unidad I Fundamentos del Lenguaje
complejas en poquísimo tiempo. En el caso de los programadores novatos por
el hecho de ver de lo que son capaces a los pocos minutos de empezar su
aprendizaje.
Java es también un lenguaje orientado a objetos. La diferencia con un lenguaje
no orientado a objetos y uno basado en objetos es que el segundo utiliza
objetos con propiedades y métodos, pero carece de los mecanismos de
herencia y polimorfismo propios de los verdaderos lenguajes orientados a
objetos como Java.
Existen distintos tipos de programas. Al inicio de la historia de la programación
los programas eran de tipo secuencial (también llamados tipo batch). Un
programa secuencial es un programa que se arranca, lee los datos que
necesita, realiza los cálculos e imprime o guarda en el disco los resultados.
Mientras un programa secuencial está ejecutándose no necesita ninguna
intervención del usuario. A este tipo de programas se les llama también
programas basados u orientados a procedimientos o a algoritmos (procedural
languages). Este tipo de programas siguen utilizándose ampliamente en la
actualidad, pero la difusión de las PC’s ha puesto de actualidad otros tipos de
programación.
Los programas interactivos exigen la intervención del usuario en tiempo de
ejecución, ya sea para suministrar datos, o bien para indicar al programa lo
que debe hacer por medio de menús. Los programas interactivos limitan y
orientan la acción del usuario.
Por su parte los programas orientados a eventos son los programas típicos de
Windows, tales como Netscape, Word, Excel, PowerPoint y otros. Cuando uno
de estos programas ha arrancado, lo único que hace es quedarse a la espera
de las acciones del usuario, que en este caso son llamadas eventos.
El usuario dice si quiere abrir y modificar un archivo existente, o bien comenzar
a crear un archivo desde el principio. Estos programas pasan la mayor parte de
su tiempo esperando las acciones del usuario (eventos) y respondiendo a ellas.
Las acciones que el usuario puede realizar en un momento determinado son
variadísimas, y exigen un tipo especial de programación: la programación
orientada a eventos. Este tipo de programación es sensiblemente más
complicada que la secuencial y la interactiva, pero con los lenguajes visuales
de hoy, se hace sencilla y agradable.
Ya se ha dicho que las acciones del usuario sobre el programa se llaman
eventos. Son eventos típicos el clic sobre un botón, el hacer doble clic sobre el
nombre de un archivo para abrirlo, el arrastrar un icono, el pulsar una tecla o
combinación de teclas, el elegir una opción de un menú, el escribir en una caja
de texto, o simplemente mover el ratón.
Cada vez que se produce un evento sobre un determinado tipo de control,
NetBeans arranca una determinada función o procedimiento que realiza la
acción programada por el usuario para ese evento concreto. Estos
Instituto Tecnológico de Morelia.
Página 7
ITM Unidad I Fundamentos del Lenguaje
procedimientos se llaman con un nombre que se forma a partir del nombre del
objeto y el nombre del evento como se muestra a continuación:
private void botonAbrirMouseClicked
(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
}
Como se puede observar, el evento que se programará es el clic sobre el
objeto botonAbrir, cabe mencionar que al utilizar NetBeans, todo este código se
generará automáticamente. Lo único que tendremos que hacer será
seleccionar el objeto que deseamos, seleccionar un evento de la pestaña de
eventos y dar doble clic. El programa incluso coloca comentarios en el código
para guiarnos. Por ejemplo en el evento anterior, se nos indica donde podemos
colocar nuestro código. Este proceso se explica con mayor detalle adelante.
Para comprender más sobre los eventos tenemos el siguiente ejemplo. Solo se
muestra un mensaje de confirmación. Para ello se utiliza la clase JOptionPane,
esta clase se analiza a fondo en la unidad II.
Ejemplo: Hacer un pequeño ejemplo en el cual se muestre un pequeño
mensaje de bienvenida. El código es el siguiente:
package proyecto;
import javax.swing.JOptionPane;
/**
*
* @author saul.chavez
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JOptionPane.showMessageDialog(null,
"Bienvenido al lenguaje Java");
System.Out.Println(Bienvenido al lenguaje Java”
}
}
El código anterior es tal cual un nuevo proyecto en NetBeans. Para el ejemplo
anterior no se tuvo más que crear nuevo proyecto y agregar las líneas en
negrita que se encarga de mostrar el mensaje deseado, que es todo lo que
hace el programa. Con JOptionPane se crea una ventana como la que se
Instituto Tecnológico de Morelia.
Página 8
ITM Unidad I Fundamentos del Lenguaje
muestra en la Figura 1.3. Con System.Out.Println(); el mensaje se
muestra en modo texto.
Figura 1.3 Ejemplo utilizando JOptionPane.
Hay otro tipo de ventana de diálogo predefinida que necesitaremos conocer en
este momento para los ejercicios propuestos. Esta ventana nos servirá para
introducir datos gráficamente y se utiliza de la siguiente manera:
package proyecto;
import javax.swing.JOptionPane;
public static void main(String[] args) {
JOptionPane.showMessageDialog(null,
"Bienvenido al lenguaje Java");
int Valor = Integer.parseInt
(JOptionPane.showInputDialog(null, "Introduce un valor"));
}
}
Lo que se está haciendo en la línea en negritas es declarar una variable entera,
mostrar una venta de diálogo que pide un valor y asignarlo a la variable. La
instrucción sola que muestra la ventana deseada es:
JOptionPane.showInputDialog(null, "Introduce un valor")
Pero esto nos regresa una cadena, no un entero. Por ello utilizamos el método
Integer.ParseInt(); que transforma la cadena que reciba en un valor entero. Si
se recibe como parámetro una cadena que no representa a un valor entero
(como “hola” en lugar de “200”) se producirá un error en al método ParseInt().
Figura 1.4 Ejemplo usando ventanas de diálogo para entrada de datos.
1.1.3 Métodos
Instituto Tecnológico de Morelia.
Página 9
ITM Unidad I Fundamentos del Lenguaje
Los métodos son funciones de una clase. Generalmente los métodos se
dividen en aquellos que se usan internamente en la clase, llamados métodos
privados (private), los que se usan fuera de la clase, llamados métodos
públicos (public) y los que son usados por la clase y sus derivadas, llamados
métodos protegidos (protected).
Los métodos privados son generalmente llamados en el interior del objeto por
otras partes del mismo.
Una vez que se tiene un objeto que soporta métodos, se pueden usar los
métodos de esos objetos. En el ejemplo siguiente se usa el método calcular
para trabajar con los valores de operando1 y operando2 y almacenar el
resultado en la variable resultado.
//Suponiendo que ya creamos esta clase
Calculadora objeto = new Calculadora();
double resultado = objeto.calcular(operando1, operando2);
//Suponiendo
que
el
método
calcular
también
fue
programado.
Java soporta dos tipos de métodos: métodos de clase y métodos de instancia.
Los métodos de instancia, como en el ejemplo “calcular”, son invocados en
objetos (es decir, los objetos son instancias de una clase). Los métodos de
clase, por otro lado, son invocados en una clase. Por ejemplo, la clase
java.lang.Math tiene un método de clase llamado sqrt que calcula una raíz
cuadrada y se puede usar como sigue (no es necesario un objeto):
public class MiClase{
public static void main (String [] args)
double valor = 4, raiz;
raiz = Math.sqrt(valor);
System.out.println(“La raíz cuadrada de “ +
valor + “ = “ + sqrt);
}
}
La salida de este código es:
La raíz cuadrada de 4.0 = 2.0
Ejercicio 1.3: Defina en cada una de las clases de su proyecto, un método que
realice la operación a la que su nombre hace referencia (Ej. En la clase Suma
un método que sume). Cada método trabajará únicamente con dos operadores,
los cuales se recibirán como parámetros cuando una instancia de la clase los
Instituto Tecnológico de Morelia.
Página 10
ITM Unidad I Fundamentos del Lenguaje
requiera. Utilice la clase JOptionPane ejemplificada anteriormente para obtener
los valores.
Método main
Es un método especial que java reconoce como el punto inicial para que un
programa se ejecute desde la línea de comando. Su sintaxis es:
public static
//Código}
void
main
(String
args[]){
Siempre debe tener dos modificadores de acceso: public y static. El método
main no regresa ningún valor. Acepta cero o más objetos de tipo String.
Accesando miembros del objeto
El operador punto (.) permite accesar a atributos y métodos no privados
de una clase como se muestra en los ejemplos anteriores.
Dentro de un método no se necesita usar esta notación para accesar
miembros locales del método.
Generalmente se crean métodos set() y get() para accesar a miembros
de un objeto que no es local.
Polimorfismo
El polimorfismo se logra mediante la sobrecarga de métodos. Consiste en crear
métodos que se comporten de manera distinta dependiendo de los parámetros
con los que trabaje. Por ejemplo, si usted crea una clase cualquiera y en ella
define el método “Suma”, el cual realiza la suma de dos operadores, pero usted
tiene la necesidad de sumar ahora tres operadores… No necesita crear un
nuevo método para realizar dicha acción, para eso sirve la sobrecarga de
métodos.
La sobrecarga de métodos permite definir diferentes versiones de un método,
todos con el mismo nombre pero con diferentes listas de parámetros. Cuando
se utiliza un método sobrecargado, el compilador de java sabe cual se desea
utilizar por el número y/o tipo de parámetros que se le pasen.
Para sobrecargar un método, sólo hay que definirlo más de una vez,
especificando una nueva lista de parámetros en cada una de ellas. Cada lista
de parámetros debe ser diferente de cualquier otra de alguna forma, el número
de parámetros o el tipo de uno o más de ellos.
Ejemplo: Sobrecargaremos el método Suma de la clase Calculadora
Instituto Tecnológico de Morelia.
Página 11
ITM Unidad I Fundamentos del Lenguaje
//Clase original sin sobrecarga.
class Calculadora
{
int Suma(int op1, int op2)
{
return op1 + op2;
}
}
class Calculadora
{
//método Suma que
int Suma(int op1,
{
return op1 +
}
//método Suma que
int Suma(int op1,
{
return op1 +
}
}
trabaja con dos operadores
int op2)
op2;
trabaja con tres operadores
int op2, int op3)
op2 + op3;
Para utilizar la clase anterior el código es el siguiente.
public class MiClase{
public static void main(String [] args){
Calculadora calc = new Calculadora();
System.out.println(“Suma 2 más 2 = “ +
calc.Suma(2,2));
System.out.println(“Suma 2 más 2 más 2 = “ +
calc.Suma(2,2,2));
}
}
Como puede ver, la sobrecarga proporciona una técnica potente, con ella
podemos evitar problemas clásicos de desorden de código como la declaración
de varios métodos con nombres como: “Suma2”, “Suma3” o “SumaDosOp”,
“SumaTresOp”, etc.
Ejercicio 1.4: Sobrecargue cada uno de los métodos que contienen las clases
Suma, Resta, Multiplica y Divide para que trabajen con tres operadores de la
siguiente manera:
*Suma: Se sumarán los tres operadores.
*Resta: el tercer parámetro indicara cuantas veces se desea que se reste el
segundo parámetro al primero.
Instituto Tecnológico de Morelia.
Página 12
ITM Unidad I Fundamentos del Lenguaje
*Multiplica: Se multiplicarán los tres parámetros entre sí.
*Divide: El tercer parámetro indicará cuantas veces se desea que se divida el
primer parámetro entre el segundo.
Los resultados de las operaciones deberán ser manipulados o almacenados en
la variable que contiene la clase Operaciones para que la herencia tenga algún
sentido y mostrados al usuario por medio de ventanas de diálogo (Utilice la
clase JOptionPane para esto).
1.1.4 Propiedades
Una propiedad es una asignación que describe algo sobre un objeto como un
formulario, un botón, una lista, etc. Dependiendo de la propiedad, se le puede
asignar en tiempo de diseño usando la ventana Propiedades y/o en tiempo de
ejecución al programar.
Los objetos que ya existen en NetBeans como los botones, listas, formularios,
etc. Tienen propiedades definidas ya en el lenguaje, por ejemplo:
Figura 1.5 Objeto en NetBeans
Un botón en NetBeans como este posee propiedades como:
Font: describe el tipo de letra que contiene el botón.
Background: indica el color del fondo del botón.
Name: nombre del objeto asignado por el usuario.
Como estas propiedades, cada objeto en NetBeans posee sus propiedades
específicas, estas propiedades pueden ser modificadas dentro del ambiente
grafico de NetBeans en la ventana de propiedades (Los aspectos relacionados
con el funcionamiento gráfico serán analizados a profundidad posteriormente) o
en el código escribiendo el nombre del objeto seguido de un punto.
(<Nombre_objeto>.<Propiedad>), al escribir el punto (.) NetBeans nos mostrará
una lista de las propiedades y los métodos del objeto.
Ejemplo: si queremos cambiar el texto jButton1 que se encuentra en el botón,
utilizamos el método “setText(“String”).
jButton1.setText(“Hola”);
Figura 1.6 Botón con texto editado.
En caso de que se trate de objetos creados por nosotros mismos como se
mostró en la parte “1.1.1 Objetos” de este libro, las propiedades son descritas
Instituto Tecnológico de Morelia.
Página 13
ITM Unidad I Fundamentos del Lenguaje
por los atributos. En Java, los atributos son representados usando variables
(estas a su vez son el mecanismo para guardar datos)
Declaración de atributos
<modificador>* <tipo> <nombre> [=<valor_inicial>];
Ejemplo:
public class MiClase{
int x;
private float y = 10000.0F;
public String name = “Saúl Chávez”;
…
La palabra private indica que el atributo solo es accesible por los métodos
dentro de la clase. El tipo puede ser primitivo o de cualquier clase.
Por último, al igual que para los atributos de los objetos de NetBeans, para
accesar a las propiedades de un objeto se utiliza el operador punto (.).
Ejemplo:
MiClase objeto1 = new MiClase(); //Declaramos el objeto
objeto1.x=30;
//asignamos un valor al atributo x del objeto
Modificadores de acceso
Los modificadores de acceso permiten al diseñador de una clase determinar
quien accede a los datos y métodos miembros de una clase.
Los modificadores de acceso preceden a la declaración de un elemento de la
clase (ya sea dato o método), de la siguiente forma:
[modificadores]
[modificadores]
tipo_variable nombre;
tipo_devuelto nombre_Metodo ( lista_Argumentos );
Existen los siguientes modificadores de acceso:
• public - Todo el mundo puede acceder al elemento. Si es un dato, todo
el mundo puede ver el elemento, es decir, usarlo y asignarlo. Si es un
método todo el mundo puede invocarlo.
•
private - Sólo se puede acceder al elemento desde métodos de la clase,
o sólo puede invocarse el método desde otro método de la clase.
Instituto Tecnológico de Morelia.
Página 14
ITM Unidad I Fundamentos del Lenguaje
•
protected – Es más accesible que prívate debido a que permite el uso a
todos los elementos de la clase o clases derivadas. Se explicará mas a
detalle en el tema de la herencia.
•
sin modificador - Se puede acceder al elemento desde cualquier clase
del package donde se define la clase.
Pueden utilizarse estos modificadores para cualquier tipo de miembros de la
clase, incluidos los constructores (con lo que se puede limitar quien puede
crear instancias de la clase).
1.2 Entorno Integrado De Desarrollo
Un entorno de desarrollo integrado o en inglés Integrated Development
Environment (IDE1) es un programa compuesto por un conjunto de
herramientas para un programador.
Puede dedicarse en exclusiva a un sólo lenguaje de programación o bien,
poder utilizarse para varios.
Un IDE es un entorno de programación que ha sido empaquetado como un
programa de aplicación, es decir, consiste en un editor de código, un
compilador, un depurador y un constructor de interfaz gráfica GUI2. Los IDEs
pueden ser aplicaciones por si solas o pueden ser parte de aplicaciones
existentes. El lenguaje Visual Basic por ejemplo puede ser usado dentro de las
aplicaciones de Microsoft Office, lo que hace posible escribir sentencias Visual
Basic en forma de macros para Microsoft Word.
Los IDEs proveen un marco de trabajo amigable para la mayoría de los
lenguajes de programación tales como C++, Java, C#, Delphi, Visual Basic,
etc. Es posible que un mismo IDE pueda funcionar con varios lenguajes de
programación. Para conocer el proceso de instalación de NetBeans (que es el
IDE que se utilizará en esta obra) y algunos otros IDE´s consulte el Anexo 1.
NetBeans
1
Entorno Integrado de Desarrollo. Programa como NetBeans que proporciona herramientas que facilitan la programación.
2
Graphical User Interface. Interfaz Gráfica de Usuario. (Lo vemos al momento de diseñar gráficamente
nuestras aplicaciones gráficas arrastrando botones o cambiando tamaño de los elementos con jalar una
esquina, etc.)
Instituto Tecnológico de Morelia.
Página 15
ITM Unidad I Fundamentos del Lenguaje
Figura 1.7 Pantalla principal de NetBeans
NetBeans se refiere a una plataforma para el desarrollo de aplicaciones de
escritorio usando Java y a un entorno de desarrollo integrado (IDE)
desarrollado usando la Plataforma NetBeans.
La plataforma NetBeans permite que las aplicaciones sean desarrolladas a
partir de un conjunto de componentes de software llamados módulos. Un
módulo es un archivo Java que contiene clases de java escritas para
interactuar con las APIs de NetBeans y un archivo especial (manifest file) que
lo identifica como módulo. Las aplicaciones construidas a partir de módulos
pueden ser extendidas agregándole nuevos módulos.
Debido a que los módulos pueden ser desarrollados independientemente, las
aplicaciones basadas en la plataforma NetBeans pueden ser extendidas
fácilmente por otros desarrolladores de software.
NetBeans es un proyecto de código abierto de gran éxito con una gran base de
usuarios, una comunidad en constante crecimiento. Sun MicroSystems3 fundó
el proyecto de código abierto NetBeans en junio 2000 y continúa siendo el
patrocinador principal de los proyectos.
La Plataforma NetBeans es una base modular y extensible usada como una
estructura de integración para crear aplicaciones de escritorio grandes.
Empresas independientes asociadas, especializadas en desarrollo de software,
proporcionan extensiones adicionales que se integran fácilmente en la
plataforma y que pueden también utilizarse para desarrollar sus propias
herramientas y soluciones.
3
Sun Microsystems es una empresa informática de Silicon Valley, fabricante de semiconductores y software.
Instituto Tecnológico de Morelia.
Página 16
ITM Unidad I Fundamentos del Lenguaje
La plataforma ofrece servicios comunes a las aplicaciones de escritorio,
permitiéndole al desarrollador enfocarse en la lógica específica de su
aplicación. Entre las características de la plataforma están:
•
Administración de las interfaces de usuario (ej. menús y barras de
herramientas).
•
Administración de las configuraciones del usuario.
•
Administración del almacenamiento (guardando y cargando cualquier
tipo de dato).
•
Administración de ventanas.
•
Framework basado en asistentes (diálogo paso a paso).
Está escrito en Java y existe además un número importante de módulos para
extender el IDE NetBeans. El IDE NetBeans es un producto libre y gratuito sin
restricciones de uso.
Paquetes adicionales de NetBeans.
Pack de Movilidad de NetBeans
El Pack de Movilidad de NetBeans es una herramienta para desarrollar
aplicaciones que se ejecutan en teléfonos móviles. El Pack de Movilidad puede
ser usado para escribir, probar, y depurar aplicaciones para la plataforma Java
ME4, tecnología existente en dispositivos móviles.
Profiler de NetBeans
El Profiler de NetBeans es una herramienta para la optimización de
aplicaciones Java: Ayuda a encontrar cuellos de botella en la memoria y a
optimizar la velocidad de las aplicaciones.
El C/C++ Native Development Module
Soporta proyectos de C/C++. Más información:
http://www.netbeans.org/kb/55/1/cnd-index.html
4
Java ME: Java Micro Edition Herramienta para crear programas para celulares y otras tecnologías moviles.
Instituto Tecnológico de Morelia.
Página 17
ITM Unidad I Fundamentos del Lenguaje
1.3 Ventanas (proyecto, propiedades, ayuda).
Ventana de proyectos
Figura 1.8 Ventana de Proyectos
Esta es la ventana de proyectos de NetBeans, para accesar a ella deberá dar
clic sobre el menú File (Archivo) y a continuación en New Project (Nuevo
Proyecto). Podrá seleccionar entre los distintos tipos de proyectos, desde
aplicaciones de consola, pasando por aplicaciones de escritorio, hasta
aplicaciones para celulares o páginas web. Los tipos de proyectos serán
analizados en el siguiente tema. (1.4 Tipos de proyectos), por ahora solo se
analizan los componentes de las ventanas en cuestión.
Como puede observar, esta ventana es muy sencilla, únicamente debe
seleccionar la categoría del proyecto que quiere crear y el tipo de proyecto
dentro de la categoría que eligió. Si no está seguro que tipo de proyecto debe
crear, esta ventana muestra una breve explicación de lo que hará en cada
caso en el campo “Description”, bastará con que usted seleccione una
categoría y un tipo de proyecto para que se muestre la descripción del mismo
en dicho campo.
Por ejemplo, podemos ver que se encuentra seleccionada la categoría “Java” y
el tipo de proyecto “Java Desktop Application” y debajo nos dice:
Crea un esqueleto de una aplicación de escritorio basada en la Swing
Application Framework. Este template provee infraestructura básica para
aplicaciones como barras de menú, persistencia de estado de ventana, y
barras de estado. Con este template, puedes además generar código para
Instituto Tecnológico de Morelia.
Página 18
ITM Unidad I Fundamentos del Lenguaje
crear una interfaz GUI (Interfaz Gráfica de Usuario) para una tabla de base de
datos.
Ejemplo: Crearemos un “Hola Mundo” en una aplicación Java. (Java
Application).
1. Seleccione la categoría “Java” y el proyecto “Java Application”.
2. De clic sobre el botón “Next”
3. Nos aparece la ventana de Nombre y Localización, esto se refiere
al nombre que tendrá nuestra aplicación y el lugar donde serán
guardados los archivos que se generen.
Figura 1.9 Ventana elegir nombre u ubicación.
4. Especificamos un nombre, en este caso HolaMundo. Este será el
nombre de nuestra clase principal y el archivo. Como se explicó
anteriormente, dentro de nuestro programa debe existir el método
main. NetBeans lo generará automáticamente.
5. Damos clic en “Finish”.
6. Como puede observar, se creó el método Main automáticamente,
incluso tenemos comentarios importantes acerca del código.
Habrá ocasiones en la que no podrá modificar el código generado
automáticamente
debido
a
puede
provocar
un
mal
funcionamiento. Bueno, pasamos a nuestro método main y
Instituto Tecnológico de Morelia.
Página 19
ITM Unidad I Fundamentos del Lenguaje
escribimos System.out.println("Hola Mundo"); donde se indica
que debemos colocar nuestro código.
7. Damos clic sobre el botón de correr proyecto o presionamos f6 y
veremos que sucede.
Botón para correr el proyecto
Aquí ponemos el código
Aquí se muestra la salida
Figura 1.10 Hola Mundo en java.
Como puede ver, tenemos una pequeña ventana con el nombre de “Projects”,
esta nos muestra el proyecto en el que estamos trabajando y los archivos que
necesitamos. Entre esos archivos se encuentran las librerías que incluimos.
Ventana Propiedades
Para abrir la ventana de propiedades, damos clic sobre el menú “Window” y a
continuación en “Properties”.
Con esto se mostrará la ventana de propiedades de nuestra aplicación.
NetBeans lo conoce como Main.java aunque si lo buscamos en el directorio
que se creo, la clase principal se llamará HolaMundo.class.
En esta ventana podemos observar información como el nombre, el directorio
donde se encuentran los archivos, la hora a la que se modificaron y el directorio
donde se crean los archivos de clases que conforman a nuestro proyecto. Por
ejemplo el archivo HolaMundo.class.
Instituto Tecnológico de Morelia.
Página 20
ITM Unidad I Fundamentos del Lenguaje
Figura 1.11 Ventana propiedades.
Ventana de Ayuda
Para abrir la ventana de ayuda debe dar clic sobre el menú “Help” y a
continuación en “Help Contents”.
Figura 1.12 Ventana Help
Instituto Tecnológico de Morelia.
Página 21
ITM Unidad I Fundamentos del Lenguaje
En esta ventana, podremos buscar información relacionada con temas
específicos listados del lado izquierdo en la ventana de contenido “Contents” o
buscar información dentro del contenido mediante algún criterio de búsqueda
en la pestaña de “Search” (esta es la más recomendada).
No hay ningún grado de dificultad en el uso de esta ventana. Si desea ver la
información de los temas listados, únicamente de clic sobre el tema que le
interesa, o si le interesa saber algo de algún tema especifico y no sabe en qué
tema pueda encontrarlo, utilice la búsqueda. Para ello únicamente debe
ingresar una palabra o palabras relacionadas con la información que usted
necesita y a continuación se le mostrará un listado de archivos en los que se
localizó el criterio de búsqueda. Por ejemplo, buscaremos la información
relacionada con un botón.
Cabe mencionar que NetBeans le permite ingresar su criterio de búsqueda en
el idioma requerido o no obtendrá resultados.
Buscar: Button
Figura 1.13 Búsqueda en Ayuda.
En la figura 1.13 se muestra el resultado de la búsqueda.
1.4 Tipos De Proyectos.
1.4.1 Configuración
Instituto Tecnológico de Morelia.
Página 22
ITM Unidad I Fundamentos del Lenguaje
Como ya se mencionó, Se pueden crear muchos tipos de proyectos de cada
categoría en NetBeans, de entre los cuales:
Categoría Java
Java Application: crea una aplicación en un proyecto estándar de la IDE. Puede
generarse la clase main en el proyecto. El proyecto que creamos en esta
primera unidad es de este tipo.
Java Desktop Application: crea un esqueleto de una aplicación de escritorio
basada en la Swing Application Framework (JSR 296). Este template provee
infraestructura básica para aplicaciones como barras de menú, persistencia de
estado de ventana, y barras de estado. Con este template, puedes además
generar código para crear una interfaz GUI (Interfaz Gráfica de Usuario) para
una tabla de base de datos.
Java Class Library: Crea una librería Java SE (Standard Edition) en un
proyecto estándar IDE (Entorno Integrado de Desarrollo). No contiene clase
main.
Java Project with Existing Sources: importa una aplicación existente de java
para crear un proyecto estándar IDE. La aplicación de java se puede importar
de múltiples folders.
Categoría Web
Web Application: Crea una aplicación web vacía en un proyecto IDE estándar.
Web Application with Existing Sources: importa una aplicación web existente
para crear un proyecto IDE estándar.
Como existen muchos proyectos posibles, no se explicará cada uno pero en la
ventana de nuevo proyecto existe una pequeña parte, en la cual se describe
qué clase de proyecto se creará de acuerdo a la opción y la categoría
seleccionadas.
Instituto Tecnológico de Morelia.
Página 23
ITM Unidad I Fundamentos del Lenguaje
Figura 1.14 Ventana de Proyectos.
1.5 Comentarios
En muchas ocasiones, es necesario incluir notas en el código para documentar
un poco y recordar posteriormente para que se utiliza una función u
alguna línea de código, para poder hacer esto existen los comentarios:
• Comentarios de una sola línea.
• Comentarios de una o más líneas.
Ejemplos:
// Comentarios para una sola línea (doble diagonal).
/* Comentarios de una o más líneas, (diagonal-asterisco
para iniciar le comentario, asterisco-diagonal para
terminarlo.*/
/** Comentario de documentación, de una o más líneas,
(diagonal-asterisco-asterisco para iniciarlo, asteriscodiagonal para terminarlo. */
Los dos primeros tipos de comentarios son los que todo programador conoce y
se utilizan del mismo modo. Los comentarios de documentación, colocados
Instituto Tecnológico de Morelia.
Página 24
ITM Unidad I Fundamentos del Lenguaje
inmediatamente antes de una declaración (de variable o función), indican que
ese comentario ha de ser colocado en la documentación que se genera
automáticamente cuando se utiliza la herramienta de Java, javadoc. Dichos
comentarios sirven como descripción del elemento declarado permitiendo
generar una documentación de nuestras clases escrita al mismo tiempo que se
genera el código.
Convenciones de nombres
SUN recomienda un estilo de codificación que es seguido en el API5 de Java y
en este material que consiste en:
•
Utilizar nombres descriptivos para las clases, evitando los nombres muy
largos.
•
Para los nombres de clases poner la primera letra en mayúsculas y las
demás en minúsculas. Por ejemplo: Empleado o MiClase.
•
Si el nombre tiene varias palabras ponerlas todas juntas (sin separar con
- o _) y poner la primera letra de cada palabra en mayúsculas. Por
ejemplo: InstrumentoMusical.
•
Para los nombres de miembros (datos y métodos) seguir la misma
norma, pero con la primera letra de la primera palabra en minúsculas.
Por ejemplo: registrarOyente.
•
Para las constantes (datos con el modificador final) usar nombres en
mayúsculas, separando las palabras con _
1.6 Constantes
En Java, se utiliza la palabra clave final para indicar que una variable debe
comportarse como si fuese constante, significando con esto que no se permite
su modificación una vez que haya sido declarada e inicializada. Como es una
constante, se le ha de proporcionar un valor en el momento en que se declare,
por ejemplo:
5
(del inglés Application Programming Interface - Interfaz de Programación de Aplicaciones) es el conjunto de funciones y
procedimientos
Instituto Tecnológico de Morelia.
Página 25
ITM Unidad I Fundamentos del Lenguaje
class Elipse {
final float PI = 3.14159;
. . .
}
Si se intenta modificar el valor de una variable final desde el código de la
aplicación, se generará un error de compilación.
Si se usa la palabra clave final con una variable o clase estática, se pueden
crear constantes de clase, haciendo un uso altamente eficiente de la memoria,
porque no se necesitarían múltiples copias de las constantes.
La palabra clave final también se puede aplicar a métodos, significando en este
caso que los métodos no pueden ser sobrescritos.
1.7 Tipos De Datos
Los tipos de datos en Java pueden dividirse en dos categorías: simples y
compuestos. Los simples son tipos nucleares que no se derivan de otros tipos,
como los enteros, de punto flotante, booleanos y de carácter. Los tipos
compuestos se basan en los tipos simples, e incluyen las cadenas, las
matrices, etc.
Cada tipo de datos simple soporta un conjunto de literales que le pueden ser
asignados, para darles valor. En este apartado se explican los tipos de datos
simples (o primitivos) que presenta Java, así como los literales que soporta
(sintaxis de los valores que se les puede asignar).
Tipos de datos simples
Es uno de los conceptos fundamentales de cualquier lenguaje de
programación. Estos definen los métodos de almacenamiento disponibles para
representar información, junto con la manera en que dicha información ha de
ser interpretada.
Para crear una variable (de un tipo simple) en memoria debe declararse
indicando su tipo de variable y su identificador.
Sintaxis: para la declaración de variables de tipo de dato simple.
Tipo nombre [ = valor] [, nombre [ = valor]…];
Tipos de datos enteros
Se usan para representar números enteros con signo. Hay cuatro tipos: byte,
short, int y long.
Tipo
byte
Instituto Tecnológico de Morelia.
Tamaño
1Byte (8 bits)
Página 26
ITM Unidad I Fundamentos del Lenguaje
short
2 Bytes (16 bits)
int
4 Bytes (32 bits)
long
8 Bytes (64 bits)
Tabla 1.2 Tipos de datos enteros
Literales enteros
Son básicos en la programación en Java y presentan tres formatos:
•
Decimal: Los literales decimales aparecen como números ordinarios sin
ninguna notación especial.
•
Hexadecimal: Los hexadecimales (base 16) aparecen con un 0x ó 0X
inicial, notación similar a la utilizada en C y C++.
•
Octal: Los octales aparecen con un 0 inicial delante de los dígitos.
Por ejemplo, un literal entero para el número decimal 12 se representa en Java
como 12 en decimal, como 0xC en hexadecimal y como 014 en octal.
Los literales enteros se almacenan por defecto en el tipo int, (4 bytes con
signo), o si se trabaja con números muy grandes, con el tipo long, (8 bytes con
signo), añadiendo una L ó l al final del número.
La declaración de variables enteras es muy sencilla. Un ejemplo de ello sería:
long numeroLargo = 0xC; // Por defecto vale 12
Tipos de datos en punto flotante
Se usan para representar números con partes fraccionarias (o con decimales
como los conocemos normalmente). Hay dos tipos de punto flotante: float y
double. El primero reserva almacenamiento para un número de precisión
simple de 4 bytes y el segundo lo hace para un número de precisión doble de 8
bytes.
Tipo
Tamaño
float
4 Bytes (32 bits)
double
8 Bytes (64 bits)
Tabla 1.3 Tipos de datos numéricos en punto flotante
Instituto Tecnológico de Morelia.
Página 27
ITM Unidad I Fundamentos del Lenguaje
Literales en punto flotante
Representan números decimales con partes fraccionarias.
representarse con notación estándar (563.84) o científica (5.6384e2).
Pueden
De forma predeterminada son del tipo double (8 bytes). Existe la opción de usar
un tipo más corto (el tipo float de 4 bytes), especificándolo con una F ó f al final
del número.
La declaración de variables de punto flotante es muy similar a la de las
variables enteras.
Por ejemplo: declaración de variables punto flotante.
double valorDePi = 314.16e-2 ;
float temperatura = (float)36.6
Se realiza un enmascaramiento a temperatura, porque todos los literales con
decimales por defecto se consideran double.
Tipo de datos boolean
Se usa para almacenar variables que presenten dos estados, que serán
representados por los valores true y false.
Normalmente estamos acostumbrados a utilizar variables enteras como
banderas en el código, desperdiciando así mucha memoria, este desperdicio
crece conforme vamos creando banderas sobre la marcha, este vicio de
programación se arrastra debido a que la mayoría de los programadores
aprendieron a programar en lenguajes como C, en cuya estructura no existe un
tipo de dato lógico y se tenía que recurrir a los datos tipo entero. Aquí hay una
buena opción para disminuir drásticamente este desperdicio.
Literales Booleanos
Java utiliza dos palabras clave para los estados: true (para verdadero) y false
(para falso). Este tipo de literales es nuevo respecto a C/C++, lenguajes en los
que el valor de falso se representa por un 0 numérico, y verdadero cualquier
número que no fuese el 0.
Sintaxis: para declarar un dato del tipo booleano se utiliza la palabra reservada
boolean.
boolean reciboPagado = false;
Tipo de datos carácter
Instituto Tecnológico de Morelia.
Página 28
ITM Unidad I Fundamentos del Lenguaje
Se usa para almacenar caracteres Unicode simples.
Java a diferencia de C/C++ distingue entre matrices de caracteres y cadenas.
Literales carácter
Representan un único carácter (de la tabla de caracteres Unicode 1.1) y
aparecen dentro de un par de comillas simples. De forma similar que en C/C++.
Los caracteres especiales (de control y no imprimibles) se representan con una
barra invertida ('\') seguida del código carácter.
Descripción
Representación
Valor Unicode
Caracter Unicode
\udddd
Numero octal
\ddd
Barra invertida
\\
\u005C
Continuación
\
\
Retroceso
\b
\u0008
Retorno de carro
\r
\u000D
de \f
\u000C
Tabulación horizontal
\t
\u0009
Línea nueva
\n
\u000A
Comillas simples
\’
\u0027
Comillas dobles
\"
\u0022
Números arábigos ASCII
0-9
\u0030 a \u0039
Alimentación
formularios
Alfabeto
ASCII
mayúsculas
en A.-Z
\u0041 a \u005A
Alfabeto
ASCII
minúsculas
en a.-z
\u0061 a \u007A
Tabla1.4: Caracteres especiales Java
Sintaxis: Las variables de tipo char se declaran de la siguiente forma
char letraMayuscula = 'A';
// Observe la necesidad de los ' '
char letraV = '\u0056'; // Letra 'V'
La clase String
Instituto Tecnológico de Morelia.
Página 29
ITM Unidad I Fundamentos del Lenguaje
En java las cadenas se gestionan como si fueran objetos. De ahí que String no
es un tipo de dato. Se trata de una clase, una de las ventajas de esto es que
un objeto de tipo String tiene gran variedad de métodos que se pueden usar.
En muchos lenguajes, las cadenas de texto son tipos de datos fundamentales
inherentes al lenguaje, pero en java, las cadenas son gestionadas con la clase
String.
El siguiente es un ejemplo en el que se crea una cadena y se visualiza
(observe cómo este código hace la clase String como si fuera otro tipo de dato
sencillo).
Public class MiClase{
Public static void main (String [] args){
String cadena1= “¡¡Hola Mundo!!”;
System.out.println(cadena1);
}
}
La clase String es muy ponderosa, pues con los métodos que proporciona
permite convertir la cadena en un arreglo de caracteres, convertir números en
cadenas, buscar cadenas, crear sub-cadenas, cambiar la cadena de
mayúsculas a minúsculas o viceversa, obtener la longitud de la cadena,
comparar cadenas y mucho mas.
Algunos de los métodos de la clase String son los siguientes:
int lastIndexOf (int ch)
int lastIndexOf (int ch, int fromIndex)
int lastIndexOf (String str)
int lastIndexOf (String str, int fromIndex)
int length()
String replace (char oldChar, char
newChar)
boolean startsWith (String prefix)
boolean startsWith (String prefix, int
offset)
Instituto Tecnológico de Morelia.
Devuelve el índice, dentro de la
cadena, de la última ocurrencia del
carácter especificado.
Produce el índice, dentro de la
cadena de la última ocurrencia del
carácter dado, buscando hacia atrás
desde el índice especificado.
Devuelve el índice, dentro de la
cadena, de la ocurrencia del String
dado.
Produce el índice dentro de la
cadena de la última ocurrencia del
carácter dado.
Devuelve la longitud de la cadena
Produce
una
nueva
cadena
substituyendo todas las ocurrencias
de oldChar con newChar
Chequea si la cadena empieza con
el prefijo dado.
Chequea si la cadena empieza con
el prefijo dado, empezando en el
índice dado.
Página 30
ITM Unidad I Fundamentos del Lenguaje
char[] to CharArray ()
String toLowerCase ()
String to UpperCase()
String trim()
Static String valueOf (boolean b)
Static String valueOf (char b)
Static String valueOf (char [] data)
Static String valueOf(char[] data, offset,
int count)
Static String valueOf (doubleb)
Static String valueOf (float b)
Static String valueOf (int b)
char charAt (int index)
int compareTo (Object o)
int compareToIgnoreCase(String
otraCadena)
int compareTo (String otraCadena)
String concat(String str)
Boolean endsWith (String sufijo)
Convierte una cadena en un arreglo
de caracteres.
Cambia todos los caracteres de la
cadena a su equivalente en
minúsculas.
Cambia
los caracteres de una
cadena a su equivalente en
mayúsculas.
Elimina los espacios en blanco que
encuentre iniciando la búsqueda
desde ambos extremos de la
cadena.
Produce la representación de la
cadena del argumento booleano.
Produce la representación de la
cadena del argumento char
Produce la representación de la
cadena del arreglo de caracteres.
Produce la representación de la
cadena de un sub arreglo específico
del argumento char array de enteros.
Produce la representación String de
un double.
Produce la representación String de
un float.
Produce la representación String de
un int.
Proporciona el carácter del índice
especificado.
Compara este objeto String con otro.
Compara dos cadenas ignorando
diferencias entre mayúsculas y
minúsculas.
Compara que dos cadenas sean
exactamente iguales.
Concatena la cadena dada al final de
la cadena.
Verdadero si la cadena termina con
el sufijo dado.
Tabla 1.5 Métodos de la clase String.
Conversión de tipos de datos
En Java es posible transformar el tipo de una variable u objeto en otro diferente
al original con el que fue declarado. Este proceso se denomina "conversión",
“cast”, “enmascaramiento”, "moldeado" o "tipado". La conversión se lleva a
cabo colocando el tipo destino entre paréntesis, a la izquierda del valor que
queremos convertir de la forma siguiente:
char c = (char)System.in.read();
Instituto Tecnológico de Morelia.
Página 31
ITM Unidad I Fundamentos del Lenguaje
La función read devuelve un valor int, que se convierte en un char debido a la
conversión (char), y el valor resultante se almacena en la variable de tipo
carácter c.
El tamaño de los tipos que queremos convertir es muy importante. No todos los
tipos se convertirán de forma segura. Por ejemplo, al convertir un long en un
int, el compilador corta los 32 bits superiores del long (de 64 bits), de forma que
encajen en los 32 bits del int, con lo que si contienen información útil, esta se
perderá.
Por ello se establece la norma de que "en las conversiones el tipo destino
siempre debe ser igual o mayor que el tipo fuente":
Tipo Origen
Tipo Destino
byte
double, float, long, int, char,
short
short
double, float, long, int
char
double, float, long, int
int
double, float, long
long
double, float
float
Double
Tabla 1.6 Conversiones sin pérdidas de información
1.8 Variables
Las variables pueden ser de diferentes tipos y actúan como gestores de
memoria de datos. Los diferentes tipos tienen que ver con el formato de los
datos que almacenan en ellas, así como con la memoria que es necesaria para
gestionar ese dato. Por ejemplo, la variable de tipo entero (int), es de 4 bytes (o
32 bits) y se utiliza para almacenar valores enteros. Esto hace que un dato de
tipo int pueda tomar un rango de valores que van desde -2,147,483,648 hasta
2,147,483,647.
Antes de usar una variable en java, debe declararse especificando su tipo.
Sintaxis: como declarar una variable en Java.
Tipo nombre [ = valor] [, nombre [ = valor]…];
Ejemplo: declaración de una variable tipo int.
Instituto Tecnológico de Morelia.
Página 32
ITM Unidad I Fundamentos del Lenguaje
public class MiClase{
public static void main (String[] args){
int dias;
dias = 365;
System.out.println("Número de días = " +
dias);
}
}
En este código se reservan 32 bits de memoria y se etiqueta esa ubicación de
forma que el compilador entienda la variable dias, luego recibe el valor 365 y
por último, se visualiza en pantalla. Esta es la salida que se muestra en
pantalla:
Número de días = 365;
Como puede ver, hemos creado una variable para almacenar un valor y luego
visualizarlo. Una variable puede ser inicializada en el momento de declararla,
por ejemplo:
public class MiClase{
public static void main (String[] args){
int días = 365;
System.out.println("Número de días = " +
dias);
}
}
Los tipos primitivos para la declaración de variables son:
•
Enteros: Estos tipos son byte, short, int y long, que guardan el signo y el
valor.
•
Números en punto flotante: Estos tipos son float y double; almacenan
números flotantes con signo.
•
Caracteres: char, en estas se guardan caracteres tanto alfabéticos como
numéricos.
•
Booleano: en este tipo se guardan únicamente dos valores: verdadero
(true) o falso (false).
boolean
byte
char
Almacenamiento en
bytes
1
1
2
double
8
Tipo de Variable
Instituto Tecnológico de Morelia.
Rango de Valores
Verdadero, Falso
-128 a 127
N/A
-1.79769313486232E308 a
-94065645841247E-324
Página 33
ITM Unidad I Fundamentos del Lenguaje
Float
4
int
4
Long
8
Short
para valores negativos y
4.94065645841247E-324 a
1.79769313486232E308
para valores positivos.
-3.402823E38 a 1.401298E-45 para valores
negativos y 1.401298E-45
a 3.402823E38 para
valores positivos.
-2,147,483,648 a
2,147,483,647
9,223,372,036,854,775,808
a
9,223,372,036,854,775,807
-32,768 a 32,767
2
Tabla1.7 Tipos de variables.
La tabla 1.7 muestra los tipos de variables.
Strings
Como se mencionó anteriormente, no existe un tipo de dato String, se trata de
una clase con métodos y constructores. Entonces, la declaración de una
variable String dependerá del constructor que se desea utilizar. La manera más
sencilla es String nombre; y posteriormente asignas cualquier valor que
queramos. Sin embargo si usted tiene la necesidad de crearlas de una manera
distinta, aquí se muestran algunos de sus constructores.
Constructor
String ()
String (byte[] bytes)
String (byte[] bytes, int offset, int
length)
String (byte[] bytes bytes, int offset,
enc)
String (byte[] bytes, String enc)
Instituto Tecnológico de Morelia.
Descripción
Inicializa un nuevo objeto String para
gestionar una secuencia de caracteres
vecía.
Construye un nuevo objeto String
convirtiendo el arreglo de bytes
mediante la codificación de caracteres
que tiene la plataforma por defecto.
Construye un nuevo objeto String
convirtiendo el subarreglo de bytes
usando la codificación de caracteres
por defecto.
Construye un Nuevo objeto String
convirtiendo el entero length y el
subarreglo de caracteres utilizando la
codificación
de
caracteres
especificada.
Construye un nuevo objeto String
convirtiendo el arreglo de bytes
mediante la codificación de caracteres
Página 34
ITM Unidad I Fundamentos del Lenguaje
String (char[] value)
que se especifica.
Aloca un nuevo objeto String para
representar
la
secuencia
de
caracteres.
Tabla 1.8 Constructores de la clase String.
La tabla 1.8 muestra la lista de constructores.
Ejemplos: Distintas formas de crear e inicializar cadenas.
Esta forma ya la hemos visto.
public class MiClase{
public static void main (String [] args){
String s1 = “Hola Mundo!”;
.
.
.
}
}
Declaramos una cadena y la inicializamos posteriormente.
public class MiClase{
public static void main (String [] args){
String s1 = “Hola Mundo!”;
String s2;
s2 = “Hola!”;
.
.
}
}
Creamos una cadena vacía y luego le asignamos datos.
public class MiClase{
public static void main (String [] args){
String s1 = “Hola Mundo!”;
String s2;
s2 = “Hola!”;
string s3 = new String();
s3 = “Hola de nuevo!”;
.
}
}
Utilizamos uno de los constructores de la clase String.
Instituto Tecnológico de Morelia.
Página 35
ITM Unidad I Fundamentos del Lenguaje
public class MiClase{
public static void main (String [] args){
String s1 = “Hola Mundo!”;
String s2;
s2 = “Hola!”;
string s3 = new String();
s3 = “Hola de nuevo!”;
String
s4
Constructor!”);
.
.
.
}
=
new
String(“Usamos
}
1.9 Operadores
Los operadores son un tipo de tokens que indican una evaluación o
computación para ser realizada en objetos o datos, y en definitiva sobre
identificadores o constantes. Además de realizar la operación, un operador
devuelve un valor, ya que son parte fundamental de las expresiones.
El valor y tipo que devuelve depende del operador y del tipo de sus operandos.
Por ejemplo, los operadores aritméticos devuelven un número como resultado
de su operación. Los operadores realizan alguna función sobre uno, dos o tres
operandos.
Los operadores que requieren un operando son llamados operadores unarios.
Por ejemplo, el operador "++" es un operador unario que incrementa el valor de
su operando en una unidad.
Los operadores unarios en Java pueden utilizar tanto la notación prefija como
la posfija.
La notación prefija indica que el operador aparece antes que su operando.
++contador; // Notación prefija, se evalúa a: contador+1
La notación posfija indica que el operador aparece después de su operando:
contador++ // Notación posfija, se evalúa a: contador
Los operadores que requieren dos operandos se llaman operadores binarios.
Por ejemplo el operador "=" es un operador binario que asigna el valor del
operando del lado derecho al operando del lado izquierdo.
Instituto Tecnológico de Morelia.
Página 36
ITM Unidad I Fundamentos del Lenguaje
Todos los operadores binarios en Java utilizan notación infija, lo cual indica que
el operador aparece entre sus operandos.
operando1 <operador> operando2
Por último, los operadores ternarios son aquellos que requieren tres operandos.
El lenguaje Java tiene el operador ternario, "?", que es una sentencia similar a
la if-else.
Este operador ternario usa notación infija; y cada parte del operador aparece
entre operandos:
expresión ? operación1 : operación2
Los operadores de Java se pueden dividir en las siguientes cuatro categorías:
• Aritméticos.
•
De comparación y condicionales.
•
A nivel de bits y lógicos.
•
De asignación.
Operadores aritméticos
El lenguaje Java soporta varios operadores aritméticos para los números
enteros y en punto flotante. Se incluye + (suma), - (resta), * (multiplicación), /
(división), y % (módulo, es decir, resto de una división entera). La tabla 1.9
muestra los operadores aritméticos.
Por ejemplo:
sumaEste + aEste; //Suma los dos enteros
divideEste % entreEste; //Calcula el resto de dividir 2
enteros
Operador
+
*
/
Uso
op1 + op2
op1 - op2
op1 * op2
op1 / op2
%
op1 % op2
Descripción
Suma op1 y op2
Resta op2 de op1
Multiplica op1 por op2
Divide op1 entre op2
Calcula el resto de dividir op1 entre
op2
Tabla1.9 Operadores aritméticos binarios de Java
Instituto Tecnológico de Morelia.
Página 37
ITM Unidad I Fundamentos del Lenguaje
El tipo de los datos devueltos por una operación aritmética depende del tipo de
sus operandos; si se suman dos enteros, se obtiene un entero. Estos
operadores se deben utilizar con operandos del mismo tipo, o si no realizar una
conversión de tipos de uno de los dos operandos al tipo del otro.
El lenguaje Java sobrecarga la definición del operador “+” para incluir la
concatenación de cadenas. El siguiente ejemplo utiliza “+” para concatenar la
cadena "Contados ", con el valor de la variable contador y la cadena "
caracteres.":
System.out.print("Contados" + contador + "caracteres.");
Esta operación automáticamente convierte el valor entero de contador a una
cadena de caracteres.
Los operadores + y - tienen versiones unarias que realizan las siguientes
operaciones:
Operador Uso
+
+op
-
-op
Descripción
Convierte op a entero si es un byte, short o
char
Niega aritméticamente op
Tabla 1.10 Versiones unarias de los operadores "+" y "-"
El operador - realiza una negación del número en complemento a 2, es decir,
cambiando de valor todos sus bits y sumando 1 al resultado final:
42 -> 00101010
-42 -> 11010110
Existen dos operadores aritméticos que funcionan como atajo de la
combinación de otros: ++ que incrementa su operando en 1, y -- que
decrementa su operando en 1. Ambos operadores tienen una versión prefija, y
otra posfija. La utilización correcta es crítica en situaciones donde el valor de la
sentencia es utilizado en mitad de un cálculo más complejo, por ejemplo para
control de flujos.
Operador
Uso
++
op++
++
++op
--
op--
--
--op
Descripción
Incrementa op en 1; se evalúa con valor anterior
incremento
Incrementa op en 1; se evalúa con valor posterior
incremento
Decrementa op en 1; se evalúa con valor anterior
incremento
Decrementa op en 1; se evalúa con valor posterior
Instituto Tecnológico de Morelia.
al
al
al
al
Página 38
ITM Unidad I Fundamentos del Lenguaje
incremento
Tabla 1.11 Operaciones con "++" y "--"
Operadores de comparación y condicionales
Un operador de comparación compara dos valores y determina la relación
existente entre ambos. Por ejemplo, el operador “!=” devuelve verdadero (true)
si los dos operandos son distintos. La siguiente tabla resume los operadores de
comparación de Java:
Operador
>
>=
<
<=
==
!=
Uso
op1 > op2
op1 >= op2
op1 < op2
op1 <= op2
op1 == op2
op1 != op2
Devuelve verdadero si
op1 es mayor que op2
op1 es mayor o igual que op2
op1 es menor que op2
op1 es menor o igual que op2
op1 y op2 son iguales
op1 y op2 son distintos
Tabla: Operadores de comparación
Los operadores de comparación suelen ser usados con los operadores
condicionales para construir expresiones complejas que sirvan para la toma de
decisiones. Un operador de este tipo es “&&”, el cual realiza la operación
booleana and. Por ejemplo, se pueden utilizar dos operaciones diferentes de
comparación con “&&” para determinar si ambas relaciones son ciertas. La
siguiente línea de código utiliza esta técnica para determinar si la variable index
de una matriz se encuentra entre dos límites (mayor que cero y menor que la
constante NUMERO_ENTRADAS):
( 0 < index ) && ( index < NUMERO_ENTRADAS )
Se debe tener en cuenta que en algunos casos, el segundo operando de un
operador condicional puede no ser evaluado. En caso de que el primer
operando del operador && sea falso, Java no evaluará el operando de la
derecha:
(contador < NUMERO_ENTRADAS) && ( in.read() != -1 )
Si contador es mayor o igual que NUMERO_ENTRADAS, el valor de retorno de
&& puede ser determinado sin evaluar el operando de la parte derecha. En este
caso in.read no será llamado y un carácter de la entrada estándar no será
leído.
Si el programador quiere que se evalúe la parte derecha, deberá utilizar el
operador & en lugar de &&.
De la misma manera se relacionan los operadores || y | para la exclusión lógica
(OR).
Instituto Tecnológico de Morelia.
Página 39
ITM Unidad I Fundamentos del Lenguaje
Java soporta cinco operadores condicionales, mostrados en la siguiente tabla:
Operador
Uso
&&
op1 && op2
&
op1 & op2
||
op1 || op2
|
!
op1 | op2
! op
Devuelve verdadero si...
op1 y op2 son ambos verdaderos, condicionalmente
evalúa op2
op1 y op2 son ambos verdaderos, siempre evalúa op1
y op2
op1 o op2 son verdaderos, condicionalmente evalúa
op2
op1 o op2 son verdaderos, siempre evalúa op1 y op2
op es falso
Tabla 1.12 Operadores condicionales
Además Java soporta un operador ternario, el “?:”, que se comporta como una
versión reducida de la sentencia if-else:
expresion ? <operacion1> : operacion2
El operador ?: evalúa la expresion y devuelve operación1 si es cierta, o
devuelve operación2 si expresion es falsa.
Operadores de bit
Un operador de bit permite realizar operaciones de bit sobre los datos. Existen
dos tipos: los que desplazan (mueven) bits, y operadores lógicos de bit.
Operadores de desplazamiento de bits
Operador
Uso
>>
op1 >> op2
<<
op1 << op2
>>>
op1 >>> op2
Operación
Desplaza los bits de op1 a la derecha op2 veces
Desplaza los bits de op1 a la izquierda op2 veces
Desplaza los bits de op1 a la derecha op2 veces
(sin signo)
Tabla 1.13 Operadores de desplazamiento de bits
Los tres operadores de desplazamiento simplemente desplazan los bits del
operando de la parte izquierda el número de veces indicado por el operando de
la parte derecha. El desplazamiento ocurre en la dirección indicada por el
operador. Por ejemplo, la siguiente sentencia, desplaza los bits del entero 13 a
la derecha una posición:
13 >> 1;
La representación en binario del número 13 es 1101. El resultado de la
operación de desplazamiento una posición a la derecha es 110 o 6 en decimal.
Se debe tener en cuenta que el bit más a la derecha se pierde en este caso.
Instituto Tecnológico de Morelia.
Página 40
ITM Unidad I Fundamentos del Lenguaje
Un desplazamiento a la derecha una posición es equivalente a dividir el
operando del lado izquierdo por 2, mientras que un desplazamiento a la
izquierda de una posición equivale a multiplicar por 2, pero un desplazamiento
es más eficiente computacionalmente hablando, que una división o
multiplicación.
El desplazamiento sin signo >>> funciona de la siguiente manera:
•
Si se desplaza con signo el número -1 (1111), seguirá valiendo -1, dado
que la extensión de signo sigue introduciendo unos en los bits más
significativos.
•
Con el desplazamiento sin signo se consigue introducir ceros por la
izquierda, obteniendo el número 7 (0111).
Operadores de lógica a nivel de bits
La lógica de bits (lógica de Bool) se utiliza para modelar condiciones biestado y
trabajar con ellas (cierto/falso, true/false, 1/0). En Java hay cuatro operadores
de lógica de bits:
Operador
&
|
^
~
Uso
op1 & op2
op1 | op2
op1 ^ op2
~op2
Operación
AND
OR
OR Exclusivo
Complemento
Tabla 1.14 Operadores de lógica a nivel de bits
El operador & realiza la operación AND de bit. Aplica la función AND sobre
cada par de bits de igual peso de cada operando. La función AND es evaluada
a cierto si ambos operandos son ciertos. Por ejemplo vamos a aplicar la
operación AND a los valores 12 y 13:
12 & 13
El resultado de esta operación es 12. ¿Por qué?. La representación en binario
de 12 es 1100, y de 13 es 1101. La función AND pone el bit de resultado a uno
si los dos bits de los operandos son 1, sino, el bit de resultado es 0:
1100
& 1101
----------1100
Instituto Tecnológico de Morelia.
Página 41
ITM Unidad I Fundamentos del Lenguaje
El operador | realiza la operación OR de bit. Aplica la función OR sobre cada
par de bits de igual peso de cada operando. La función OR es evaluada a cierto
si alguno de los operandos es cierto. Entonces 12 | 13 genera el resultado 13.
El operador ^ realiza la operación OR exclusivo de bit (XOR). Aplica la función
XOR sobre cada par de bits de igual peso de cada operando. La función XOR
es evaluada a cierto si alguno de los operandos es cierto, pero no los dos.
Entonces 12 ^ 13 genera el resultado 1.
Para finalizar, el operador de complemento invierte el valor de cada bit del
operando. Convierte el falso en cierto, y el cierto en falso. Entre otras cosas, la
manipulación bit es útil para gestionar indicadores booleanos (banderas).
Supongamos, por ejemplo, que se tienen varios indicadores booleanos en
nuestro programa, los cuales muestran el estado de varios componentes del
programa: esVisible, esArrastrable, etc... En lugar de definir una variable
booleana para cada indicador, se puede definir una única variable para todos
ellos. Cada bit de dicha variable representará el estado vigente de uno de los
indicadores. Se deberán utilizar entonces manipulaciones de bit para
establecer y leer cada indicador.
Primero, se deben preparar las constantes de cada indicador. Esos indicadores
deben ser diferentes unos de otros (en sus bits) para asegurar que el bit de
activación no se solape con otro indicador. Después se debe definir la variable
de banderas, cuyos bits deben de poder ser configurados según el estado
vigente en cada indicador.
El siguiente ejemplo inicia la variable de banderas flags a 0, lo que significa que
todos los indicadores están desactivados (ninguno de los bits es 1):
final int VISIBLE = 1;
final int ARRASTRABLE = 2;
final int SELECCIONABLE = 4;
final int MODIFICABLE = 8;
int flags = 0;
Para activar el indicador VISIBLE, se deberá usar la sentencia:
flags = flags | VISIBLE;
Para comprobar la visibilidad se deberá usar la sentencia:
if ( (flags & VISIBLE) == 1 )
Operadores de asignación
Instituto Tecnológico de Morelia.
Página 42
ITM Unidad I Fundamentos del Lenguaje
El operador de asignación básico es el =, que se utiliza para asignar un valor a
otro. Por ejemplo:
int contador = 0; //Inicia la variable contador con 0.
Java además proporciona varios operadores de asignación que permiten
realizar un atajo en la escritura de código. Permiten realizar operaciones
aritméticas, lógicas, de bit y de asignación con un único operador.
Supongamos que necesitamos sumar un número a una variable y almacenar el
resultado en la misma variable, como a continuación:
i = i + 2;
Se puede abreviar esta sentencia con el operador de atajo +=, de la siguiente
manera:
i += 2;
La siguiente tabla muestra algunos de los operadores de atajo de asignación y
sus equivalentes largos:
Operador
Uso
Equivalente a
+=
op1 += op2
op1 = op1 + op2
-=
op1 -= op2
op1 = op1 - op2
*=
op1 *= op2
op1 = op1 * op2
/=
op1 /= op2
op1 = op1 / op2
%=
op1 %= op2
op1 = op1 % op2
&=
op1 &= op2
op1 = op1 & op2
Tabla 1.15 Operadores de atajo de asignación
Precedencia de operadores
Cuando en una sentencia aparecen varios operadores el compilador deberá de
elegir en qué orden aplica los operadores. A esto se le llama precedencia.
Los operadores con mayor precedencia son evaluados antes que los
operadores con una precedencia menor.
Cuando en una sentencia aparecen operadores con la misma precedencia:
•
Los operadores de asignación son evaluados de derecha a izquierda.
•
Los operadores binarios, (menos los de asignación) son evaluados de
izquierda a derecha.
Instituto Tecnológico de Morelia.
Página 43
ITM Unidad I Fundamentos del Lenguaje
Se puede indicar explícitamente al compilador de Java cómo se desea que se
evalúe la expresión con paréntesis balanceados ( ). Para hacer que el código
sea más fácil de leer y mantener, es preferible ser explícito e indicar con
paréntesis que operadores deben ser evaluados primero.
La siguiente tabla muestra la precedencia asignada a los operadores de Java.
Los operadores de la tabla están listados en orden de precedencia: cuanto más
arriba aparezca un operador, mayor es su precedencia. Los operadores en la
misma línea tienen la misma precedencia:
Tipo de operadores
Operadores posfijos
Operadores unarios
Creación o conversión
Multiplicación
Suma
Desplazamiento
Comparación
Igualdad
AND a nivel de bit
OR a nivel de bit
XOR a nivel de bit
AND lógico
OR lógico
Condicional
Asignación
Operadores de este tipo
[ ] . (parametros) expr++ expr-++expr --expr +expr -expr ~ !
new (tipo) expr
*/%
+<< >> >>>
< > <= >= instanceof
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= |= <<= >>= >>>=
Tabla1.16 Precedencia de operadores
Por ejemplo, la siguiente expresión produce un resultado
dependiendo de si se realiza la suma o división en primer lugar:
diferente
x + y / 100
Si no se indica explícitamente al compilador el orden en que se quiere que se
realicen las operaciones, entonces el compilador decide basándose en la
precedencia asignada a los operadores. Como el operador de división tiene
mayor precedencia que el operador de suma el compilador evaluará y/100
primero. Así:
x + y / 100
Es equivalente a:
x + (y / 100)
Instituto Tecnológico de Morelia.
Página 44
ITM Unidad I Fundamentos del Lenguaje
1.10 Sentencias
La unidad básica de ejecución es una sentencia, Java determina el fin de una
sentencia mediante el “;”. Un bloque es un conjunto de sentencias
comprendidas entre dos llaves ({ }). Es importante remarcar que los bloques
definen el alcance de las variables y que los bloques pueden anidarse.
Como la mayoría de los lenguajes de programación Java tiene sentencias
condicionales y de ciclo (ciclo). A continuación se presentan breves ejemplos,
cada sentencia se explica con gran detalle en el punto 1.13 Estructuras de
control.
Condicionales
if(<condición>){
<sentencia>*
}
if(<condición>){
<sentencia>*
}else{
<sentencia>*
}
switch(<variable>){
case<valor>:
<sentencia>*
break;
case<valor>:
<sentencia>*
break;
default:
<sentencia>*
break;
}
Ciclos o Ciclos
for(<valor_inicial>;<condición>;<incremento>){
<sentencia>*
}
while(<condición>){
<sentencia>*
}
do{
<sentencia>*
} while(<condición>);
Tabla 1.17 Sentencias condicionales y de ciclo.
Como los bloques se pueden anidar no hay problemas por definir una
sentencia de control dentro de otra:
Instituto Tecnológico de Morelia.
Página 45
ITM Unidad I Fundamentos del Lenguaje
Las condiciones deben ser sentencias que forzosamente devuelven un
booleano (un valor cierto o falso), por lo tanto una asignación i=34 no es una
condición válida, ni el 0 es equivalente a false o el 1 a true.
break: La palabra reservada break puede utilizarse para romper la secuencia
de ejecución dentro de los ciclos.
continue: La palabra reservada continue funciona de forma similar a break con
la diferencia que no rompe el ciclo, sino que simplemente se salta una
iteración.
1.11 Matrices
Se define como un conjunto de datos del mismo tipo organizados en dos o más
columnas y uno o más renglones, es decir es un arreglo bidimensional o una
tabla. Los arreglos con dos dimensiones se utilizan a menudo para representar
tablas de valores, que constan de información ordenada en filas y columnas.
Para identificar un elemento especifico de una tabla, se deben especificar los
índices. Por convención, el primer índice indica la fila del elemento y el
segundo, su columna. En Java los arreglos bidimensionales son arreglos de
arreglos. Como era de esperarse, se parecen y actúan como los arreglos
multidimensionales.
Las matrices se derivan de los arreglos (arrays), de hecho son arreglos
multidimensionales, debido a ello daré una breve explicación sobre ellos.
Inicialización de arreglos
Para inicializar los arreglos unidimensionales, únicamente hay que poner los
valores entre llaves, un valor detrás de otro, separados por comas, empezando
con el primer valor del arreglo.
Ejemplo: Declaración e inicialización de un arreglo.
public class MiClase{
public static void main (String [] args){
double cuentas[] = {345.6, 999.0, 0, 1000.5};
cuantas[3] = 1000.5;
System.out.println("La cuenta 3 debe $" +
cuentas[3]);
}
}
Declaración de matrices
Se pueden declarar matrices de una manera muy similar a como se declaran
los arreglos, solo se incluyen un par de corchetes adicionales. Serian arreglos
multidimensionales. De hecho, se agrega un par de corchetes adicionales por
Instituto Tecnológico de Morelia.
Página 46
ITM Unidad I Fundamentos del Lenguaje
cada dimensión, por ejemplo, para un arreglo, que es de una dimensión, se
incluye un par de corchetes, para uno bidimensional, se incluirán dos pares.
Tipo nombre [][]….;
Sintaxis: Declaración y creación de una matriz de dos filas y 100 columnas
tipo nombreMatriz [][] = new tipo [filas][columnas];
tipo [][] nombreMatriz = new tipo [filas][columnas];
Ejemplo:
double accounts [][] = new double [2][100];
Podría incluso declarar arreglos de mas dimensiones.
Ejemplo: Declaración de un arreglo de cuatro dimensiones.
double cuentas [][][][] = new double [2] [3] [4] [5];
Usted podría declarar únicamente una matriz y crearla posteriormente.
Ejemplo:
public class MiClase{
public static void main (String [] args){
double cuentas[][]; //declaración de la matriz
//demás sentencias
cuentas = new double[2][4];//creación de la matriz
cuentas[0][0] = 1000.5;
System.out.println("Valor en cuentas [0][0]"+
cuentas[0][0]);
}
}
Inicialización de matrices
Las matrices se pueden inicializar cuando se les declara, de la misma forma
que inicializaron lo arreglos; basta con poner un par de corchetes para cada
dimensión y poner los valores con los que se quiere inicializar el arreglo dentro
de los mismos.
Ejemplo:
public class MiClase{
public static void main (String [] args){
Instituto Tecnológico de Morelia.
Página 47
ITM Unidad I Fundamentos del Lenguaje
double cuentas[][] = {{10.1, 14.4, 5067.88,
7.7}, {345.67, 67.8, 678.890,
43.0}};
System.out.println("Valor en cuentas [0][3]"+
cuentas[0][3]);
}
}
Creación de matrices
Como en otros lenguajes de programación, en Java, las matrices, son arreglos
de arreglos. Esto quiere decir que se pueden construir arreglos como se quiera;
como en el ejemplo siguiente, en el que cada fila de un arreglo de dos
dimensiones tiene un diferente número de elementos.
Ejemplo:
public class MiClase{
public static void main (String [] args){
double matriz[][] = new double [5][];
matriz[0] = new double [500];
matriz[1] = new double [400];
matriz[2] = new double [300];
matriz[3] = new double [50];
matriz[4] = new double [5];
matriz[0][3] = 4567.886;
System.out.println("En matriz [0][3] "+
cuentas[0][3]);
}
}
Mostrar una matriz
Mostrar una matriz en la pantalla de texto es difícil, ya que Java no dispone de
una función que sitúe el cursor de texto en una posición de la pantalla, como lo
hace la función gotoxy disponible en los lenguajes C/C++. La única alternativa
que queda es mostrar los elementos de una fila unos a continuación de los
otros separados por un tabulador, después otra fila y así hasta mostrar todos
los elementos de la matriz.
En el siguiente ejemplo se muestra en pantalla una matriz de 2 x 3; primero se
inicializa la matriz en la línea int [][]a ={{1,2,3},{10,20,30}};. Se separan los
elementos de una fila mediante el carácter tabulador '\t', Cuando se acaba una
fila se inserta un retorno de carro '\n' y se continua con la siguiente fila, y así
sucesivamente.
Instituto Tecnológico de Morelia.
Página 48
ITM Unidad I Fundamentos del Lenguaje
public class MiClase{
public static void main (String [] args){
int[][] matriz = {{1,2,3},{10,20,30}};
for (int fila=0; fila<2; fila++){
for(int columna=0; columna<3; columna++){
System.out.println(
matriz[fila][columna] +"\t");
}
System.out.println("\n");
}
}
}
Como inicializamos la matriz con dos grupos de números, estos representarán
dos columnas, y como cada grupo de números contiene tres números, cada
uno de ellos es una fila, recomiendo que si es confuso identificar el número de
filas y de columnas al inicializar una matriz al momento de su declaración,
créela de alguna de las otras maneras explicada anteriormente.
La salida es:
1
10
2
20
3
30
1.12 Procedimientos y funciones
Funciones
Supongamos que queremos depositar todo nuestro dinero ganado como
programadores. Hay dos bancos en los que podemos llevar a cabo un depósito
y ganar algunos intereses. El primero, lo llamamos "Banco A", nos ofrecen un
interés con una tasa mensual del 1 % mas una bonificación final del 5%. El
segundo, el "Banco B", nos ofrece una tasa del 1.5 %.
Realizamos un algoritmo para obtener el mayor beneficio. El programa
calculará el monto obtenido en un período de 12 meses con un cálculo de
interés compuesto. Para darnos una mejor idea de lo que tenemos que hacer
elaboramos el algoritmo principal.
double monto = 10000;
double meses = 12;
for ( int n = 1; n <= meses; n++){
monto = monto + monto * interés / 100;
}
Al monto inicial le sumamos las sucesivas capitalizaciones que ganamos mes a
mes, hasta llegar a un período de 12 meses.
Instituto Tecnológico de Morelia.
Página 49
ITM Unidad I Fundamentos del Lenguaje
Con este algoritmo probado, codificamos el programa:
public class ShowMeTheMoney{
public static void main(String args[]){
int meses = 12;
float interesBanco1 = 1f;
float bonificBanco1 = 5f;
float interesBanco2 = 1.5f;
double monto = 10000;
double montoBanco1 = monto;
double montoBanco2 = monto;
for ( int n = 1; n <= meses; n++){
montoBanco1+=montoBanco1 * interesBanco1 / 100;
}
montoBanco1 += montoBanco1 * bonificBanco1 /100;
for ( int n = 1; n <= meses; n++){
montoBanco2+=montoBanco2 * interesBanco2 / 100;
}
System.out.println("Importe final del banco1 : " +
montoBanco1);
System.out.println("Importe final del banco2 : " +
montoBanco2);
}
}
Esto ocurrirá cada vez que tengamos que realizar un cálculo de intereses. Si la
elección se extendiera a, por ejemplo, cinco bancos, tendríamos que copiar el
algoritmo para cada uno de ellos. Para no tener que repetir una y otra vez lo
mismo, podemos recurrir a una técnica muy utilizada en programación: dividir el
código en funciones.
Una función es un conjunto de instrucciones que ejecutan una rutina y
devuelven un resultado. El resultado puede depender de parámetros de
entrada. Una función se construye de la siguiente manera:
tipo_resultado
nombre_función
nombre_parámetro, ... ) {
sentencia1;
sentencia2;
...
sentenciaN;
return unValor;
}
(tipo_parámetro
Se debe definir el tipo de dato del resultado y el nombre que identifica a la
función. Además, opcionalmente se pueden definir parámetros de entrada con
el tipo de dato y su nombre.
Una función permite que reutilicemos un algoritmo. En el caso de nuestro
problema bancario, podemos reutilizar el cálculo de interés aplicándolo a cada
banco. Veamos cómo se construye esta función:
Instituto Tecnológico de Morelia.
Página 50
ITM Unidad I Fundamentos del Lenguaje
double interesCompuesto(double monto, float tasa, int
períodos){
for(int n = 1; n <= períodos; n++ ){
monto += monto * tasa / 100;
}
return monto;
}
Necesitamos definir ciertos datos de entrada para ejecutar el algoritmo. Vamos
a necesitar el monto inicial, la tasa de interés y el período. A su vez definimos
el tipo de datos del resultado. La función nos devuelve el monto final, entonces
el tipo de dato es double. Para identificar a la función le hemos puesto el
nombre de interesCompuesto.
Para utilizar la función en el programa la llamamos por su nombre. Como la
función devuelve un resultado, tendremos que almacenarlo en una variable que
tenga un tipo de dato compatible con el resultado.
double montoBanco2 = interesCompuesto(10000 , interesBanco2, meses);
Debemos pasar los parámetros como se han definido, en el mismo orden y con
el mismo tipo de dato.
Conociendo como se arma y se invoca una función, estamos listos para
utilizarla en nuestro programa.
public class ShowMeTheMoney2{
static double interesCompuesto(double monto, float tasa,
int períodos){
for(int n = 1; n <= períodos; n++ ){
monto += monto * tasa / 100;
}
return monto;
}
public static void main(String args[]){
int meses = 12;
float interesBanco1 = 1f;
float bonificBanco1 = 5f;
float interesBanco2 = 1.5f;
double monto = 10000;
double montoBanco1 = monto;
double montoBanco2 = monto;
montoBanco1 = interesCompuesto( montoBanco1,
interesBanco1, meses );
montoBanco1 += montoBanco1 * bonificBanco1 /100;
montoBanco2 = interesCompuesto( montoBanco2,
interesBanco2, meses );
System.out.println("Importe final del banco1 : " +
montoBanco1);
System.out.println("Importe final del banco2 : " +
Instituto Tecnológico de Morelia.
Página 51
ITM Unidad I Fundamentos del Lenguaje
montoBanco2);
}
}
Ejercicio 1.5: Cree una función que muestre un menú que le permita decidir qué
operación realizar. Esto de acuerdo al proyecto que se ha venido
desarrollando. De acuerdo a cada opción, el usuario deberá ingresar un
número o una letra que identifique cada opción.
Procedimientos
Los procedimientos son también funciones programadas por el usuario. Son
muy parecidos a los métodos, de hecho muchas personas que publican
tutoriales o guías en la red, se refieren a los procedimientos como métodos.
Los procedimientos son invocados escribiendo el nombre del objeto, seguido
del operador punto (.), y después el nombre del procedimiento que ofrece la
clase y que describe sus atributos y comportamientos. Como cualquier rutina
los métodos pueden incorporar argumentos.
Declaración de procedimientos
Sintaxis.
<modificador>*<tipo_regresado><nombre>(<argumentos>*){
<cuerpo>*
}
• Los modificadores pueden ser: public, protected , prívate.
• El modificador de acceso público indica que el procedimiento puede ser
llamado desde otro código.
• Un procedimiento privado indica que solo puede ser llamado por otros
métodos dentro de la clase.
• Se pueden sobrecargar los procedimientos. (Procedimientos con el
mismo nombre pero que funcionan diferente de acuerdo a los
parámetros que reciben.)
Ejemplo: crear el procedimiento setPeso, esta función nos servirá para
asignar un valor a este atributo del objeto y otro procedimiento que nos
regrese dicho valor. (getPeso)
Instituto Tecnológico de Morelia.
Página 52
ITM Unidad I Fundamentos del Lenguaje
public class Perro{
private int peso;
public int getPeso(){
return peso;
}
public void setPeso(int nuevoPeso){
if(nuevoPeso > 0){
peso = nuevoPeso;
}
}
}
Para sobrecargar un procedimiento utilizaremos lo que se conoce como
polimorfismo. Esta función ya fue analizada y ejemplificada en la parte 1.1.1
Objetos, de cualquier forma he aquí una breve explicación.
Para sobrecargar un procedimiento, sólo hay que definirlo más de una vez,
especificando una nueva lista de parámetros en cada una de ellas. Cada lista
de parámetros debe ser diferente de cualquier otra de alguna forma, el número
de parámetros o el tipo de uno o más de ellos.
Ejemplo: Sobrecargaremos el método setPeso del ejemplo anterior.
public class Perro{
private int peso;
public int getPeso(){
return peso;
}
public void setPeso(int nuevoPeso){
if(nuevoPeso > 0){
peso = nuevoPeso;
}
}
public void setPeso(int nuevoPeso, int viejoPeso){
if(nuevoPeso > 0 && viejoPeso<100){
peso = nuevoPeso;
}
}
}
La referencia this
En ocasiones es conveniente disponer de una referencia que apunte al propio
objeto que se está manipulando. Esto se consigue con la palabra reservada
this. this es una referencia implícita que tienen todos los objetos y que apunta a
sí mismo. Por ejemplo:
Instituto Tecnológico de Morelia.
Página 53
ITM Unidad I Fundamentos del Lenguaje
//Se ejemplifica el uso de this
public class Perro{
private int peso;
public void setPeso(int peso){
this.peso = peso;
}
public Perro elPesoMayor(Perro nuevo){
if( peso > nuevo.peso) return this;
else return nuevo;
}
}
/*En este ejemplo se compara el valor de la
variable peso de dos objetos, lo que se regresa
es el objeto cuyo valor en peso sea mayor.*/
El método elPesoMayor devuelve una referencia al perro que tiene mayor peso,
comparando los pesos del Perro nuevo que se recibe como argumento y el
propio. En caso de que el propio resulte mayor el método debe devolver una
referencia a sí mismo. Esto se consigue con la expresión return this.
Al ir avanzando conocerá métodos en los cuales se debe enviar o recibir como
parámetro un objeto, en todos esos casos será de mucha utilidad la referencia
this.
Ejercicio 1.6: Realice los cambios necesarios (diseñar clase, procedimientos o
funciones) para agregar funcionalidad a nuestra aplicación. Agregue por lo
menos 3 habilidades nuevas a nuestra calculadora. Por ejemplo: sacar la raíz
cuadrada, elevar un número a una potencia, etc. Obviamente estas nuevas
opciones deberán aparecer en nuestro menú por lo que deberá modificar
algunas de sus funciones.
1.13 Estructuras de control
Durante un programa existen acciones que se han de repetir un número
determinado de veces. Por ejemplo, leer 3 caracteres de un flujo de entrada in
se codificaría:
in.read();
in.read();
in.read();
Este código además de poco elegante sería inviable para una repetición de
3000 lecturas. Por eso aparecen las estructuras de control, que facilitan que
determinadas acciones se realicen varias veces, mientras que una condición se
Instituto Tecnológico de Morelia.
Página 54
ITM Unidad I Fundamentos del Lenguaje
cumpla, y en definitiva, tomar decisiones de qué hacer en función de las
condiciones que se den en el programa en un momento dado de su ejecución.
Ejemplo:
int contador=0;
for ( contador=0 ; contador < 3 ; contador++ )
in.read();
Donde bastaría cambiar el 3 por cualquier otro número para que la lectura se
repitiese ese número de veces.
El lenguaje Java soporta las siguientes estructuras de control:
Sentencia
Toma de decisión
Ciclo
Diversas
Clave
if-else, switch-case
for, while, do-while
break, continue, label:, return
Tabla1.18 Estructuras de control
Las sentencias condicionales: if y switch
La sentencia if - else
La sentencia if-else de Java dota a los programas de la habilidad de ejecutar
distintos conjuntos de sentencias según algún criterio.
Sintaxis: La sintaxis de la sentencia if-else es:
if ( condición ){
// Código a ejecutar si la condición es cierta
}
else{
//Código a ejecutar si la condición es falsa
}
La parte del else es opcional, y un bloque de código puede ser simplemente la
sentencia vacía; para representar que en ese caso no se ha de ejecutar nada.
Supongamos que un programa debe realizar diferentes acciones dependiendo
de si el valor de una variable es mayor o igual a cero, este valor lo escribimos
nosotros en un campo de texto que se llama “campoDeTexto”. Nuestro
programa puede realizar esto usando la sentencia if - else:
Instituto Tecnológico de Morelia.
Página 55
ITM Unidad I Fundamentos del Lenguaje
int
variable=Integer.parseInt(campoDeTexto.getText());
if (variable >= 0) {
//que hacer si es mayor o igual a cero
System.out.println( "Entró a >= 0 " );
}
else {
//que hacer si no es mayor o igual que cero
System.out.println( "Entró a <0 " );
}
Se pueden anidar expresiones if-else, para poder implementar aquellos casos
con múltiples acciones. Esto es lo que se suele denominar como sentencias
else if.
Por ejemplo, supongamos que se desea escribir un programa que clasifique
según el contenido de una variable valor, asigne una letra a una variable
clasificación. A para un valor del 91-100, B de 81-90, C para 71-80 y F (Método
de calificar de EUA) si no es ninguno de los anteriores:
int valor;
//leer valor
char clasificacion;
if (valor > 90){
clasificacion='A';
}
else
if (valor > 80){
clasificacion='B';
}
else
if (valor > 70){
clasificacion='C';
}
else{
clasificacion='F';
}
Se pueden escribir los if en las mismas líneas que los else. Este sistema de
programación (else if) no es demasiado recomendable cuando crece la
cantidad de condiciones, por ello el lenguaje Java incluye la sentencia switch,
que veremos a continuación, para dirigir el flujo de control de variables con
múltiples valores.
Instituto Tecnológico de Morelia.
Página 56
ITM Unidad I Fundamentos del Lenguaje
La sentencia switch
Mediante la sentencia switch se puede seleccionar entre varias sentencias
según el valor de cierta expresión.
Sintaxis: La forma general de switch es la siguiente
switch ( <expresionMultivalor> ) {
case valor1 : conjuntoDeSentencias; break;
case valor2 : conjuntoDeSentencias; break;
case valor3: conjuntoDeSentencias; break;
default: conjuntoDeSentencias; break;
}
La sentencia switch evalúa la expresiónMultivalor y ejecuta el
conjuntoDeSentencias que aparece junto a la cláusula case cuyo valor
corresponda con el de la expresiónMultivalor.
Cada sentencia case debe ser única y el valor que evalúa debe ser del mismo
tipo que el devuelto por la expresiónMultivalor de la sentencia switch.
Las sentencias break que aparecen después del conjuntoDeSentencias
provocan que el control salga del switch y continúe con la siguiente instrucción
al switch. Las sentencias break son necesarias porque sin ellas se ejecutarían
secuencialmente las sentencias case siguientes. Existen ciertas situaciones en
las que se desea ejecutar secuencialmente algunas o todas las sentencias
case, para lo que habrá que eliminar algunos break.
Finalmente, se puede usar la sentencia default para manejar los valores que no
son explícitamente contemplados por alguna de las sentencias case. Su uso es
altamente recomendado.
Por ejemplo, supongamos un programa con una variable entera meses cuyo
valor indica el mes actual, y se desea imprimir el nombre del mes en que
estemos. Se puede utilizar la sentencia switch para realizar esta operación:
int mes;
//asignar un valor a mes
switch ( mes ){
case 1: System.out.println( "Enero" ); break;
case 2: System.out.println( "Febrero" ); break;
case 3: System.out.println( "Marzo" ); break;
//Demás meses
Instituto Tecnológico de Morelia.
Página 57
ITM Unidad I Fundamentos del Lenguaje
case 12: System.out.println( "Diciembre" ); break;
default: System.out.println( "Mes no valido" ); break;
}
El decidir si usar la sentencia if o switch depende del criterio de cada caso. Se
puede decidir cuál usar basándonos en la legibilidad, aunque se recomienda
utilizar switch para sentencias con más de tres o cuatro posibilidades.
Ejercicio 1.7: Utilice las herramientas anteriores para crear dos maneras
distintas de mostrar el menú de nuestra aplicación. Al inicio, el usuario deberá
elegir uno de los dos (Uno que use if else y el otro switch)
Sentencias de iteración o ciclos: for, do, while
Ciclo while
El ciclo while es el ciclo básico de iteración. Sirve para realizar una acción
sucesivamente mientras se cumpla una determinada condición.
La forma general del ciclo while es la siguiente:
while ( expresiónBooleana )
{
sentencias;
};
Las sentencias se ejecutan mientras la expresiónBooleana tenga un valor de
verdadero.
Se utiliza, por ejemplo para estar en un ciclo del que no hay que salir mientras
que no se cumpla una determinada condición. Por ejemplo, multiplicar un
número por 2 hasta que sea mayor que 100:
int i = 1;
while ( i <= 100 )
{
i = i * 2;
}
Ciclo do-while
El ciclo do-while es similar al ciclo while, pero en el ciclo while la expresión se
evalúa al principio del ciclo y en el ciclo do-while la evaluación se realiza al
final, es decir hasta que se cumpla una determinada condición.
La forma general del ciclo do-while es la siguiente:
Instituto Tecnológico de Morelia.
Página 58
ITM Unidad I Fundamentos del Lenguaje
do {
sentencias;
} while ( expresiónBooleana );
La sentencia do-while debe utilizarse cuando el ciclo deba ser ejecutado por lo
menos una vez.
Por ejemplo, cuando se lee información de un archivo, se sabe que siempre se
debe leer por lo menos un carácter:
int c;
do {
c = System.in.read( );
// Sentencias para tratar el carácter c
} while ( c != -1 ); // No se puede leer más
(Fin del archivo)
Ciclo for
La forma general de la sentencia for es la siguiente:
for ( iniciación ; terminación ; incremento ){
sentencias;
}
La iniciación es una sentencia que se ejecuta una vez antes de entrar en el
ciclo.
La terminación es una expresión que determina cuándo se debe terminar el
ciclo. Esta expresión se evalúa al final de cada iteración del ciclo. Cuando la
expresión se evalúa a falso, el ciclo termina.
El incremento es una expresión que es invocada en cada iteración del ciclo. En
realidad puede ser una acción cualquiera, aunque se suele utilizar para
incrementar una variable contador:
for ( i = 0 ; i < 10 ; i++ )
Algunos (o todos) estos componentes pueden omitirse, pero los puntos y coma
siempre deben aparecer (aunque sea sin nada entre sí).
Se debe utilizar el ciclo for cuando se conozcan las restricciones del ciclo (su
instrucción de iniciación, criterio de terminación e instrucción de incremento).
Por ejemplo, los ciclos for son utilizados comúnmente para iterar sobre los
elementos de una matriz, o los caracteres de una cadena:
Instituto Tecnológico de Morelia.
Página 59
ITM Unidad I Fundamentos del Lenguaje
// cad es una cadena (String)
for ( int i = 0; i < cad.length() ; i++){
// hacer algo con el elemento i-ésimo de cad
}
Un ciclo for, normalmente involucra a tres acciones en su ejecución:
o Inicialización de la variable de control (clausula inicio)
o
Comprobación del valor de la variable de control en una expresión
condicional (clausula test)
o
Actualización de la variable de control (clausula incremento)
La cláusula de inicio y la cláusula de incremento pueden estar compuestas por
varias expresiones separadas mediante el operador coma (,).
for ( a=0,b=0; a < 7; a++,b+=2 )
El operador coma garantiza que el operando de su izquierda se ejecutará antes
que el operando de su derecha. Las expresiones de la cláusula de inicio se
ejecutan una sola vez, cuando arranca el ciclo. Cualquier expresión legal se
puede emplear en esta cláusula, aunque generalmente se utiliza para
inicialización. Las variables se pueden declarar e inicializar al mismo tiempo en
esta sentencia:
for( int cnt=0; cnt < 2; cnt++ )
La segunda cláusula, consiste en una expresión que debe evaluarse a false
para que el ciclo concluya. En Java, esta segunda expresión debe ser de tipo
booleano, de tal modo que se pueden utilizar únicamente expresiones
relacionales o expresiones relacionales y condicionales. El valor de esta
segunda cláusula es comprobado cuando la sentencia comienza la ejecución y
en cada una de las iteraciones posteriores.
Sentencias de salto: break, continue y return
Sentencia break
La sentencia break provoca que el flujo de control salte a la sentencia
inmediatamente posterior al bloque en curso. Ya se ha visto anteriormente la
sentencia break dentro de la sentencia switch.
Se puede etiquetar una sentencia poniendo un identificador Java válido
seguido por dos puntos antes de la sentencia:
nombreSentencia: sentenciaEtiquetada
Instituto Tecnológico de Morelia.
Página 60
ITM Unidad I Fundamentos del Lenguaje
La sentencia break se utiliza para salir de una sentencia etiquetada, llevando el
flujo del programa al final de la sentencia de programa que indique:
break nombreSentencia2;
Un ejemplo de esto sería el programa:
void gotoBreak() {
System.out.println("Ejemplo de break como 'goto' ");
a:
for ( int contadorUno=1; contadorUno <10; contadorUno++ ){
System.out.print("contadorUno ="+ contadorUno);
for( int contadorDos =1; contadorDos <10;
contadorDos++ ){
if (contadorDos ==5 )
break a; //Sale de los dos ciclos!!!
System.out.print("contadorDos ="+
contadorDos);
}
System.out.print("No llega aquí");
}
}
Al interpretar break a, no solo se rompe la ejecución del ciclo interior (el de
contadorDos), sino que se salta al final del ciclo contadorUno, obteniéndose:
contadorUno = 1 contadorDos = 1 contadorDos = 2 ontadorDos = 3
contadorDos = 4
No se aconseja esta forma de programación, basada en goto, y con saltos de
flujo “no controlados”.
Sentencia continue
Del mismo modo que en un ciclo se puede desear romper la iteración, también
se puede desear continuar con el ciclo, pero dejando pasar una determinada
iteración.
Se puede usar la sentencia continue dentro de los ciclos para saltar a otra
sentencia, aunque no puede ser llamada fuera de un ciclo o ciclo.
Tras la invocación a una sentencia continue se transfiere el control a la
condición de terminación del ciclo, que vuelve a ser evaluada en ese momento,
y el ciclo continúa o no dependiendo del resultado de la evaluación. En los
ciclos for además en ese momento se ejecuta la cláusula de incremento (antes
de la evaluación). Por ejemplo el siguiente fragmento de código imprime los
números del 0 al 9 no divisibles entre 3:
Instituto Tecnológico de Morelia.
Página 61
ITM Unidad I Fundamentos del Lenguaje
for (int cont = 0 ; cont < 10 ; cont++)
{
if ( ( cont % 3 ) == 0 )
continue;
System.out.print( " " + cont );
}
Del mismo modo que break, en las sentencias continue se puede indicar una
etiqueta de bloque al que hace referencia. Con ello podemos referirnos a un
bloque superior, si estamos en ciclos anidados. Si dicha etiqueta no es
indicada, se presupone que nos referimos al ciclo en el que la sentencia
continue aparece.
Por ejemplo, el siguiente fragmento de código:
void gotoContinue( ) {
f: for ( int cont1=1; cont1 <5; cont1 ++ ) {
for ( int cont2 =1; cont2 <5; cont2 ++ ) {
if (cont2 > cont1 ) {
System.out.println(" ");
continue f;
}
System.out.print( " " + (cont1 * cont2) );
}
}
}
En este código la sentencia continue termina el ciclo de cont2 y continúa el flujo
en la siguiente iteración de cont1. La salida es:
1
24
369
4 8 12 16
No se aconseja esta forma de programación, basada en goto, y con saltos de
flujo “no controlados”.
Sentencia return
La última de las sentencias de salto es la sentencia return, que puede usar
para salir de la función, procedimiento o método en curso y retornar a la
sentencia que realizó la llamada.
Para devolver un valor, simplemente se debe poner el valor (o una expresión
que calcule el valor) a continuación de la palabra return. El valor devuelto por
return debe coincidir con el tipo declarado como valor de retorno del método.
Instituto Tecnológico de Morelia.
Página 62
ITM Unidad I Fundamentos del Lenguaje
Cuando un método se declara como void se debe usar la forma de return sin
indicarle ningún valor. Ejemplo:
int contador;
boolean condicion;
int devuelveContadorIncrementado(){
return ++contador;
}
void metodoReturn(){
//Sentencias
if ( condicion == true )
return;
//Más sentencias a ejecutar si condición ¡= true
}
Ejercicio 1.8: Hasta el momento, las herramientas que hemos utilizado
permiten que nuestra aplicación se utilice una vez, eligiendo una de las
opciones y termine su ejecución. Utilice ciclos (ciclos) para lograr que la
aplicación se ejecute de manera indefinida hasta que se le presente la opción
salir. Agregue la opción salir.
1.14 Controles básicos y sus propiedades.
Una Interfaz gráfica de Usuario (GUI) presenta un mecanismo amigable al
usuario para interactuar con un programa.
Las GUI se crean a partir de componentes de la GUI (también conocidos como
controles [accesorios de ventana]). Un componente de la GUI es un objeto con
el cual interactúa el usuario mediante el ratón, el teclado u otra forma de
entrada. Los componentes de la GUI en Java se encuentran en java.awt o en
javax.swing (existe una diferencia entre los .swing y los .awt pero se analizará a
profundidad posteriormente).
Los componentes de GUI son parte de la JFC6 (Java Foundation Classes), las
bibliotecas de Java para el desarrollo de GUI´s para múltiples plataformas.
El Swing es una extensión de AWT así que a los métodos o clases se les
antepuso la ‘J’ para saber que era de Swing
AWT
Button
Label
SWING
JButton
JLabel
A continuación, presentaré por medio de ejemplos la manera como se crean
aplicaciones con controladores básicos. Cabe mencionar que lo que está a
6
Java Foundation Classes; Clases de la fundación java.
Instituto Tecnológico de Morelia.
Página 63
ITM Unidad I Fundamentos del Lenguaje
punto de aprender, es hecho por NetBeans automáticamente, de cualquier
manera, usted puede necesitar modificar el código por lo que será mejor
conocer su estructura básica.
Etiquetas
// Nombre del archivo: PruebaEtiqueta.java
// Demostración de la clase JLabel.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaEtiqueta extends JFrame {
private JLabel etiqueta1;
// crearemos la etiqueta en el constructor
public PruebaEtiqueta()
{
super( "Prueba de JLabel" );
//este texto sale en la ventana
//Así se crea la ventana.
Container contenedor = getContentPane();
//Línea anterior: Se crea el contenedor
contenedor.setLayout( new FlowLayout() );
//Línea anterior: Forma de organizar los elementos.
// constructor de JLabel con un argumento cadena
etiqueta1 = new JLabel( "Etiqueta con texto" );
//este es el texto de la etiqueta
etiqueta1.setToolTipText( "Esta es la etiqueta1" );
//esto sale si dejas el cursor sobre ella.
contenedor.add( etiqueta1 );
//le agregamos al contenedor la etiqueta y ya está.
setSize( 275, 170 );
setVisible( true );
} // fin del constructor
public static void main( String args[] )
{
PruebaEtiqueta aplicacion = new PruebaEtiqueta();
aplicacion.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE );
}
Instituto Tecnológico de Morelia.
Página 64
ITM Unidad I Fundamentos del Lenguaje
} // fin de la clase PruebaEtiqueta
La salida se muestra en la figura 1.15:
Figura 1.15 Ejemplo de una etiqueta.
Como se puede observar, el código en si es muy autodocumentado, de ahí los
estándares en los nombres de variables y clases. Con los comentarios la
comprensión del código se incrementa aún más aunque no se recomienda
inundar tanto el código con comentarios.
Campos de texto
En el ejemplo siguiente, se crean varios tipos de campos de texto, normales,
para passwords, editables, no editables, etc.
// Nombre del Archivo: PruebaCampoTexto.java
// Demostración de la clase JTextField.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaCampoTexto extends JFrame {
private JTextField campoTexto1, campoTexto2;
private JPasswordField campoContrasenia;
// configurar GUI
public PruebaCampoTexto()
{
super( "Prueba de JTextField y JPasswordField" );
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// crear campo de texto con tamaño predeterminado
campoTexto1 = new JTextField( 10 );
contenedor.add( campoTexto1 );
// crear campo de texto con texto predeterminado
campoTexto2 = new JTextField( "Escriba el texto aquí" );
contenedor.add( campoTexto2 );
// crear campo de contraseña con texto
// predeterminado, se verán asteriscos
campoContrasenia = new JPasswordField( "Texto oculto" );
Instituto Tecnológico de Morelia.
Página 65
ITM Unidad I Fundamentos del Lenguaje
contenedor.add( campoContrasenia );
// registrar manejadores de eventos
ManejadorCampoTexto manejador =
new ManejadorCampoTexto();
campoTexto1.addActionListener( manejador );
campoTexto2.addActionListener( manejador );
campoContrasenia.addActionListener( manejador );
setSize( 325, 100 );
setVisible( true );
} // fin del constructor de PruebaCampoTexto
public static void main( String args[] )
{
PruebaCampoTexto aplicacion = new PruebaCampoTexto();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE
);
}
//clase interna privada para el manejo de eventos,
//en este caso se usa para escuchar al teclado.
//Para que lo que escribamos se muestre en ese campo.
private class ManejadorCampoTexto implements ActionListener
{
// procesar eventos de campo de texto
public void actionPerformed( ActionEvent evento )
{
String cadena = "";
// el usuario oprimió Intro en objeto JTextField campoTexto1
if ( evento.getSource() == campoTexto1 )
cadena = "campoTexto1: " +
evento.getActionCommand();
// el usuario oprimió Intro en objeto JTextField campoTexto2
else if ( evento.getSource() == campoTexto2 )
cadena = "campoTexto2: " +
evento.getActionCommand();
// el usuario oprimió Intro en objeto JTextField
campoContrasenia
else if ( evento.getSource() == campoContrasenia ) {
cadena = "campoContrasenia: " +
new String( campoContrasenia.getPassword() );
}
JOptionPane.showMessageDialog( null, cadena );
} // fin del método actionPerformed
} // fin de la clase interna privada ManejadorCampoTexto
Instituto Tecnológico de Morelia.
Página 66
ITM Unidad I Fundamentos del Lenguaje
} // fin de la clase PruebaCampoTexto
Debido al tamaño que tiene el código de este ejemplo por sí solo, se omitieron
comentarios de instrucciones que ya fueron explicadas anteriormente.
JTextArea
En el siguiente ejemplo, se utilizan objetos JTextArea. El ejemplo consiste
enmostrar como copiar texto seleccionado de un área de texto a otra, usando
métodos de la clase JTextArea.
package jtextarea_ej;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main extends JFrame
{
private JTextArea areaTexto1, areaTexto2;
private JButton botonCopiar;
// configurar Interfaz grafica
public Main() {
super( "Ejemplo del uso de JTextArea" );
Box cuadro = Box.createHorizontalBox();
//Creamos la ventana
String cadena = "Ésta es una cadena de"+
"\ndemostración para\nilustrar cómo copiar"+
"texto\nde un área de texto a \n" +
"otra, utilizando un\nevento externo";
// establecer areaTexto1
areaTexto1 = new JTextArea( cadena, 10, 15 );
cuadro.add( new JScrollPane( areaTexto1 ) );
// Creamos el botón Copiar y le asignamos el
// ActionListener para el evento.
botonCopiar = new JButton( "Copiar" ); //Lo creamos
cuadro.add( botonCopiar ); //Le ponemos texto
botonCopiar.addActionListener(
new ActionListener() {
// clase interna anónima
// Creamos un método que copie el texto seleccionado
// de un campo a otro
//cuando detecte el evento sobre el botón.
Instituto Tecnológico de Morelia.
Página 67
ITM Unidad I Fundamentos del Lenguaje
public void actionPerformed( ActionEvent evento ){
areaTexto2.append(
areaTexto1.getSelectedText()
);
}
} // fin de la clase interna anónima
); // fin de la llamada a addActionListener
// establecer areaTexto2
areaTexto2 = new JTextArea( 10, 15 );
areaTexto2.setEditable( false );
cuadro.add( new JScrollPane( areaTexto2 ) );
// agregar cuadro al panel de contenido
Container contenedor = getContentPane();
contenedor.add( cuadro );
// colocar en in BorderLayout.CENTER
setSize( 425, 200 );
setVisible( true );
} // fin del constructor de Main (no se onfunda por el
public static void main( String args[] ){
Main aplicacion = new Main();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE
);
}
} // fin de la clase
JScrollPane
Esto es un ejemplo de cómo usar el JScrollPane. Para ello vamos a poner una
imagen dentro de un JLabel y esta a su vez dentro de un JScrollPane. Todo
ello dentro de un JFrame para visualizarlo.
El JFrame saldrá con el tamaño necesario para ver la imagen completa (la
línea que dice ventana.pack() hace eso). Para que aparezcan las barras de
scroll hay que redimensionar la ventana, haciéndola más pequeña que la
imagen. También, en el código, se podría usar el método:
setVerticalScrollBarPolicy (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
De JScrollPane para obligar a que salga siempre la barra vertical. Hay un método
similar para la horizontal.
package pruebajscrollpane;
import javax.swing.*;
public class PruebaJScrollPane {
Instituto Tecnológico de Morelia.
Página 68
ITM Unidad I Fundamentos del Lenguaje
/** Crea una instancia de PruebaJScrollPane */
public PruebaJScrollPane() {
// La ventana
JFrame ventana = new JFrame("Imagen");
// El panel de scroll
JScrollPane scroll = new JScrollPane();
// La etiqueta.
JLabel etiqueta = new JLabel();
// Se carga la imagen, con path absoluto para evitar
// problemas y debe ser un gif.
Icon imagen = new ImageIcon ("E:/ angelodemonio.gif);
// Se mete la imagen en el label
etiqueta.setIcon (imagen);
// Se mete el scroll en la ventana
ventana.getContentPane().add(scroll);
// Se mete el label en el scroll
scroll.setViewportView(etiqueta);
// Y se visualiza todo.
ventana.pack();
ventana.setVisible(true);
}
/**
* Programa principal. Instancia un PruebaJScrollPane
*/
public static void main(String[] args) {
new PruebaJScrollPane();
}
}
Instituto Tecnológico de Morelia.
Página 69
ITM Unidad I Fundamentos del Lenguaje
Figura 1.16 Ejemplo de ScrollBar no a la vista.
Si la imagen no es .gif, no funciona. Para que aparezcan los scrolls debe hacer
la ventana más pequeña que la imagen, como se muestra a continuación. Si
desea que aparezcan sin tener que modificar la imagen utilice el método que se
mencionó anteriormente.
Figura 1.17 Ejemplo de ScrollBar a la vista.
Instituto Tecnológico de Morelia.
Página 70
ITM Unidad I Fundamentos del Lenguaje
EJERCICIO PROPUESTOS
1.1 ¿En qué consiste la programación orientada a eventos?
1.2 Defina que es un objeto, un evento, un método y sus propiedades.
1.3 ¿Qué es un entorno integrado de desarrollo?
1.4 ¿Para qué sirven los comentarios dentro del código de una aplicación?
1.5 ¿Qué tipos de comentarios existen?
1.6 ¿Qué es una estructura de control?
1.7 Investigar la clase Exception de Java. Mencione sus métodos más
importantes.
1.8 Diseñe las clases que serían necesarias para crear un sistema de
inventarios para una tienda de ropa. A la tienda le interesa llevar un control
sobre sus empleados, sus productos, sus clientes y las ventas realizadas para
llevar un control contable, no es necesario programarlas.
1.9 Diseñe una clase llamada Factorial, su finalidad será calcular el factorial de
un número, este número deberá ser solicitado por el programa y el resultado
deberá ser comunicado al usuario. Utilice una función recursiva para lograrlo.
Ejemplo:
public class RecursivaApp{
public static void main(String[] args){
System.out.println("Factorial de 5 "+factorial(5));
}
static long factorial(int n){
//función recursiva
//...
}
}
Variaciones:
Instituto Tecnológico de Morelia.
Página 71
ITM Unidad I Fundamentos del Lenguaje
Posteriormente utilice la herencia para crear una clase que calcule el
factorial de 2 números dados (obviamente por separado).
Utilice también el polimorfismo para que dependiendo de si se le envía 1
o 2 parámetros realice los cálculos de cada uno.
1.10 Crear una clase en java que permita resolver ecuaciones de segundo
grado (forma: ax2 + bx + c = 0). Si en los resultados de una ecuación dada
existe una raíz compleja (raíz de número negativo) deberá mostrarse la
expresión que la represente.
1.11 Crear una clase que contenga un arreglo de números enteros y cuyas
funciones miembro realicen las siguientes funciones:
Encontrar el valor mayor.
Encontrar el valor más pequeño del arreglo.
Calcular un promedio de los valores.
Ordenar los numero del arreglo de mayor a menor.
Los resultados deberán ser mostrados al usuario.
Variaciones:
Crear una clase que pida n valores enteros para llenar un arreglo.
Posteriormente crear 4 clases que hereden de la anterior para utilizar su
método de creación del arreglo y realicen las 4 operaciones descritas.
1.12 Crear una clase que contenga las siguientes funciones:
Calcular y mostrar el valor absoluto de un número entero.
Determinar si un número dado por el usuario es primo o no.
Variación:
Utilizar el polimorfismo para lograr que una función realice las
operaciones anteriores dependiendo de si recibe un número entero
(calcular valor absoluto) o un numero entero y un carácter (determinar si
el valor dado es primo)
1.13 Llenar un arreglo de caracteres de n elementos y determinar:
Cuántas letras mayúsculas existen.
Cuántas letras minúsculas existen.
Cuántas vocales.
Instituto Tecnológico de Morelia.
Página 72
ITM Unidad I Fundamentos del Lenguaje
Los caracteres que no entren en ninguna de estas clasificaciones deberán
ser ignoradas y llenar el arreglo únicamente con letras mayúsculas y
minúsculas.
1.14 Crear una clase que contenga un método que liste los divisores de un
número dado.
1.15 Dada las siguientes variables:
int a = 8 , b = 3;
double suma = 10.241;
char letra = ‘R’;
Indique los resultados que imprimen las siguientes instrucciones:
System.out.println(“Este es el resultado de ”+ a*a);
System.out.println(a+“ + 3 vale ”+ (a+3) );
System.out.println(“Creo que voy a ”+ letra+”eprobar esta materia =(
!!!”);
System.out.println(letra);
System.out.println(“Este es el resultado de ”+ a/suma);
System.out.println(“Este es el resultado de ”+ b*suma);
System.out.println(“Este es el resultado de ”+ b-suma);
1.16 Diseñar una clase que pida un número n al usuario y muestre los primeros
n números de la serie fibonacci (Investigue como se calcula la serie fibonacci).
Instituto Tecnológico de Morelia.
Página 73
ITM Unidad I Fundamentos del Lenguaje
PROYECTOS INTEGRÁLES.
Crear un proyecto en NetBeans como el que se desarrollo a lo largo de la
Unidad I. La funcionalidad será la siguiente:
Proyecto 1:
•
Calcular las áreas de distintas figuras geométricas. Por ejemplo:
triángulos, rectángulos, etc.
•
Diseñe las clases necesarias, implemente herencia y polimorfismo.
•
Programe lo necesario para crear un menú con las opciones
correspondientes.
•
Utilice objetos gráficos como JOptionPane para ingresar los datos con
los que desea trabajar.
Proyecto 2:
•
Crear una agenda en memoria manejando arreglos para almacenar la
información. (Nombre, Teléfono, Mail, Dirección)
•
Crear un menú para la aplicación que permita agregar a una nueva
persona, después de ello, guardar su información personal. Utilice al
manejo de arreglos para almacenar la información como usted desee.
(Si conoce el manejo de listas de objetos será más eficiente).
•
El sistema deberá ser capaz de realizar altas, bajas, modificaciones y
consultas de la información que se haya almacenado en dichos arreglos
o listas. Y el menú obviamente deberá contener dichas opciones.
Proyecto 3:
•
Desarrolle una aplicación que realice operaciones con matrices
cuadradas.
•
Suma, resta y multiplicación, serán las operaciones que se realicen. El
usuario deberá especificar el tamaño de las matrices. Posteriormente se
Instituto Tecnológico de Morelia.
Página 74
ITM Unidad I Fundamentos del Lenguaje
llenarán con valores aleatorios de 1 a 9 y se presentaran en consola al
usuario.
•
Deberá existir la opción de generar matrices nuevas.
•
Por último, el usuario especificará que operación desea realizar con
ellas. Y se le presentarán los resultados.
•
Utilice arreglos bidimensionales, herencia, polimorfismo.
Instituto Tecnológico de Morelia.
Página 75
Unidad 2. Controles, Eventos,
Métodos y Componentes.
Aplicaciones gráficas.
ITM Unidad II Controles, Eventos, Métodos y Componentes
2.1 Controles Estándar.
Al hablar de controles estándar en NetBeans, hacemos referencia a los
botones, campos de texto, etiquetas y todas esas herramientas que más
comúnmente utilizamos en nuestras aplicaciones. A continuación se describe el
proceso mediante el cual se crean o se modifican dichos controles.
Para ejemplificar todo el proceso, iremos desarrollando una aplicación de
escritorio en la cual incorporaremos los controles estándar y daremos alguna
funcionalidad para conocer mejor su funcionamiento.
Primero crearemos una aplicación de escritorio, para ello hay que crear un
proyecto en NetBeans de tipo Java Desktop Application. La manera de crear un
proyecto ya se explicó anteriormente, debemos ir al menú File (Archivo) y a
continuación en New Project (Nuevo Proyecto). Podrá seleccionar entre los
distintos tipos de proyectos, desde aplicaciones de consola, pasando por
aplicaciones de escritorio, hasta aplicaciones para celulares o páginas web, en
este caso debemos seleccionar la categoría “Java” y el tipo de proyecto
mencionado y presionar “Next”.
Figura 2.1 Ventana “Nuevo Proyecto”
Aparece la ventana de Nombre y Localización, esto se refiere al nombre que
tendrá nuestra aplicación y el lugar donde serán guardados los archivos que se
generen.
Instituto Tecnológico de Morelia.
Página 77
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.2 Ventana de configuracion de proyecto.
Especificamos un nombre, en este caso AplicacionDeEscritorio. Este será el
nombre de nuestra clase principal. Como se explicó anteriormente, dentro de
nuestro programa debe existir el método main. NetBeans lo generará
automáticamente.
Damos clic en “Finish” para que se cree el proyecto y a continuación podremos
ver nuestra área de trabajo con todas las herramientas necesarias.
Figura 2.3 Área de trabajo de NetBeans
Habrá ocasiones en la que no podrá modificar el código generado
automáticamente debido a puede provocar un mal funcionamiento.
Damos clic sobre el botón de correr proyecto o presionamos f6 y veremos que
sucede.
Instituto Tecnológico de Morelia.
Página 78
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.4 Aplicación de escritorio vacía. (Esto es lo que se muestra.)
Como puede observar, por default tenemos ya una pestaña de Archivo “File” y
una de ayuda “Help”, esto es debido a que es el template o esqueleto de
aplicación de escritorio por default de NetBeans, también se tienen los íconos
para ampliar la ventana, minimizarla o cerrarla. Si lo deseamos podremos
remover o cambiar lo que sea.
Una vez que tenemos nuestra aplicación de escritorio podremos crear controles
y agregarlos a la misma de una manera tan sencilla como arrastrarlos al lugar
donde los necesitemos.
Para eso, tenemos la ventana del lado derecho de la pantalla con la leyenda
“Palette”, en ella podremos localizar los componentes comunes que
encontramos en una aplicación.
Figura 2.5 Paleta de controles.
Botones.
Los botones proporcionan al usuario una forma rápida de iniciar alguna acción.
Hay que hacer clic sobre ellos. A los botones se les puede dar una inscripción,
Instituto Tecnológico de Morelia.
Página 79
ITM Unidad II Controles, Eventos, Métodos y Componentes
como “¡Presióneme!”. Cuando el usuario hace clic sobre un botón, el código
recibe una notificación.
Hay dos tipos de botones entre los cuales seleccionar.
El primero es el “Button”, este tipo de botón no permanece presionado, posee
dos estados:
• Presionado: el momento en que se da clic al botón.
• No presionado: el estado normal del botón.
A diferencia del “Toggle Button” que cambia de estado al ser presionado.
También posee dos estados pero los maneja de una manera distinta al anterior.
• Presionado: al dar clic sobre el botón, queda presionado, no regresa a
su estado anterior como el tipo de botón anterior.
• No presionado: estado inicial del botón, para cambiar de un estado a
otro debemos dar clics.
Para crear un botón, únicamente tenemos que arrastrarlo de la Paleta de
componentes a nuestra ventana de aplicación y ubicarlo en el lugar que
queramos. Presione f6 para observar que sucede.
Figura 2.6 Programa en ejecución con dos botones de ejemplo.
En este momento los botones no tienen función alguna, el cómo agregar
función a estos elementos se analizará en el apartado siguiente 2.2 Eventos del
formulario. Recuerde que java es un lenguaje orientado a eventos y con ellos
se dará funcionalidad a los controles del formulario.
Modificar propiedades.
Instituto Tecnológico de Morelia.
Página 80
ITM Unidad II Controles, Eventos, Métodos y Componentes
Como puede observar, los botones tienen texto predeterminado, este texto se
almacena en una de las muchas propiedades de los objetos, veamos como
modificar algunas de estas propiedades.
Para modificar las propiedades de los objetos, basta con seleccionar la
propiedad deseada en la ventana de propiedades que se encuentra en la parte
derecha de la pantalla.
Figura 2.7 Ventana propiedades.
Puede cambiar el texto del botón, la fuente, el color de la letra, el color del
botón, el tamaño, el nombre del botón, etc.
Algunas de las propiedades son las siguientes:
background: color del fondo del botón.
font: tipo de letra.
text: texto que se muestra sobre el botón.
enabled: propiedad que indica si el botón esta activado o no en el formulario.
margin: margen del texto del botón.
name: nombre del botón, con el hará referencia al objeto para utilizarlo en el
código. La propiedad nombre se modifica de manera distinta a las demás.
Posteriormente se explicará este proceso.
Ejemplo: Cambiar el texto de los botones del ejemplo a “¡Hola Mundo!” y “¡Hola
Java!”.
Para ello:
1. Seleccionamos la propiedad “text”.
2. Cambiamos el texto predeterminado por el texto deseado.
Instituto Tecnológico de Morelia.
Página 81
ITM Unidad II Controles, Eventos, Métodos y Componentes
3. Presione Enter.
4. Pruebe el resultado corriendo el programa con f6.
Ventana de propiedades
Corrida del programa.
Aquí selecciona la propiedad
Figura 2.8 Cambio de Propiedades de un objeto.
Para cambiar la propiedad “name” se describe a continuación.
1. En la ventana de propiedades, seleccione la pestaña “Code”.
2. Seleccione la propiedad “Variable Name”.
3. Escriba el nombre con el cual desee referirse al objeto.
4. Presione “Enter”, automáticamente verá el cambio en la propiedad
“name”
Es conveniente que asigne un nombre a cada componente que crea para
facilitarle la programación.
Instituto Tecnológico de Morelia.
Página 82
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.9 Cambio de la propiedad “name”
Campos de Texto.
Los cuadros de texto son componentes que soportan texto. Estos componentes
gestionan cadenas de texto de una dimensión; permiten visualizar el texto que
el usuario escribe, poner máscaras de texto cuando se introduce una clave
secreta, leer texto que el usuario ha incluido y mucho mas.
Para crear un campo de texto, llevamos a cabo el mismo proceso que en los
botones. Únicamente tenemos que arrastrarlo de la Paleta de componentes a
nuestra ventana de aplicación y ubicarlo en el lugar que queramos. Presione f6
para observar que sucede.
Figura 2.10 Programa en ejecución con caja de texto de ejemplo.
En este momento la caja de texto no tienen función alguna (podemos editarlo
pero no tiene función alguna). Se preguntará, ¿Qué funcionalidad?, pues que
Instituto Tecnológico de Morelia.
Página 83
ITM Unidad II Controles, Eventos, Métodos y Componentes
se lleve a cabo alguna acción cuando escriba algo, seleccionar la caja de texto,
etc.
Modificar propiedades.
Al igual que los botones tienen texto predeterminado, lo tiene la caja de texto,
este texto se almacena en una de las muchas propiedades de los objetos,
estas propiedades se modifican de la misma manera que se describió
anteriormente.
Puede cambiar el texto, la fuente, el color de la letra, el color del fondo, el
tamaño, el nombre del objeto, cambiarlo de habilitado a deshabilitado, ocultar el
texto que se escribe, etc.
Ejemplo: Cambiar el texto predeterminado de la caja de texto y deshabilitarla.
Para ello:
1. Seleccionamos la propiedad “text” de la primera caja.
2. Cambiamos el texto predeterminado por el texto deseado.
3. Presione Enter.
4. Seleccione la propiedad “editable” de la segunda caja y
desactívela.
5. Pruebe el resultado corriendo el programa con f6.
Instituto Tecnológico de Morelia.
Página 84
ITM Unidad II Controles, Eventos, Métodos y Componentes
Ventana de propiedades
Corrida del programa.
En una cambiamos la propiedad
editable y en la otra la propiedad
text.
Figura 2.11 Cambio de Propiedades de un objeto TextField.
Casillas de activación (Check Box)
Las casillas de activación son como botones, salvo que tienen un doble estado,
es decir, pueden estar seleccionadas o no. Cuando se seleccionan, aparecen
con algún tipo de marca, como puede ser una marca de activación o una X (el
tipo de indicación visual depende del sistema operativo en que se haya
programado, que es una de las razones por la que Sun introdujo Swing, que
puede visualizar componentes con la misma forma independientemente del
sistema operativo). El usuario puede marcar una casilla de activación para
seleccionar un tipo de opción. Se usan las casillas de activación para permitir al
usuario opciones de selección no exclusivas.
Ejemplo: Programa que tiene dos campos de texto, uno editable y otro no
editable. Agregar dos casillas de activación al programa, cambie el texto
predeterminado de las casillas para describir lo que hará cada una, en este
caso, una que diga mayúsculas y otra que copie el texto de una casilla a la
otra.
Para ello:
1. Coloque las dos casillas de activación, arrastrándola de la paleta de
componentes, asignándoles un nombre en función de su propósito,
por ejemplo jCBcopiar (jCheckBoxcopiar).
2. Seleccione la propiedad “text” de ambas casillas y cámbielas por
“Mayúsculas” y “Copiar”.
Instituto Tecnológico de Morelia.
Página 85
ITM Unidad II Controles, Eventos, Métodos y Componentes
Ventana de propiedades
Corrida del programa.
Figura 2.12 Cambio de Propiedades de objetos CheckBox.
Botones de opción (Radio Button) y Grupos de Botones (Button Group)
Los botones de opción son un tipo especial de casilla de activación, y se usan
en grupos. Sólo un botón de opción de un grupo puede ser seleccionado a la
vez; cuando el usuario selecciona un botón de opción de un grupo, el resto del
grupo es automáticamente desactivado.
Estas herramientas se utilizan cuando desea ejecutar acciones mutuamente
excluyentes.
Para crear un grupo de botones de opción siga los siguientes pasos:
1. Arrastre los objetos “Radio Button”
de la paleta de objetos que
necesite y colóquelos en el formulario en el sitio que guste. Para el
ejemplo siguiente se colocarán dos opciones distintas.
2. Una vez que ordenó los botones de opción, arrastre un grupo de
botones (Button Group) al formulario. Como puede observar, este
objeto no se muestra en el formulario pero si se agrega a la lista de
Instituto Tecnológico de Morelia.
Página 86
ITM Unidad II Controles, Eventos, Métodos y Componentes
objetos en el inspector del formulario (lado izquierdo inferior de la
pantalla, pestaña “Inspector”).
3. Ahora seleccione los botones de opción (Radio Button) y busque la
propiedad “buttonGroup” en la lista de propiedades como lo ha hecho
hasta ahora. Modifique esta propiedad seleccionando el grupo de
botones de opción que creamos en el punto anterior. Por default tiene
de nombre “ButtonGroup1”. Con ello logramos que al seleccionar una
de las opciones se deseleccionen las otras.
NOTA: Si no agrega los botones de opción a un grupo, estos funcionarán de
manera independiente. Y si selecciona alguno, los otros no se deseleccionarán.
Es decir, la propiedad primordial de estos objetos se desperdicia. En ese caso
será mejor utilizar “Check Box”.
Ejemplo: Agregar dos botones de opción al formulario y organizarlos en un
grupo de opción. (Recuerde asignar un nombre a los componentes al momento
de crearlos)
Aquí selecciona el grupo al que desea que
pertenezcan los botones de opción.
Figura 2.13 Aplicación con botones de opción.
2.2 Eventos del formulario.
Ya se ha dicho que las acciones del usuario sobre el programa se llaman
eventos. Son eventos típicos el clic sobre un botón, el hacer doble clic sobre el
nombre de un archivo para abrirlo, el arrastrar un icono, el pulsar una tecla o
combinación de teclas, el elegir una opción de un menú, el escribir en una caja
Instituto Tecnológico de Morelia.
Página 87
ITM Unidad II Controles, Eventos, Métodos y Componentes
de texto, o simplemente mover el ratón. Cada vez que se produce un evento
sobre un determinado tipo de control, Java arranca una determinada función o
procedimiento que realiza la acción programada por el usuario para ese evento
concreto. Estos procedimientos se llaman con un nombre que se forma a partir
del nombre del objeto y el nombre del evento, separados por el carácter (_), por
ejemplo:
private void Boton1MouseClicked(java.awt.event.MouseEvent
evt) {
// TODO add your handling code here:
}
Para ejemplificar como se programan los eventos en un formulario, ahora
haremos que nuestra aplicación tenga funcionalidad. Analizaremos diferentes
eventos con los objetos del formulario.
Para crear un evento sobre algún objeto del formulario, seleccione el objeto
que desee y a continuación busque el evento deseado en la pestaña “Events”
que se encuentra junto a la pestaña de propiedades.
Figura 2.14 Lista de eventos.
Campo de texto (Text Field).
Crearemos un evento sobre el campo de texto habilitado del ejemplo
“campoTexto1”, el evento que crearemos se llama “KeyTyped”, es decir, al
presionar una tecla se llevará a cabo alguna acción.
Los pasos para crear dicho evento son los siguientes:
1. Seleccione el campo de texto y después busque el evento
“KeyTyped” en la lista de eventos de la pestaña “Events” y presione
enter.
Instituto Tecnológico de Morelia.
Página 88
ITM Unidad II Controles, Eventos, Métodos y Componentes
2. Con esto, se crea el esqueleto del evento en la parte correspondiente
del código. Por si solo, este código no realiza función alguna.
Debemos echar mano de los métodos del objeto “campoTexo1”.
3. En este caso, haremos que se copie el texto que tecleemos en la
segunda ventana de texto (la que se encuentra deshabilitada,
(“jTextField2”). El código está adelante.
4. campoTexto2.setText(), es un método que sirve para asignar un valor
al campo de texto. campoTexto2.getText(), por el contrario, devuelve
el texto de un campo.
private void campoTexto1KeyTyped(java.awt.event.KeyEvent evt)
{
// TODO add your handling code here:
campoTexto2.setText(campoTexto1.getText());
//Aquí se toma el texto del campo1 y se copia en el
//campo2.
}
2.15 Ejemplo en ejecución.
NOTA IMPORTANTE: Para facilitar la programación, NetBeans posee una
herramienta muy importante. Si no recuerda como se llaman sus objetos o
desconoce los métodos de un objeto, basta con escribir la primera letra del
nombre del objeto y luego presionar la combinación de teclas “Ctrl+espacio”
para listar las posibles opciones, con ello, únicamente tendrá que seleccionar el
nombre que desea. Aplica lo mismo para los métodos.
Instituto Tecnológico de Morelia.
Página 89
ITM Unidad II Controles, Eventos, Métodos y Componentes
Para agregar más funcionalidad debemos utilizar los métodos de los objetos, a
continuación se listan algunos de los métodos de un campo de texto y su
funcionalidad.
Método
Dimension getMinimumSize()
int getColumns()
Protected String paramString()
void removeActionListener(Action
Listener)
void setText(String)
String getString ()
Descripción
Obtiene las dimensiones mínimas
para el cuadro de texto
Obtiene el número de columnas del
cuadro de texto.
Obtiene la representación en cadena
del estado del cuadro de texto.
Elimina el action listener indicado,
para que no reciba eventos.
Asigna una cadena al objeto.
Devuelve en una cadena el contenido
de una caja de texto.
Tabla 2.1 Métodos de algunos objetos.
Cabe mencionar que NetBeans proporciona una lista y una breve descripción
del funcionamiento de cada método. Basta con utilizar la herramienta de
NetBeans mencionada anteriormente.(Ctrl+Space)
Botones
Ahora crearemos un evento sobre el botón de nuestro ejemplo. Utilizaremos el
evento “mouseClicked”, es decir, algunas funciones se desencadenarán al dar
clic sobre nuestro botón.
Los pasos para crear el evento son los mismos, únicamente debe seleccionar
el evento indicado. Seleccione el botón y busque el evento apropiado en la
pestaña de eventos. “mouseClicked” para el ejemplo, además es lo más común
con un botón.
Ejemplo: Programe el evento “mouseClicked” en el botón del ejemplo. Haga
que al dar clic sobre el mismo, se muestre cualquier frase en el campo de texto
deshabilitado.
El código es el siguiente:
private
evt) {
void
Boton1MouseClicked(java.awt.event.MouseEvent
campoTexto1.setText("Programaste el evento clic");
//Entre comillas se pone lo que deseas que se
//muestre en la caja de texto
}
Instituto Tecnológico de Morelia.
Página 90
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.16 Programa en ejecución
Casillas de activación (check box)
A continuación trabajaremos con los check box, programaremos también el
evento mouseClicked.
Ejemplo: Programar el evento mouseClicked de las casillas de activación (debe
hacerse en ambas). Al dar clic sobre una, deberá revisar si se está activando o
desactivando, para llevar a cabo la acción específica.
1. La primera casilla deberá cambiar el texto del campo de texto habilitado
a mayúsculas al ser activada, y a minúsculas al ser desactivada.
2. La segunda deberá copiar el texto de la primera caja de texto a la
segunda al ser activada y quitar cualquier texto de dicha caja al ser
desactivada.
3. Busque el evento en cada una de las check box y programe lo anterior.
El código es el siguiente:
Para el check_box 1
private void checkMayusculasMouseClicked(java.awt.event.
MouseEvent evt) {
if (checkMayusculas.isSelected() == true){
campoTexto1.setText(campoTexto1.getText().
toUpperCase());
}
else{
campoTexto1.setText(campoTexto1.getText().
toLowerCase());
}
Instituto Tecnológico de Morelia.
Página 91
ITM Unidad II Controles, Eventos, Métodos y Componentes
}
Para el check_box 2
private
void
checkCopiarMouseClicked(java.awt.event.MouseEvent evt) {
if (campoTexto2.isSelected()==true){
campoTexto2.setText(campoTexto1.getText());
}
else{
campoTexto2.setText("");
}
}
Como puede observar, la programación cada vez involucra más herramientas.
En este caso ya utilizamos el condicional if else, además los métodos
toLowerCase() y toUpperCase() que cambian una cadena de mayúsculas a
minúsculas. Estos y más métodos ya se analizaron en la primera unidad 1.7
Tipos De Datos, en la clase String.
También hay métodos como campoTexto2.isSelected(), este nos regresa “true”
si la casilla de activación esta activada, valga la redundancia, o “false” si esta
desactivada.
A continuación, se presentan algunos métodos relacionados con las check box
que pueden facilitar la programación:
Método
boolean isBackgroundSet()
boolean isBorderPainted()
boolean isEnabled()
boolean isSelected()
void setText (String text)
void setVisible (boolean aFlag)
Instituto Tecnológico de Morelia.
Descripción
Regresa “true” si el color de fondo del
componente se ha especificado, “false” si
no.
Regresa “true” si el borde del objeto está
pintado, regresa “false” de lo contrario.
Regresa “true” si el componente está
habilitado o “false” si no.
Regresa “true” si el componente está
seleccionado o “false” si no.
text – Es una cadena que se pondrá como
texto.
aFlag – bandera “true” para hacer que este
Página 92
ITM Unidad II Controles, Eventos, Métodos y Componentes
void setEnabled (boolean b)
componente sea visible, bandera “false”
para que no sea visible.
“false” para deshabilitar el componente,
“true” para habilitarlo.
Tabla 2.2 Métodos de una check box.
Figura 2.17 Aplicación en ejecución.
Botones de Opción (Radio Button).
Ahora crearemos un evento sobre los botones de opción de la aplicación.
Ejemplo: Para los botones de opción programe el evento “StateChanged” para
lograr que al seleccionar uno, se coloque una frase en el campo de texto
habilitado y con el otro botón una frase distinta.
1. Seleccione cada uno de los botones de opción e identifique el evento
“StateChanged”, pulse enter para crear el código correspondiente.
El código es el siguiente:
Código para el botón de opción 1:
private
void
opcion1StateChanged(javax.swing.event.ChangeEvent evt) {
if(opcion1.isSelected()==true){
campoTexto1.setText("Eligió la opción 1");
}
}
Código para el botón de opción 2:
Instituto Tecnológico de Morelia.
Página 93
ITM Unidad II Controles, Eventos, Métodos y Componentes
private
void
opcion2StateChanged(javax.swing.event.ChangeEvent evt) {
if (opcion2.isSelected()==true){
campoTexto.setText("Eligió la opción 2");
}
}
Como puede observar, estamos utilizando el método “isSelected()”, es el
mismo que utilizamos en los check box. Esto se debe a que muchos de los
métodos disponibles para los componentes estándar son iguales.
Figura 2.18 Aplicación en ejecución.
2.3 Cajas de diálogo.
Los programas de ventanas utilizan, con frecuencia, cuadros de diálogo para
que el usuario introduzca datos, como el nombre de un archivo que se desea
abrir, una clave o un color que se selecciona entre muchos otros. Al igual que
otros elementos visuales, los cuadros de diálogo son familiares para los
usuarios GUI (interfaz Grafica de Usuario). Se usan cuando se quiere que el
usuario introduzca información, pero no quiere usar un control dedicado, como
un cuadro de texto, todas la veces en la ventana principal. Es decir, los cuadros
de diálogo son ventanas temporales que se pueden llenar con controles para la
entrada de datos del usuario.
2.3.1 Modales y no modales.
Los formularios y los cuadros de diálogo pueden ser modales o no modales. Un
formulario o cuadro de diálogo modal debe cerrarse u ocultarse para que el
usuario pueda continuar trabajando con el resto de la aplicación.
Instituto Tecnológico de Morelia.
Página 94
ITM Unidad II Controles, Eventos, Métodos y Componentes
Es conveniente que los cuadros de diálogo que muestran mensajes
importantes sean siempre modales. El cuadro de diálogo Acerca de es un
ejemplo de un cuadro de diálogo modal.
Los formularios no modales permiten alternar el foco entre dos formularios sin
necesidad de cerrar el formulario inicial. El usuario puede continuar trabajando
en otro lugar, en cualquier aplicación, mientras se muestra el formulario.
Los formularios no modales son más difíciles de programar, porque el acceso
por parte de los usuarios se produce en un orden impredecible. Se ha de
mantener la aplicación en un estado coherente con independencia de lo que
haga el usuario.
Con frecuencia, las ventanas de herramientas se muestran de forma no modal.
El cuadro de diálogo Buscar, disponible en muchas aplicaciones, es un
ejemplo de cuadro de diálogo no modal. Utilice formularios no modales para
mostrar comandos o información utilizados con frecuencia.
Para crear una caja de dialogo en java, usted debe crear una clase desde cero,
heredar de clases predefinidas y crear por medio de texto puro cada elemento
del nuevo formulario.
NetBeans provee herramientas que permiten la creación de cajas de dialogo de
la misma manera que hemos creado nuestro formulario hasta ahora.
Para crear una caja de dialogo siga los pasos siguientes:
1. Vaya al menú “File” (archivo) y seleccione “New File”.
2. Elija la categoría “Swing GUI Forms”
3. Seleccione el tipo de archivo “JDialog Form” y presione “Next”.
Instituto Tecnológico de Morelia.
Página 95
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.19 Ventana “New File” crear caja de diálogo.
4. Ahora debemos elegir el nombre de la clase de nuestro nuevo
formulario. Debe quedar claro, que este será el nombre de la clase, mas
no del formulario. Por último presione “Finish”
5. Como puede ver, se crea un nuevo formulario, usted puede arrastrar
componentes de la paleta de componentes y darle la forma que usted
quiera. Estos procesos se explicaron con detalle en el apartado anterior.
El nombre de la clase de nuestro nuevo cuadro de diálogo es
“NewJDialog”.
Figura 2.20 Nuevo formulario para caja de dialogo vacio.
Ejemplo: Ponga un par de botones y una caja de texto al cuadro de diálogo.
Y programa los eventos clic de cada botón para mostrar algún mensaje en
la caja de texto.
Instituto Tecnológico de Morelia.
Página 96
ITM Unidad II Controles, Eventos, Métodos y Componentes
Para el ejemplo anterior muestre el texto “Hola a mi” y “Hola a Todos” al
presionar el botón correspondiente a la frase.
Hasta este momento no puede ejecutar este cuadro de diálogo. Para ello
debe crear una instancia de su clase en nuestro formulario principal. Para
llamar el cuadro de diálogo que diseñamos anteriormente en el formulario
principal, haga lo siguiente:
1. Para el ejemplo, llamaremos el cuadro de diálogo al dar clic sobre el
botón de nuestra aplicación principal.
2. Una vez que nos ubicamos en el código del evento correspondiente,
procedemos a declarar una instancia de la clase “NewJDialog” y la
mostramos. El código es el siguiente:
private
evt) {
void
Boton1MouseClicked(java.awt.event.MouseEvent
campoTexto2.setText("Programaste el evento clic");
//Creamos el objeto.
NewJDialog cuadroDialogo =
new NewJDialog(getFrame(), false);
//Luego lo mostramos
cuadroDialogo.show();
}
Como puede observar, al declarar el objeto de tipo “NewJDialog” se llamará a
su constructor, el cual requiere como parámetros: el formulario padre, es decir,
el que lo invoca y una bandera en la que se especificará si la caja de diálogo
será modal o no modal.
NewJDialog cuadroDialogo = new NewJDialog(getFrame(), false);
//Es en este momento que se decide si la caja de diálogo será
modal o no modal
Instituto Tecnológico de Morelia.
Página 97
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.21 Aplicación en ejecución.
TIP: Si en determinado método no esta seguro de los parámetros, presione
“Ctrl + space” para que NetBeans le ofrezca posibles valores.
2.3.2 Predefinidas
En el apartado anterior, 3.1 Modales y no modales, analizamos como crear
cajas de diálogo pero; existen cajas de dialogo predefinidas, crearlas es muy
sencillo y el proceso necesario se describe a continuación.
La clase que se utiliza para este fin se llama “JOptionPane”
Los tipos de cajas de texto predefinidas son:
1. Confirmación (ConfirmDialog).
2. Entrada de datos (InputDialog).
3. Confirmación Interna (InternalConfirmDialog)
4. Entrada interna de datos (InternalInputDialog)
5. Mensaje Interno (InternalMessageDialog)
6. Mensaje (MessageDialog)
7. Opción (OptionDialog)
Instituto Tecnológico de Morelia.
Página 98
ITM Unidad II Controles, Eventos, Métodos y Componentes
Cada uno de los tipos de cajas de dialogo predefinidas mencionadas
anteriormente tienen varios constructores dependiendo de sus parámetros, a
continuación se explicará el proceso de creación y utilización de algunas de
estas cajas de diálogo mediante el uso de herramientas de NetBeans que
facilitan la programación.
Por ejemplo:
Crearemos una caja de diálogo de confirmación en el objeto
“checkMayusculas1” de nuestra aplicación, este es el que nos da la opción de
poner nuestro texto en mayúsculas. Para ello realice lo siguiente.
1. Localice el código de evento que ya habíamos programado para este
objeto, si no ha seguido el ejemplo hasta este punto, cree una checkbox,
localice el evento mouseclicked y escriba “JOptionPane.”. Al escribir él
“.” (punto) NetBeans intentará complementar su código dándole
opciones posibles. Si no ocurre lo anterior presione Ctrl + space para
que lo haga.
Figura 2.22 Cómo ver la lista de cuadros de diálogo predefinidos
Como puede Observar es muy sencillo, solo debe seleccionar el tipo de caja
de diálogo que desea utilizar. Si no está seguro de para qué sirve cada una,
en la parte inferior se muestra una explicación de para qué sirve, que es lo
que muestra, etc. En el listado de los métodos puede observar que
parámetros se necesitan y que devuelve la función. En fin entre las dos
ventana automáticamente desplegadas por NetBeans se muestra todo lo
que debe saber del método que crea una caja de diálogo.
Instituto Tecnológico de Morelia.
Página 99
ITM Unidad II Controles, Eventos, Métodos y Componentes
2. Una vez que identifica el método que necesita, selecciónelo y presione
“enter”, automáticamente se muestra otra ventana de ayuda para
completar el código con los parámetros correspondientes.
Figura 2.23 Error por no importar librería.
Los parámetros para la caja de diálogo que estamos creando son el
formulario que la esta invocando y el mensaje que deseamos se muestre.
Recuerde que se puede ayudar de Ctrl+space para completar los
parámetros si desconoce que debe poner.
En este caso, el formulario que llamará al cuadro de diálogo es el formulario
principal cuyo nombre es “mainPanel” y el mensaje que queremos mostrar
es: “Está completamente seguro??”.
Observe que tenemos un error, es debido a que no hemos importado la
clase “JOptionPane” pero; otra de las herramientas poderosas de NetBeans
es solucionar con facilidad errores de los cuales conoce su solución. Por
ejemplo para que se solucione ese error, basta con dar un clic sobre el foco
amarillo para que nos diga de qué error se trata y a continuación
seleccionar una de las posibles soluciones. Siempre que se muestra un foco
en un mensaje de error, es porque NetBeans puede solucionarlo, De lo
contrario solo se muestra el error que se localiza.
Figura 2.24 Herramienta útil para corregir errores sencillos.
Puede ser que le muestre otro error debido a que no está asignando el valor
de vuelta a ninguna variable. Ese error también se puede solucionar
fácilmente. Aunque… de hecho esto no es un error, sería el equivalente a
un warning en el lenguaje C.
Instituto Tecnológico de Morelia.
Página 100
ITM Unidad II Controles, Eventos, Métodos y Componentes
Como vemos el método devuelve un entero que nos permitirá captar cual es
la opción elegida por el usuario. Los valores serán 0 para Si, 1 para No, 2
para Cancelar y -1 para el cierre de la ventana. Así podremos preguntar
cuál es el valor devuelto y realizar la acción que deseamos.
3. Ahora
utilicemos
los
valores
de
retorno
para
condicionar
el
comportamiento. De lo contrario se mostrará la ventana pero no tendrá
función alguna.
4. Haremos que si se presiona “Si”, la casilla se seleccione y cambie el
texto del cuadro de texto a mayúsculas, si se presiona “No” No se
activará la casilla, y en caso de que se presione “Cancelar” o se cierre la
ventana, Tampoco se activará la casilla.
5. El código en el evento clic del checkbox es el siguiente.
private void checkMayusculasMouseClicked(java.awt.event.MouseEvent
evt) {
//necesitamos una variable entera en la cual almacenar el
valor de retorno.
int showConfirmDialog = JOptionPane.showConfirmDialog(mainPanel,
"Está Completamente seguro??");
if(showConfirmDialog == 0){
checkMayusculas.setSelected(true);
}
else{
checkMayusculas.setSelected(false);
}
//Como puede ver se realiza una acción si se selecciona la
//casilla.
if (checkMayusculas.isSelected() == true){
ampoTexto1.setText(campoTexto1.getText().toUpperCase());
}
else{
campoTexto1.setText(campoTexto1.getText().toLowerCase());
}
}
Con esto, estamos condicionando a que se confirme la acción que antes
siempre se ejecutaba al dar clic sobre ese objeto.
Instituto Tecnológico de Morelia.
Página 101
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.25 Programa en ejecución.
Ahora, supongamos que usted no necesita preguntar nada al usuario, que solo
quiere mostrar un mensaje al realizar cierta acción, ya sea una confirmación o
un mensaje de que ocurrió cierto error. Para eso utilicemos un mensaje simple,
ahora lo pondremos en el botón de la aplicación.
Ejemplo: Agregar al código del evento “mouseclicked” del Botón con la leyenda
“Hola Java” de nuestra aplicación el código que muestre una mensaje que
indique que la acción se llevó a cabo correctamente. Anteriormente habíamos
mostrado una caja de dialogo en ese código. Modifíquelo si es necesario.
El código es el siguiente:
private void Boton1MouseClicked(java.awt.event.MouseEvent evt) {
campoTexto2.setText("Programaste el evento clic");
JOptionPane.showMessageDialog(mainPanel,
"La acción se realizó correctamente");
}
La creación de cuadros de diálogo pre diseñados es una de las tareas más
sencillas. Utilice cajas de diálogo prediseñanadas en lugar de cajas diseñadas
por usted mismo si es posible. Se ahorrará mucho tiempo en la programación y
además tendrá muchas opciones pre programadas en las mismas.
Instituto Tecnológico de Morelia.
Página 102
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.26 Aplicación en ejecución.
2.4 Componentes estándar.
Cuando desarrolla una aplicación en java, es apropiado elegir los componentes
de interfaz gráfica de usuario (GUI) adecuados. En NetBeans se pueden
crear componentes Swing7 o AWT8 (Abstract Window Toolkit), ambos forman
parte de la Java Foundation Classes (JFC).
Para crear componentes de los distintos estándares, debe seleccionar la
categoría correspondiente en la paleta de componentes.
Ambos tienen ventajas y desventajas, las cuales se mencionarán
posteriormente. Hasta el momento hemos trabajado únicamente con controles
swing.
7
Swing es una biblioteca gráfica para Java. Contiene botones, cajas de texto, etc.
La Abstract Window Toolkit (AWT, en español Kit de Herramientas de Ventana Abstracta) es un kit de herramientas de gráficos,
e interfaz de usuario.
8
Instituto Tecnológico de Morelia.
Página 103
ITM Unidad II Controles, Eventos, Métodos y Componentes
Figura 2.27 Componentes Swing y AWT.
Las Internet Foundation Classes (IFC9) era una biblioteca gráfica para el
lenguaje de programación Java desarrollada originalmente por Netscape10.
Desde sus inicios el entorno Java ya contaba con una biblioteca de
componentes gráficos conocida como AWT. Esta biblioteca estaba concebida
como una API estandarizada que permitía utilizar los componentes nativos de
cada sistema operativo. Entonces una aplicación Java corriendo en
determinado sistema operativo, usaría componentes estándar del sistema. En
la práctica esta tecnología no funcionó:
•
Al depender fuertemente de los componentes nativos del sistema
operativo el programador AWT estaba confinado a un mínimo
denominador común entre ellos. Es decir que sólo se disponen en AWT
de las funcionalidades comunes en todos los sistemas operativos.
•
El comportamiento de los controles varía mucho de sistema a sistema y
se vuelve muy difícil construir aplicaciones portables. Fue por esto que el
eslogan de Java "Escríbalo una vez, ejecútelo en todos lados" fue
parodiado como "Escríbalo una vez, pruébelo en todos lados".
9
Internet Foundation Classes era una biblioteca gráfica para el lenguaje de programación Java
Es una empresa de software famosa por ser la creadora del navegador web Netscape Navigator.
10
Instituto Tecnológico de Morelia.
Página 104
ITM Unidad II Controles, Eventos, Métodos y Componentes
En cambio, los componentes de IFC eran mostrados y controlados
directamente por código Java independiente de la plataforma.
Swing se desarrolla a partir de AWT con el objetivo de mejorar a las
tecnologías existentes y lograr lo que AWT no pudo. Swing introdujo un
mecanismo que le permite que el aspecto de cada componente de una
aplicación pudiera cambiar sin introducir cambios sustanciales en el código de
la aplicación. Swing emula la apariencia de los componentes nativos
manteniendo las ventajas de la independencia de la plataforma. También
contiene un conjunto de herramientas que nos permiten crear un interfaz
atractivo para los usuarios.
Pudo haber notado que en NetBeans se pueden crear controles Swing y
controles AWT. La explicación anterior es para comprender por qué durante el
desarrollo de este libro, se utilizaron únicamente componentes Swing.
De cualquier modo, la creación y manipulación de ambos es la misma, esta
decisión se basó en las ventajas que ofrece una nueva tecnología (“Swing”)
sobre (“AWT”).
AWT vs Swing
Hay por supuesto pros y contras de ambos componentes de la JFC, a
continuación se listan algunos.
AWT:
Pros
•
Velocidad: el uso de componentes nativos aumenta la velocidad de
ejecución y el desempeño.
•
Portabilidad Web: La mayoría de los navegadores de internet soportan
AWT por lo que no es necesario algún plugin adicional.
•
Apariencia: Los componentes AWT lucen más como los componentes
nativos del sistema Operativo.
Contras
• Portabilidad: El uso de componentes nativos atenta contra la portabilidad
de la aplicación a otra plataforma.
•
Mayorías: La mayor parte de las compañías importantes de Software
basan sus tecnologías sobre swing.
•
Funciones adicionales: los componentes AWT no soportan cosas como
iconos y otras herramientas adicionales.
Instituto Tecnológico de Morelia.
Página 105
ITM Unidad II Controles, Eventos, Métodos y Componentes
Swing:
Pros
•
Portabilidad: El diseño de éstos componentes provén mayor portabilidad.
•
Comportamiento: Estos componentes provén de mayor funcionalidad ya
que no están atados a funciones de un solo sistema.
•
Funciones: Swing soporta muchas más funciones como los iconos, los
pop-up, etc.
•
Actualmente: El desarrollo de Swing es más activo, sun continúa dando
mantenimiento a estas librerías y mejorándolas.
•
Apariencia: Aunque estos componentes imitan a los nativos de los
sistemas operativos, la verdad es que no hay diferencia notable en la
actualidad. Sobre todo para plataformas como (Microsoft Windows,
Solaris, Macintosh, etc.)
Contras
• Portabilidad Web: La mayoría de los navegadores de internet no
contienen la librería swing por lo que debe agregarse un plug-in. (Si la
tendencia hacia swing continúa, esto ya no será necesario).
•
Desempeño: Los componentes swing son mucho más lentos y contienen
más bugs que los AWT.
•
Apariencia: Aunque los componentes Swing están hechos para lucir
como los propios del sistema operativo, pueden no verse como ellos.
Instituto Tecnológico de Morelia.
Página 106
ITM Unidad II Controles, Eventos, Métodos y Componentes
EJERCICIOS PROPUESTOS.
2.1 Desarrolle una aplicación de escritorio, adapte las clases creadas en el
proyecto de la Unidad I, en el proyecto de la calculadora. Para funcionar
gráficamente, agregue los botones necesarios para las funciones adicionales
que realice su aplicación. Ej. De la interfaz que deberá crear y programar.
2.2 Diseñe una aplicación gráfica para manipular la información de una Agenda
electrónica. Utilice los controles swing disponibles para poder agregar,
modificar, eliminar o consultar la información de 20 personas diferentes. La
información se almacenará en memoria. Utilice arreglos de tipo que considere
necesarios.
2.3 Programe una aplicación en ambiente gráfico que le permita tener una lista
de alumnos y sus calificaciones. Utilice un objeto JList para almacenar dicha
lista y utilice JOptionPane o JTextField para ingresar la información. Luego
coloque los botones necesarios para ordenar dicha lista ya sea por nombre o
por la calificación.
2.4 Memorama. Desarrolle una aplicación que funcione como un memorama.
Un memorama cociste en un conjunto de “n“cartas con n/2 imágenes distintas.
El objetivo es poner las cartas hacia abajo y tratar de localizar el mayor número
de parejas posible. Elija que objetos utilizar (botones, labels, etc.) y programe
un evento sobre ellos para que al seleccionar uno nos muestre que imagen o
texto oculta (puede utilizar texto en lugar de imágenes). La aplicación deberá
llevar el control de puntaje y turno de 2 jugadores. Utilice como mínimo 16
objetos que representarán las cartas.
2.6 Diseñe un programa en ambiente gráfico que le ayude a aprender inglés.
Deberá crear de manera automática (con valores fijos) o pidiendo los valores al
usuario para llenar un arreglo de palabras en inglés. Deberá guardar en otro su
equivalente en español. El programa mostrará de manera aleatoria una palabra
del arreglo de palabras en inglés. Usted deberá ingresar la palabra en español
Instituto Tecnológico de Morelia.
Página 107
ITM Unidad II Controles, Eventos, Métodos y Componentes
y presionar enter para revisar si fue correcta o incorrecta su respuesta. El
programa mostrará de manera infinita y aleatoria las palabras que contiene.
2.7 Programe una aplicación que realice una conversión de temperaturas entre
Fahrenheit y Centígrados. Deberá ser capaz de que a que escala convertir, es
decir, de centígrados a Fahrenheit o viceversa.
2.8 Desarrolle una aplicación que le permita transformar cantidades entre
varias tipos de monedas. Por ejemplo: De euros a pesos, a libras esterlinas, a
dólares, etc. Contemple todas las conversiones posibles entre al menos esas
cuatro monedas.
2.9 Diseñe una aplicación que le permita resolver ecuaciones algebraicas de
primer grado. Ejemplo: x + 3 = 2x – 2 y segundo grado. Ejemplo: x2 − 16 = 0.
1.10 Programe el juego del gato. Utilice una matriz de 9 elementos para llevar
un control de las posiciones. Utilice el objeto que considere conveniente para
representar de manera gráfica al gato. El programa debe llevar el control de
turno de dos jugadores y decir cuando gana alguno. Utilice botones o un menú
para crear opciones como nuevo juego o lo que necesite.
Instituto Tecnológico de Morelia.
Página 108
ITM Unidad II Controles, Eventos, Métodos y Componentes
PROYECTO INTEGRAL.
Sudoku. (En japonés: 数独, sūdoku) es un pasatiempo (como los crucigramas
en México), muy popular en Japón. El objetivo es rellenar una cuadrícula de
9×9 celdas (81 casillas) dividida en subcuadrículas de 3×3 (también llamadas
"regiones") con los números del 1 al 9 partiendo de algunos números ya
dispuestos en algunas de las celdas. Aunque se podrían usar colores, letras,
figuras, conviene en usar números para mayor claridad. Lo que importa, en
todo caso, es que sean nueve elementos diferenciados. No se debe repetir
ninguna cifra en una misma fila, columna o región. Un sudoku está bien
planteado si la solución es única. La resolución del problema requiere paciencia
y ciertas dotes lógicas.
Diseñe una aplicación gráfica que cree tablas de sudoku y usted pueda
resolverlas. El programa deberá ser capaz de revisar la solución que demos y
decir si es correcta o incorrecta. Existen algoritmos que describen también
como solucionarlos, de la opción al usuario para resolver un sudoku si es que
se rindió o no puede resolverlo.
Instituto Tecnológico de Morelia.
Página 109
Unidad 3. Sistemas de
Archivos.
Utilización de archivos como método de almacenamiento de información.
ITM Unidad III Sistemas de Archivos
INTRODUCCION.
Antes de comenzar con el contenido de esta unidad, considero conveniente
explicar un poco el manejo de archivos en el lenguaje Java. Esto con el fin de
que comprendan mejor los ejemplos y explicaciones presentes en la Unidad.
Definición de archivos de texto y archivos binarios
Archivos de texto: Es una estructura de datos permanente no estructurada
formada por una secuencia de caracteres ASCII. Los archivos de texto son
aquellos que están compuestos
únicamente por texto sin formato, sólo
caracteres. Estos caracteres se pueden codificar de distintos modos
dependiendo de la lengua usada. Algunos de los sistemas de codificación más
usados son: ASCII, Latín-1, Unicode, etc. Se les conoce también como
archivos de texto plano por carecer de información destinada a generar
formatos y tipos de letra (por ejemplo, tipo de letra: Arial, Times, Courier;
formato: negritas, subrayado, cursivas; tamaño, etc.).
La costumbre ha hecho que se nombren con la extensión de archivo .TXT
aunque pueden tener cualquier otra, a capricho del usuario (son válidas y
habituales .INF .80 .DAT .TMP .PRV .HLP etc.). Los archivos .BAT, .HTML y
muchos otros son también archivos de texto, que tienen funciones especiales.
Archivos binarios: Los archivos binarios son archivos electrónicos que han sido
guardados utilizando el código básico de las computadoras: una sucesión de
ceros y unos. Constituyen, en última instancia, la forma en la cual almacenan la
información, aunque su interacción con los usuarios requiere de lenguajes
auxiliares que resulten más inteligibles al ser humano.
Operaciones Básicas en Archivos.
Crear
Para crear un archivo la sintaxis es:
FileWriter nombre_variable = new FileWriter(“Nombre del archivo incluyendo
ruta”);
Por ejemplo:
FileWriter archivo = new FileWriter("c:/prueba.txt");
En el ejemplo anterior se crea un archivo de nombre prueba.txt ubicado en la
ruta “c:”, pero en NetBeans marcará un error si no se coloca esta línea dentro
de un control de excepciones try y catch. El código funcional es el siguiente:
Instituto Tecnológico de Morelia.
Página 109
ITM Unidad III Sistemas de Archivos
try{
FileWriter archivo = new FileWriter ("C:/prueba.txt");
}
catch (Exception e){
System.out.print("Error al crear el archivo");
}
Si quiere añadir al final de un archivo ya existente, simplemente se debe poner
una bandera (flag) en true como segundo parámetro del constructor de
FileWriter
FileWriter archivo = new FileWriter("c:/prueba.txt",true);
En este ejemplo se añadirán líneas al final del archivo prueba.txt
Abrir
La apertura de un archivo se hace con la siguiente sintaxis:
FileReader nombre_variable = new FileReader(“Nombre del archivo incluyendo
ruta”);
Por ejemplo:
FileReader fr2 = new FileReader("archivo.txt");
Esto es equivalente a:
File archi = new File("archivo.txt");
FileReader fr2 = new FileReader(archi);
Si a la hora de la apertura no se encuentra el archivo indicado, los
constructores de FileReader y FileInputStream
lanzan la excepción
java.io.FileNotFoundException.
Cerrar
Para cerrar un archivo, ya sea de lectura o escritura, utilice el método close().
Sintaxis: Nombre_variable.close();
Este método debe invocarse para liberar los recursos11. Una vez que el archivo
ha sido cerrado, las operaciones posteriores sobre él producirán una excepción
IOException (Excepciones de entrada y salida de datos). Cerrar un archivo
previamente cerrado no tiene ningún efecto.
Para probar las operaciones anteriores el código es el siguiente:
11
Como los descriptores de archivos.
Instituto Tecnológico de Morelia.
Página 110
ITM Unidad III Sistemas de Archivos
try{
FileWriter archivoEsc = new FileWriter ("C:/prueba.txt");
FileReader archivoLee = new FileReader ("C:/prueba.txt");
archivoEsc.close();
archivoLee.close();
}
catch (Exception e){
System.out.print("Error en el archivo");
}
Aunque con lo anterior se logra el objetivo de lectura en los archivos, la clase
FileReader tiene pocos métodos que faciliten la lectura en archivos de texto.
Para ello existe la clase BufferReader. El código para crear un objeto de este
tipo es el siguiente:
FileReader archivoLee = new FileReader ("C:/prueba.txt"); BufferedReader
leerArch = new BufferedReader(archivoLee);
3.1 Acceso secuencial.
En este caso los datos son leídos secuencialmente, desde el comienzo del
archivo hasta el final.
Entrada y salida secuencial en Java
La interfaz básica de entrada y salida secuencial se define a través de las
clases InputStream y OutputStream, su interfaz permite la lectura y escritura de
bytes, el tipo de dato más pequeño disponible en Java e históricamente el
tamaño mínimo de almacenamiento de datos en las computadoras.
Entrada
Como se dijo, la clase base para los distintos tipos de entrada secuencial es
InputStream. Existen varias subclases que implementan distintos tipos de
fuentes de datos secuenciales, algunas de las más usadas son:
• FileInputStream: Permite leer datos desde un archivo.
• ByteArrayInputStream: Permite leer datos desde un bloque de memoria
dado por un arreglo de tipo byte.
• StringBufferInputStream: Lee caracteres desde una cadena de texto.
La interfaz de InputStream provee un acceso muy crudo a los datos, siempre
en forma de bytes. Cuando se habla de E/S, es deseable tener formas para:
Instituto Tecnológico de Morelia.
Página 111
ITM Unidad III Sistemas de Archivos
• Leer distintos tipos de datos además de bytes (por ejemplo: double, int,
boolean, etc.)
• Hacer más eficiente el acceso a los datos mediante la lectura en ráfagas
hacia buffers.
• Volver hacia atrás en la lectura de un archivo.
En Java se define una subclase abstracta de InputStream,
LineNumberInputStream. Esta clase contiene métodos que nos permiten
realizar funciones con las que estamos más familiarizados y consideramos más
accesibles como .read() que nos permiten leer líneas en un archivo. Vemos un
pequeño ejemplo:
Agregue un botón al ejemplo que hemos utilizado hasta el momento, su
objetivo será abrir un archivo de texto creado, leer cada línea que contenga e
imprimirla y al final indicar cuantas líneas fueron leídas en el archivo. Cree el
archivo en el directorio que desee.
private
evt) {
void
leerArchivoMouseClicked(java.awt.event.MouseEvent
try {
File f = new File("C:/prueba.txt");
LineNumberInputStream lin = new
LineNumberInputStream(new FileInputStream(f));
int contador;
do {
contador = lin.read();
if (contador >= 0) {
System.out.print((char) contador);
}
} while (contador >= 0);
System.out.println("\nSe leyeron " +
lin.getLineNumber()+1+ " lineas de texto.");
lin.close();
} catch (IOException ex) {
System.out.println("Error al leer o crear archivo");
}
En el caso anterior la clase LineNumberInputStream es una clase que provee
métodos adicionales para llevar la cuenta del número de líneas leídas desde el
flujo entrante (en este caso proveniente de un archivo). Observe que para crear
un objeto de la clase LineNumberInputStream se necesita un objeto de la clase
FileInputStream quien a su vez necesita un objeto de tipo File.
Las líneas donde se crean estos objetos es la siguiente:
Instituto Tecnológico de Morelia.
Página 112
ITM Unidad III Sistemas de Archivos
File f = new File("C:/prueba.txt");
LineNumberInputStream lin = new
LineNumberInputStream(new FileInputStream(f));
Observe que en el ejemplo, todas las líneas que involucran al archivo
(creación, lectura, etc.) se encuentran dentro de un control de excepciones try,
catch. Si no fuera así, el intérprete nos marcaría un error. Observe además,
que dentro del catch nos dice “IOException ex”. IOException nos indica que
será una excepción de entrada o salida (In, Out) y ex es el nombre con que
conoceremos dicha excepción. Usted puede poner el nombre que desee a una
excepción. También, en lugar de poner IOException, podría poner simplemente
Ecxeption. Para que cualquier tipo de excepción que ocurra se controle por
medio de ese catch.
Recuerde, dentro del catch usted pondrá lo que desea que el programa haga si
ocurre un error de algún tipo. De salida en caso de IOException o cualquier
error en caso de Exception. En este caso queremos que nos muestre un
mensaje explicándonos que tipo de error ocurrió, por eso ponemos la línea:
System.out.println("Error al leer o crear archivo");
Figura 3.1 Programa en ejecución.
Otras clases (más útiles que esta) existentes son:
• BufferedInputStream: Agiliza (y mucho) el acceso a flujos mediante la
lectura de los datos en ráfagas. Los datos, en lugar de ser leídos de a
uno a medida que se invoca al método read(), son leídos de a muchos y
almacenados en una memoria intermedia de contención (buffer).
Instituto Tecnológico de Morelia.
Página 113
ITM Unidad III Sistemas de Archivos
• DataInputStream: Permite leer datos de tipo primitivo desde el flujo en
lugar de sólo enteros de 8 bits (bytes), por ejemplo double, float, int,
long, etc.
Salida
La familia de flujos de salida es análoga a la de entrada, teniéndose subclases
de OutputStream que permiten escribir en distintos medios:
• FileOutputStream: hacia un archivo.
• ByteArrayOutputStream:
hacia
un
bloque
de
memoria
o
bien
decoradores, heredados de FilterOutputStream.
• BufferedOutputStream: escritura en ráfagas.
• DataOutputStream: escritura de datos de otros tipos primitivos además
de byte.
• PrintSteam: permite escribir texto de a líneas (System.out es un ejemplo
de PrintStream).
Ejemplo: Modifique el ejemplo, coloque un nuevo botón para crear un archivo
de texto que pueda utilizar para leerlo y contar la líneas que se escribieron en
el. Justo lo que se hizo en el ejemplo anterior.
private void crearArchivo1MouseClicked(java.awt.event.MouseEvent
evt) {
try{
FileWriter archivoEsc = new FileWriter ("C:/prueba.txt");
PrintWriter escribirArch = new PrintWriter(archivoEsc);
int lineas = Integer.parseInt(JOptionPane.showInputDialog
(campoTexto1, "¿Cuantas Lineas desea ingresar?"));
for(int contador=1; contador<=lineas; contador++ ){
escribirArch.println(JOptionPane.showInputDialog
(campoTexto1, "Escriba la linea "+contador));
}
archivoEsc.close();
}
catch (Exception e){
System.out.print("Error al crear el archivo");
}
}
Instituto Tecnológico de Morelia.
Página 114
ITM Unidad III Sistemas de Archivos
En el ejemplo anterior, se crea el archivo y se presenta una caja de dialogo
preguntando cuantas líneas desea ingresar al archivo y posteriormente se crea
un ciclo en el cual se pide una por una las líneas que se indicaron en la primera
y se escriben en el archivo.
Figura 3.2 Programa en ejecución.
3.2 Acceso directo.
Las clases que hemos analizado hasta ahora, son clases de acceso
secuencial, clases cuyo contenido debe ser leído o escrito secuencialmente.
Esto es increíblemente útil, los archivos de acceso secuencial son
consecuencia de un medio secuencial cómo una cinta magnética. Por otro lado,
los archivos de acceso aleatorio, permiten un acceso no secuencial, o aleatorio
al contenido de un archivo.
Veamos por qué podríamos necesitar archivos de acceso aleatorio.
Consideremos el formato de archivo conocido como "zip". Los archivos Zip
contienen archivos que normalmente están comprimidos para ahorrar espacio.
Estos archivos también contienen una "entrada de directorio" que indica donde
comienzan los distintos archivos contenidos dentro de la carpeta Zip:
Ahora supongamos que queremos extraer un archivo específico de un archivo
Zip. Si utilizáramos una clase de acceso secuencial, tendría que hacer lo
siguiente:
•
Abrir el archivo Zip.
•
Buscar a través del archivo Zip hasta que se localice el archivo que
quiere extraer.
•
Extraer el Archivo.
•
Cerrar el archivo Zip.
Instituto Tecnológico de Morelia.
Página 115
ITM Unidad III Sistemas de Archivos
Como mínimo, utilizando este argumento, habremos tenido que leer medio
archivo Zip antes de encontrar el archivo que quiere extraer. Se puede extraer
el mismo archivo de un archivo Zip de una forma más eficiente utilizando la
característica de búsqueda de un archivo de acceso aleatorio:
•
Abrir el archivo Zip.
•
Buscar en la entrada de directorio y localizar la posición para el archivo
que quiere extraer.
•
Buscar (hacia atrás o adelante) dentro del archivo Zip hasta la posición
del archivo a extraer.
•
Extraer el archivo.
•
Cerrar el archivo Zip.
Este algoritmo es mucho más eficiente porque sólo lee la entrada de directorio
y el archivo que se quiere extraer. (Los archivos .zip que contiene varios
archivos dentro, contienen una breve descripción de las posiciones que ocupa
cada archivo dentro de este. Eso es lo que se lee para saber dónde está el
archivo y extraerlo).
La clase RandomAccessFile del paquete java.io implementa un archivo de
acceso aleatorio.
Utilizar Archivos de Acceso Aleatorio
Al contrario que las clases de acceso secuencial, RandomAccessFile se utiliza
tanto para leer como para escribir archivos. Se puede crear el
RandomAccessFile con diferentes argumentos dependiendo de lo que se
intente hacer, leer o escribir.
La clase RandomAccessFile implementa las interfaces DataInput y DataOutput
y por lo tanto puede utilizarse tanto para leer como para escribir.
RandomAccessFile es similar a FileInputStream y FileOutputStream en que se
especifica un archivo del sistema de archivos nativo para abrirlo cuando se
crea. Se puede hacer esto con un nombre de archivo o un objeto File. Cuando
se crea un RandomAccessFile, se debe indicar si sólo se va a leer el archivo o
también se va a escribir en él. La siguiente línea de código java crea un
RandomAccessFile para leer el archivo llamado prueba.txt:
new RandomAccessFile("prueba.txt", "r");
Y esta otra abre el mismo archivo para leer y escribir:
Instituto Tecnológico de Morelia.
Página 116
ITM Unidad III Sistemas de Archivos
new RandomAccessFile("prueba.txt", "rw");
Después de haber abierto el archivo, se pueden utilizar los métodos comunes
read() o write() para realizar la I/O sobre el archivo. En la siguiente tabla se
muestran algunos de los métodos para leer o escribir que posee esta clase.
Método
read()
write()
readLine()
writeLong()
readShort()
readLong()
readInt()
Función
Lee un byte de información del archivo.
Escribe un byte específico en el archivo.
Lee la siguiente Línea de texto del archivo.
Escribe un dato tipo long en el archivo.
Lee un número con signo de 16 bits del archivo.
Lee un dato tipo long del archivo.
Lee un dato tipo Int del archivo.
Tabla 3.1 Métodos de la clase RandomAccessFile.
Esta clase posee métodos suficientes para leer cualquier tipo de dato nativo de
java, líneas en un archivo, escribir cualquier tipo de dato nativo de java e
incluso métodos para moverse a determinada posición.
RandomAccessFile soporta la noción de puntero de archivo. El puntero de
archivo indica la posición actual dentro del archivo. Cuando el archivo se crea
por primera vez, el puntero de archivo es cero, indicando el principio del
archivo. Las llamadas a los métodos readTipoDeDato() y writeTipoDeDato()
ajustan el puntero de archivo el número de bytes leídos o escritos.
Además de los métodos normales de E/S (Entrada / Salida) que mueven
implícitamente el puntero del archivo cuando ocurre una operación,
RandomAccessFile contiene tres métodos que manipulan explícitamente el
puntero de archivo.
skipBytes() : Mueve el puntero de archivo hacia adelante el número de bytes
especificado.
void seek() : Coloca el puntero del archivo en una posición determinada. La
posición se da como un desplazamiento en bytes desde el comienzo del
archivo. La posición 0 marca el comienzo de ese archivo.
long getFilePointer() : Devuelve la posición actual del puntero de archivo.
long length() : Devuelve la longitud del archivo. La posición length() marca el
final de ese archivo.
Creación de un Archivo de Acceso Aleatorio
Hay dos posibilidades para abrir un archivo de acceso aleatorio:
Con el nombre del archivo:
miRAFile = new RandomAccessFile( String nombre,String modo );
Instituto Tecnológico de Morelia.
Página 117
ITM Unidad III Sistemas de Archivos
Con un objeto File:
miRAFile = new RandomAccessFile( File archivo, String modo );
El argumento modo determina si se tiene acceso de sólo lectura (“r”) o de
lectura/escritura (“r/w”). Por ejemplo, se puede abrir un archivo de una base de
datos para actualización:
RandomAccessFile miRAFile;
miRAFile = new RandomAccessFile( "/tmp/kk.dbf","rw" );
Actualización de Información
Se pueden utilizar archivos de acceso aleatorio para añadir información a
archivos existentes:
Ejemplo: Agregar un botón a la aplicación de escritorio que cree un archivo de
acceso aleatorio, se mueva al final del archivo y agregue algunas líneas de
información.
private void crearRAFMouseClicked(java.awt.event.MouseEvent
evt) {
try {
//Cada vez que demos clic sobre este botón,
//se incorporara una nueva
//línea al archivo de log que se crea
//la primera vez que se ejecuta
RandomAccessFile miRAFile;
String s = "Informacion a incorporar";
// Abrimos el archivo de acceso aleatorio
miRAFile = new RandomAccessFile("C:/prueba.txt", "rw");
// Nos vamos al final del archivo
miRAFile.seek(miRAFile.length());
miRAFile.writeBytes(s);
miRAFile.close();
} catch (IOException ex) {
System.out.println("Error
archivo");
}
}
Instituto Tecnológico de Morelia.
al
Abrir
el
Página 118
ITM Unidad III Sistemas de Archivos
Figura 3.3 Ejemplo con RandomAccessFile.
Como puede observar la información se escribe de manera consecutiva, en la
misma línea. Este tipo de archivo es muy útil cuando se conoce la estructura
exacta de algún archivo y se desea introducir información en determinado lugar
o después de determinada cantidad de bytes.
Observe que debido a sus características, usted es capaz de regresar a cierta
posición en el archivo o ir de nuevo al inicio si así lo requiere para alguna
aplicación.
Leer y Escribir objetos (Serialización).
La serialización es una característica de objetos (cuya clase implementa la
interfaz Serializable) que les permite convertirse en una secuencia de bytes
que pueden ser posteriormente leídos para restaurar al objeto original. Esta
característica se mantiene incluso al mandar la información por alguna red sin
importar si quiera si se envía de un sistema operativo a otro distinto.
Para hacer una clase serializable, esta debe implementar la interfaz
Serializable por ejemplo:
public class MiClase implements java.io.Serializable{
private int[] x;
private int n;
//otros miembros...
}
Hay dos clases que se especializan en la lectura y escritura de objetos. Estas
clases con: ObjectInputStream y ObjectOutputStream. Estas clases ayudan en
la lectura y escritura de clases que implementan serialización, como la del
ejemplo anterior.
Para escribir objetos siga los siguientes pasos:
1. Creamos un objeto de la clase “MiClase” o cualquiera que implemente
serialización.
MiClase objetoAEscribir = new MiClase(new [] {1,2,3,4,5});
Estamos creando un arreglo de enteros para que el objeto tenga algo de
información.
Instituto Tecnológico de Morelia.
Página 119
ITM Unidad III Sistemas de Archivos
2. Creamos un flujo de salida. O sea un objeto FileOutputStream, le
pasamos el nombre del archivo en el que queremos escribir o el objeto
file que contenga dicha información (Estos métodos se analizaron
anteriormente).
FileOutputStream fileOut=new FileOutputStream("prueba.obj");
3. Ya creamos un flujo de salida a un archive, sin embargo, necesitamos
relacionar el objeto que acabamos de crear con uno de la clase
ObjectOutputStream que es el que procesa los datos.
ObjectOutputStream flujoSalida=new ObjectOutputStream(fileOut);
O puede unir los dos pasos anteriores con la siguiente línea:
ObjectOutputStream flujoSalida=new ObjectOutputStream(new
FileOutputStream("prueba.obj"));
4. El objeto flujoSalida puede utilizar ahora al método writeObject para
escribir los objetos en un archivo en el disco duro. Por ejemplo, para
escribir un objeto de la clase MiClase y un String el código es el
siguiente:
flujoSalida.writeObject("Esta String se guardará\n");
flujoSalida.writeObject(onjetoAEscribir);
5. Por último, se cierran los flujos de salida.
flujoSalida.close();
El código completo se vería de la siguiente manera:
MiClase objetoAEscribir= new MiClase(new int[]{12, 15, 11, 4,
32});
FileOutputStream fileOut=new FileOutputStream("prueba.obj");
ObjectOutputStream flujoSalida=new
ObjectOutputStream(fileOut);
flujoSalida.writeObject("guardar este string y un objeto\n");
flujoSalida.writeObject(lista1);
flujoSalida.close();
Para leer objetos siga los siguientes pasos:
Instituto Tecnológico de Morelia.
Página 120
ITM Unidad III Sistemas de Archivos
1. Creamos un objeto de la clase FileInputStream, éste será nuestro flujo
de entrada al archivo. Le pasamos el nombre y directorio del archivo que
deseamos utilizar o un objeto file que contenga el dato.
FileInputStream fileIn=new FileInputStream("media.obj");
2. El flujo de entrada ObjectInputStream es el que procesa los datos, se
debe vincular al objeto de la clase FileInputStream que creamos.
ObjectInputStream flujoEntrada=new ObjectInputStream(fileIn);
3. El objeto flujoEntrada posee ahora los métodos necesarios para leer
objetos que se encuentren en un archivo. El método que llama
readObject se encarga de leer objetos del flujo de entrada, o sea, el
archivo. Por ejemplo, para leer un objeto String y un objeto de MiClase
las líneas son las siguientes:
String str=(String)flujoEntrada.readObject();
MiClase obj=(MiClase)flujoEntrada.readObject();
4 Utilice los objetos recuperados. Una vez que llega a este punto, puede
disponer de los objetos como le plazca, puede utilizar sus métodos o
propiedades para lo que sea que los haya recuperado de la misma manera que
lo hace habitualmente. Por ejemplo, imprimiremos un dato del objeto obj y al
objeto str.
System.out.println("Valor de n "+obj1.n);
System.out.println(“El objeto String contiene ”+str);
5. Y por último, al igual que al escribir objetos, se cierran los flujos.
flujoEntrada.close();
Modificador transient
El escribir objetos muchas veces se utiliza para mandarlos por medio de
archivos a través de internet, esto podría ser un problema si usted transporta
información importante o secreta. Por ello existe el modificador transient, este
modificador protege los datos de un objeto cuando lo escribimos en un archivo.
Este modificador se utiliza de la siguiente manera:
public class MiClase implements java.io.Serializable{
private int[] x;
private transient int n;
//otros miembros...
}
Instituto Tecnológico de Morelia.
Página 121
ITM Unidad III Sistemas de Archivos
Como puede ver, únicamente debe colocar la palabra transient antes del tipo
de dato. Para escribir un objeto que contenga este tipo de protección, el
proceso es el mismo.
3.3 Manejo de archivos.
El manejo de archivos en java es el conjunto de operaciones que se pueden
realizar con ellos en sus respectivos tipos. A lo largo de esta unidad estos
procesos fueron ya explicados para que se comprendiera mejor la explicación
de cada tema por lo que en este apartado se explicarán algunas otras
herramientas útiles para el manejo de archivos en java que no se mencionaron
anteriormente.
Clase JFileChooser
La clase JFileChooser proporciona una interfaz al usuario para elegir un
archivo de una lista. Un selector de archivos es un componente que podemos
situar en cualquier lugar del GUI (interfaz Gráfica de Usuario) de nuestro
programa. Sin embargo, normalmente los programas los muestran en diálogos
modales porque las operaciones con archivos son sensibles a los cambios
dentro del programa (Recuerde, un cuadro de diálogo modal no permite que el
programa siga interactuando con el usuario hasta que se cierre). La clase
JFileChooser hace sencillo traer un diálogo modal que contiene un selector de
archivos.
Los selectores de archivos se utilizan comúnmente para dos propósitos.
•
Para presentar una lista de archivos que pueden ser abiertos por la
aplicación.
•
Para permitir que el usuario seleccione o introduzca el nombre de un
archivo a grabar.
Recuerde que hasta ahora, en todos los ejemplos relacionados con archivos,
debemos introducir el directorio y nombre del archivo que queremos abrir, con
esta clase, podremos elegir el archivo que deseemos abrir o guardar con el
nombre que queramos sin tener que predefinir nada en el código con relación a
estos nombres.
Es conveniente aclarar que el selector de archivos ni abre ni graba archivos.
Presenta una GUI para elegir un archivo de una lista. El programa es
responsable de hacer algo con el archivo, como abrirlo o grabarlo.
Como la mayoría de los programadores sólo quieren un selector para abrir o
para grabar archivos, la clase JFileChooser proporciona los métodos
convenientes para mostrar estos tipos de selectores de archivos en un diálogo.
Nuestro primer ejemplo ilustra estos usos.
Instituto Tecnológico de Morelia.
Página 122
ITM Unidad III Sistemas de Archivos
Ejemplo: Agregue dos botones a una aplicación de escritorio y programe los
eventos correspondientes para que uno permita abrir un archivo de una lista y
el otro permita guardar un archivo con un nombre cualquiera.
Figura 3.4 Ejemplo usando la clase JFileChooser.
Cuando se pulsa el botón “Abrir Archivo” el programa trae un open file
chooser. Cuando se pulsa el botón “Guardar Archivo” el programa trae un
save file chooser. Aquí podemos ver una imagen de un selector de apertura de
archivos.
Figura 3.5 Selector de apertura
El código que crea y muestra el selector de apertura de archivos es el
siguiente.
Instituto Tecnológico de Morelia.
Página 123
ITM Unidad III Sistemas de Archivos
private void abrirArchivoMouseClicked(java.awt.event.MouseEvent
evt) {
JFileChooser fileChooser = new JFileChooser();
int valor = fileChooser.showOpenDialog(fileChooser);
//Guardamos el valor de retorno para saber si se abrió
//o no un archivo, Otras utilidades se explicarán
//adelante.
}
Por defecto, un selector de archivos que no haya sido mostrado anteriormente
muestra todos los archivos en el directorio del usuario. Podemos especificarle
un directorio inicial utilizando uno de los otros constructores de JFileChooser, o
podemos seleccionar el directorio directamente con el método
setCurrentDirectory.
El programa de ejemplo utiliza el mismo ejemplar de JFileChooser para mostrar
el selector de grabar archivos. El código es el siguiente:
private
guardarArchivoMouseClicked(java.awt.event.MouseEvent
void
evt)
{
JFileChooser fileChooser = new JFileChooser();
int valor = fileChooser.showSaveDialog(fileChooser);
}
Utilizando el mismo selector de archivos para abrir y grabar archivos, el
programa consigue estos beneficios.
•
El selector recuerda el directorio actual entre usos, por eso los diálogos
de abrir y grabar comparten el mismo directorio actual.
•
Sólo tenemos que personalizar un selector de archivos, y nuestra
personalización se aplicará a las dos versiones, la de apertura y la de
grabación.
Cómo hemos podido ver en los fragmentos de código anteriores, los métodos
showOpenDialog() y showSaveDialog() devuelven un entero que indica si el
usuario ha seleccionado un archivo. Podemos utilizar el valor de retorno para
determinar si realizar o no la operación requerida.
Si el usuario elige un archivo, el código llama a getSelectedFile (del objeto
fileChooser) sobre el selector de archivos para obtener un ejemplar de File, que
representa el archivo elegido. Podemos utilizar otros métodos del objeto File,
como getPath o isDirectory, para obtener información sobre él. También
podemos llamar a otros métodos como delete y rename para cambiar el archivo
Instituto Tecnológico de Morelia.
Página 124
ITM Unidad III Sistemas de Archivos
de alguna forma. Por supuesto, podríamos leer o grabar el archivo utilizando
una de las clases lectoras o escritoras proporcionadas
Anteriormente abríamos un archivo indicando la ruta y nombre del mismo, con
los métodos de fileChooser como getPath podemos hacer lo mismo que antes
pero sin especificar solo un archivo.
Si quieres crear un selector de archivos para una tarea distinta de abrir o
grabar, o si quieres personalizar el selector de archivos, sigue leyendo.
Selectores de Archivos Personalizados
Como hemos visto, JFileChooser proporciona un método para mostrar un
selector de apertura de archivos y otro método para mostrar un selector para
grabar archivos. En aspecto y comportamiento, la única diferencia entre estos
dos selectores es el título de la ventana del diálogo y la etiqueta del botón
"accept".
La clase tiene un tercer método, showDialog, para mostrar un selector de
archivos para una tarea personalizada. Aquí podemos ver el código que
muestra el diálogo selector de archivos para la tarea Enviar.
private
void
abrirArchivoMouseClicked(java.awt.event.MouseEvent
evt)
{
JFileChooser fileChooser = new JFileChooser();
int valor = fileChooser.showDialog(fileChooser,
"Enviar");
}
Figura 3.6 Selector personalizado.
El primer argumento del método showDialog es el componente padre para el
diálogo. El segundo argumento es un String que proporciona tanto el título de la
ventana de diálogo como la etiqueta del botón "accept".
Instituto Tecnológico de Morelia.
Página 125
ITM Unidad III Sistemas de Archivos
De nuevo, el selector de archivos no hace nada con el archivo seleccionado. El
programa es responsable de implementar la tarea personalizada para la que se
creó el selector de archivos.
Filtrar la lista de archivos
Por defecto, un selector de archivos muestra todos los archivos y directorios
que detecta. Un programa puede aplicar uno o más filtros de archivos a un
selector de archivos para que el selector sólo muestre algunos de ellos. El
selector de archivos llama al método accept del filtro con cada archivo para
determinar si debería ser mostrado. Un filtro de archivos acepta o rechaza un
archivo basándose en algún criterio como el tipo, el tamaño, el propietario, etc.
JFileChooser soporta tres clases de filtrado. Los filtros se checan en el orden
aquí listado. Por eso un filtro del segundo tipo solo puede filtrar aquellos
archivos aceptados por el primero, etc.
Filtrado interno: El filtrado se configura a través de llamadas a métodos
específicos de un selector de archivos. Actualmente el único filtro interno
disponible es para los archivos ocultos. Se llama a setFileHidingEnabled(true) y
sirve para desactivar la selección de archivos ocultos (como aquellos que
empiezan con '.' en sistemas UNIX).
Filtrado controlado por la aplicación: La aplicación determina los archivos a
mostrar. Se crea una subclase de FileFilter, y se utiliza como un argumento
para setFileFilter. El selector de archivos sólo mostrará los archivos que acepte
el filtro.
Filtrado seleccionable por el usuario: La GUI selector de archivos proporciona
una lista de filtros de la que el usuario puede elegir uno. Cuando el usuario
elige un filtro, el selector de archivos muestra sólo aquellos archivos que acepte
el filtro. En el siguiente ejemplo se añade un filtro de archivos personalizado a
su lista de filtros seleccionables del selector de archivos.
Ejemplo: Cree un botón en nuestra aplicación o edite uno ya existente para que
al dar clic, muestre un selector de archivos personalizado. Crear un filtro
personalizado para que el selector de archivos muestre únicamente los
archivos cuya extensión pertenezca a una imagen. Para ello deberá crear una
clase separada que herede las propiedades de la clase FileFilter.
El código del botón es:
private
evt) {
void
abrirArchivoMouseClicked(java.awt.event.MouseEvent
JFileChooser fileChooser = new JFileChooser();
int valor = fileChooser.showDialog(fileChooser,
"Abrir Imagen");
Filtro imagenes = new Filtro();
fileChooser.addChoosableFileFilter(imagenes);
}
Instituto Tecnológico de Morelia.
Página 126
ITM Unidad III Sistemas de Archivos
Lo que se hace es lo siguiente:
a. Creamos un objeto FileChooser, este nos ayuda a mostrar los
selectores de archivos.
b. Guardamos el valor de retorno que nos indica que botón del
selector se presionó para realizar lo que deseemos. Al mismo
tiempo, se está personalizando la ventana para mostrar un texto
diferente en el botón “accept”, “Abrir Imagen” en este caso.
c. Creamos una instancia de la clase que representa al filtro.
Filtro.java que hicimos. Esta se muestra a continuación.
d. Agregamos el filtro a nuestro FileChooser. Este método, recibe
como parámetro un objeto FileFilter. Debido a esto, la clase que
nosotros diseñamos (Filtro.java) debe heredar las características
de FileFilter.
El filtro personalizado se implementa en Filtro.java, como una subclase de
FileFilter. La clase Filtro implementa el método getDescription() para devolver
un string y ponerlo en la lista de filtros seleccionables. Como muestra en el
código de la clase Filtro, se implementa el método accept para aceptar todos
los directorios y cualquier archivo que tenga las extensiones ".jpg", ".jpeg",
".gif", ".tif", or ".tiff".
El código de la clase que representa al filtro es el siguiente: El nombre de la
clase en Filtro.java
package aplicaciondeescritorio;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.*;
//debe heredar de FileFilter para que se pueda usar la
//clase en el método que la utiliza.
public class Filtro extends FileFilter{
final static String jpeg = "jpeg";
final static String jpg = "jpg";
final static String gif = "gif";
final static String tiff = "tiff";
final static String tif = "tif";
Instituto Tecnológico de Morelia.
Página 127
ITM Unidad III Sistemas de Archivos
// Acepta todos los directorios y los archivos gif, jpg,
//o tiff.
public boolean accept(File f) {
if (f.isDirectory()) {
return true;
}
String s = f.getName();
int i = s.lastIndexOf('.');
//Buscamos después del punto en cada archivo para saber su
//ext.
if (i > 0 && i < s.length() - 1) {
String extension =
s.substring(i+1).toLowerCase();
if (tiff.equals(extension) ||
tif.equals(extension) ||
gif.equals(extension) ||
jpeg.equals(extension) ||
jpg.equals(extension)) {
return true;
} else {
return false;
}
}
return false;
}
// Método que nos muetra la descripcion del filtro
public String getDescription() {
return "Solo Imagenes";
}
}
Como al principio se indica que esta clase pertenece al mismo paquete de
nuestra aplicación (package aplicaciondeescritorio;), no es necesario importarla
en ella para instanciar.
Aceptando todos los directorios, este filtro permite al usuario navegar a través
del sistema de archivos. Si se omitieran las líneas en negrita de este método, el
usuario se vería limitado al directorio en que se inicializó el selector de
archivos.
A continuación, los métodos relacionados con lo aprendido y una breve
descripción de su funcionamiento.
Crear y Mostrar un Selector de Archivos
Método
Instituto Tecnológico de Morelia.
Propósito
Página 128
ITM Unidad III Sistemas de Archivos
JFileChooser()
JFileChooser(File, FileSystemView)
JFileChooser(File)
JFileChooser(FileSystemView)
JFileChooser(String, FileSystemView)
JFileChooser(String)
int showOpenDialog(Component)
int showSaveDialog(Component)
int showDialog(Component, String)
Crea un ejemplar de JFileChooser.
Muestra un diálogo modal
conteniendo el selector de archivos.
Tabla 3.2 Métodos para crear y mostrar un selector de archivos.
Navegar por la Lista del Selector de Archivos
Método
void ensureFileIsVisible(File)
void setCurrentDirectory(File)
File getCurrentDirectory
void changeToParentDirectory()
void rescanCurrentDirectory()
Propósito
Fuerza el archivo indicado a ser
visible en la lista de archivos.
Selecciona u obtiene el directorio
cuyos archivos se están mostrando en
el selector de archivos.
Cambia la lista para mostrar el
directorio padre del directorio actual.
Comprueba el sistema de archivos y
actualiza la lista del selector.
Personalizar el Selector de Archivos
Método
JComponent getAccessory()
void setAccessory(JComponent)
void setFileFilter(FileFilter)
FileFilter getFileFilter()
void setFileView(FileView)
FileView getFileView()
FileFilter[] getChoosableFileFilters()
void setChoosableFileFilters
(FileFilter[])
void addChoosableFileFilter(FileFilter)
boolean removeChoosableFileFilter
(FileFilter)
void resetChoosable(FileFilter)
FileFilter getAcceptAllFileFilter()
void setFileHidingEnabled(boolean)
boolean isFileHidingEnabled()
Propósito
Selecciona u obtiene el accesorio del
selector de archivos.
Selecciona u obtiene el filtro primario
del selector de archivos.
Selecciona u obtiene el visor de
archivos del selector.
Selecciona, obtiene o modifica la lista
de filtros seleccionables.
Selecciona u obtiene si se muestran
los archivos ocultos.
Tabla 3.3 Métodos para personalizar el selector de archivos.
Seleccionar Archivos y Directorios
Método
void setFileSelectionMode(int)
Instituto Tecnológico de Morelia.
Propósito
Selecciona el modo de selección de
Página 129
ITM Unidad III Sistemas de Archivos
int getFileSelectionMode()
archivos. Los valores aceptables son
boolean isDirectorySelectionEnabled() FILES_ONLY,
DIRECTORIES_ONLY,
y
boolean isFileSelectionEnabled()
FILES_AND_DIRECTORIES.
void setMultiSelectionEnabled
Selecciona u obtiene si se pueden
(boolean)
seleccionar varios archivos a la vez.
boolean isMultiSelectionEnabled()
void setSelectedFile(File)
Selecciona u obtiene el archivo
File getSelectedFile()
actualmente seleccionado.
void setSelectedFiles(File[])
Selecciona u obtiene los archivos
File[] getSelectedFiles()
actualmente seleccionados.
Tabla 3.4 Métodos para seleccionar archivos y directorios.
3.4 Controlar errores en tiempo de ejecución.
En todo programa existen errores inesperados en tiempo de ejecución, y
también errores que no consideramos debido a nuestra propia inexperiencia
como programadores. Algunos de estos errores ocurren por ejemplo, al intentar
acceder a un elemento del arreglo que está fuera del límite de nuestro arreglo,
o cuando intentamos acceder a un archivo inexistente, entre otros.
Normalmente estos errores interrumpen el flujo de ejecución de nuestros
programas, hasta el extremo de provocar la terminación del programa en forma
inmediata. Java hace uso de las excepciones12 para poder controlar los errores
en tiempo de ejecución. En Java, casi todos los tipos de errores que puedan
surgir en tiempo de ejecución lanzan excepciones, es decir, cuando ocurre un
error dentro de un método de Java, este método crea un objeto Exception,
dicho objeto contiene información sobre la excepción, que incluye su tipo y el
estado del programa cuando ocurrió el error. El sistema de ejecución es el
responsable de buscar algún código para manejar el error. El manejo de
excepciones en Java sigue una estructura como esta:
try {
//Codigo donde puede ocurrir un error
}
catch (ExcepcionA ex) { // Que se va a hacer en caso que
se lance una Excepcion A }
...
catch (ExcepcionZ ex) { // Que se va a hacer en caso que
se lanze una Excepcion Z }
Por ejemplo: el siguiente es el código de un botón de nuestro ejemplo que se
encarga de crear un archivo de acceso aleatorio, se ubica al final del archivo y
agrega algo de información.
12
Una excepción es un evento que ocurre durante la ejecución del programa, de forma que interrumpe el flujo normal de las
sentencias.
Instituto Tecnológico de Morelia.
Página 130
ITM Unidad III Sistemas de Archivos
private
evt) {
void
crearRAFMouseClicked(java.awt.event.MouseEvent
try {
// Cada vez que demos clic sobre este botón, se
//incorporara una nueva línea al archivo de
// log que se crea la primera vez que se ejecuta
RandomAccessFile miRAFile;
String s = "Informacion a incorporar";
// Abrimos el archivo de acceso aleatorio
miRAFile =
new RandomAccessFile("C:/prueba.txt", "rw");
// Nos vamos al final del archivo
miRAFile.seek(miRAFile.length());
miRAFile.writeBytes(s);
miRAFile.close();
} catch (IOException ex) {
System.out.println("Error al Abrir el archivo");
}
}
Dentro del bloque try { } viene encerrada la parte del programa que se desea
manejar sus excepciones. El código dentro de algún catch (TipoDeExcepcion
e) se ejecuta en caso de que se lance una excepción TipoDeExcepcion o que
pertenezca al grupo TipoDeExcepcion. El sistema de ejecución Java busca rar
el método que esté interesado en manejar una excepción particular. Es decir si
se lanza una excepción en el método A, pero si A no está interesado en
manejar dicha excepción, entonces el sistema de ejecución Java ve quién
llamó a A (supongamos que si existe, y es el método B), entonces se regresa a
B y ve si está interesado en dicha excepción, y así consecutivamente hasta
llegar al método principal de nuestra aplicación. En caso de no encontrar
alguien que quiera manejarlo, comúnmente Java manda una lista de mensajes
en nuestra ventana de consola, y en muchos casos se termina la ejecución de
nuestro programa. Cuando manejamos excepciones, podemos manejar
excepciones en forma específica (por ejemplo, usar un índice que está fuera de
los límites de nuestro arreglo), o manejar una excepción de cierta categoría
(por ejemplo, una excepción lanzada por mal uso de un arreglo de datos), o
manejar todas las excepciones en su conjunto. Para el primer caso, es
necesario este código:
catch(ArrayIndexOutOfBoundsException e){ }
Para el segundo:
catch (ArrayException e){}
Y para el último
catch (Exception e){ }
Instituto Tecnológico de Morelia.
Página 131
ITM Unidad III Sistemas de Archivos
En la práctica no es recomendable hacer uso de manejadores de excepciones
demasiado generales, como la del último caso. Las excepciones son parte de
Java, y es muy común usarlos en las operaciones E/S, ya que es donde más
probabilidad hay de que se lance una. El uso de try y catch se abordo a fondo
en la primera unidad de este libro.
Instituto Tecnológico de Morelia.
Página 132
ITM Unidad III Sistemas de Archivos
EJERCICIOS PROPUESTOS.
3.1 Para continuar con nuestro proyecto de la calculadora, ahora
implementaremos archivos en ella. Deberá crear un archivo en donde contenga
una lista de nombres, nombres de usuario y contraseñas, estructure el archivo
como crea que le convenga, ya sea separando el nombre y la contraseña por
un carácter o simplemente basándose en las posiciones. El objetivo será que el
programa pida un nombre de usuario y una contraseña, revisará que se el
usuario este registrado en el archivo de texto y dará o no acceso a la
aplicación. El programa utilizara las columnas de nombre y contraseña para
validar el acceso a nuestra calculadora y el campo de nombre para mostrarlo
en alguna parte de la calculadora con la leyenda “Usuario:
nombre_del_usuario. “ Después, tendrá que agregar un menú que le permita
agregar, eliminar, modificar o consultar usuarios. Agregue los objetos que
considere necesarios.
NOTA: Puede leer y manipular la información en arreglos y almacenar en
archivo solo al momento de entrar o salir de la aplicación.
Ejemplos del archivo de texto:
3.2 Programe una pequeña función que le permita leer un archivo de entrada y
le diga cuantas palabras encontró en el mismo.
3.3 Diseñe un programa que le permita leer un archivo en su totalidad y que le
diga cuantas veces encontró cierta palabra en él. El usuario deberá especificar
que palabra desea buscar y elegir el archivo de entrada.
3.4 Programe una aplicación que le permita consultar el contenido de un
archivo de texto, se le proporcionaran dos datos al programa, una palabra que
se desea buscar y otra palabra con la que se desea sustituir la anterior. El
Instituto Tecnológico de Morelia.
Página 133
ITM Unidad III Sistemas de Archivos
programa buscará la primera palabra y la sustituirá por la segunda y al final
creará un nuevo archivo.
3.5. Implemente la utilización de archivos para manipular la información de una
agenda electrónica. Este programa le permitirá crear, borrar, modificar o
consultar de uno o varios archivos la información de sus amigos, familiares y
conocidos. Utilice la clase JOptionPane para permitir que el usuario seleccione
el archivo con el que se desea trabajar en lugar de especificar un directorio fijo.
Lea la información de un(os) archivo(s) con una estructura especifica, manipule
la información en arreglos y almacene la información al salir de la aplicación. La
información almacenada es el nombre y su número telefónico únicamente.
3.6 Diseñe y programe las clases necesarias para crear una aplicación que le
permita manipular una lista de alumnos y sus calificaciones almacenada en un
archivo de texto. Deberá ser capaz de ordenar a los alumnos por su nombre o
por sus calificaciones. Además, deberá ser capaz de agregar nuevos alumnos
a su lista o eliminar registros existentes. Luego de tener una lista en orden,
deberá ser capaz de guardar dicha lista ordenada en un archivo distinto al
archivo de origen.
3.7 Crear un programa traductor del idioma inglés. Para ello, introduzca un
archivo que contenga las palabras que pueden ser traducidas, cuando el
usuario escriba una palabra en ingles, el programa leerá el archivo y buscará el
significado para mostrarlo en la pantalla.
3.8 Desarrolle una aplicación que lea un archivo que contiene una lista de
nombres con diferentes longitudes. El programa deberá comprobar que todos
los nombres midan menos de 20 caracteres, de lo contrario deberá ajustarlo a
este tamaño, elimine espacios en blanco que se encuentren en los extremos (si
es que los hay) antes de comprobar el tamaño. Cree un nuevo archivo con los
nombres filtrados y haga que el programa le diga cuantos registros fueron
modificados para que su tamaño correspondiera.
3.9 Programe lo necesario para crear una aplicación que le permita leer de un
archivo una lista de personas, su dirección y su teléfono. Las columnas
deberán medir: nombre, 20 caracteres, dirección 60 caracteres y teléfono 20
caracteres. El programa deberá rellenar con espacios en blanco lo necesario
para que haya 3 columnas con los datos exactamente en ese formato. El
archivo de entrada puede tener algún formato en específico pero el de salida
deberá tener la estructura mencionada.
3.10 Diseñe un programa que lea de un archivo una lista de valores numéricos
(teléfonos) y busque si hay alguno repetido. El programa le notificará que
número y cuantas veces esta repetido.
Instituto Tecnológico de Morelia.
Página 134
ITM Unidad III Sistemas de Archivos
PROYECTO INTEGRAL
El siguiente es un proyecto relativamente sencillo que se desarrolló en la
empresa Konexo de grupo posadas (Morelia) para facilitar un proceso de
filtrado de información para ciertas aplicaciones que trabajan utilizando
archivos de texto con formato de posiciones.
El programa consiste en tomar como entrada un archivo de Excel o pasar la
información que contenga dicho archivo separada por algún carácter a otro
archivo de texto para que la información se pueda separa en columnas (Las
columnas dentro de un archivo de texto plano se identifican por los caracteres
de separación como “#”, “’”, “|”, etc.). Las columnas más comunes son:
Nombre, apellido paterno, apellido materno, dirección, ciudad y número
telefónico.
El objetivo es obtener como salida un archivo de texto plano con la siguiente
estructura:
ESTRUCTURA DEL ARCHIVO DE SALIDA.
ID
2
3
7
8
9
10
11
12
13
12
12
14
13
Descripción del campo
Tipo de producto
Tipo de solicitud
NSS
CURP
Ap. Paterno
Ap. Materno
Nombres
Telefono casa
Telefono oficina
Telefono celular
Telefono patrón
Extension oficina
Extension patron
Tipo de dato
Numérico
Numérico
Numerico
CHAR
CHAR
CHAR
CHAR
CHAR
CHAR
CHAR
CHAR
CHAR
CHAR
Longitud
6
6
11
18
40
40
40
20
20
20
20
6
6
Pos Inicial
1
7
13
24
42
82
122
162
182
202
222
242
248
Pos Final
6
12
23
41
81
121
161
181
201
221
241
247
253
Comentarios
1 AFORE
1 Afiliación 2 Traspaso
número de seguro social
Clave CURP
Apellido Paterno
Apellido Materno
Nombres
Teléfono del domicilio del trabajador
Teléfono de la oficina del trabajador
Teléfono celular del trabajador
Teléfono del jefe el trabajador
Extensión de oficina del trabajador
Extensión del oficina del jefe
Los campos de tipo de producto y tipo de solicitud se rellenan con: 000001 en
cada registro y los datos que no existen en nuestro archivo de entrada como
Teléfono del patrón, teléfono celular y demás. Se rellenan con espacios en
Instituto Tecnológico de Morelia.
Página 135
ITM Unidad III Sistemas de Archivos
blanco. El único campo que no se deberá quedar en blanco es el NSS, pero
como no lo tenemos llenamos los campos con 00000000001, 00000000002 y
así sucesivamente para cada registro.
Un ejemplo del archivo final es:
Las validaciones son las siguientes:
•
Se necesitan por lo menos 10 dígitos en el número telefónico (solo
números). Los registros que no cumplan con esto se eliminan junto
con los datos que los acompañan. (No deben tener espacios,
diagonales, paréntesis, menos de 10 dígitos, guiones medios, letras,
etc.).
•
Rellenar con espacios en blanco cada campo para que se completen
un número determinado de caracteres por línea.
En resumen, debe leer del archivo de Excel las diferentes columnas o extraer la
información a un archivo de texto que le permita realizar las validaciones
necesarias a los registros. La aplicación real obedece más validaciones y
reglas pero para nuestro proyecto creo que con esto será suficiente.
Instituto Tecnológico de Morelia.
Página 136
Unidad 4. Acceso a Datos
Bases de Datos.
ITM Unidad IV Acceso a Datos
4.1 Introducción.
En esta unidad trabajaremos sobre bases de datos, sin embargo, no es objetivo
de esta unidad profundizar demasiado en el tema, mas bien, el dar al
estudiante una idea del funcionamiento y los beneficios de utilizar una base de
datos y también presentarle superficialmente algunas nuevas tecnologías
diseñadas para trabajar con ellas que además de proporcionar un mejor diseño
a la estructura de una aplicación, ayudan muchísimo a un funcionamiento
mucho más eficiente.
Como podrá recordar, el desarrollo de este material se basa en el lenguaje
java, sin embargo, adicionalmente a los temas que se deben desarrollar de
acuerdo al temario, explicaré y ejemplificare el uso de tecnologías
importantísimas relacionadas con el lenguaje java, que además son
equivalentes a las que se piden en el temario pero que son basadas en otros
lenguajes como Visual Basic. Es necesario mencionar que debido a que las
bases de datos son objeto de estudio en materias posteriores, aquí solo daré
una breve introducción. Dando así al estudiante los conocimientos necesarios
para facilitar el aprendizaje futuro.
Para ello utilizaremos la herramienta de java JDBC13. Como manejador de
bases de datos utilizaremos MySQL.
JDBC fue diseñado para mantener sencillas las cosas sencillas. Esto significa
que el API14 JDBC hace muy sencillas las tareas diarias de una base de datos,
como una simple sentencia SELECT. Esta sección nos llevará a través de
ejemplos que utilizan el JDBC para ejecutar sentencias SQL15 comunes, para
que podamos ver lo sencilla que es la utilización del API JDBC básico.
Al final de esta primera sección, sabremos cómo utilizar el API básico del JDBC
para crear tablas, insertar valores en ellas, pedir tablas, recuperar los
resultados de las peticiones y actualizar las tablas. En este proceso,
aprenderemos como utilizar las sentencias sencillas y veremos un ejemplo de
un procedimiento almacenado. También aprenderemos como realizar
transacciones y como capturar excepciones y avisos.
Instalar Componentes Necesarios.
Para crear una aplicación que utiliza una base de datos debemos conectar
nuestro programa hecho en con el lenguaje java en NetBeans con el manejador
de la base de datos MySQL. Lo primero que debemos hacer antes de conectar
Java con MySQL en NetBeans es instalar ambos. En la primera unidad vimos
como
instalar NetBeans. Para MySQL, no solo instalaremos MySQL,
instalaremos un paquete llamado Appserv16.
13
Java Database Connectivity, es un API que permite ejecutar operaciones sobre una base de datos.
Del inglés Application Programming Interface – Interfaz de Programación de Aplicaciones.
15
Structured Query Language – Lenguaje estructurado para consultas en una base de datos.
16
Es un paquete que instalará en la PC Apache, PHP, MySQL y phpMyAdmin, dejando las aplicaciones configuradas para su
funcionamiento.
14
Instituto Tecnológico de Morelia.
Página 138
ITM Unidad IV Acceso a Datos
Appserv es una herramienta OpenSource para Windows que facilita la
instalación de Apache, MySQL y PHP en una sola herramienta, esta
característica facilita la tarea al usuario ya que se configuran las aplicaciones
de forma automática y quedan listas y funcionando.
AppServ incluye:
• Apache 2.2.8: servidor HTTP multiplataforma.
• PHP 5.2.6: lenguaje de programación dinámico que utilizan la mayoría
de gestores de contenidos más populares. Se integra a la perfección con
MySQL y Apache.
• MySQL 5.0.51b: gestor de bases de datos, rápido y seguro.
• phpMyAdmin 2.10.3: interfaz gráfica de administración para MySQL.
Una vez instalado AppServ, dispondremos de un servidor web y otro de base
de datos propio, configurado de manera local, y que nos permitirá realizar todas
las pruebas necesarias en nuestra aplicación.
La instalación de este paquete es conveniente para explicar de manera más
adecuada y comprensible lo relacionado con la base de datos. Para ello se
necesita phpMyAdmin.
phpMyAdmin es una herramienta escrita en PHP con la intención de manejar
la administración de MySQL a través de páginas web, utilizando Internet.
Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y alterar
tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia SQL,
administrar claves en campos, administrar privilegios, exportar datos en varios
formatos y está disponible en 50 idiomas. Se encuentra disponible bajo la
licencia GPL (General Public License – O sea open source).
Instalación de AppServ.
Para instalar AppServ siga los siguientes pasos:
1. Baje la versión que desee del sitio oficial de AppServ, en este caso se
utilizará la versión (2.5.10), el link de la página oficial es el siguiente:
http://www.appservnetwork.com/
2. De doble clic al archivo y presione siguiente, acepte los términos de uso
y seleccione los elementos que desea instalar. Cabe mencionar que se
Instituto Tecnológico de Morelia.
Página 139
ITM Unidad IV Acceso a Datos
necesita apache server para que phpMyAdmin funcione. En nuestro
caso, instalaremos el paquete completo.
Figura 4.1 Ventana: Elegir nombre de pagina y puerto.
En este punto deberá elegir el nombre de su página de internet y dar un
mail. Esto es para el servidor web apache. Por lo que si decidió no
instalar este componente no verá esta pantalla. También deberá
especificar porque puerto desea que trabaje el servidor. El valor
predefinido es el 80.
3. Posteriormente, deberá elegir la configuración de MySQL.
Figura 4.2 Ventana: configuración de MySQL.
Instituto Tecnológico de Morelia.
Página 140
ITM Unidad IV Acceso a Datos
Esta parte es de suma importancia ya que debe elegir una contraseña
para manejar las bases de datos, esta contraseña se requerirá al
momento de conectar NetBeans con MySQL. “No la olvide”
4. Por último nos pregunta si debemos iniciar el servidor apache y MySQL.
Para probar que la instalación funciona debemos iniciar ambos servidores, para
hacer esto vaya a inicio y busque AppServ, luego Control Server by Service y
ahí seleccione Apache start y MySQL start.
Puede ser que necesite en determinado momento detener o reiniciar el servidor
apache, para que no tenga que venir a este punto en todo momento, puede
utilizar Apache Monitor, al ejecutar esto, aparecerá un pequeño icono en la
esquina inferior derecha con el cual tendrá acceso a estos comandos.
Figura 4.3 Iniciar ambos servidores.
Una vez que ambos servidores están funcionando habrá algún navegador de
internet y escriba “localhost” en el apartado de la página.
Lo que se muestra es la página de inicio de nuestro servidor apache. Si no se
muestra la siguiente pantalla, puede ser que se haya instalado mal o que no
hayamos iniciado los servidores.
Nota: “localhost” funciona únicamente si usted dejo el puerto 80 al momento de
instalar el servidor apache, si por algún motivo usted cambio ese número,
deberá escribir “localhost:xxxx” (Ej. Localhost:8080).
Instituto Tecnológico de Morelia.
Página 141
ITM Unidad IV Acceso a Datos
Figura 4.4 Pantalla principal del servidor Apache.
Una vez que tenemos esta página vamos a entrar a phpMyadmin para
administrar nuestras bases de datos. Para ello pulse donde dice phpMyadmin
Database Manager.
Para tener acceso deberemos ingresar nuestro nombre de usuario y
contraseña; pero, hasta este momento únicamente existe el usuario “root”, para
el cual especificamos una contraseña al momento de instalar. Escriba “root” en
el nombre de usuario y la contraseña que eligió para poder entrar.
Figura 4.5 Pantalla principal de phpMyAdmin.
Esta es la interfaz de phpMyadmin que nos ayudará a administrar nuestra base
de datos.
Por último veamos la tabla de MySQL donde se guardan los usuarios que
tienen acceso para ver qué usuarios tiene acceso.
NOTA: La utilización de phpMyadmin es muy sencilla pero debido a la
gran cantidad de funciones y a la gran extensión de la misma, no se
explicará a fondo su manejo en este apartado. Sin embargo, procesos
como la creación de una base de datos, sus tablas y algunas otras
acciones se explicarán a detalle más adelante.
Instituto Tecnológico de Morelia.
Página 142
ITM Unidad IV Acceso a Datos
Para ver la tabla donde se guardan los usuarios que tiene acceso demos click
en “Bases de Datos” y seleccione la tabla de MySQL.
Figura 4.6 Como acceder a la tabla de usuarios
Como puede observar, se muestra un listado de las tablas que contiene esa
base de datos. Seleccione la tabla “user” que está en lo más bajo.
Hay dos opciones:
Si da clic sobre la palabra “user” se mostraran los campos de la tabla, y su
descripción. Esto es lo mismo que seleccionar la tabla y luego dar clic en la
pestaña “Estructura”.
Si da clic sobre la pequeña imagen de la tabla, se mostrará el contenido de la
tabla, es decir los registros que se encuentran almacenados. Esto equivale a
seleccionar una tabla y dar clic en la pestaña “Examinar” (Esta opción es la que
nos interesa en este momento.)
Figura 4.7 Consulta de la tabla user de mySQL.
Instituto Tecnológico de Morelia.
Página 143
ITM Unidad IV Acceso a Datos
Como puede observar, se nos muestra la sintaxis de la consulta SQL que nos
mostraría el contenido de esta tabla en la sección “consulta SQL” y en la parte
inferior nos lista los resultados de la consulta. Esta herramienta le puede ser de
gran utilidad si no está seguro de la sintaxis de alguna acción sobre una tabla
al momento de programar y necesite saber cómo hacer algo sobre alguna
tabla… todo lo que usted haga aquí de manera gráfica, se mostrara en consulta
SQL.
Vea que el único registro de la tabla es el usuario “root” y en el campo
Password aparecen muchos caracteres. Esto es debido a que no es
conveniente tener almacenada este tipo de información sin codificar. (Al
momento de instalar, usted debió elegir algún método de codificación, si no se
otorga uno por default). Si desea agregar un nuevo registro a esa tabla, haga
click en la pestaña Insertar y llene los campos correspondientes.
Figura 4.8 Datos a llenar para dar de alta otro usuario.
Como puede ver, será capaz de crear nuevos usuarios con diferentes
privilegios sobre las tablas o las cosas que puede hacer o no.
Conectar Java con MySql en NetBeans.
El proceso para conectar Java con MySQL es diferente en las diferentes
versiones de NetBeans debido a que algunas versiones ya tienen incluidos los
drivers necesarios y en otras se deben agregar manualmente.
Conexión en versiones sin drivers.
Lo primero es descargar el conector de la página oficial. El enlace es el
siguiente: http://www.mysql.com/products/connector/j/
Para conectar una base de datos con java, abrimos NetBeans y creamos un
proyecto, hacemos clic en la pestaña "Runtime" (En la versión que estamos
utilizando la pestaña dice “Services”) y buscamos la opción "Databases",
Instituto Tecnológico de Morelia.
Página 144
ITM Unidad IV Acceso a Datos
hacemos doble clic sobre ella. Nos mostrará una carpeta con el nombre Driver,
a esta le daremos clic con el botón derecho del mouse y seleccionamos Add
Driver.
Figura 4.9 ¿Cómo agregar el driver para conectar la base de datos?
Nos mostrará un cuadro de dialogo en el cual debemos agregar el driver que
descargamos anteriormente. Esto se hace oprimiendo el botón Add,
deberemos buscar el archivo mysql-connector-java-5.1.6-bin.jar. En la opción
Driver Class debemos seleccionar "com.mysql.jdbc.Driver".
Figura 4.10 Ventana: Agregar driver JDBC
Ahora, veremos que en la carpeta "Driver" nos aparecerá una opción llamada
com.mysql.jdbc.Driver, la seleccionamos con el botón derecho del mouse y
seleccionamos "Connect Using"
Instituto Tecnológico de Morelia.
Página 145
ITM Unidad IV Acceso a Datos
Figura 4.11 Opción para conectar la base de datos.
Ahora, se nos pide los datos de la base de datos, en la opción "Database URL" debemos
ingresar la dirección de la base de datos, empezando con el prefijo
"jdbc:mysql:://host/bd, ingresamos nuestro nombre de usuario y contraseña.
Figura 4.12 Agregar los datos de la base de datos.
Nos deberá salir un mensaje diciendo "Connection established", si es así, la
conexión se completó sin problemas. De lo contrario, algún dato está mal o el
servidor de MySQL no está activo.
Establecer Conexión en NetBeans 6.0
En esta versión de NetBeans, el conector viene incluido por lo que establecer la
conexión es más sencillo.
Abra su aplicación, localice la pestaña “Services” y dentro de doble clic en
Databases. Por último abra la carpeta Drivers.
Como puede ver, ya se encuentran incluidos varios drivers, incluido el de
MySQL. Lo seleccionamos con el botón derecho del mouse y seleccionamos
"Connect Using". Ahora, se nos pide los datos de la base de datos (igual que
antes), en la opción "Database URL" debemos ingresar la dirección de la base
de datos, empezando con el prefijo "jdbc:mysql:://host/bd, ingresamos nuestro
nombre de usuario y contraseña.
Instituto Tecnológico de Morelia.
Página 146
ITM Unidad IV Acceso a Datos
Figura 4.13 Conectar NetBeans con MySQL.
Una vez que ingresa los datos correctos, la conexión se establece.
Figura 4.14 Ventana: Conexión establecida.
La manera de conectarse con la base de datos anterior, puede ser útil para
realizar pruebas con los usuarios que se hayan creado o para otros fines pero
la manera importante de establecer la conexión es mediante código, dentro de
alguna función.
Ejemplo: Modificar nuestra aplicación para conectarse con una Base de Datos.
Cree una función que pueda llamar desde cualquier lugar para conectarse
mediante líneas de código con una base de datos.
Instituto Tecnológico de Morelia.
Página 147
ITM Unidad IV Acceso a Datos
A continuación, se muestra la clase “ConectarBD”, la cual nos servirá para
conectarnos con una base de datos específica.
package aplicaciondeescritorio;
//Importamos las bibliotecas necesarias.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author Saùl
*/
public class ConectarBD {
//Accesaremos a la base de datos de prueba que viene en el Appserv.
public
public
public
public
static
static
static
static
String
String
String
String
bd = "test"; //Nombre de la BD
login = "root"; //usuario
password = "entrar"; //Contraseña
url = "jdbc:mysql://localhost/"+bd;
public static void conectar() {
Connection conn = null; //Creamos un objeto Connection
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null)
{
System.out.println("Conexión a base de datos "+
url+" … Ok");
//Este mensaje se mostrará si la conexión se estableció.
conn.close();
//La instrucción anterior termina la conexión.
}
}
catch(SQLException ex) {
System.out.println("Hubo un problema al intentar"+
" conectarse con la base de datos "+url);
}
catch(ClassNotFoundException ex) {
System.out.println(ex);
//Se muestra un error si no se localiza una clase.
}
}
}
Si no sabe que bibliotecas necesitará, no se preocupe, NetBeans le indicará al
momento de detectar el error qué biblioteca necesita.
Primero indicamos el driver que vamos a utilizar para establecer la conexión.
Los drivers se bajan de internet como se indicó anteriormente. La manera de
hacerlo es mediante la instrucción:
Class.forName("com.mysql.jdbc.Driver");
El método forName recibe como parámetro el nombre del driver. Este lo
debimos haber agregado como se indicó anteriormente.
Instituto Tecnológico de Morelia.
Página 148
ITM Unidad IV Acceso a Datos
Las instrucciones que utilizamos para establecer la conexión deben estar
dentro de un try {}, de lo contrarió NetBeans no nos permitirá avanzar.
Los objetos necesarios para establecer una conexión vienen de la clase
Connection. Una vez que creamos uno, hay que mandarle como parámetro la
url (Direccion de la base de datos), el nombre de usuario y la contraseña de
nuestro manejador de bases de datos.
Ahora llamaremos esta función desde un botón nuevo en nuestra aplicación.
(Se eliminaron los elementos de los ejemplos anteriores ya que no se
necesitaban más.)
Figura 4.15 Ejemplo de botón que invoca una conexión con la base de datos.
El código del botón ConectarBD es el siguiente:
private void conectarBDMouseClicked(java.awt.event.MouseEvent evt) {
ConectarBD.conectar();
}
Vea que ni siquiera es necesario declarar un objeto de la clase ConectarBD
debido a que su único método (conectar()) es público.
Aplicación con Bases de Datos.
Para conocer la importancia de manejar las bases de datos hagamos el
siguiente ejemplo. Siga los pasos cuidadosamente.
Dado que no se pretende profundizar en el lenguaje de mySQL en el programa
de esta materia, este no se analizará con profundidad, sin embargo se realizara
un pequeño ejemplo en el cual se utilizara una base de datos con la ayuda de
Instituto Tecnológico de Morelia.
Página 149
ITM Unidad IV Acceso a Datos
phpMyadmin, se recomienda revisar el “Apendice 2” para conocer más a
profundidad el lenguaje de mySQL. Cabe mencionar que al llevar a cabo este
procedimiento en phpMyadmin, usted podrá “visualizar los comandos que
tendría que llevar a cabo en línea de comandos”.
Crear una base de datos.
La base de datos se llamará Negocio.
Contendrá las tablas Clientes, Productos y Empleados.
Los campos serán: para Clientes (Id, nombre, dirección), para Productos
(Id, nombre y precio) y para empleados (Id, nombre, salario).
Primero entramos a nuestro navegador y luego a phpMyAdmin. Para crear ahí
de manera gráfica nuestra base de datos. Seleccionamos la opción “Bases de
Datos”.
Figura 4.16 Opción necesaria para crear una Base de Datos.
Ingresamos el nombre de nuestra base de datos y damos click en crear.
Instituto Tecnológico de Morelia.
Página 150
ITM Unidad IV Acceso a Datos
Figura 4.17 Crear tablas de la base de datos.
Creamos cada una de nuestras tablas. El proceso es muy intuitivo, escriba el
nombre de la tabla y el número de campos, luego de clic en Continuar.
Figura 4.18 Ingresar datos de la tabla.
Ahora hay que definir que tamaño y tipo serán nuestros campos. Para el
ejemplo manejaremos el campo Id como numérico y los demás serán
caracteres. El campo Id, será la llave de cada una de las tablas. De clic en
Guardar cuando termine con cada tabla.
Instituto Tecnológico de Morelia.
Página 151
ITM Unidad IV Acceso a Datos
Figura 4.19 Ingresar datos de cada campo de la tabla.
En la figura anterior se muestra que nuestro Id será un tipo de dato INT, no
nulo, se autoincrementará y es además la llave de nuestra tabla. No se
preocupe por cometer errores, puede modificar las tablas y sus campos
posteriormente si lo desea. Haga lo mismo con las demás tablas.
Una vez que creamos nuestras tablas podremos seleccionar nuestra nueva
base de datos en el menú de bases de datos y ver cómo está conformada.
Figura 4.20 Vista de las tablas de nuestra base de datos.
Ahora vamos a nuestro ejemplo a crear registros en las tablas. Hasta este
punto, nos conectamos con nuestra base de datos al dar clic en un botón.
Obviamente no debe ser así, una aplicación de este tipo debería conectarse sin
necesidad de tener que indicárselo.
En el ejemplo donde se conecta con la base de datos usando un botón
estamos terminando la conexión inmediatamente después de establecerla.
Para este ejemplo hay que quitar esa línea y modificar los datos para
conectarnos a la base de datos que acabamos de crear. La clase queda de la
siguiente manera.
package aplicaciondeescritorio;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConectarBD {
public static String bd = "negocio"; //Nombre de la BD
public static String login = "root"; //usuario
public static String password = "entrar"; //Contraseña
public static String url = "jdbc:mysql://localhost/"+bd;
public static Connection conectar() {
Instituto Tecnológico de Morelia.
Página 152
ITM Unidad IV Acceso a Datos
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null){
System.out.println("Conexión a base de datos "+url+" …
Ok");
//conn.close(); se quita para permanecer conectados
}
}
catch(SQLException ex) {
System.out.println("Hubo un problema al intentar "+
"conectarse con la base de datos "+url);
}
catch(ClassNotFoundException ex) {
System.out.println(ex);
}
return conn;
}
}
En el ejemplo anterior nos conectamos con una base de datos vacía que se
llama test, ahora nos conectamos con la base de datos que creamos. Solo hay
que cambiar el nombre de la base a la que nos conectamos y quitar la
instrucción que nos desconectaba. También modificamos un poco la función
para que nos regrese el objeto que representa nuestra conexión. Lo
necesitaremos para los accesos a la base de datos.
Ahora crearemos un botón que de de alta productos en nuestra base de datos,
quitaremos el botón de “Conectar” ya que eso lo haremos aquí antes de dar de
alta un registro. Nos pedirá por medio de cajas de diálogo los datos y los
almacenará en la base de datos.
El código del botón es el siguiente:
private void altaProductoMouseClicked(java.awt.event.MouseEvent evt) {
try {
java.sql.Connection cone = ConectarBD.conectar();
String Id = JOptionPane.showInputDialog(menuBar, "Id :");
String nombre = JOptionPane.showInputDialog(menuBar, "Nombre :");
String precio = JOptionPane.showInputDialog(menuBar, "Precio :");
java.sql.Statement st = cone.createStatement();
st.execute("INSERT INTO `negocio`.`productos` (`Id` ,`nombre` ,`precio`)
VALUES ('"+Id+"', '"+nombre+"', '"+precio+"');");
} catch (SQLException ex) {
Logger.getLogger(AplicacionDeEscritorioView.class.getName()).
log(Level.SEVERE, null, ex);
}
}
Instituto Tecnológico de Morelia.
Página 153
ITM Unidad IV Acceso a Datos
Primero se está estableciendo la conexión, luego se piden los tres valores que
se almacenarán en la tabla. Por último se crea un objeto de la clase Statement
que nos permitirá ejecutar sentencias SQL que enviemos en forma de cadenas.
Figura 4.21. Programa en ejecución.
Si entramos a phpMyadmin a ver los registros en esta tabla podremos ver lo
siguiente.
Figura 4.22 Contenido de la base de datos.
Ejercicio: Realice modificaciones a la aplicación para realizar las cuatro
operaciones básicas (Altas, Bajas, Modificaciones y Consultas) en las 3 tablas
del ejemplo.
4.2 Control de datos ADO.
ActiveX Data Objects (ADO) es uno de los mecanismos que usan los
programas para comunicarse con las bases de datos, darles órdenes y obtener
resultados de ellas.
Con ADO, un programa puede leer, insertar, editar o borrar, la información
contenida en diferentes áreas de almacenamiento dentro de la base de datos
llamadas tablas.
Instituto Tecnológico de Morelia.
Página 154
ITM Unidad IV Acceso a Datos
Además, se puede manipular la propia base de datos para crear nuevas áreas
para el almacenamiento de información (tablas), como también alterar o
eliminar las ya existentes, entre otras cosas.
Fue desarrollado por Microsoft y es usado en ambientes Windows por
lenguajes de programación como Visual Basic y en la Web mediante el uso de
Active Server Pages (ASP) y el lenguaje VBScript.
ADO substituyó tanto a DAO (Data Access Object), que eran los sistemas
previos que se usaban para acceder a las bases de datos y bases de datos
remotas. Es sencillo de usar, de entender y por lo tanto fácil y menos engorroso
de programar.
La última versión de ADO, creada por Microsoft, se llama ADO.NET, y se usa
en los entornos de programación de la plataforma .NET, de Microsoft, para
manejar bases de datos tanto en Windows como en la Web mediante
ASP.NET, que es la nueva versión del ASP para la plataforma .NET.
ADO.NET es mucho más poderoso que ADO pero también es muy diferente,
por lo que es necesario rediseñar los programas hechos con ADO, para que
funcionen en él.
DAO
RDO
ADO
ADO.NET
ADO.NET 2 (2006)
Funcionamiento
ADO es un intermediario entre el programa y la base de datos. El programa no
ve la base de datos directamente, sino que hace todo el trabajo a través de
ADO. Usando ADO, el programa se comunica con la base de datos, consulta,
edita, inserta, borra registros, añade tablas, etc. ADO a su vez se comunica
con la base de datos a través de un "proveedor de datos".
El programa usa ADO para hacer una solicitud a la base de datos:
"Dame el nombre y apellido de todos los clientes que vivan en México"
Programa ---> ADO ---> Proveedor de datos ---> Base de datos
En la dirección contraria, la base de datos responde, comunicándose con el
proveedor de datos, éste con ADO, y al final, la información llega al programa.
La base de datos responde:
Programa <--- ADO <--- Proveedor de datos <--- Base de datos
Instituto Tecnológico de Morelia.
Página 155
ITM Unidad IV Acceso a Datos
Una vez que el programa tiene la información proveniente de la base de datos,
puede hacer con ella lo que considere, como por ejemplo, puede desplegarla
en una página Web.
Importancia de esta tecnología.
Para comprender la importancia de esta tecnología, imaginemos que hicimos
una aplicación de gestión para una empresa. Utilizando como motor de base de
datos Oracle. Pero no tenemos dividida la capa de lógica (esta se representa
con las líneas de programación que dicen qué hace el programa o que
información necesita manipular de la base de datos) de la de persistencia (la
capa de persistencia seria la que manipula las consultas directamente sobre la
base de datos). Por lo que la interacción con la base de datos se hace
directamente desde la capa de lógica de negocio. Tal y como lo hicimos en el
apartado anterior.
Nuestra aplicación consiste en muchísimas clases, y gran parte de ellas
interactúan con la base de datos (conectándose a la base de datos, guardando
y recuperando datos, etc.).
Nuestra aplicación va de maravilla, cuando de pronto, se acerca nuestro cliente
y nos comenta que por X, Y y Z razones se va a cambiar el motor de la base de
datos a MySQL. En ese momento se nos viene el mundo encima pues
tendremos que hacer prácticamente todo de nuevo. Todas las clases que
interactúan directamente con la base de datos deben ser rediseñadas.
Si hubiéramos tenido por separado la capa de lógica de negocio de la de
persistencia, habría sido suficiente con modificar la capa de persistencia para
que la aplicación pudiera utilizar el nuevo motor de base de datos, sin tener que
modificar nada de la capa de lógica de negocio. Pero como en el ejemplo
anterior NO usamos una capa de persistencia, sino que interactuamos con la
base de datos directamente desde la capa de lógica de negocio, entonces
vamos a tener que modificar todas las clases, cambiando todas las consultas
SQL, la manera de acceder a la base de datos, etc. para adecuarse al nuevo
motor de la base de datos.
4.3 Objetos ADO. (ActiveX Data Object)
Los objetos ADO, se utilizan comúnmente con la tecnología ASP17. Una de las
características más interesantes de ASP es su facilidad para el manejo de
bases de Datos que residen en el servidor, obviamente mediante el uso de
ADO (ActiveX Data Object) de una forma fácil, rápida y con un mínimo
consumo de recursos del sistema.
ADO usa ODBC (Open Database Connectivity)18 para el acceso a bases de
datos. Lo que nos independiza de la tecnología de las misma; esto implica que
podemos cambiar la tecnología de la base de datos y si mantenemos la misma
17
18
Active Server Pages, tecnología de Microsoft del tipo “lado servidor” para páginas web dinámicas.
Estándar para manejo de bases de datos creado por Microsoft.
Instituto Tecnológico de Morelia.
Página 156
ITM Unidad IV Acceso a Datos
estructura de datos, nuestras aplicaciones desarrolladas con ADO pueden
seguir funcionando sin cambiar ni una sola línea de código.
ADO está formado por varios objetos organizados de forma jerárquica (cada
uno de ellos con sus métodos y propiedades específicos) de los cuales vamos
a estudiar los que considero más interesantes.
Connection
Nos proporciona una conexión a una base de datos ODBC desde una página
ASP. Esta conexión nos permitirá efectuar las operaciones que deseemos
sobre la base de datos. Es el objeto primario de ADO, ninguno de los otros
objetos puede existir si este no es declarado de forma explícita o implícita (en
algunos de los ejemplos veremos que no existe una declaración del objeto
Connection, pero debemos de tener en cuenta que siempre existe, si es
necesario ADO lo declarará por sí mismo). La conexión terminará cuando
nosotros la cerremos explícitamente con el método close o bien cuando termine
la ejecución de la página ASP.
Error
Es una colección en la que se almacenarán los posibles errores del objeto.
Command
Representa un comando SQL que se ejecuta contra la base de datos declarada
en el objeto Connection. Si el resultado de ese comando es un conjunto de
datos, estos se almacenaran en un objeto de tipo Recordset.
Recordset
Representa una tabla o el resultado de una consulta ejecutada contra la base
de datos. Va a ser nuestra interface natural contra la base de datos. Como en
todo modelo relacional, los datos se nos presentaran en filas y columnas.
Field
El objeto Field representa la información relativa a un campo de un Recordset.
Contiene la colección Fields que representa todos los campos de la tabla, cada
miembro de esa colección es un objeto de tipo Field.
Objeto Connection (propiedades y métodos)
Hemos comentado que el objeto Connection nos proporciona una conexión a
una base de datos desde una página ASP; ahora vamos a ver como se usa, así
como sus propiedades y métodos.
Para establecer la conexión lo primero que hacemos es crear el Objeto
Connetion por medio de la propiedad CreateObject de objeto Server:
Instituto Tecnológico de Morelia.
Página 157
ITM Unidad IV Acceso a Datos
<% Set conexión=Server.CreateObject("ADODB.Connection")%>
Una vez establecida la instancia del objeto pasamos a configurarlo mediante
sus distintas propiedades y métodos.
Propiedades:
ConnectionString
Especifica la referencia a la base de datos con la cual queremos conectar,
conteniendo en una cadena de texto la información necesaria para efectuar esa
conexión mediante parejas de valores separadas por ";".
Los valores que podemos asignar son:
Data Source:
DSN=Nombre ODBC de la Base de Datos
Usuario:
User=Nombre de Usuario
Password:
Password=Password del usuario para la base de datos
Ejemplo:
<% conexion.ConnectionString="DSN=MIOdbc;User=pepe;Password=1234" %>
Mode
Especifica los permisos de la conexión.
Algunos de los valores más habituales que podemos asignar son:
1 Establece permiso solo de Lectura
2 Establece permiso solo de Escritura
3 Establece permiso de Lectura/Escritura
Ejemplo:
<% conexion.Mode=3 %>
Métodos:
BeginTrans
Abre una transacción; todas las operaciones que realicemos a partir de ese
momento no serán efectivas hasta que no cerremos la transacción.
Ejemplo:
Instituto Tecnológico de Morelia.
Página 158
ITM Unidad IV Acceso a Datos
<% conexion.BeginTrans %>
Close
Cierra el objeto.
Ejemplo:
<% conexion.close %>
CommitTrans
Cierra una transacción haciendo efectivos los cambios efectuados dentro de
ella.
Ejemplo:
<% conexion.CommitBeginTrans %>
Execute
Ejecuta una sentencia SQL contra la base de datos.
Ejemplo:
<% Set resultado=conexion.execute (Select * from amigos) %>
Open
Abre la conexión con los parámetros especificados en las propiedades.
Ejemplo:
<% conexion.open %>
RollBackTrans
Deshace todos los cambios efectuados en la base de datos desde el inicio de
la transacción.
Ejemplo:
<% conexion.RollBackTrans %>
Objeto Error (propiedades y métodos)
El objeto Error contiene la colección Errores, que es la encargada de
almacenar los errores que se pudieran producir durante la ejecución de
operaciones contra Bases de Datos.
Instituto Tecnológico de Morelia.
Página 159
ITM Unidad IV Acceso a Datos
Propiedades:
Description
Descripción del error.
Number
El numero de error.
SQLState
Código de error SQL.
Métodos:
Clear
Elimina los datos del objeto Error.
Ejemplo: Examinando los posibles datos de la colección Errors. Se crea un
ciclo y se imprimen los posibles errores.
.......
.......
Miconexion.open
If Miconexion.Errors.Count > 0 then
For each error in Miconexion.errors then
Response.write Error.Number & " = "& Error.Description
next
End if
Nota: Count es una propiedad de la colección Errors.
Objeto RecordSet
El objeto Recordset es la interface entre los datos obtenidos de nuestras
consultas sobre las tablas y nuestras páginas ASP. Representa una tabla
organizada en filas (registros) y columnas (campos). La propiedades y métodos
de Recordset son muchos, en esta unidad vamos a ver las más interesantes,
para hacerlo un poco más sencillo de entender vamos a verlos agrupados por
la funcionalidad que nos ofrecen.
Definición del tipo de Cursor
Entendemos como cursor el puntero que nos permite desplazarnos por los
registros del recordset. Dependiendo del tipo elegido determinaremos los
Instituto Tecnológico de Morelia.
Página 160
ITM Unidad IV Acceso a Datos
desplazamientos y cambios realizables en los datos. El tipo de cursor lo
definiremos mediante la propiedad CursorType, los posibles valores son:
Denominación
valor
adOpenForwardOnly
0
adOpenKeyset
1
adOpenDynamic
2
adOpenStatic
3
Características
Es el cursor por defecto, solo nos permite
recorrer la tabla de forma secuencial (no se
puede volver hacia atrás) y no permite
modificaciones en los registros. No vemos
los cambios realizados en la tabla por otro
recordset.
Nos permite movernos en los dos sentidos,
si permite modificaciones en los registros.
Vemos los cambios realizados en la tabla
por otro recordset a excepción de las
nuevas altas.
Nos permite movernos en los dos sentidos,
si permite modificaciones en los registros.
Vemos todos los cambios realizados en la
tabla por otro recordset.
Nos permite movernos en los dos sentidos,
no permite modificaciones en los registros.
No
vemos los cambios realizados en la tabla
por otro recordset.
Tabla 4.1 Tipos de cursores
Definición del tipo de Cerrojo
Entendemos como cerrojo el tipo de bloqueo que efectuaremos en la base de
datos cuando modifiquemos un recordset, a fin de evitar que dos o más
usuarios accedan a modificar un mismo registro a la vez.
El tipo de cerrojo lo definiremos mediante la propiedad LockType, los posibles
valores son:
Denominación
valor
adLockReadOnly
1
dLockPessimistic
2
adLockOptimistic
3
Características
Es el que está por defecto; no permite al
usuario modificar los datos de la tabla.
Cuando se abra la tabla nadie más podrá
hacerlo, este modo nos asegura la plena
integridad de los datos.
Cierra la tabla a los demás usuarios cuando
se
invoque al método Update del objeto
recordset;
de este modo la Base de datos quedará
bloqueada menos tiempo que con el
método anterior.
Tabla 4.2 Tipos de Cerrojo.
Instituto Tecnológico de Morelia.
Página 161
ITM Unidad IV Acceso a Datos
Ejemplo: Definición de un recordset para actualizar datos:
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3%>
set rs=createobject("ADODB.Recordset")
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
Moviéndose por los datos del RecordSet
Métodos usados para moverse en un RecordSet:
Método
Move Num_registros
MoveFirst
MoveLast
MoveNext
MovePrevious
Características
Mueve el cursor Num_registros hacia abajo si
es positivo y hacia arriba si es negativo.
Mueve el cursor al primer registro del
Recordset.
Mueve el cursor al último registro del
Recordset.
Mueve el cursor un registro hacia adelante.
Mueve el cursor un registro hacia atrás.
Tabla 4.3 Métodos pa moverse en un Recorset
Propiedades usadas:
Propiedades
PageSize
(Ej. rs.Pagesize=10)
AbsolutePage
(Ej. rs.AbsolutePage=2)
PageCount
(Ej. xx=rs.PageCount)
Absoluteposition
(Ej.
rs.Absoluteposition=17)
RecordCount
(Ej. xx=rs.recordcount)
BOF
EOF
Caracteristicas
Establece el número de registros por página
del
Recordset.
Mueve el cursor al primer registro de dicha
página (es necesario definir anteriormente el
pageSize).
Contiene el número de páginas del recordset,
tomando como base PageSize.
Mueve el cursor al num_registro especificado.
Contiene el número de registros del recordset;
Nota:
No
funciona
con
el
cursor
adOpenForwardOnly
Toma el valor True cuando estamos en el
primer
registro del recordset
Toma el valor True cuando estamos en el
ultimo
registro del recordset
Instituto Tecnológico de Morelia.
Página 162
ITM Unidad IV Acceso a Datos
Tabla 4.4 Propiedades de un Recordset.
Modificando los datos
Métodos usados:
Metodo
AddNew
EJ.
rs.Addnew
rs("codigo")=1234
rs("titulo")="Todo sobre ASP"
rs.Update
Delete
Update
EJ:
Caracteristicas
Abre un nuevo registro en el recordset
para introducir
datos
Elimina el registro actual
Actualiza un registro del recordset tras
haberlo
modificado
rs("titulo")="Como hacerse rico en 10
minutos"
rs.Update
Tabla 4.5 Métodos usados para modificar datos de un RecordSet.
Abriendo y cerrando el recordset
Métodos usados:
Método
Open Sql, conexion
Caracteristicas
Abre el recordset y almacena en el
resultado de sql contra la conexión
EJ.
set
rs=createobject("ADODB.Recordset")
rs.CursorType = 1
rs.LockType = 3
Sqltxt="SELECT * FROM libros"
rs.open Sqltxt, "DSN=Biblioteca"
Close
Cierra el recordset
Tabla 4.6 Métodos usados para abrir y cerrar un Recordset.
Ejemplo de listado de un Recordset: Suponga que tiene una BD, en ella la tabla
almacén y en esa tabla los campos Id_Producto, Producto, Cantidad y Precio
para el ejemplo.
Nombre del archivo: Listado.asp
Instituto Tecnológico de Morelia.
Página 163
ITM Unidad IV Acceso a Datos
<%SQLtxt = "SELECT Producto, Cantidad, Precio FROM almacen
set rs = CreateObject("ADODB.Recordset")
rs.Open SQLtxt, "DSN=Mibase"%>
<table>
<%
Do While NOT rs.EOF%>
<tr>
<td><%= rs("Producto")%></td>
<td><%= rs("Cantidad")%></td>
<td align="right"><% = FormatCurrency(rs("Precio"))%></td>
</tr>
<% rs.MoveNext
Loop
rs.Close
</table>
%>
4.4 Herramientas de acceso a datos.
En el apartado anterior, analizamos una de las tecnologías más novedosas
para el acceso eficiente a los datos. Sin embargo, existen muchas más
herramientas que podríamos utilizar con el mismo fin. A continuación
mencionaré de manera general algunas de las más comunes.
4.4.1 ADO.NET
El ADO.NET es un conjunto de componentes del software que pueden ser
usados por los programadores para acceder a datos y a servicios de datos. Es
una parte de la biblioteca de clases base que están incluidas en el Microsoft
.NET Framework. Es comúnmente usado por los programadores para acceder
y para modificar los datos almacenados en un Sistema Gestor de Bases de
Datos Relacionales, aunque también puede ser usado para acceder a datos en
fuentes no relacionales. ADO.NET es a veces considerado como una evolución
de la tecnología ActiveX Data Objects (ADO), pero fue cambiado tan
extensivamente que puede ser concebido como un producto enteramente
nuevo.
4.4.2 JDBC
JDBC es el acrónimo de Java Database Connectivity, un API que permite la
ejecución de operaciones sobre bases de datos desde el lenguaje de
programación Java independientemente del sistema operativo donde se
ejecute o de la base de datos a la cual se accede utilizando el dialecto SQL del
modelo de base de datos que se utilice.
El API JDBC se presenta como una colección de interfaces Java y métodos de
gestión de manejadores de conexión hacia cada modelo específico de base de
datos. Un manejador de conexiones hacia un modelo de base de datos en
Instituto Tecnológico de Morelia.
Página 164
ITM Unidad IV Acceso a Datos
particular es un conjunto de clases que implementan las interfaces Java y que
utilizan los métodos de registro para declarar los tipos de localizadores a base
de datos (URL) que pueden manejar. Para utilizar una base de datos particular,
el usuario ejecuta su programa junto con la librería de conexión apropiada al
modelo de su base de datos, y accede a ella estableciendo una conexión, para
ello provee el localizador a la base de datos y los parámetros de conexión
específicos. A partir de allí puede realizar con cualquier tipo de tareas con la
base de datos a las que tenga permiso: consulta, actualización, creación,
modificación y borrado de tablas, ejecución de procedimientos almacenados en
la base de datos, etc.
4.4.3 ODBC
Open Database Connectivity (ODBC) es un estándar de acceso a Bases de
Datos desarrollado por Microsoft Corporation, el objetivo de ODBC es hacer
posible el acceder a cualquier dato desde cualquier aplicación, sin importar qué
Sistema Gestor de Bases de Datos (DBMS por sus siglas en inglés) almacene
los datos, ODBC logra esto al insertar una capa intermedia llamada manejador
de Bases de Datos, entre la aplicación y el DBMS, el propósito de esta capa es
traducir las consultas de datos de la aplicación en comandos que el DBMS
entienda. Para que esto funcione tanto la aplicación como el DBMS deben ser
compatibles con ODBC, esto es que la aplicación debe ser capaz de producir
comandos ODBC y el DBMS debe ser capaz de responder a ellos. Desde la
versión 2.0 el estándar soporta SAG y SQL.
Para conectarse a la Base de Datos se crea una DSN dentro del ODBC que
define los parámetros, ruta y características de la conexión según los datos que
solicite el fabricante.
4.4.4 DAO
Como mencioné al inicio de esta unidad, este material se orienta a la
programación en java en la medida de lo posible. Sin embargo, se analizan
herramientas que no necesariamente trabajan con java. La tecnología ADO (De
Microsoft, se maneja con Visual Basic o tecnologías propias hasta este
momento), como pudo observar, es una tecnología importantísima en cuanto al
manejo de bases de datos, es por esto que analizaré más a detalle el tema de
los objetos DAO. Estos objetos se considera una herramienta vieja en
comparación a ADO, sin embargo está comprobado que se utiliza de manera
más amplia debido a que se maneja con el lenguaje java y su potencia es
equiparable. Un Data Access Object (DAO, Objeto de Acceso a Datos) es un
componente de software que suministra una interfaz común entre la aplicación
y uno o más dispositivos de almacenamiento de datos, tales como una Base de
datos o un archivo.
Al igual que los objetos ADO, los objetos DAO conforman una capa que separa
las capas de lógica y de programación de nuestras aplicaciones. El beneficio
principal, como se ejemplificó anteriormente, es que si tuviéramos una
tecnología de BD y cambiáramos a otra, no tendríamos que reprogramar
nuestras clases. La capa formada por los objetos DAO se llama capa de
Persistencia de Datos.
Instituto Tecnológico de Morelia.
Página 165
ITM Unidad IV Acceso a Datos
Como ya mencionamos, DAO encapsula el acceso a la base de datos. Por lo
que cuando la capa de lógica de negocio necesite interactuar con la base de
datos, va a hacerlo a través de la API que le ofrece DAO. Generalmente esta
API consiste en métodos CRUD (Create, Read, Update y Delete). Entonces por
ejemplo cuando la capa de lógica necesite guardar un dato en la base de
datos, va a llamar a un método create(). Lo que haga este método, es problema
de DAO y depende de cómo DAO implemente el método create(), puede que lo
implemente de manera que los datos se almacenen en una base de datos o
que los datos se almacenen en un archivos de texto. Lo importante es que la
capa de lógica no tiene porque saberlo, lo único que sabe es que el método
create() va a guardar los datos, así como el método delete() va a eliminarlos, el
método update() actualizarlos, etc. Pero no tiene idea de cómo interactúa DAO
con la base de datos.
En una aplicación, hay tantos DAOs como modelos. Es decir, en una base de
datos relacional, por cada tabla, habría un DAO.
DAO consiste básicamente en una clase que es la que interactúa con la base
de datos. Los métodos de esta clase dependen de la aplicación y de lo que
queramos hacer. Pero generalmente se implementan los métodos CRUD para
realizar las "4 operaciones básicas" de una base de datos.
Por último, debemos mencionar a los objetos DTO y podremos analizar código.
Los DTO (Data Transfer Object) o también denominados VO (Value Object).
Son utilizados por DAO para transportar los datos desde la base de datos hacia
la capa de lógica y viceversa. Por ejemplo, cuando la capa de lógica llama al
método create(), ¿qué es lo que hace DAO? inserta un nuevo dato... ¿pero qué
dato? el que la capa de lógica le pase como parámetro... ¿y cómo se lo pasa
este dato?, a través de un DTO.
Podría decirse que un DTO es un objeto común y corriente, que tiene como
atributos los datos del modelo, con sus correspondientes accesos (getters y
setters).
Por ejemplo, si tuviéramos una base de datos relacional con una tabla
Almacen, con los campos id, producto y cantidad. Entonces tendríamos que
crear una clase AlmacenDTO, con los atributos id, producto y cantidad, que van
a utilizar la capa de lógica y de persistencia para transportar los datos entre las
dos capas.
Entonces cuando la capa de lógica quiera guardar un dato en la base de datos,
va a crear un objeto AlmacenDTO, a través de los accessors (métodos
utilizados para accesar a la base) va a modificar los atributos, y después se lo
va a pasar al método create() de DAO. Entonces DAO va a leer los datos del
DTO, y los va a guardar en la base de datos. Lo mismo pasaría para eliminar
datos. Y para actualizarlos además se le pasaría el ID, para saber que dato
actualizar. Para buscar datos, sería parecido, ya que se le pasa al método
read() el DTO para usarlo como patrón de búsqueda, pero con la diferencia de
Instituto Tecnológico de Morelia.
Página 166
ITM Unidad IV Acceso a Datos
que este método tiene valor de retorno, ya que devuelve otro DTO con los
datos del resultado de la búsqueda.
Ejemplo usando DAO
Imaginemos una aplicación realizada en Java, utilizada para gestionar los datos
de una empresa (Almacen, clientes, empleados, etc.). Nosotros somos los
encargados de crear la capa de persistencia de la aplicación, y decidimos
utilizar el patrón de diseño DAO.
Primero debemos saber ¿Qué vamos a guardar en la base de datos?.
Los datos de los empleados, los datos de los clientes y los datos de los
productos.
Son tres modelos:
• El modelo Empleado: que almacena los datos de los empleados (el ID,
el nombre y el sueldo).
•
El modelo Cliente: que almacena los datos de los clientes (el ID, el
nombre y la dirección).
•
El modelo Producto: que almacena los datos de los productos (el ID, el
nombre y el precio).
Lo primero que debemos hacer es crear los DTO, uno para cada modelo:
Archivo Empleado.class:
Instituto Tecnológico de Morelia.
Página 167
ITM Unidad IV Acceso a Datos
class EmpleadoDTO {
//Necesitamos una variable por cada dato de la tabla
private int id;
private String nombre;
private double salario;
//Ahora un método que nos regrese cualquiera de los
//valores de la tabla que declaramos antes.
public int getId() {return id;}
public String getNombre() {return nombre;}
public double getSalario() {return salario;}
//Por ultimo un método que podamos usar para
//establecer o dar un valor a cada elemento.
public void setId(int id) {this.id = id}
public void setNombre(String nom) {this.nombre = nom}
public void setSalario(double sal) {this.salario = sal}
}
Archivo Clientes.class:
class ClienteDTO {
//Campos de la tabla
private int id;
private String nombre;
private String direccion;
//Métodos para leer datos
public int getId() {return id;}
public String getNombre() {return nombre;}
public String getDireccion() {return direccion;}
//Métodos para establecer datos
public void setId(int id) {this.id = id}
public void setNombre(String nom) {this.nombre = nom}
public void setDireccion(String dir) {this.direccion =
dir}
}
Archivo Producto.class:
Instituto Tecnológico de Morelia.
Página 168
ITM Unidad IV Acceso a Datos
class ProductoDTO {
//Campos de la tabla
private int id;
private String nombre;
private double precio;
//Métodos para leer datos
public int getId() {return id;}
public String getNombre() {return nombre;}
public double getPrecio() {return precio;}
//Métodos para establecer datos
public void setId(int id) {this.id = id}
public void setNombre(String nom) {this.nombre = nom}
public void setPrecio(double precio) {this.precio
precio}
}
=
Ahora, vamos a crear los DAO, uno para cada modelo también:
Archivo EmpleadoDAO.class:
class EmpleadoDAO {
public void create(EmpleadoDTO dto) {
/* Implementación del método create() */
}
public EmpleadoDTO read(EmpleadoDTO dto) {
/* Implementación del método read() */
}
public void update(EmpleadoDTO dto, int id) {
/* Implementación del método update() */
}
public void delete(EmpleadoDTO dto) {
/* Implementación del método delete() */
}
}
Archivo ClienteDAO.class:
class ClienteDAO {
public void create(ClienteDAO dto) {
/* Implementación del método create() */
}
public ClienteDAO read(ClienteDAO dto) {
/* Implementación del método read() */
}
Instituto Tecnológico de Morelia.
Página 169
ITM Unidad IV Acceso a Datos
public void update(ClienteDAO dto, int id) {
/* Implementación del método update() */
}
public void delete(ClienteDAO dto) {
/* Implementación del método delete() */
}
}
Archivo Producto.class:
class ProductoDAO {
public void create(ProductoDTO dto) {
/* Implementación del método create() */
}
public ProductoDTO read(ProductoDTO dto) {
/* Implementación del método read() */
}
public void update(ProductoDTO dto, int id) {
/* Implementación del método update() */
}
public void delete(ProductoDTO dto) {
/* Implementación del método delete() */
}
}
Obviamente en lugar de los comentarios van las implementaciones. Como
estamos utilizando mySQL, el método create() , por ejemplo, de ClienteDAO
hará una consulta SQL insertando un nuevo registro con los datos pasados por
el DTO como parámetro en la tabla clientes.
Si por algún motivo tuviéramos que cambiar de manejadores de bases de
datos, es en este punto donde deberemos modificar líneas de código. Sin
embargo, será mucho más sencillo ya que tendremos perfectamente ubicados
los archivos que interactúan con la base de datos y las demás clases seguirán
funcionando exactamente igual.
Bien, ya estaría la capa de persistencia creada. Ahora ya podríamos utilizarla
desde la capa de lógica:
Aplicación. Archivo principal Programa.class:
public static void main(String[] args) {
/* Creamos el DAO */
EmpleadoDAO dao = new EmpleadoDAO();
/* Creamos un DTO */
Instituto Tecnológico de Morelia.
Página 170
ITM Unidad IV Acceso a Datos
EmpleadoDTO dto = new EmpleadoDTO();
/* Le asignamos los datos */
dto.setNombre("Saúl Chávez");
dto.setSalario(7500);
/* Llamamos al método create() del DAO que se encarga de
guardarlo en la base de datos */
dao.create(dto);
}
Como pueden ver, lo único que hace la capa de lógica es llamar al método
create() de EmpleadoDAO, pasándole como parámetro un EmpleadoDTO,
después lo que haga el método create() es asunto de EmpleadoDAO.
Instituto Tecnológico de Morelia.
Página 171
ITM Unidad IV Acceso a Datos
EJERCICIO PROPUESTOS.
4.1 ¿Qué y para qué es el lenguaje SQL? Investigue acerca de este lenguaje
con mucho detalle. Sobre todo la sintaxis de sus consultas.
4.2 ¿Cuál es la sintaxis para dar de alta un registro, modificarlo, consultarlo o
eliminarlo? Ejemplifique diversas posibilidades.
4.3 Instale el paquete AppServ y de de alta un nuevo usuario con todos los
accesos y permisos sobre las bases de datos de MySQL.
4.4 Crear una base de datos con ayuda de phpMyAdmin, deberá contener al
menos 2 tablas, utilice el ambiente gráfico para ingresar 5 registros en cada
una y luego experimente como modificar o eliminar los registros creados. Ej.
Clientes
ID
Nombre
AP
AM
Productos
ID
Nombre
Precio
Existencia
4.5 Programe una función que le permita leer registro a registro el contenido de
las tablas de una base de datos. Impleméntela en una aplicación gráfica que
tenga los botones y campos de texto necesarios para ello. El usuario deberá
elegir que tabla desea consultar, en caso de que la base de datos contenga
varias.
4.6 Ejercicio de continuación del proyecto general. Cree una base de datos con
el nombre que guste que contenga una tabla que se llame “usuarios” esta tabla
deberá contener los campos: ID, usuario, password, nombre. Luego, haga que
la calculadora que ha desarrollado durante todo el material utilice esta base de
datos para el control de acceso, al igual que en la unidad anterior, donde se
utilizó un archivo estructurado.
4.7 Desarrolle una aplicación gráfica que implemente bases de datos para
almacenar palabras en ingles y sus equivalentes en español. Deberá crear la
base de datos necesaria y permitir al usuario consultar el significado de una
palabra en ingles. O sea, un traductor implementando bases de datos.
4.8 Explique con sus propias palabras la importancia de la capa de persistencia
de datos en una aplicación. ¿Para qué sirve? Y ¿Qué herramientas puede
utilizar para crearla?
4.9 ¿Cuáles son algunos de los objetos ADO Principales? ¿Para qué sirve
cada uno?
4.10 Haga un programa sencillo en el que implemente algún objeto DAO para
una consulta de datos. Realice la misma función sin utilizar el objeto y analice
Instituto Tecnológico de Morelia.
Página 172
ITM Unidad IV Acceso a Datos
cuales son las ventajas y desventajas de usarlo, no solo para su aplicación sino
para proyectos empresariales. Investigue en internet que tanto se utiliza esta
tecnología en comparación a los objetos ADO de Microsoft.
PROYECTO INTEGRAL
Existen muchos negocios en crecimiento que se interesan más y mas en
poseer un sistema que les ayude a controlar la mercancía que tienen a la
venta. La falta de un sistema de este tipo impide llevar un control exacto de las
ganancias, las ventas y la existencia en bodega de sus productos. Además de
que es menos posible detectar robos de esta manera.
Desarrolle una aplicación de escritorio que implemente el uso de bases de
datos. Consistirá en controlar los inventarios de la tienda de abarrotes “Doña
Lupe”, como se trata de un negocio pequeño, solo les interesa saber que
productos tienen, cuantos tienen, cuánto valen y quieren tener un sistema que
les permita consultar la existencia de cierto producto para saber si necesitan
comprar más o no, o si hay producto que está desapareciendo misteriosamente
de la tienda y cual.
Debe crear la base de datos que necesite y una interfaz que permita introducir
nuevos productos al inventario, eliminar productos que ya no se tienen o
realizar las consultas que el cliente necesita y se mencionaron anteriormente.
Instituto Tecnológico de Morelia.
Página 173
Unidad 5. Componentes y
Controles Definidos por el
Usuario.
ITM Unidad V Componentes y Controles Definidos por el Usuario
5.1 Modelo de componentes.
Un componente es un modulo de software independiente, que puede ser
reemplazado y es una parte de un sistema de software dentro de una
arquitectura bien definida. Un componente se ensambla a una arquitectura
debido a que realiza o implanta un conjunto de interfaces.
El modelo de componentes es una arquitectura y un API (del inglés Application
Programming Interface - Interfaz de Programación de Aplicaciones) que
permite a los desarrolladores definir segmentos reutilizables de código y que
pueden ser reutilizados para crear programas.
ActiveX
Es un término que hace referencia a un conjunto de tecnologías independientes
del lenguaje, que permiten que los componentes de software escritos en
diferentes lenguajes funcionen juntos en entornos de red. Los componentes
desarrollados bajo esta tecnología se denominan ActiveX.
Su fundamento es tratar de hacer que estos componentes sean reutilizables.
Cada componente (objeto) se caracteriza por un comportamiento, que se
puede alterar a través de sus métodos, propiedades o la interacción con otros
objetos.
5.2 Crear un componente Active X.
Los controles ActiveX son pequeñas aplicaciones capaces de interactuar con el
usuario, realizar cálculos o representar datos, y que se insertan en páginas web
a través de las etiquetas <OBJECT> y <PARAM>, que se corresponden a las
operaciones de inserción del componente y paso de sus parámetros de
ejecución.
Diferencia entre controles y componentes ActiveX
Los elementos desarrollados con esta tecnología pueden aplicarse tanto en el
lado cliente como en el lado servidor. Esta es la diferencia fundamental entre
un control ActiveX, que se ejecuta localmente en nuestra aplicación, de un
objeto ActiveX, que utiliza un "automation interface" (o interfaz automatizada)
para que otras aplicaciones o herramientas de programación puedan utilizarlo.
Se denomina formalmente componente al objeto ActiveX y no al control. Un
componente tiene la ventaja de que se trata de un estándar prácticamente
universal, multiplataforma y, por tanto, independiente de las aplicaciones y sus
lenguajes.
Los controles se encuentran en clara desventaja frente a las posibilidades que
nos ofrecen los objetos de servidor (componentes), al poder combinarse, a
través de ASP, con scripts y páginas HTML para poder crear webs
profesionales. Su funcionamiento precisa la instalación del objeto en la
máquina sobre la que se ejecute, y suele encontrarse bajo archivos de
extensión OCX o DLL.
Instituto Tecnológico de Morelia.
Página 175
ITM Unidad V Componentes y Controles Definidos por el Usuario
Para poder utilizar un componente, deberá enlazarlo con su página web a
través de programación en un lenguaje de script, directamente, o a través del
uso de ASP (Active Server Pages).
En cualquiera de los casos, deberá introducir cierto código para poder usar el
componente, una vez instalado en el servidor sobre el que vaya a ejecutarse.
Se trata, principalmente de una línea en la que crea una "instancia" del objeto
(componente) que va a usar, y el resto de código que utiliza los métodos y
propiedades de la instancia que acaba de crear. Por ejemplo, si escribimos en
una página ASP, el código debe quedar de la forma:
<%
Set OBJETO = Server.CreateObject(IDENTIFICADOR)
OBJETO.Metodo(Argumentos)
.......
%>
El parámetro "IDENTIFICADOR" es un identificador único del componente. Los
valores "OBJETO.Metodo(Argumentos)" referencian a las funciones, y
parámetros que necesitan las mismas para su llamada, que incorpora el
componente que estamos usando.
Por ejemplo, el componente Acceso a bases de datos utiliza objetos de datos
de ActiveX (ADO) para proporcionar un fácil acceso a la información
almacenada en una base de datos (o en otra estructura de datos en forma de
tabla), que cumpla con el estándar ODBC (Open DataBase Connectivity).
A continuación se muestra el código que tendría que colocar en su página ASP
para poder usar este objeto:
<%
'Aquí creamos la instancia del objeto
Set miconexion = Server.CreateObject("ADODB.Connection")
'Ahora usamos la instancia y sus propiedades
nuestros fines
'Indicamos al objeto la cadena de conexión
miconexion.ConnectionString = "DSN=midsn"
para
'Se abre la base de datos
miconexion.Open
' .......
'........
'Se cierra la base de datos
miconexion.Close
%>
Crear un componente
Instituto Tecnológico de Morelia.
Página 176
ITM Unidad V Componentes y Controles Definidos por el Usuario
Si tiene algo de experiencia en programación de aplicaciones, puede que le
resulte interesante desarrollar sus propios objetos para temas específicos.
Los componentes ActiveX pueden ser creados con las herramientas
tradicionales de desarrollo (que soporten automatización).
Entre las más conocidas están el Visual C++ (en particular MFC ActiveX
ControlWizard) y Borland C++ respectivamente. Sin embargo, tal vez le resulte
más sencillo el uso de otros como Visual Basic o Delphi.
El enlace natural de estos componentes con las páginas HTML se realiza
mediante scripts. Por ello, una vez creado el componente, podrá enlazarlo en
su web directamente a través de scripts o con el uso de páginas ASP. Dado
que la diferencia entre un control y un componente ActiveX radica en qué lugar
se ejecuta (Cliente o servidor) ejemplificaré la creación de un objeto de este
tipo en el apartado siguiente.
Encontrar Componentes ActiveX
Si busca por Internet encontrará numerosos componentes para muchisimas
utilidades. Aunque no todos los encontrará de manera gratuita (algunos son
comerciales), podrá obtener versiones de prueba con las que podrá decidir si le
interesa o no adquirir una licencia para su uso.
Puede visitar el siguiente sitio web donde encontrará información y algunos
componentes: http://www.activex.org/
5.3 Crear un Control Active X.
ActiveX está compuesto por dos tipos de objetos: controles Activos (Active
controls) y documentos Activos (Active documents). Estos últimos permiten
insertar documentos con formato PDF, DOC, etc. Cada objeto tiene suficiente
información para ejecutarse él mismo sin ayuda de ninguna aplicación.
Podemos crear nuestros propios controles o usar los creados por otros
programadores que nos los venden o distribuyen gratuitamente. Si optamos por
programarlos nosotros mismos existen herramientas que lo convierten
prácticamente en un juego de niños, entre ellas destaca las creadas para este
fin por Microsoft y que distribuye a través de su Web (www.microsoft.com/ie/).
Hoy por hoy el único inconveniente de la tecnología ActiveX consiste en que
sólo puede ser visto desde el sistema operativo Windows y con el Navegador
Internet Explorer, aunque afortunadamente parece que esto cambiará pronto.
Creando un control ActiveX (OCX)19
19
OCX hace referencia a módulos que publican controles y funciones para ser utilizados en programas para Windows, incluyendo
especialmente el navegador.
Instituto Tecnológico de Morelia.
Página 177
ITM Unidad V Componentes y Controles Definidos por el Usuario
Se pueden crear distintos tipos de controles activeX, lo único que requiere, es
decidir si quiere hacer un control como el de un formulario, un ejecutable, algo
que pueda cargar en una página web, etc. Al crear un proyecto nuevo en Visual
Basic tendrá que elegir cual desea desarrollar. Para el siguiente ejemplo, y con
el fin de que no se piense que los controles ActiveX son solo para temas
relacionados con el internet, haremos un ejecutable que se encargue de apagar
nuestra computadora.
Figura 5.1 Tipos de proyectos en Visual Basic.
Para crear un control OCX, siga los siguientes pasos en el Visual Basic.
NOTA IMPORTANTE: En esta ocasión no se señalará punto a punto y por
medio de imágenes dónde se localiza cada opción dentro de la interfaz gráfica
de Visual Basic, solo las que podría tener dificultad en localizar. Sin embargo,
está en muy intuitiva y no tendrá problema en seguir el procedimiento que se
describe a continuación.
1. Abrir Visual Basic y crear un proyecto "EXE Estándar" (Standard EXE) y le
vamos a agregar otro proyecto de tipo "Control ActiveX". De tal forma que nos
queden los dos proyectos como si fuera uno. El control que crearemos será
uno que nos permita apagar Windows, reiniciarlo, etc.
2. Seleccionamos la propiedad "InvisibleAtRunTime" y la ponemos en true, ya
que nuestro control no será visible durante la ejecución del proyecto en el que
se encuentre.
Instituto Tecnológico de Morelia.
Página 178
ITM Unidad V Componentes y Controles Definidos por el Usuario
Figura 5.2 Propiedades del proyecto.
Como puede observar, nuestro control es como un form normal, pero sin
bordes, ahora inserte un objeto image (Image1, se encuentran del lado
izquierdo de la pantalla, pase el puntero por encima para que se muestre el
nombre de cada objeto) y ponga como picture un icono que te parezca
representativo de lo que va a hacer nuestro control. O alguna imagen que
tenga a la mano para realizar la prueba.
3. En el evento "Resize" del UserControl pon lo siguiente... (Para ver los
eventos debe dar doble clic sobre el objeto que desee y a continuación
seleccionar
el
evento
de
una
lista
disponible).
Private Sub UserControl_Resize()
Image1.Top = 0
Image1.Left = 0
UserControl.Height = Image1.Height
UserControl.Width = Image1.Width
End Sub
Esto hará que el control se vea en el formulario como si fuera solo el icono de
la imagen.
Instituto Tecnológico de Morelia.
Página 179
ITM Unidad V Componentes y Controles Definidos por el Usuario
Figura 5.3 Evento Resize del control ActiveX.
4. Ahora debemos crear los Métodos del control, para eso vaya al menú
"Complementos" (Add-Ins), de ahí a "Administrador de Complementos" (Add-In
Manager) y haga doble clic sobre "Asistente para interfaz de controles ActiveX
de VB" (VB 6 ActiveX Ctrl Interface Wizard) seleccione la casilla “Cargado/No
Cargado” (Loaded/Unloaded) y pulse "Aceptar".
Figura 5.4 Ventana para activar el asistente de configuración de controles ActiveX.
El "Asistente para interfaz de controles ActiveX de VB" es un asistente que nos
guiará paso a paso en la asignación de métodos para nuestro control. Otra vez
vaya a "Complementos", allí aparecerá una nueva opción, que es el asistente.
Ábralo y pulse "Siguiente". En el cuadro "Nombres Disponibles" (Available
Instituto Tecnológico de Morelia.
Página 180
ITM Unidad V Componentes y Controles Definidos por el Usuario
names) tiene todos los métodos más comunes que puede insertar, en
"Nombres Seleccionados" (Selected names) no deje nada y pulse "Siguiente".
En esta nueva ventana podemos definir métodos personalizados.
Figura 5.5 Ventana: Seleccionar miembros de la interfaz.
De clic en "Nuevo" y crea estos métodos...
1. "Mensaje_Apagar"
2. "Cerrar_Sesion"
3. "Apagar_Sistema"
4. "Reiniciar_Sistema"
5. "Forzar_Apagado"
Figura 5.6 Ventana: Agregar miembros personalizados.
Instituto Tecnológico de Morelia.
Página 181
ITM Unidad V Componentes y Controles Definidos por el Usuario
No olvide de poner a cada uno como "Método" (Method) en el cuadro "Tipo"
(Type). De Clic a "Siguiente", en el cuadro siguiente no hacemos nada, así que
"Siguiente" de nuevo.
Figura 5.7 Ventana Crear miembros personalizaos de la interfaz.
El cuadro que nos salteamos nos permite decir a cuál de los componentes
insertados en nuestro control corresponden los métodos que tengamos puestos
(de los que aparecían en "Nombres Disponibles") ya que hay métodos que lo
tienen más de uno de los controles insertados y esto se presta a confusiones.
En la ventana actual, podemos agregar una descripción a cada cosa y designar
que valor retorna una función. Ponga una descripción a cada método lo desea,
aunque los nombres son bastante descriptivos. No cambien nada en lo de "Tipo
Devuelto". Denle a "Siguiente" y a "Finalizar".
Figura 5.8 Ventana Establecer atributos de los miembros.
Instituto Tecnológico de Morelia.
Página 182
ITM Unidad V Componentes y Controles Definidos por el Usuario
5. Vamos al código de control. Tenemos que declarar las APIs20 que realizaran
las operaciones necesarias:
(si no está familiarizado con la interfaz puede perderse en este punto, el código
siguiente debe ser insertado en la parte de las declaraciones del código de
nuestro control.)
Con esto se nos permitirá mostrar el dialogo de "Apagar el Sistema":
Private Declare Function SHShutDownDialog Lib
Alias "#60" (ByVal YourGuess As Long) As Long
"shell32"
Con el siguiente código se ejecutaran las demás operaciones:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal
uFlags As Long, ByVal dwReserved As Long) As Long
Const
Const
Const
Const
EWX_LOGOFF = 0
EWX_SHUTDOWN = 1
EWX_REBOOT = 2
EWX_FORCE = 4
Una vez que tenemos las declaraciones, tenemos las siguientes funciones (Se
pueden ver en la parte baja del código):
Public Function Dialogo_Apagar() As Variant
End Function
Y así para las demás funciones.
Ahora debemos poner las llamadas a las APIs dentro de cada
función...
Public Function Dialogo_Apagar() As Variant
SHShutDownDialog 0
End Function
Public Function Cerrar_Sesion() As Variant
ExitWindowsEx EWX_LOGOFF, 0
End Function
Public Function Apagar_Sistema() As Variant
ExitWindowsEx EWX_SHUTDOWN, 0
End Function
20
Del inglés Application Programming Interface - Interfaz de Programación de Aplicaciones
Instituto Tecnológico de Morelia.
Página 183
ITM Unidad V Componentes y Controles Definidos por el Usuario
Public Function Reiniciar_Sistema() As Variant
ExitWindowsEx EWX_REBOOT, 0
End Function
Public Function Forzar_Apagado() As Variant
ExitWindowsEx EWX_FORCE, 0
End Function
No elimine los comentarios ni el resto del código que haya generado
automáticamente Visual Basic.
Casi hemos terminado.
De clic a guardar y pase al formulario del proyecto ejecutable… (O sea, el otro,
que no hemos tocado, pulse CTRL+F4 para cerrar la ventana del formulario del
control ActiveX). El último icono que aparece en la barra de la izquierda es el
de nuestro control, dibújelo en el formulario de nuestro proyecto ejecutable
(aparecerá el ícono que le asignamos”) y vaya a la ventana de código del
formulario (En este punto, nuestro control apareció en el panel izquierdo, con el
nombre de “UserControl1”, es decir, hemos creado un control personalizado
ActiveX, a partir de este punto se pretende implementarlo). Escriba
"UserControl11" y ponga un punto para ver los métodos del control, aparecen
los
nuestros
mas
algunos
que
VB
pone
por
defecto.
Objeto insertado al formulario
(Elija una imagen pequeña) Esa
imagen es de la empresa en la que
laboro y es marca registrada Así que
cuidado con eso =)
Control
Nuevo
Ventana del código del
formulario y métodos de
nuestro control.
Figura 5.9 Utilización de nuestro control.
Instituto Tecnológico de Morelia.
Página 184
ITM Unidad V Componentes y Controles Definidos por el Usuario
Por último, ponga la propiedad "CanGetFocus" a False (nuestro control no
obtiene el foco porque es invisible).
En Paint u otro programa para manejo de imágenes cree un BMP de 16 x 15
pixeles. Coloque esa imagen en "ToolBoxBitmap", ese es el icono que
aparecerá en la barra de la izquierda (la barra de herramientas), en lugar del
icono por defecto.
Asigne un nombre en la propiedad "Nombre", de modo que cuando dibuje su
control en un formulario, el nombre por default del objeto será
“nombre_objeto_1”, “nombre_objeto_2”, etc.
Ejercicio: Vaya al Form1, borre el que control que pusimos anteriormente y el
código que en el que creamos el objeto (si escribió algo) e inserte uno nuevo.
Ponga en el form varios botones (uno que llame a cada función del control).
Guarde todo y pruébelo (recuerde que apagara su computadora así que tenga
cuidado).
Compile el control, elija el proyecto y vaya al menú "Archivo" y a "Generar
Nombre_quepuso.OCX". Elija donde desea guardarlo, asigne un nombre (Si se
llama Apagar_Equipo, puede ponerle Apagar_Equipo.OCX). Vaya a "Opciones"
y agregue la información que desee. Esto último es solo con el fin de poner su
nombre o lo que guste a su control... no afecta su funcionamiento.)
Inserción de un control ActiveX
El código HTML que se necesita para insertar un control o documento ActiveX
en una página Web fue desarrollado por Microsoft, con lo que se acordó el uso
del estándar OBJECT. A continuación veremos un sencillo ejemplo que no
requiere ningún archivo especial, el único requisito para poder visualizarlo
consistirá en tener instalado el navegador Internet Explorer 3.0 o superior, en
este caso se utilizó Internet Explorer 7.0. El código usado para insertar el
control ActiveX será:
<OBJECT WIDTH=250 HEIGHT=340
CLASSID="clsid:99B42120-6EC7-11CF-A6C7-00AA00A47DD2">
<PARAM NAME="alignment" VALUE="2">
<PARAM NAME="BackStyle" VALUE="3">
<PARAM NAME="caption" VALUE="Programación II">
<PARAM NAME="FontName" VALUE="Arial">
<PARAM NAME="FontSize" VALUE="30">
<PARAM NAME="FontBold" VALUE="1">
<PARAM NAME="Backcolor" VALUE="#006600">
<PARAM NAME="Forecolor" VALUE="#FFFFFF">
Para visualizar el control ActiveX necesita Explorer 3.0 o posterior.
</OBJECT>
En la figura 5.1 podemos ver el resultado obtenido tal y como se ve con Internet
Explorer 7.0. Pasemos a explicar el este código: El valor del atributo CLASSID
es el que identifica el tipo de control ActiveX que estamos insertando. Este
código es complejo y se sale de los objetivos de esta obra.
Instituto Tecnológico de Morelia.
Página 185
ITM Unidad V Componentes y Controles Definidos por el Usuario
Figura 5.10 Objeto ActiveX
Usando este control ActiveX podemos crear efectos variados con texto…
Entre los principales parámetros usados en la inserción de este control ActiveX
encontramos:
Caption: Es el texto que debe insertarse con las características que se indican
con el resto de parámetros.
Angle: Es el ángulo del texto con la horizontal en grados. Si le damos el valor
90 el control mostrará el texto en vertical.
FontSize: Es el tamaño del texto.
FontName: Es el tipo de letra.
Backcolor y Forecolor: Son el color del fondo y el color del texto
respectivamente.
Ejercicio: Hacer pruebas modificando los valores de estos y el resto de los
atributos para adaptarlo a nuestras necesidades y poder incorporarlo en sus
propias páginas.
EJERCICIOS PROPUESTOS
Instituto Tecnológico de Morelia.
Página 186
ITM Unidad V Componentes y Controles Definidos por el Usuario
5.1 ¿Qué es un control modelo de componentes?
5.2 ¿Qué es un control ActiveX? ¿Para qué sirve?
5.3 ¿Qué es un componente ActiveX? ¿Para qué sirven?
5.4 ¿Cuál es la diferencia entre un control y un componente?
5.5 ¿Qué herramientas se pueden utilizar para crear componentes y controles
ActiveX? ¿Por qué?
5.6 ¿Cuáles son las ventajas y desventajas principales de los componentes
ActiveX?
5.7 ¿Qué herramientas existen para crear elementos equivalentes a los
controles y componentes ActiveX?
5.8 Realice una investigación para determinar cuál es la tecnología equivalente
a los controles y componentes ActiveX para el lenguaje Java.
5.9 Investigue qué tipos de controles y componentes ActiveX pueden ser
programados en Visual Basic.
5.10 ¿Por qué a pesar de ser una herramienta tan útil, ActiveX es una
herramienta que se utiliza poco a comparación de otras herramientas
disponibles?
PROYECTO INTEGRAL.
Proyecto 1: Crear tu propio componente o control ActiveX. No importa que
funcionalidad le de. Utilice Visual Basic para crear un objeto personalizado y
posteriormente utilícelo en alguna aplicación de escritorio o Web.
Recuerde: Visual Basic es una de las herramientas que permiten crear este tipo
de objetos de una manera sencilla. Después de crearlo, deberá probarlo y
utilizarlo.
Proyecto 2: Desarrolle una investigación detallada acerca de Java Beans y
desarrolle un ejemplo sencillo que realice cualquier función equivalente a la de
los controles ActiveX.
Instituto Tecnológico de Morelia.
Página 187
ITM Apéndice 1 “Instalación de NetBeans”
Apéndice 1
Instalación de NetBeans
A continuación se darán las instrucciones de como instalar NetBeans IDE en
cada una de las plataformas soportadas. Recuerde que el JDK21 de java ya
debe estar instalado en el sistema. Hay dos versiones de NetBeans, una
normal y una que incluye ya los paquetes, sin embargo la instalación no tiene
dificultad alguna. (Es del tipo accept, next, next, finish.)
Instalación en Windows XP o Vista
1. Bajar e instalar el JDK de internet, una de las paginas que lo tiene es:
http://java.sun.com/javase/downloads/index.jsp
2. Después de haber bajado el instalador, dar doble clic sobre el icono para
iniciar el instalador.
3. Después aparecerá el Acuerdo de Licenciamiento (License Agreement),
acéptelo y de clic en Siguiente (Next).
4. Especificar un directorio vacío donde instalar Netbeans IDE. Dar clic en
Siguiente (Next).
5. Selecciones el JDK que se quiere usar junto con el NetBeans IDE de la
lista de selección si hay más de uno. Dar clic en Siguiente (Next). (si ya
tiene instalada una versión no le pregunta)
6. Verifique que el directorio de instalación es el correcto y que se cuenta
con espacio suficiente en el sistema para la instalación.
7. De clic en Siguiente (Next) para iniciar la instalación.
Instalación en Linux (Este proceso se probó en Ubuntu 8.1 Intrepid Ibex)
1. Abrir una consola de comandos y ejecutar el comando “sudo su”,
después de ingresar la contraseña adecuada podrá ejecutar el siguiente
comando.
2. $sudo apt-get install netbeans. Con esto se nos listas los paquetes que
se instalarán, el espacio requerido, etc. Y al final se nos preguntará si se
desea proceder.
3. ¿Desea continuar [S/n]?
4. Una vez que selecciona continuar, la instalación se crea sin ningún
problema y la aplicación se agrega a la lista de aplicaciones de Ubuntu.
Nota: Los pasos pueden ser diferentes dependiendo de la distribución que
tenga.
Ejecutar NetBeans IDE
A continuación se explicará la forma de ejecutar NetBeans IDE en los
diferentes sistemas operativos.
Ejecutar en Windows XP o Vista
21
Java Development Kit. Kit de desarrollo de Java. Necesario para trabajar con dicho lenguaje.
Instituto Tecnológico de Morelia.
Página 188
ITM Apéndice 1 “Instalación de NetBeans”
Para ejecutar el IDE en Máquinas con Microsoft Windows hacer lo siguiente:
• Dar Doble clic en el icono de NetBeans IDE en el escritorio.
• Desde el Menú Inicio, seleccionar NetBeans IDE > NetBeans IDE
Ejecutar en Linux (Ubuntu 8.1 Intrepid Ibex)
•
•
Dar Doble clic en el icono de NetBeans IDE en el escritorio.
Buscar el ícono de la aplicación en el listado de aplicaciones y dar clic
sobre el mismo.
Desinstalar NetBeans IDE
A continuación se mostrará como desinstalar NetBeans IDE en los diferentes
sistemas operativos.
Desinstalar en Windows XP o Vista
1. Desde el Menú Inicio, escoger Panel de Control.
2. Dar doble clic en el icono de “Agregar o Quitar Programas”.
3. Seleccionar NetBeans IDE de la lista y dar clic en “Remover”.
Desinstalar en Linux (Ubuntu 8.1 Intrepid Ibex)
1. Entre a una consola de comandos y ejecute el comando sudo para
poder ejecutar algunos comandos con permisos de root.
2. Ejecute $sudo apt-get remove netbeans.
Instalación de Eclipse en (Ubuntu 8.1 Intrepid Ibex)
1. Abrir una consola de comandos y ejecutar el comando “sudo su”,
después de ingresar la contraseña adecuada podrá ejecutar el siguiente
comando.
2. $sudo apt-get install eclipse. Con esto se nos listas los paquetes que se
instalarán, el espacio requerido, etc. Y al final se nos preguntará si se
desea proceder.
3. ¿Desea continuar [S/n]?
4. Una vez que selecciona continuar, la instalación se crea sin ningún
problema y la aplicación se agrega a la lista de aplicaciones de Ubuntu.
5. Para ejecutar la aplicación o desinstalarla siga la misma lógica que se
aplicó al instalar NetBeans.
Instalación de JCreator en Windows XP o Vista
Instituto Tecnológico de Morelia.
Página 189
ITM Apéndice 1 “Instalación de NetBeans”
1. La instalación es muy sencilla independientemente de la versión, sobre
todo hablando de instalar aplicaciones en Windows. Primero localice el
archivo instalador y de doble clic. Presione “Next” y luego acepte la
licencia y presione “Next” nuevamente
2. Seleccione el directorio donde desea que se instale la aplicación y
presione “Next”.
3. Seleccione sonde desea que se coloquen accesos directos y presione
“Next”.
4. Finalmente presione “Install” y termine la instalación con “Finish”
Instituto Tecnológico de Morelia.
Página 190
ITM Apéndice 2 “Introducción a MySQL”
Apéndice 2
Introducción a MySQL
MySQL es un gestor de base de datos sencillo de usar, es uno de los motores de base
de datos más usados en Internet, la principal razón de esto es que es Open Source.
En este apéndice se pretende mostrar el uso del programa cliente mysql para crear y
usar una sencilla base de datos, se analizara solo lo necesario para llevar a cabo un
ejercicio como el que se presenta en el material.
Mysql es un programa interactivo que permite conectarnos a un servidor MySQL,
ejecutar algunas consultas, y ver los resultados.
Supongamos que mysql está instalado en alguna máquina y que disponemos de un
servidor MySQL al cual podemos conectarnos (Tal como lo deja AppServ). Para ver la
lista de opciones proporcionadas por mysql, lo invocamos con la opción --help:
> mysql --help
A continuación se describe el proceso completo de creación y uso de una base de
datos en MySQL. Puesto que es imposible que se describan a detalle muchos de los
temas relacionados con la funcionalidad total de MySQL, se recomienda que se
consulte el manual de MySQL para obtener más información al respecto.
Conectar al servidor MySQL
Para conectarse al servidor, usualmente necesitamos de un nombre de usuario (login)
y de una contraseña (password), y si el servidor al que nos deseamos conectar está en
una máquina diferente de la nuestra, también necesitamos indicar el nombre o la
dirección IP de dicho servidor. Una vez que conocemos estos tres valores, podemos
conectarnos de la siguiente manera:
> mysql -h NombreDelServidor -u NombreDeUsuario -p
Cuando ejecutamos este comando, se nos pedirá que proporcionemos también la
contraseña para el nombre de usuario que estamos usando.
Si la conexión al servidor MySQL se pudo establecer de manera satisfactoria,
recibiremos el mensaje de bienvenida y estaremos en el prompt de mysql:
Instituto Tecnológico de Morelia.
Página 191
ITM Apéndice 2 “Introducción a MySQL”
>mysql -h root -u algo -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5563 to server version: 3.23.41
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Esto nos indica que mysql está listo para recibir comandos.
Después de que nos hemos conectado de manera satisfactoria, podemos
desconectarnos en cualquier momento al escribir "quit", "exit", o presionar
CONTROL+D.
La mayoría de los ejemplos siguientes asume que estamos conectados al servidor, lo
cual se indica con mysql>.
Sintaxis MySQL
En este momento debimos de haber podido conectarnos ya al servidor MySQL, aún
cuando no hemos seleccionado alguna base de datos para trabajar. Lo que haremos a
continuación es escribir algunos comandos para irnos familiarizando con el
funcionamiento de mysql.
•
•
•
•
•
Un comando normalmente consiste de una sentencia SQL seguida por un punto
y coma.
Cuando emitimos un comando, mysql lo manda al servidor para que lo ejecute,
nos muestra los resultados y queda listo para recibir más consultas.
mysql muestra los resultados de la consulta como una tabla (filas y columnas).
La primera fila contiene etiquetas para las columnas. Las filas siguientes
muestran los resultados de la consulta. Normalmente las etiquetas de las
columnas son los nombres de los campos de las tablas que estamos usando en
alguna consulta.
mysql muestra cuántas filas fueron regresadas y cuanto tiempo tardó en
ejecutarse la consulta, lo cual puede darnos una idea de la eficiencia del
servidor, aunque estos valores pueden ser un tanto imprecisos ya que no se
muestra la hora del CPU, y porque pueden verse afectados por otros factores,
tales como la carga del servidor y la velocidad de comunicación en una red.
Las palabras clave pueden ser escritas usando mayúsculas y minúsculas.
Instituto Tecnológico de Morelia.
Página 192
ITM Apéndice 2 “Introducción a MySQL”
Las siguientes consultas son equivalentes:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
Es posible escribir más de una sentencia por línea, siempre y cuando estén separadas
por punto y coma:
mysql> SELECT VERSION(); SELECT NOW();
Sintaxis MySQL
Un comando no necesita ser escrito en una sola línea, así que los comandos que
requieran de varias líneas no son un problema. mysql determinará en dónde finaliza la
sentencia cuando encuentre el punto y coma, no cuando encuentre el fin de línea.
Aquí está un ejemplo que muestra una consulta simple escrita en varias líneas:
mysql> SELECT
-> USER(),
-> CURRENT_DATE;
+-------------------+--------------+
| USER()
| CURRENT_DATE |
+-------------------+--------------+
| root@localhost
| 2008-12-24
|
+-------------------+--------------+
1 row in set (0.00 sec)
mysql>
En este ejemplo debe notarse como cambia el texto (de mysql> a ->, a ese texto se le
conoce como propmt.) cuando se escribe una consulta en varias líneas. Esta es la
manera en cómo mysql indica que está esperando a que finalice la consulta. Sin
embargo si deseamos no terminar de escribir la consulta, podemos hacerlo al escribir \c
como se muestra en el siguiente ejemplo:
mysql> SELECT
-> USER(),
-> \c
mysql>
Instituto Tecnológico de Morelia.
Página 193
ITM Apéndice 2 “Introducción a MySQL”
Está listo para una nueva consulta.
Los comandos multi-línea comúnmente ocurren por accidente cuando tecleamos
ENTER, pero olvidamos escribir el punto y coma. En este caso mysql se queda
esperando para que finalicemos la consulta:
mysql> SELECT
USER()
->
Si esto llega a suceder, muy probablemente mysql estará esperando por un punto y
coma, si escribimos el punto y coma podremos completar la consulta y mysql podrá
ejecutarla:
mysql> SELECT USER()
-> ;
+----------------+
| USER()
|
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql>
Los prompts '> y "> ocurren durante la escritura de cadenas. En mysql podemos
escribir cadenas utilizando comillas sencillas o comillas dobles (por ejemplo, 'hola' y
"hola"), y mysql nos permite escribir cadenas que ocupen múltiples líneas. De manera
que cuando veamos el prompt '> o ">, mysql nos indica que hemos empezado a
escribir una cadena, pero no la hemos finalizado con la comilla correspondiente.
Aunque esto puede suceder si estamos escribiendo una cadena muy grande, es más
frecuente que obtengamos alguno de estos prompts si inadvertidamente escribimos
alguna de estas comillas.
Por ejemplo:
mysql> SELECT * FROM mi_tabla WHERE nombre = "Tecnológico
AND edad < 30;
">
Si escribimos esta consulta SELECT y entonces presionamos ENTER para ver el
resultado, no sucederá nada. En lugar de preocuparnos porque la consulta ha tomado
mucho tiempo, debemos notar la pista que nos da mysql cambiando el prompt. Esto
nos indica que mysql está esperando que finalicemos la cadena iniciada ("Tecnológico).
Instituto Tecnológico de Morelia.
Página 194
ITM Apéndice 2 “Introducción a MySQL”
En este caso, lo más simple es cancelar la consulta. Sin embargo, no basta con escribir
\c, ya que mysql interpreta esto como parte de la cadena que estamos escribiendo. En
lugar de esto, debemos escribir antes la comilla correspondiente y después \c :
mysql> SELECT * FROM mi_tabla WHERE nombre = "Tecnológico AND
edad < 30;
"> " \c
mysql>
El prompt cambiará de nuevo al ya conocido mysql>, indicándonos que mysql está listo
para una nueva consulta.
Es sumamente importante conocer lo que significan los prompts '> y ">, ya que si en
algún momento nos aparece alguno de ellos, todas la líneas que escribamos a
continuación serán consideradas como parte de la cadena, inclusive cuando escribimos
QUIT. Esto puede ser confuso, especialmente si no sabemos que es necesario escribir
la comilla correspondiente para finalizar la cadena, para que podamos escribir después
algún otro comando, o terminar la consulta que deseamos ejecutar.
Usar una base de datos
Ahora que conocemos como escribir y ejecutar sentencias, es tiempo de acceder a una
base de datos.
Crearemos la misma base de datos y las tablas que se crean en el materia de esta
materia utilizando “phpMyadmin” así podrá realizar una comparación entre utilizar la
línea de comandos o alguna aplicación gráfica que le permita administrar su servidor
mySQL.
La base de datos "Negocio" será muy simple (deliberadamente), pero no es difícil
pensar de situaciones del mundo real en la cual una base de datos similar puede ser
usada.
Primeramente usaremos la sentencia SHOW para ver cuáles son las bases de datos
existentes en el servidor al que estamos conectados:
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql
|
| test
|
+----------+
2 rows in set (0.00 sec)
mysql>
Instituto Tecnológico de Morelia.
Página 195
ITM Apéndice 2 “Introducción a MySQL”
Es probable que la lista de bases de datos que veamos sea diferente en nuestro caso,
pero seguramente las bases de datos "mysql" y "test" estarán entre ellas. En particular,
la base de datos "mysql" es requerida, ya que ésta tiene la información de los
privilegios de los usuarios de MySQL. La base de datos "test" es creada durante la
instalación de MySQL con el propósito de servir como área de trabajo para los usuarios
que inician en el aprendizaje de MySQL, como puede recordar, cuando comenzamos a
trabajar con phpMyadmin utilizamos la base de datos “test”.
Es posible que no veamos todas las bases de datos si no tenemos el privilegio SHOW
DATABASES. Se recomienda revisar la sección del manual de MySQL dedicada a los
comandos GRANT y REVOKE.
Si la base de datos "test" existe, hay que intentar accesar a ella:
mysql> USE test
Database changed
mysql>
Observe que USE, al igual que QUIT, no requieren el uso del punto y coma, aunque si
se usa no hay ningún problema. El comando USE es especial también de otra manera:
éste debe ser usado en una sola línea.
Crear una base de datos
Intentaremos acceder a la base de datos, si no ha sido creada deberemos hacerlo
nosotros mismos.
mysql> USE Negocio
ERROR 1049: Unknown database
'Negocio'
mysql>
El mensaje anterior indica que la base de datos no ha sido creada, por lo tanto
necesitamos crearla.
mysql> CREATE DATABASE Negocio;
Query OK, 1 row affected (0.00 sec)
mysql> USE Negocio
Database changed
mysql>
Instituto Tecnológico de Morelia.
Página 196
ITM Apéndice 2 “Introducción a MySQL”
Al crear una base de datos no se selecciona ésta de manera automática; debemos
hacerlo de manera explícita, por ello usamos el comando USE en el ejemplo anterior.
La base de datos se crea sólo una vez, pero nosotros debemos seleccionarla cada vez
que iniciamos una sesión con mysql. Por ello es recomendable que se indique la base
de datos sobre la que vamos a trabajar al momento de invocar al monitor de MySQL.
Por ejemplo:
>mysql -h parametro1 -u usuario -p Negocio
Enter password: ******
Welcome to the MySQL monitor. Commands end
with ; or \g.
Your MySQL connection id is 17 to server
version: 3.23.38-nt
Type 'help;' or '\h' for help. Type '\c' to
clear the buffer
mysql>
Observe que "Negocio" no es la contraseña que se está proporcionando desde la línea
de comandos, sino el nombre de la base de datos a la que deseamos acceder. Si
deseamos proporcionar la contraseña en la línea de comandos después de la opción "p", debemos de hacerlo sin dejar espacios (por ejemplo, -phola123, no como -p
hola123). Sin embargo, escribir nuestra contraseña desde la línea de comandos no es
recomendado, ya que es bastante inseguro.
Crear tabla
Crear la base de datos es la parte más fácil, pero en este momento la base de datos
está vacía, como lo indica el comando SHOW TABLES:
mysql> SHOW TABLES;
Empty set (0.00 sec)
La parte un tanto complicada es decidir la estructura que debe tener nuestra base de
datos: qué tablas se necesitan y qué columnas estarán en cada tabla.
En principio, Contendrá las tablas Clientes, Productos y Empleados.
Los campos serán: para Clientes (Id, nombre, dirección), para Productos (Id, nombre y
precio) y para empleados (Id, nombre, salario).
Instituto Tecnológico de Morelia.
Página 197
ITM Apéndice 2 “Introducción a MySQL”
Usaremos la sentencia CREATE TABLE para indicar como estarán conformados los
registros de nuestros clientes.
mysql> CREATE TABLE Clientes(
-> id INT, nombre VARCHAR(60),
-> direccion VARCHAR(120);
Query OK, 0 rows affected (0.02 sec)
mysql>
Lleve a cabo el mismo procedimiento para las tres tablas. Consulte el manual de
MySQL para saber más acerca de los tipos de datos que se utilizan, sus longitudes y la
manera adecuada de asignarlos a campos dentro de una tabla.
Ahora que hemos creado la tabla, la sentencia SHOW TABLES debe producir algo
como:
mysql> SHOW TABLES;
+---------------------+
| Tables_in_Negocio |
+---------------------+
| clientes
|
| productos
| empleados
|
+---------------------+
3 row in set (0.00 sec)
mysql>
Para verificar que la tabla fue creada como nosotros esperábamos, usaremos la
sentencia DESCRIBE:
mysql> DESCRIBE clientes;
+--------------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id
| INT
| NO |
| NULL
|
|
| nombre
| varchar(60) |NO|
| NULL
|
|
| direccion| varchar(120)|NO|
| NULL
|
|
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql>
Instituto Tecnológico de Morelia.
Página 198
ITM Apéndice 2 “Introducción a MySQL”
Podemos hacer uso de la sentencia DESCRIBE en cualquier momento, por ejemplo, si
olvidamos los nombres ó el tipo de las columnas en alguna tabla.
Cargar datos en una tabla
Después de haber creado la tabla, ahora podemos incorporar algunos datos en ella,
para lo cual haremos uso de la sentencia INSERT.
En la manera más simple, debemos proporcionar un valor para cada columna en el
orden en el cual fueron listados en la sentencia CREATE TABLE.
mysql> INSERT INTO clientes
-> VALUES('1', 'Saul Chavez', 'Constelaciones 99');
Recuperar información de una tabla
La sentencia SELECT es usada para obtener la información guardada en una tabla. La
forma general de esta sentencia es:
SELECT
LaInformaciónQueDeseamos
CondiciónASatisfacer
FROM
DeQueTabla
WHERE
Aquí, LaInformaciónQueDeseamos es la información que queremos ver. Esta puede
ser una lista de columnas, o un * para indicar "todas las columnas". DeQueTabla indica
el nombre de la tabla de la cual vamos a obtener los datos. La clausula WHERE es
opcional. Si está presente, la CondiciónASatisfacer especifica las condiciones que los
registros deben satisfacer para que puedan ser mostrados.
Seleccionando todos los datos
La manera más simple de la sentencia SELECT es cuando se recuperan todos los
datos de una tabla:
mysql> SELECT * FROM clientes;
+---+-----------------+--------------------------+
| id |
nombre
| dirección
|
+---+-----------------+--------------------------+
| 1 | Saul Chavez | Constelaciones 99
|
+---+------------------+-------------------------+
1 rows in set (0.00 sec)
Esta forma del SELECT es útil si deseamos ver los datos completos de la tabla.
Para eliminar “todos” los datos de una tabla usamos la sentencia DELETE.
mysql> DELETE FROM clientes;
Instituto Tecnológico de Morelia.
Página 199
ITM Apéndice 2 “Introducción a MySQL”
Para llevar a cabo una modificación, utilizamos una sentencia UPDATE:
mysql> UPDATE clientes SET nombre="Saul Hernandez
de caifanes"
WHERE nombre="Saul Chavez";
Como se mostró anteriormente, es muy fácil recuperar los datos de una tabla completa.
Pero típicamente no deseamos hacer esto, particularmente cuando las tablas son
demasiado grandes..
Seleccionar registros particulares
Podemos seleccionar sólo registros particulares de una tabla. Por ejemplo, si
deseamos verificar el cambio que hicimos al nombre de Saul Chavez, seleccionamos
sólo el registro de Saul Hernandez de caifanes de la siguiente manera:
mysql> SELECT * FROM clientes WHERE id="1";
+---+-----------------+--------------------------+
| id |
nombre
| dirección
|
+---+-----------------+--------------------------+
| 1 | Saul Hernandez de caifanes | Constelaciones 99|
+---+------------------+-------------------------+
1 rows in set (0.00 sec)
La salida mostrada confirma que el nombre ha sido modificado de Saul Chavez a Saul
Hernandez de caifanes.
La comparación de cadenas es normalmente no sensitiva, así que podemos especificar
el nombre como "Saul Chavez", "saul chavez", etc. El resultado de la consulta será el
mismo.
Podemos además especificar condiciones sobre cualquier columna, no sólo el "id",
como el nombre o la dirección. O incluso utilizar el operador lógico AND u OR para
especificar más condiciones:
mysql> SELECT * FROM clientes WHERE id = "1" OR Nombre = "Saul
Chavez";
Si tenemos una mayor cantidad de operadores AND u OR y queremos determinar el
orden en que se deben agrupar las condiciones, es buena idea usar paréntesis.
Seleccionar columnas particulares
Si no deseamos ver los registros completos de una tabla, entonces tenemos que usar
los nombres de las columnas en las que estamos interesados separándolas por coma.
Instituto Tecnológico de Morelia.
Página 200
ITM Apéndice 2 “Introducción a MySQL”
Por ejemplo, si deseamos conocer solo la dirección, debemos seleccionar la columna
"direccion" únicamente:
mysql> SELECT direccion FROM clientes;
+-------------------------+
| dirección
|
+-------------------------+
| Constelaciones 99|
+-------------------------+
1 rows in set (0.00 sec)
La extracción de información de una base de datos puede ser tan específica como lo
requiera el usuario y hay muchas palabras claves que facilitan el filtrado, ordenamiento
u otra acción a realizar en los registros resultantes de una consulta. Para conocer a
profundidad la creación de sentencias por favor consulte el manual de mySQL ya que
este material es meramente introductorio.
Instituto Tecnológico de Morelia.
Página 201
ITM
Conclusiones
En este material se han conseguido los objetivos propuestos:
Elaborar el material didáctico para la asignatura de Programación II y proporcionar los
conocimientos teórico – prácticos a los estudiantes, quienes aplicarán los
conocimientos en un lenguaje de programación orientado a eventos, para resolver
problemas dentro de los procesos administrativos.
Desarrollar material que lleve de la mano al alumno y sea una herramienta útil para el
profesor, con explicaciones sencillas.
Respetar el temario indicado y desarrollarlo utilizando el lenguaje Java y analizar
herramientas alternativas relacionadas con Java para temas que no tienen relación con
dicho lenguaje.
Apoyar sustancialmente al profesor y alumno de la asignatura de Programación II,
ofreciendo al alumno una buena referencia de la cual extraer información, tomar
ejemplos, realizar ejercicios, etc. durante el estudio de esta asignatura. A los profesores
de la misma, les podrá funcionar como apoyo y guía durante el desarrollo de los temas.
Así mismo, apoya a sostener el programa de acreditación de la carrera de la
Licenciatura en Informática.
Este material fue desarrollado de manera tal, que se facilite el aprendizaje y que este
sea además progresivo y la dificultad vaya en aumento para así no solo guiar al
alumno, sino inculcar en él la necesidad de investigar y aprender más acerca de los
temas expuestos. Por ejemplo: en la unidad uno se desarrollan los temas relacionados
con la “base” del lenguaje, sus estructuras, su sintaxis, su importancia, etc. Y todo se
realiza desarrollando proyectos en consola, con una interfaz rudimentaria y ejemplos
sencillos, de cualquier modo, los ejemplos van aumentando en su grado de
complejidad, comenzando con un simple “hola mundo” hasta pequeñas aplicaciones
donde se piden datos por medio de una interfaz ahora un poco mejor y se trabajan de
tal manera que se obliga al alumno a practicar lo expuesto durante toda la unidad
como: ciclos, estructuras, declaraciones, objetos, clases, herencia, polimorfismo, etc.
etc. etc.
Siguiendo esta idea de aumento progresivo en dificultad de programación y análisis de
conceptos, en la segunda unidad se introduce al alumno a un ambiente gráfico, en el
cual debe implementar “todo” lo aprendido en la unidad I pero ahora utilizando
elementos de un ambiente gráfico como botones, cuadros de diálogo, ventanas, áreas
de texto, etc.
Instituto Tecnológico de Morelia.
Página 202
ITM
Posteriormente, en la unidad III, el alumno es guiado a implementar lo aprendido en las
unidades anteriores y fusionarlos con la administración de archivos. Hasta el momento,
todos los ejemplos y ejercicios fueron planeados de tal manera que los datos fueran
almacenados y generados en memoria, en esta unidad se da otro giro implementando
ahora archivos como fuente de información y lugares de almacenamiento. Es así como
en esta unidad se logra desarrollar aplicaciones gráficamente amigables que
implementan archivos para funcionar.
Después, en la unidad IV se sigue con la línea de aprendizaje guiando al alumno a la
implementación de bases de datos como medio de almacenaje y lectura de
información. Aunque no se profundiza demasiado en este tema debido a que el objetivo
durante ésta materia es más introductorio. A pesar de esto, se detalla como instalar un
servidor de bases de datos, como utilizarla usando el lenguaje de programación java y
el ambiente gráfico de NetBeans e incluso se ejemplifican pequeñas aplicaciones con
bases de datos pequeñas también. Con ello, el alumno contará con los conocimientos
necesarios en relación con bases de datos para un aprendizaje futuro.
Por último, en la unidad V salimos un poco de la temática que gira alrededor de Java
para analizar herramientas que trabajan con otros lenguajes como Visual Basic. El
objetivo es mostrar al alumno que además de poder programar aplicaciones poderosas
utilizando los componentes y controles existentes, es posible crear sus propios
componentes con fines específicos. Y debido a que los temas que propone el temario
están relacionados con el lenguaje Visual Basic y uno de los objetivos del libro fue
desarrollar los temas utilizando el lenguaje java, se da al alumno la tarea de analizar el
equivalente a la tecnología Active X de Microsoft en el lenguaje Java.
Así pues, se estructuró el contenido de este material, guiando al alumno de lo más
sencillo a lo más complejo, siempre ejemplificando y proponiendo ejercicios que
fuercen al alumno a ir un poco más profundo…
A pesar de que este material fue realizado en la versión más actual en cuanto a las
herramientas que involucra, siempre hay herramientas nuevas que surgen incluso día
con día y esto podría dejar atrás ciertos métodos analizados. Sin embargo, la esencia
del funcionamiento de cualquier lenguaje orientado a eventos queda plasmada y no
pasará de moda, además, analizando la evolución de los lenguajes de programación
puedo predecir que este material será de utilidad durante suficiente tiempo para cumplir
su misión y ayudar al alumnado y profesorado de la mejor institución educativa pública
del estado a aprender y enseñar respectivamente.
Instituto Tecnológico de Morelia.
Página 203
ITM
Bibliografía
1. Steven Holzner - “La Biblia Del Java 2”
Ed. Coriolis.
2. Deitel – “Java How to Program”, 4th EditionMicrosoft
Ed. Prentice Hall
3. Taylor David.
Object Orient informations systems, planning and implementations.
Ed. Ed. Wiley, Canada, 1992.
4. Fco. Javier Ceballos.
Java 2 Curso de Programación.
Ed. Alfaomega.
5. Herbert Schildt.
Fundamentos de Programación en Java 2.
Ed. McGrawHil.
6. Agustín Froufe.
Java 2 Manual de usuario y tutorial.
Ed. Alfaomega.
Instituto Tecnológico de Morelia.
Página 204
ITM
7. Stephen R. Davis.
Aprenda Java Ya.
Ed. McGrawHill.
8. Laura Lemay, Rogers Cadenhead.
Aprendiendo JAVA 2 en 21 días.
Ed. Prentice Hall.
9. Kris Jamsa Ph D..
¡Java Ahora!
Ed. McGrawHill..
10. Philip Heller, Simon Roberts
Complete Java® 2 Certification: Study Guide
Fifth Edition
11. http://java.sun.com/
Web oficial de SUN. Puedes encontrar: información, software, etc.
Fecha de consulta: 02/ene/09
12. http://www.javaworld.com/
Documentación muy completa.
Fecha de consulta: 03/ene/09
Instituto Tecnológico de Morelia.
Página 205
ITM
13. http://www.adictosaltrabajo.com/indexg.php?pagina=tutoriales
Tutoriales muy completos
Fecha de consulta: 10/ene/09
14. http://www.developer.com/java/
Información muy actualiza respecto al mundo de java.
Fecha de consulta: 27/ene/09
15. http://www.javahispano.org/canyamo.action
Uno de los sitios de java más completos que hay en español.
Fecha de consulta: 10/ene/09
16. http://www.programacion.net/java/
Otro buen sitio de java en español.
Fecha de consulta: 15/ene/09
17. http://www.exampledepot.com/
Aquí se puede disponer de muchos ejemplos sencillos.
Fecha de consulta: 08/ene/09
18. http://www.java2s.com/
Otro excelente sitio con información confiable y ejemplos sobre java.
Fecha de consulta: 01/feb/09
19. http://www.lawebdelprogramador.com/
Instituto Tecnológico de Morelia.
Página 206
ITM
Información confiable, chat para resolver dudas, foros de consulta, libros incluso posee
un área de ofertas de trabajo.
20. http://www.elrincondelprogramador.com/
Buena fuente de información, no solo para temas relacionados con java, sino con más
lenguajes.
Fecha de consulta: 05/feb/09
21. http://mindprod.com/jgloss/jgloss.html
Glosario muy completo sobre java. Aunque el diseño de la página no es el mejor.
Fecha de consulta: 05/ene/09
22. http://java.dzone.com/
Pagina con foros, links e información sobre java muy confiables pero sobre temas
avanzados del lenguaje.
Fecha de consulta: 17/ene/09
23. http://www.javasoft.com
Fuente confiable y completa.
Fecha de consulta: 01/feb/09
24. http://www.prenhall.com/deitel
Pagina con la cual se complementa la información que viene en la obra de deitel.
Fecha de consulta: 03/ene/09
25. http://es.wikipedia.org/wiki/Java
Instituto Tecnológico de Morelia.
Página 207
ITM
La información consultada es buena.
Fecha de consulta: 10/feb/09
26. http://www.java.com
Página oficial, descargas, ayuda, ¿Qué es java?
Fecha de consulta: 09/feb/09
27. www.manual-java.com
Manual muy completo, sección de FAQ, Foros, Código, etc.
Fecha de consulta: 10/feb/09
28. www.webtaller.com/manual-java
Manual paso a paso de Java. Muy recomendable para alguien que comienza a
introducirse en el tema.
Fecha de consulta: 10/feb/09
29. http://todojava.awardspace.com/manuales-java.html
Manuales de java
Fecha de consulta: 10/feb/09
30. www.itapizaco.edu.mx/paginas/Javatut/froufe/introduccion/indice.html
Tutorial muy bueno para principiantes en java.
Fecha de consulta 10/feb/09
Instituto Tecnológico de Morelia.
Página 208
ITM
Glosario de Términos
A
abstract class (clase abstracta)
Una clase que contiene uno o más métodos abstractos, y, por tanto, nunca puede ser
instanciada. Las clases se definen de manera que otras clases pueden extenderse y
hacerlas concretas mediante la aplicación de los métodos abstractos.
abstract method (método abstracto)
Un método que no tiene implementación.
Abstract Window Toolkit (AWT)
Una colección de componentes de interfaz gráfica de usuario (GUI) que se crearon
utilizando las plataformas-nativas de los componentes. Estos componentes
proporcionan un subconjunto de la funcionalidad que es común a todas las plataformas.
En gran medida suplantado por el proyecto conjunto de componentes Swing.
access control (control de acceso)
Los métodos por los cuales las interacciones con los recursos son limitados a las
colecciones de los usuarios o programas con el fin de hacer cumplir la integridad,
confidencialidad, disponibilidad o limitaciones.
ACID
El acrónimo de las cuatro propiedades de las transacciones garantizadas: (atomicity,
consistency, isolation, and durability) atomicidad, la consistencia, aislamiento y
durabilidad.
actual parameter list (lista de parámetros reales)
The arguments specified in a particular method call. Los argumentos que se especifican
en una llamada de método especial.
Instituto Tecnológico de Morelia.
Página 209
ITM
API
(Application Programming Interface.) Interfaz de programación de aplicaciones. La
especificación de cómo un programador haciendo una aplicación accede a la conducta
y el estado de clases y objetos.
applet
Un componente que normalmente se ejecuta en un navegador Web, pero puede
ejecutar en una variedad de otras aplicaciones o dispositivos que apoyan el modelo de
programación applet.
argument (argumento)
Un elemento de datos especificados en una llamada de método. Un argumento puede
ser un valor literal, una variable, o una expresión.
array (arreglo)
Una colección de datos, todos del mismo tipo, en el que cada elemento ocupa una
posición única designada por un entero.
ASCII
(American Standard Code for Information Interchange) Código americano estándar
para el intercambio de información. Una norma de asignación de 7-bit códigos
numéricos a caracteres.
atomic (atómica)
Se refiere a una operación que nunca se interrumpe o se dejan en un estado
incompleto bajo ninguna circunstancia.
B
bean
Un componente de software reutilizable que se ajuste a determinado diseño y
convenciones de nombres.
Binario, sistema
Instituto Tecnológico de Morelia.
Página 210
ITM
Es un sistema de numeración en el que los números se representan utilizando
solamente las cifras cero y uno (0 y 1).
binary operator (operador binario)
Un operador que tiene dos argumentos.
bit
La unidad más pequeña de información en una computadora, con un valor de 0 o 1.
bitwise operator (operador bitwise)
El operador que manipula los bits de uno o más de sus operandos por separado y en
paralelo. Los ejemplos incluyen a los operadores binario lógicos (&, |, ^), el cambio de
operadores binarios (<<,>>>>>) y el unario un complemento del operador (~).
block (bloque)
En el lenguaje de programación Java, cualquier código entre llaves. Ejemplo: {x = 1;}.
boolean
Se refiere a una expresión o variable que sólo puede tener un valor verdadero o falso.
El lenguaje de programación Java proporciona el tipo booleano y los valores literales
verdadero y falso.
break
Una palabra clave de Java utilizada para reanudar la ejecución del programa en la
instrucción inmediatamente después de la actual declaración. Si está seguido por una
etiqueta, el programa reanudará la ejecución en la etiqueta la declaración.
byte
Una secuencia de ocho bits. Java proporciona un tipo byte correspondiente.
bytecode
Código independiente máquina generado por el compilador Java y ejecutado por el
intérprete de Java.
C
Instituto Tecnológico de Morelia.
Página 211
ITM
case
Una palabra reservada de Java que define un grupo de estados para iniciar la
ejecución si un valor coincide con el valor definido.
casting (enmascaramiento)
Conversión explícita de un tipo de dato a otro.
catch
Una palabra clave de Java utilizada para declarar un bloque de código para ser
ejecutado en caso de que haya una excepción de Java, o en un error en tiempo de
ejecución, se produce en un bloque try anterior.
char
Una palabra clave de Java utilizada para declarar una variable de tipo carácter.
class (clase)
En el lenguaje de programación Java, un tipo que define la implementación de un tipo
particular de objeto. Una definición de clase define la instancia y variables de clase y
métodos, así como especificar las interfaces que la clase implementa y la inmediata
superclase de la clase.
class method (método de clase)
Un método consta de una serie de instrucciones que determinan el comportamiento del
de la clase. Los métodos de clase afectan a la clase en su conjunto, no una instancia
de la clase
class variable (variable de clase)
Un elemento de datos asociados a una clase en su conjunto - no con casos particulares
de la clase. Las variables se definen en las definiciones de clase.
Código
Conjunto de líneas de texto que son las instrucciones que debe seguir la computadora
para ejecutar un programa.
comment (comentario)
Instituto Tecnológico de Morelia.
Página 212
ITM
En un programa, un texto explicativo que es ignorado por el compilador. En los
programas escritos en el lenguaje de programación Java, los comentarios están
delimitados con / / o / * ... * /.
commit (comprometerse)
El punto en una transacción cuando todas las actualizaciones a todos los recursos que
participan en la transacción se hizo permanente.
compiler (compilador)
Programa informático que traduce un programa escrito en un lenguaje de programación
a otro lenguaje de programación, generando un programa equivalente que la máquina
será capaz de interpretar.
Componentes de Software
Todo aquel recurso desarrollado para un fin concreto y que puede formar solo o junto
con otro/s, un entorno funcional requerido por cualquier proceso predefinido. Son
independientes entre ellos, y tienen su propia estructura e implementación.
constructor (constructor)
Es un pseudo-método que crea un objeto. En el lenguaje de programación Java, los
constructores son métodos de instancia con el mismo nombre que su clase. Los
constructores se invocan utilizando la palabra reservada new.
continue (continuar)
Es una palabra clave de Java utilizados para reanudar la ejecución del programa al
final del bucle de corriente.
D
declaration (declaración)
Una línea de código que establece un identificador y los atributos asociados con él, sin
que necesariamente se reserve memoria (para datos).
default (predeterminado)
Instituto Tecnológico de Morelia.
Página 213
ITM
Palabra reservada de Java utilizado opcionalmente, después de todos los casos o
condiciones. Si las condiciones no son correspondidas por el valor de la variable, las
sentencias de la opción por default se llevarán a cabo.
Depurador
Programa que permite depurar o limpiar los errores de otro programa informático.
do
Palabra clave de Java utilizada para declarar un bucle que va a iterar un bloque de
declaraciones. La condición de salida del bucle puede especificarse al mismo tiempo.
double
Una palabra clave de Java utilizado para definir una variable de tipo doble.
E
else
Palabra clave de Java utilizada para ejecutar un bloque de estados en el caso de que la
condición de prueba con la palabra clave if evalúa a falso.
exception (excepción)
Un evento durante la ejecución del programa que evita que el programa continúe
normalmente, en general, un error. El lenguaje de programación Java admite
excepciones con las palabras try, catch, y throw.
exception handler (manejador de excepciones)
Bloque de código que reacciona a un tipo específico de excepción. Si la excepción es
para un error del cual el programa se puede recuperar, el programa se puede reanudar
después de la ejecución manejador de excepciones se ha ejecutado.
extends (se extiende o hereda)
La clase X extiende a la clase Y para añadir funcionalidad, ya sea mediante la adición
de campos o métodos para la clase Y, por una o métodos de la clase Y. esta palabra
reservada se utiliza en la herencia de clases.
Instituto Tecnológico de Morelia.
Página 214
ITM
F
final
Palabra clave de Java que se utiliza para declarar valores constantes en una
aplicación.
float
Palabra reservada de Java utilizada para definir una variable en punto flotante.
for
Palabra clave de Java utilizada para declarar un bucle que reitera las declaraciones. El
programador puede especificar los estados para ser ejecutado, las condiciones de
salida, y variables para la inicialización del bucle.
G
garbage collection (recolección de basura)
Detección automática y liberación de memoria que ya no está en uso. El sistema
ejecuta esta acción debido a que los programadores no siempre liberan la memoria que
solicitan al sistema.
goto
Se trata de una palabra reservada. Sin embargo, no es utilizado por las versiones
actuales del lenguaje de programación Java.
GUI
(Graphical User Interface.) Interfaz gráfica de usuario. Se refiere a las técnicas
involucradas en el uso de gráficos, junto con un teclado y un ratón, para proporcionar
una manera fácil de utilizar algún programa.
H
Instituto Tecnológico de Morelia.
Página 215
ITM
hexadecimal
El sistema de numeración que utiliza 16 como su base.
I
Identificador
Nombre de un elemento en un programa escrito en el lenguaje de programación Java.
if
Palabra clave de Java utilizada para llevar a cabo una prueba condicional y ejecutar un
bloque de estados si la prueba se evalúa a verdadero.
import
Palabra reservada de Java utilizada en el comienzo de un archivo fuente que puede
especificar las clases o los paquetes que se desean importar o utilizar posteriormente.
inheritance (herencia)
Concepto de clases en el que de forma automática que contienen las variables y los
métodos definidos en sus superclases.
instancia
Un objeto de una clase particular. En los programas escritos en el lenguaje de
programación Java, una instancia de una clase se crea usando el operador new
seguido por el nombre de clase.
int
Palabra reservada de Java utilizada para definir una variable de tipo entera.
intérprete
Módulo que, alternativamente, decodifica y ejecuta todas las instrucciones en un
programa. El intérprete de Java decodifica y ejecuta bytecode de la máquina virtual.
Iteración
Se refiere a la acción de repetir una serie de pasos un cierto número de veces.
Instituto Tecnológico de Morelia.
Página 216
ITM
J
Java
Lenguaje de programación orientado a objetos desarrollado por Sun Microsystems a
principios de los años 90.
Java Database Connectivity (JDBC) Conectividad de bases de datos Java
Un estándar de la industria de base de datos independiente de la conexión entre la
plataforma Java y una amplia gama de bases de datos.
Java Development Kit (JDK)
Un entorno de desarrollo de software que sirve para escribir applets y aplicaciones en
el lenguaje de programación Java.
Java Foundation Classes (JFC)
Organismo encargado de crear bibliotecas adicionales al lenguaje Java como el Toolkit
AWT.
Java virtual machine (Máquina virtual Java)
Software "motor de ejecución" que en condiciones de seguridad y compatibilidad
ejecuta el código byte en los archivos de clase Java en un microprocesador (ya sea en
una computadora o en otro dispositivo electrónico).
JavaBeans
Modelo de componente reusable e independiente de plataforma.
L
Librería
Es un conjunto de subprogramas utilizados para desarrollar software. Las librerías
contienen código y datos, que proporcionan servicios a programas independientes, es
Instituto Tecnológico de Morelia.
Página 217
ITM
decir, pasan a formar parte de éstos. Esto permite que el código y los datos se
compartan y puedan modificarse de forma modular.
M
Memoria de datos
Memoria de lectura/escritura (RAM), cuyo objetivo es permitir el almacenamiento
temporal de datos o programas de aplicación. Por sus características de
lectura/escritura, la información que reside en ella se puede alterar fácilmente. Esta se
pierde cuando se apaga la fuente de alimentación.
N
NetBeans
Plataforma para el desarrollo de aplicaciones de escritorio usando Java y a un entorno
de desarrollo integrado (IDE) desarrollado usando la Plataforma NetBeans.
new
Una palabra clave de Java utilizado para crear una instancia de una clase.
null
El tipo nulo tiene un valor, la referencia nula, representada por el literal null, el cual está
formado de caracteres ASCII. Una literal es nula siempre del tipo null.
O
objeto
Instancia de clase. Elemento principal de un lenguaje orientado a objetos.
octal
Instituto Tecnológico de Morelia.
Página 218
ITM
El sistema de numeración que utiliza 8 como su base, utilizando los números 0-7 como
sus dígitos
P
Parámetro
Es una variable que es recibida por una función, procedimiento o subrutina.
Primitivo, tipo
Tipos de datos originales de un lenguaje de programación, esto es, aquellos que nos
proporciona el lenguaje y con los que podemos (en ocasiones) construir tipos de datos
abstractos y estructuras de datos.
private
Palabra reservada de Java que indica si una variable puede ser accedida o utilizada
únicamente por elementos de la misma clase.
propiedad
Características de un objeto que los usuarios pueden fijar, como el color de una
ventana.
protected (protegidas)
Palabra reservada de Java. Significa que el método o variable sólo puede ser visitada
por los elementos que residen en sus clases, subclases, clases o en el mismo paquete.
public público
Palabra reservada de Java. Significa que el método o variable puede ser visitada por
los elementos que residen en otras clases.
R
return
Instituto Tecnológico de Morelia.
Página 219
ITM
Palabra clave de Java utilizada para terminar la ejecución de un método. Se utilize
normalmente para regresar un valor en un método.
S
short
Una palabra clave de Java utilizado para definir una variable de tipo short.
SQL
Structured Query Language. Lenguaje estructurado de consultas en bases de datos.
stream corriente
Es un flujo de datos en bytes que se envían desde un emisor a un receptor.
super
Una palabra clave de Java utilizado para acceder a miembros de una clase heredada
de la clase en la que aparece.
Swing
Colección de componentes de interfaz gráfica de usuario (GUI) que se ejecuta de
manera uniforme a cualquier plataforma nativa que utilice la máquina virtual Java
T
Template
O plantilla es una forma de dispositivo que proporciona una separación entre la forma o
estructura y el contenido. Es un medio o un instrumento que permite guiar, portar o
construir un diseño o esquema predefinido.
this
Instituto Tecnológico de Morelia.
Página 220
ITM
Una palabra clave de Java que pueden utilizarse para representar una instancia de la
clase en la que aparece. Esto puede ser usado para acceder a las variables de clase y
métodos.
throw
Una palabra clave de Java que permite al usuario lanzar una excepción.
Token
O componente léxico, es una cadena de caracteres que tiene un significado coherente
en cierto lenguaje de programación.
try
Palabra clave que define un bloque de estados que pueden lanzar una excepción
lenguaje Java.
V
Variable
Elemento de datos nombrado con un identificador.
Instituto Tecnológico de Morelia.
Página 221