Está en la página 1de 94

Universidad Tecnológica de Nezahualcóyotl

Sistemas
de
Información
en
Java
Por:
M. en C. Gilberto Pacheco Gallegos.
Academia de Programación
Academia de Ingeniería de Software.

Índice de Contenido
1. Introducción a Java................................................................................................................................2
1.1. Objetos y Clases.............................................................................................................................2
1.2. Tipos de Datos Primitivos..............................................................................................................2
1.3. Comentarios....................................................................................................................................2
1.4. Estructuras de Control....................................................................................................................3
1.5. Terminación de Ciclos y Funciones...............................................................................................4
1.6. Precedencia de Operadores............................................................................................................5
1.7. Un Programa en Java......................................................................................................................6
1.7.1. Diagrama de Clases de UML..................................................................................................6
1.7.2. Código de “ Ejemplo.java” ......................................................................................................6
1.7.3. Salida en Pantalla....................................................................................................................7
1.6.4. Comentarios............................................................................................................................7
2. Acceso a Bases de Datos......................................................................................................................10
2.1. Tablas...........................................................................................................................................10
2.2. Llaves...........................................................................................................................................11
2.3. Manipulación de una Tabla..........................................................................................................11
2.3.1. Vista Lógica..........................................................................................................................11
2.3.2. Vista de Datos.......................................................................................................................11
2.3.3. Creación de la tabla (“ alumno.sql” )......................................................................................12
2.3.4. Inserción de datos en la tabla (“ insert_alumno.sql”) ............................................................12
2.3.5. Modificación de datos en la tabla (“update_alumno.sql”). ...................................................12
2.3.6. Consulta de datos en la tabla (“select_alumno.sql”). ...........................................................12
2.3.7. Resultado de la Consulta......................................................................................................12
2.3.8. Eliminación de datos en la tabla...........................................................................................12
2.3.9. Código de “ ctrlAccesoAlumno.java”. ..................................................................................12
2.3.10. Salida en Pantalla................................................................................................................17
2.3.11. Comentarios........................................................................................................................17
2.4. Restricciones................................................................................................................................18
2.4.1. Vista Lógica..........................................................................................................................18
2.4.2. Vista de Datos.......................................................................................................................19
2.4.3. Datos en las Tablas...............................................................................................................19
2.4.4. Creación de la Tabla Material (“material.sql”). ....................................................................19
2.4.5. Ejemplo de Inserción de Datos (“insert_material.sql ”). .......................................................19
2.4.6. Una Consulta de Dos Tablas (“select_ alumno_y_material.sql”). ........................................20
2.4.7. Resultado de la Consulta......................................................................................................20
2.4.8. Código de “ ctrlAccesoMaterial.java”. ..................................................................................20
2.4.9. Salida en Pantalla..................................................................................................................23
2.4.8. Comentarios..........................................................................................................................23
2.5. Manejo de cadenas.......................................................................................................................24
2.5.1. Ejemplo de Manejo de Texto (“Caden as.java” )...................................................................24
2.5.2. Salida en Pantalla..................................................................................................................25
2.5.3. Comentarios..........................................................................................................................25
3. Interfaces Gráficas...............................................................................................................................27

i

........................................2......................................30 3.......................2..... Comentarios.................1........1...........46 5........................... 3....................... Código de “ ctrlInsertaAlumno........... ...2............... Acceso a Bases de Datos Desde Interfaces Gráficas..........3................1...........................................................................................  Código de “ frmSencilla................................................... Código de “ frmBuscaAlumno.....................44 4...................44 5... Especificación...............................................1........................................55 6...................................................................1.......... ....................1......java”....................................2........ Especificación..........40 4.....................2............46 5............................................28 3........................36 4..............html”......................................40 4................................. Comentarios. Consultas y Manejo de Restricciones.......1..40 4.........27 3...... Código de “ AppletSencillo...... ........................ ... Código de “ frmRestricciones.............54 6....2.......................................................... Código de “ frmTablaCompleta.............................................. Vista Lógica..3............................................. Una Consulta Simple...........2...............................1............................ Diagrama de Secuencia... Java en Internet. Código de “ AppletDePrueba............39 4.......................................4....1................35 4....... Un Ejemplo de Aplicación..............................27 3..5............................java”.......... Código de “ frmInsertaAlumno...............................................1..................... Código de “ frmTablaSencilla”..................................... Un Ejemplo más Completo.1.......46 5.......................3.......2............................4...............35 4........................................................................................... Vista Lógica................2........................................1...........4....................................1..................................................................................................55 6....................java”.................... Código de “ AppletDePrueba.........63 7.....................................35 4........................................................................2............ Especificación.........58 7........... Especificación............. La Especificación.....1.......... Código de “ ctrlRestricciones.33 4...........................1.....1.........................................................................................................37 4.......................2........................java”...1.................... Código de “ AppletConsulta............................................................................................................ Código de “ ctrlTablaSencilla”...............................4...............64 ii ......... Un Ejemplo Simple....................................................................1...........................java”................1.....................48 5....................................java”...........................3.............................2.....55 7.. Uso de JTable...............2.........................................5.................................2.html” .............................................................................53 6........... ....................................................................................................................................................3...........1.................35 4..2........................................................................................................................... ....java”....................30 3................2........... ...........................49 6...................... Otro Applet.java”.....................................................................................................................................2............................................2........ .......................................................................33 3.................................39 4.........................................2.....................2...................... .....................................................................................................................................58 7................................2.........53 6. Un JSP....2................ Código de “ AppletSencillo .............. Vista Lógica................................................53 6........................1...........29 3..............31 3............. .......................................1.....2.. Un Applet Sencillo...............................1.................................................................................................. Especificación.30 3........................................................java”............................2..........................................2...........27 3.................................................................. Manejo de Restricciones.......... Comentarios..............................46 5....... Código de “ ctrlBuscaAlumno...53 6............................ Un Ejemplo Sencillo. .................................. Comentarios..................1.......2.................1..................java”. ...........................1...html”.................................................................. Diseño.... Especificación...... ...........1....................................1...........1..............................1.............................48 5..........2..........3.54 6........3.....................................................................................................................47 5.........................................6.......................................................................... ................................................................ Vista Lógica....................

.........................java”.........65 7........................11....................................3.......................................... Código de “ frmLogin..........5...............68 7.................sql”....................... Código de “ frmFactura...................................................3................................ Generación del Ejecutable.... ............................... ...................................74 7................ Código de “ ctrlLogin......64 7..................................4............... ................3............java” .... 7...............................69 7..txt” ..........................................................java” ............4.................... Código de “ factura.... .......10..............................................3...81 7....... Código de “ ctrlClientes....................88 7...........java”................................8..........................java”......................................67 7.java”................. Código de “ ctrlProductos..........2.................9...3....85 7.........................................84 7........3. Código de “ GridBagPanel............. ........ Implementación........ Código de “ ctrlFactura................ Código de “ manifest.......... ......java” ...............................3.............................1......java” .............................................3.......................3....... .............................1.... Código de “ frmMenu...................................... Código de “ frmClientes...........3............................ ..................77 7.............................6.............7..3..................java”..................................................................2.........88 iii .........................java”.......................................... Código de “ frmProductos.............73 7........3........3....................... Carta de Estados para “frmClientes”..65 7........65 7........4...............2...............................

 frmSencilla.4.   19 Ilustración 8.   27 Ilustración 9. Control de Acceso. Vista Lógica de un Ejemplo que Manipula una Tabla.   30 Ilustración 12.   64 iv . Estructura Genérica de una Relación.Índice de Ilustraciones Ilustración 1. Catálogo de Clientes. frmRestricciones.   64 Ilustración 28.   59 Ilustración 21.   19 Ilustración 7.   48 Ilustración 17. frmTablaSencilla.   58 Ilustración 18.   46 Ilustración 16. Acerca De. Vista de Dato para un Ejemplo que Realiza Validaciones. Menú del Vendedor. Vista de Datos de la Tabla alumno.   35 Ilustración 14.   62 Ilustración 24.   63 Ilustración 26. frmTablaCompleta. Vista Lógica para ctrlAccesoMaterial. Ejemplo de Factura Impresa. Menú Ayuda. Portada.   61 Ilustración 23. Vista Lógica de frmSencilla.   59 Ilustración 20. Ejemplo de Clase.   30 Ilustración 11. Ejemplo de datos para el ejemplo 2.   10 Ilustración 3.   18 Ilustración 6.   58 Ilustración 19.   60 Ilustración 22. Carta de Estados para frmClientes. frmBuscaAlumno.   35 Ilustración 13.   11 Ilustración 5. Vista Lógica del Ejemplo. Menú Archivo.   11 Ilustración 4.   27 Ilustración 10. frmInsertaAlumno. Vista Lógica para frmInsertaAlumno. Menú de Supervisor.   63 Ilustración 27.   62 Ilustración 25. Reporte de Productos.   6 Ilustración 2.   40 Ilustración 15. Vista Lógica para frmBuscaAlumno.

1. Introducción a Java. 1 .

Tipos de Datos Primitivos. pero sirven para explicar o aclarar alguna sección.372. se crean objetos y se hace que estos interactúen para realizar las funciones que desees.3.94065645841246544e­ 324 4.854.7976931348623147E+30 8 ­4. Objetos y Clases.7976931348623147E+308 char boolean false true Para el tipo de datos char se utiliza el código de 16 bits llamado  Unicode.1.   Eso   significa   que   al   escribir   un programa. Comentarios.223.40282347E+38 ­1.755.483.94065645841246544e­324 1.223. Java   es   un  lenguaje   de   programación   orientado   a   objetos(oopl).854. 1. Empezaremos haciendo programas sencillos de una sola clase y terminaremos detallando la arquitectura completa de una sistema de información. 1. Estas son conjuntos de objetos que tienen las mismas variables y métodos.147. que permite representar simultáneamente juegos de caracteres de muchos idiomas.  Están  compuestos   por variables  internas. lo dividimos en  clases.40239846E­45 1. 1.648 ­1 0 2. Los   objetos   son  piezas   de  software  que  tienen   asociadas   responsabilidades.808 float ­3.147. La  forma  más  sencilla  de variables internas  son los  tipos de datos  primitivos  que se  muestran  a continuación.755. A lo largo del curso iremos detallando más y más las características de la programación orientada a objetos. se le agregan comentarios.036.768 ­1 0 32. Para hacer más legible el código.372.483.808 ­1 0  9.1.2.767 int ­2.647 long  ­9. que les sirven para almacenar información y por operaciones internas. Introducción a Java.40239846E­45 3.40282347E+38 double ­1. 2 . Para organizar más fácilmente el código. llamadas métodos que les permiten realizar labores.036. que son ignorados por el compilador. Nombre Mínimo Valor Negativo Máximo Valor Negativo Mínimo Valor Positivo Máximo Valor Positivo byte ­128 ­1 0 127 short ­32.

 Los comentarios de una sola línea empiezan con // y terminan con el final de la línea. default: ins3 Otro  valor de e } 3 .cond. Los métodos de un objeto son secuencias de instrucciones y estructuras de control como las que se muestran a continuación. case c3: e == c3 ins2 break. Los comentarios de una o más líneas empiezan con la secuencia /* y terminan con */.En Java hay dos formas de utilizar comentarios.4. instrucciones e == c2 F V ins1 } break. Estructuras de Control.inc) { F V case c2: } } while(condición). if(cond) { if(cond) { if (cond1){ if (cond1) { V F V F V F V F ins ins1 ins1 ins1 } } else { } else if (cond2) { } else if (cond2) { F V F V ins2 ins2 ins2 } } else if (cond3) { } else if (cond3) { F V F V ins3 ins3 } } else { V cond? expr1: expr2 ins4 F } switch (e) { while (condición) { do { F V case c1: e == c1 instrucciones instrucciones for (ini. 1.

instrs2 instrs2 instrs2 } } while (cond). continue Eti.inc) { instrs1 instrs1 instrs1 break. break. } Ciclo { Ciclo { Ciclo { while (cond) { do { for (ini.1. Ciclo { Ciclo { Ciclo { while (cond) { do { for (ini. continue.inc) { ciclo { ciclo { ciclo { instrs1 instrs1 instrs1 continue Eti. instrs2 instrs2 instrs2 } } } instrs3 instrs3 instrs3 } } while (cond). break. continue Eti.cond.inc) { instrs1 instrs1 instrs1 continue. break Etiqueta.5. instrs2 instrs2 instrs2 } } while(cond). continue. break Etiqueta. instrs2 instrs2 instrs2 } } } instrs3 instrs3 instrs3 } } while(cond). Terminación de Ciclos y Funciones.cond. } instrs3 instrs3 instrs3 } } } Eti: Eti: Eti: while(cond) { do { for (ini. } instrs3 instrs3 instrs3 } } } Etiqueta: Etiqueta: Etiqueta: while (cond) { do { for (ini.inc) { ciclo { ciclo { ciclo { instrs1 instrs1 instrs1 break Etiqueta.cond. } 4 .cond.

Precedencia de Operadores. instrs2 instrs2 } } 1.6. return expresión.miembro   función(parámetros)    expresión++ expresión­­ Unarios ++expresión    ­­expresión   +expresión   ­expresión   ~expresión   ! expresión  Creación y Cast new Clase(parámetros)    (tipo)expresión Multiplicativos expresión * expresión     expresión % expresión      expresión / expresión  Aditivos expresión + expresión     expresión ­ expresión Corrimientos expresión << expresión     expresión >> expresión      expresión >>> expresión  Relacionales expresión  <  expresión         expresión  >  expresión           expresión  <=  expresión expresión >= expresión    referencia instanceof expresión De Igualdad expresión == expresión     expresión != expresión Y de Bits expresión & expresión O exclusiva de Bits expresión ^ expresión O de Bits expresión | expresión Y Lógica expresión && expresión O Lógica expresión || expresión Condicional expresión? Expresión: expresión Asignación expresión  =  expresión       expresión   +=  expresión       expresión   ­=  expresión expresión  *=  expresión      expresión  /=  expresión       expresión  %=  expresión expresión  &=  expresión       expresión   ^=  expresión       expresión   |=  expresión expresión   <<=  expresión       expresión   >>=  expresión expresión >>>= expresión 5 . En la tabla siguiente se muestra el orden de evaluación de operadores en Java. Los que aparecen en los renglones superiores se evalúan primero. Posfijos arreglo[ínidice]  ref.void función(args) { tipo función(args) { instrs1 instrs1 return.

 Finalmente. el tercero  muestra los métodos de los objetos. Todos los objetos que pertenecen a la clase 13 * "Ejemplo" contienen una copia de esta operación. Las 6 * mayúsculas y minúsculas deben coincidir. El segundo indica las variables de los objetos. 1. b: int): int +main(args: String[]) Ilustración 1.6. 1.7.4 para una descripción de los niveles 16 * de acceso. 23 } 24 } 25 26 /** 27 * Operación pública que calcula la suma de dos números.java”. Se conoce como nivel 15 * de acceso. Cada archivo de 4 * Java debe contener a lo más una clase pública y su nombre coincidir con el 5 * nombre de esa clase pública.1. int b) { 31 return (a + b). b: int): int +suma(a: int.java". Esta clase debe capturarse en un 7 * archivo que se llame "Ejemplo. El primero es el nombre de la clase. Código de “Ejemplo. Recibe dos números y devuelve el 12 * mayor de ellos. Una clase puede 28 * tener varias operaciones. Diagrama de Clases de UML. Ejemplo +max(a: int. 17 */ 18 public int max(int a. Las clases se representan como una caja con tres compartimientos que describen su estructura y la de los objetos que pertenecen a ella.7. 32 } 33 6 .7. La palabra "public" indica que esta 3 * clase es visible desde cualquier parte de la aplicación. int b) { 19 if (a > b) { 20 return a. 8 */ 9 public class Ejemplo { 10 /** 11 * Se define un método que se llama max.1. 21 } else { 22 return b. 29 */ 30 public int suma(int a. Un Programa en Java. exceptuando la extensión ". Ejemplo de Clase.java". La palabra 14 * "public" se puede usar con variables y métodos. Ver 1. como en el caso  del método main.2. Aquellos elementos que aparecen  subrayados pertenecen  a la clase  y no forman parte de los objetos. El diagrama de clases muestra en un dibujo la estructura de las clases que conforman una aplicación. 1 /** 2 * Declaración de la clase "Ejemplo".

suma(4.out.println(e.   En este caso. Salida en Pantalla. 66 System. En este método se crea un objeto de la clase y se prueba 38 * su comportamiento para asegurar que sea correcto. Se recomienda que todos los 41 * componentes de una aplicación tengan una prueba de unidad.7. o 53 // sea "a". pero empiezan su ejecución es una operación de clase (también llamada  estática) que se llame main y que reciba un arreglo de elementos “ String”. 34 /** 35 * La palabra "static" indica que esta operación pertenece a la clase y 36 * no forma parte de objetos. 71 } 1. 3))." sirve para pedirle a un objeto que haga algo. El segundo parámetro de (18).max(3. 62 63 // El comportamiento de (65) y (66) es parecido al descrito 64 // previamente. Nota que el operador 51 // ". 7)). con lo cual termina la aplicación. Dicho objeto tiene 46 // una copia de los métodos "max" y "suma". 69 System. la cual se debe capturar en un archivo que se llame “Ejemplo. 45 // Se crea un objeto con ayuda del operador "new".6. A 56 // continuación se ejecutan las líneas 19 a 24. Este es el punto de entrada a la 37 * aplicación. Comentarios. 70 } // Se termina el método main.   Respeta   las   mayúsculas   y   minúsculas   o   no   funcionará.max(1. 49 50 // Se invoca el método "max" contenido en "e". o sea "b". nuestra aplicación tiene una sola clase. 48 Ejemplo e = new Ejemplo(). El objeto tiene una operación 60 // llamada "println" que utiliza para desplegar información.out. y así sucesivamente. 3)). que 54 // es "1".println(e. pero se ejecutarán las líneas (30) a (32). 7 .java”. 65 System. 61 System.3. Las aplicaciones en Java normalmente están compuestos de varias clases.println(e.max(5. Esta es la primera línea 47 // de código que se ejecuta. Se realiza 52 // sustitución de parámetros. 8)). toma el valor el 55 // segundo parámetro de (61). 67 68 // Sucederá algo parecido.println(e. donde se muestra en la pantalla de salida de la 58 // aplicación. El primer parámetro de la línea 18. 59 // localizada en la clase "System". que es representada por la variable de clase "out". El resultado se envía 57 // de regreso a (61).   Normalmente   en   Java   los nombres de clases inician en mayúscula. y son muy útiles 40 * en la ingeniería de software.4.out. toma como valor el primer parámetro de la línea 61.out. Los métodos que 39 * realizan esto son conocidos como "pruebas de unidad". 42 */ 43 public static void main (String[] args) { 44 // AQUI EMPIEZA LA EJECUCION DEL PROGRAMA. que es "8". Línea Salida en Pantalla 61 8 65 5 66 3 69 11 1.

 en las clases hijas y en las clases que pertenezcan al mismo paquete. ­ private Los miembros se pueden utilizar solo en la clase donde se definen. + public Los miembros se pueden utilizar en cualquier lugar del código. 8 .Los niveles de acceso permitidos en Java son los siguientes: UML Java Descripción # protected Los miembros se pueden utilizar en la clase donde se definen. ~ Los miembros se pueden utilizar en la clase donde se definen y en las clases que pertenezcan al mismo paquete.

2. 9 . Acceso a Bases de Datos.

  Por   ello   es   necesario   que comprendas como funcionan y también como se utilizan desde un programa.. . Acceso a Bases de Datos.   todas   las   tuplas   tienen   los   mismos   nombres   y dominios para un número dado de atributo. . Xxxxxxxxx Tupla m Ilustración 2. todas las tuplas de una relación tienen el mismo número de atributos. 10 .. .. Valor n Tupla 1 Xxxxxxx xxxxxxxx .. .. Atributo n Valor 1 Valor 2 ... La forma de obtener el diseño de tablas está fuera de los alcances del presente texto.... Cada tupla representa un objeto.. ... Todas las tuplas tienen varios  atributos... Lo que se estudia a continuación es como manipularlas usando MySQL. Empezaremos con la manipulación de tablas aisladas........... Xxxxxxx xxxxxxxx .. todos los datos se organizan de la manera que se esquematiza a continuación Nombre de la relación Atributo 1 Atributo 2 . la base de todo el trabajo es el almacenamiento de datos. Los valores de un dominio no tienen estructura interna (es decir que son atómicos) y no contienen estructuras repetitivas (univaluados). ... ... Así mismo. . En el. . Tablas. ......   que normalmente se manejan como si fueran relaciones. Cada atributo tiene un valor asociado. Xxxxxxxx Tupla 2 . pero pueden tener distintos valores. El conjunto de los valores que puede tomar un atributo se conoce como dominio. Un conjunto de tuplas se pueden   juntar   para   formar   una  relación.2...   En   ella..1. ... El modelo más difundido para implementar bases de datos en el relacional.... ... Cuando desarrollas un sistema de información.. ... Estructura Genérica de una Relación. Los atributos representan características del mismo. ... 2.. En   la   práctica   los   sistemas   de   bases   de   datos   relacionales   utilizan   objetos   llamados  tablas.   que   generalmente   son   tablas   de   una   base   de   datos   relacional....

 Conjunto no vacío de atributos que identifican unívoca y mínimamente cada tupla.  Las clases que manipulan datos y realizan el flujo principal de una aplicación se conocen como clases de control y llevan el prefijo “ctrl”.sql.3.1. 2. fecha: java.2. Eso se representa con la flecha unidireccional. Toda las claves candidatas que no se seleccionaron como primaria. La  vista   lógica  muestra  las  clases  que   utilizará  la  aplicación. 2. En este caso es “ctrlAlumno”.2. Vista de Datos de la Tabla alumno. 11 .  La clase   “alumno”   representa   un   almacén   de   datos.password :String password = "" {frozen} . Vista Lógica de un Ejemplo que Manipula una Tabla.2. hay una que se escoge como oficial. alumno PK matricula: INTEGER NN nombre: VARCHAR(30) NN fecha_de_nacimiento: DATE Ilustración 4. • Candidatas. o bien una línea sin flechas. 2.3. se pone una flecha bidireccional. Cuando el acceso se puede realizar en los dos sentidos. • Alternativas. Vista de Datos.Date ) + main(args: String[]) Ilustración 3.usuario: String = "root" {frozen} .  pero por su parte “alumno”  no tiene acceso a la otra clase.3.url: String = "jdbc:mysql://localhost/test" {frozen} fecha_de_nacimiento: Date . ctrlAccesoAlumno alumno * matricula: int nombre: String . En la  arquitectura  que  emplearemos durante el curso se emplea una clase para manejar la base de datos. las llaves representan la identidad de un objeto. Llaves. Vista Lógica.  También se les asocia el ícono que se muestra para “ctrlAlumno”. • Primarias. nombre: String.   Cada   objeto   de   ella   representa   un   registro   de información.   La   clase   “ctrl Alumno”   puede   manipular   a   muchos   registros   del   almacén   alumno (representado con “*”). De entre todas las llaves candidatas para una relación.formato: DateFormat = getDateInstance( ) + insercionSimple( ) + inserta(matricula: int. Manipulación de una Tabla.

1 UPDATE alumno SET 2 nombre = 'Zoila Vaca del Corral'. 3 nombre VARCHAR(30) NOT NULL. fecha_de_nacimiento = '1987-02-03' 3 WHERE matricula = 200141. Resultado de la Consulta. Eliminación de datos en la tabla.6.3.7.3. Consulta de datos en la tabla (“s elect_alumno. matricula nombre fecha_de_nacimiento 200141 Zoila Vaca del Corral 1978-02-03 2.java”.sql”). 2. 1 DELETE FROM alumno 2 WHERE matricula = 200141.3.8.4.sql”). 2. 2.sql” ).text. 'Zoila Vaca'. 1 CREATE TABLE alumno( 2 matricula INTEGER PRIMARY KEY. El símbolo PK significa que el campo es una llave primaria. NN significa que el campo no puede ser nulo.3. N significa que si puede ser nulo.3.*.5. 6 12 . 4 import java. 1 SELECT * FROM alumno 2 WHERE matricula = 200141. 1 // "import" sirve para tener acceso a clases de la librería base 2 // de Java.3. // Para interactuar con la base de datos.Se ha elegido implementar la clase alumno como una tabla relacional. Las clases se organizan en "paquetes".3.3. 2.s ql”). 4 fecha_de_nacimiento DATE NOT NULL 5 ) TYPE = InnoDB. que son como 3 // carpetas.sql. Creación de la tabla (“alumno. Inserción de datos en la tabla (“in sert_alumno. 2. Modificación de datos en la tabla (“upd ate_alumno. '1978-02-03'). Es por ello que se la ha puesto el ícono que se muestra en la Ilustración 4. // Para la clase "DateFormat".*. 2. 5 import java.9. Código de “c trlAccesoAlumno. 1 INSERT INTO alumno 2 VALUES(200141.

55 13 .251/test". El valor "localhost" representa a la 14 * computadora donde estás ejecutando este programa.7. La 28 * palabra final indica que no se puede cambiar (O sea que es una 29 * constante. 48 49 /** 50 * Este objeto se utilizará para capturar y mostrar fechas en el formato 51 * e idioma correctos de acuerdo a la configuración de idiomas de la 52 * computadora donde se ejecuta este programa. Existe una sola copia de esta variable (por eso es static) 27 * y está localizada en la clase. 35 */ 36 // private static final String url = 37 // "jdbc:oracle:thin:@192. 38 39 /** 40 * Usuario con el que te conectarás a la base de datos.168. debes usar la siguiente 19 * definición. MySQL también crea un 16 * usuario que se llama "root" y no tiene password.99:1521:oracledb".getDateInstance(). El valor "test" es 15 * la base de datos que crea MySQL al instalarse. 12 * El protocolo en este caso es "jdbc:mysql". host y recurso. URL significa "Universal 10 * Resource Locator" y es una cadena que sirve para ubicar un recurso 11 * en una red.168. 7 public class ctrlAccesoAlumno { 8 /** 9 * Variable que identifica a una base de datos. 32 33 /* 34 * Para Oracle quita el comentario de la siguiente definición. 43 44 /** 45 * Password con el que te conectarás a la base de datos. 46 */ 47 private static final String password = "". 53 */ 54 private static DateFormat formato = DateFormat. 30 */ 31 // private static final String url = "jdbc:mysql://192. quita el comentario de la 25 * siguiente definición y cambia test por la base de datos que tengas 26 * asignada. el host es "localhost" y 13 * el recurso es "test". 20 */ 21 private static final String url = "jdbc:mysql://localhost/test". No forma parte de los objetos.7. 22 23 /* 24 * Si prefieres usar MySQL en un servidor. 41 */ 42 private static final String usuario = "root". Si utilizas mysql en 17 * la misma computadora donde se está ejecutando esta aplicación y 18 * quieres usar la base de datos "test". Consta de 3 partes: protocolo.

59 * Siempre inserta los mismos datos. 82 conexion. 62 */ 63 public void insercionSimple() throws Exception { 64 // Intenta conectarse al url indicado con el usuario y password 65 // definido en la clase. los cuales 61 * serán procesados por el método que mande llamar a este. 103 } 104 14 .close(). 74 75 // Transaction Isolation representa el comportamiento de la 76 // conexión en un ambiente concurrente. 56 /** 57 * Inserta un registro cuando los datos ya se conocen de antemano. 100 101 // Termina la conexión y libera los recursos que ocupó 102 conexion. Como los 86 // manejadores manejan las fechas de formas muy diferentes. "MM" son 2 dígitos para el mes y "DD". 79 // por lo cual en algunas ocasiones las transacciones pueden ser 80 // abortadas por el manejador de bases de datos para evitar daños 81 // a la integridad de la información. Para lograrlo. 2 dígitos 90 // para el día. 84 85 // Crea una instrucción en SQL para insertar un registro. "AAAA" son 4 dígitos 89 // para el año. Java te 87 // permite usar la instrucción "{d 'AAAA-MM-DD'}".TRANSACTION_SERIALIZABLE). se establecen bloqueos. {d '1978-02-03'})"). La expresión "throws Exception" 60 * significa que se pueden producir errores en la ejecución. 70 // Es caso de que la conexión si se pueda establecer. 72 Connection conexion = 73 DriverManager. Si por alguna razón no se puede conectar a 66 // la base de datos. que será cambiada 88 // por la instrucción correcta para tu DBMS. El objeto de la clase 68 // "Exception" lleva una descripción de los que falló y se pasa al 69 // método que mando llamar a "inserción" para que procese el error. 97 98 // Da por terminada la consulta y libera los recursos que ocupó 99 ps.setTransactionIsolation( 83 Connection.close().prepareStatement( 92 "INSERT INTO alumno " + 93 "VALUES(200141. 96 ps. usuario. 91 PreparedStatement ps = conexion. que representa la sesión de trabajo. 77 // TRANSACTION_SERIALIZABLE significa que nuestros datos se 78 // mantendrán sin daño. 58 * Esta rutina no se puede utilizar para insertar datos diferentes. password). se obtiene el 71 // objeto conexion.getConnection(url. se crea un objeto de la clase "Exception". Se 67 // aborta la ejecución del programa. 'Zoila Vaca'.executeUpdate(). 94 95 // Ejecuta la consulta.

140 // Al ejecutar una consulta se utiliza executeQuery.close().prepareStatement( 139 "SELECT * FROM alumno"). 163 } 164 rs.prepareStatement( 120 "INSERT INTO alumno VALUES(?.setTransactionIsolation( 137 Connection. ?)"). // El tercer signo "?" será la fecha.out. password). matricula). 126 ps. 127 conexion. 136 conexion. se genera una excepción.setInt(1.getConnection(url. 108 * Se puede utilizar siempre que se necesite. String nombre.close(). usuario.executeQuery(). 123 ps.println("-----------------------------------------").close().println("FECHA DE NACIMIENTO : " 162 + formato.getString("matricula") recupera el campo matrícula 152 // del registro que mandó traer rs. 128 } 129 130 /** 131 * Muestra los datos que se encuentran almacenados en la tabla "alumno". fecha).out. nombre). password).setString(2.105 /** 106 * Esta rutina permite insertar un registro en la base de datos 107 * que contenga la información que se recibe como parámetro. 125 ps. que regresa 141 // un objeto de la clase "ResultSet".getConnection(url. ?. Cuando ya no hay más registros. se recupera el siguiente 146 // renglón de la consulta. 116 117 // Los signos "?" representan los valores que pueden cambiar cada 118 // vez que se ejecute la consulta. 150 151 // rs. esta 147 // expresión regresa "false" y por lo tanto el ciclo termina.next()) { 149 System. 165 ps.out.setDate(3.TRANSACTION_SERIALIZABLE). 154 System. java.executeUpdate(). Si el nombre del 153 // campo está mal tecleado.// El primer signo "?" será la matrícula. 138 PreparedStatement ps = conexion.setTransactionIsolation( 115 Connection.println("MATRICULA : " 155 + rs. 166 conexion. 119 PreparedStatement ps = conexion.close().close(). usuario. 124 ps.println("NOMBRE : " 157 + rs. 143 ResultSet rs = ps. 156 System. 148 while (rs.getString("nombre")).sql.next(). 109 */ 110 public void inserta(int matricula.TRANSACTION_SERIALIZABLE). 121 122 ps. 114 conexion.getString("matricula")). 167 } 168 15 .getDate("fecha_de_nacimiento"))).Date fecha) 111 throws Exception { 112 Connection conexion = 113 DriverManager. 144 145 // Cada vez que se ejecuta rs.// El segundo signo "?" será el nombre. 158 159 // Nota el uso del objeto "formato" para convertir un texto en 160 // fecha.format(rs.out. el cual representa el 142 // resultado de la consulta.next(). 132 */ 133 public void muestraRegistros() throws Exception { 134 Connection conexion = 135 DriverManager. 161 System.

"Armando Pacheco". 209 } catch (Exception e) { 210 // Muestra la razón del error. 187 188 ctrlAccesoAlumno a = new ctrlAccesoAlumno().forName("oracle.jdbc.inserta(200142. las 173 // cuales se van a procesar con la instrucción "catch".Date(formato. 171 // La instrucción "try" indica que algunas instrucciones del 172 // bloque de instrucciones siguiente puede generar excepciones.sql.Driver"). 222 e. "Rolando Mota".169 public static void main(String[] args) { 170 // AQUI EMPIEZA LA EJECUCION DEL PROGRAMA. "Pancracio Wellington".forName("com. así como las funciones se estaban 220 // ejecutando y en cual linea en el momento de que sucedió 221 // el fallo. 174 try { 175 // Carga las clases encargadas de conectar el programa con 176 // el una base de datos Oracle.getTime())). 208 a.insercionSimple(). 223 } 224 } 225 } 16 .103 para el objeto "a".sql.parse("30/02/1985").mysql. 191 a. 186 Class. 189 190 // Ejecuta las líneas 63 . 203 204 a. 192 193 // Ejecuta las líneas 110 a 128 para el objeto "a" y toma los 194 // siguientes valores: 195 // matricula --> 200142 196 // nombre --> "Rolando Mota" 197 // fecha -->valor correspondiente a {d '1973-08-07} 198 // Nota el uso de "formato" para convertir el texto en fecha.sql. 182 183 // Carga las clases encargadas de conectar el programa con 184 // el una base de datos MySQL.Date(formato.parse("07/08/1973"). que puede ubicarse 178 // en el subdirectorio "jre/ext/lib" dentro del directorio de 179 // java o en alguna de las localidades indicadas por la 180 // variable de ambiente "CLASSPATH". Estas clases se pueden 185 // localizar de igual forma que las clases para Oracle. 207 new java.jdbc.getTime())). Normalmente están localizadas 177 // en un archivo con extensión ". 202 new java.inserta(200144.getTime())).OracleDriver"). Si 199 // el texto no tiene el formato correcto se genera una 200 // excepción.parse("02/08/1982").jar". 206 a. 205 new java. 201 a. 181 Class.printStackTrace().inserta(200143.Date(formato.muestraRegistros().

 este establece un bloqueo compartido sobre  los registros que recupera. la transacción puede continuar. Los datos se pueden modificar y consultar pero solo los puede usar una transacción. Cuando el bloque preestablecido es compartido. • Exclusivos. Si alguna de ellas falla. Si se quiere establecer un bloqueo exclusivo al consultar. Las instrucciones de modificación establecen automáticamente bloqueos exclusivos sobre los registros que afectan. En   SQL   una   transacción   es   un   conjunto   de   instrucciones.2.   las   cuales   deben   ejecutarse   todas correctamente para surtir efecto. Comentarios. Para poder asegurar que la transacción se serializable.  “ rollback” deshace todos los cambios que la transacción haya realizado. los manejadores de bases de datos utilizan los siguientes tipos de bloqueos: • Compartidos.  Si previamente se ha establecido un bloqueo exclusivo sobre los datos. Línea Salida en Pantalla 149 ----------------------------------------- 154 y 155 MATRICULA : 200141 156 y 157 NOMBRE : Zoila Vaca 161 y 162 FECHA DE NACIMIENTO : 3/02/1978 149 ----------------------------------------- 154 y 155 MATRICULA : 200142 156 y 157 NOMBRE : Rolando Mota 161 y 162 FECHA DE NACIMIENTO : 7/08/1973 149 ----------------------------------------- 154 y 155 MATRICULA : 200143 156 y 157 NOMBRE : Armando Pacheco 161 y 162 FECHA DE NACIMIENTO : 2/08/1982 149 ----------------------------------------- 154 y 155 MATRICULA : 200144 156 y 157 NOMBRE : Pancracio Wellington 161 y 162 FECHA DE NACIMIENTO : 2/03/1985 2.  al presentarse concurrencia garantiza la integridad de la información almacenada. Si previamente ya hay un bloqueo sobre esos datos.10. Cuando varias transacciones traten de usar los mismos datos simultáneamente. Al accesar al mismo dato varias transacciones solamente los pueden consultar. Salida en Pantalla. el efecto obtenido es como si ninguna de ellas se hubiera ejecutado. 17 . se aborta.3. pero no modificar. se puede usar la opción “for  update”  de esta instrucción.   la   integridad   de   los   datos   puede corromperse.   La   instrucción  “ commit”   indica   que   la   transacción   se   ha   realizado   con   éxito   y   hace visibles   a   otras   transacciones   las   modificaciones   realizadas   a   los   datos.   Decimos   que   un   método   de   administración   de   transacciones   es  serializable. En  el caso  del “select”.11. Los bloqueos se liberan en el momento de ejecutar las instrucciones “ commit”  o “ rollback”  en una transacción.   Si   las   transacciones   actúan   de   forma   desordenada.3. El efecto es o todas o ninguna. tenemos un ambiente concurrente. la transacción aborta.   Por   su   parte.

matricula: int . ctrlAccesoMaterial .1. • El estado debe ser exclusivamente alguno de los siguientes valores: “OK”.usuario: String = "root" {frozen} .password :String password = "" {frozen} + inserta(descripcion: String. “BAJA”. Por ejemplo. estado: String) ~ abortaConexion(conexion: Connection. estado: String): int ~ validaInsercion(conexion:Connection. descripcion: String) ~ validaMatricula(conexion: Connection. estado: String) ~ validaDescripcion(conexion: Connection. El modelo relacional permite incorporar información adicional sobre los datos.url: String = "jdbc:mysql://localhost/test" {frozen} . 2. El diseño de la base de datos de este ejemplo realiza las mismas validaciones.4. Vista Lógica. Vista Lógica para ctrlAccesoMaterial. • La matrícula debe ser la de algún alumno registrado. matricula: int. 18 . “EN R EPARACION” . descripcion: String. puedes indicar los valores exactos que un campo puede tomar. En este caso la clase de control verificará que los datos a insertar en la tabla “material”  cumplan con algunas reglas de negocio: • La descripción no puede ser nula. 2. También puedes indicar que un registro está relacionado con registros de otra tabla. causa: String) + muestraRegistros() + muestraJoin() + main(String[] args) * * 1 * alumno material matricula: int descripcion: String nombre: String estado: String fecha_de_nacimiento: Date Ilustración 5.Las conexiones de Java están configuradas para realizar automáticamente “commit”  o “ rollback”  en cada instrucción SQL que realizan.4.   “DESCOM PUESTO” . matricula: int) ~ validaEstado(conexion: Connection. Restricciones. pero este comportamiento se puede cambiar.

 Ejemplo de Inserción de Datos (“ insert_material. 200141.4. 'OK').4. 15 16 /* 17 * Las llaves foráneas deben indexarse en MySQL. matricula.'BAJA') NOT NULL.4. 20 21 /* 22 * Las llaves foráneas siempre apuntan a una llave primaria. alumno material 1 * PK id: INTEGER {AUTO_INCREMENT} PK matricula: INTEGER NN descripcion: VARCHAR(30) NN nombre: VARCHAR(30) FK matricula INTEGER NN fecha_de_nacimiento: DATE NN estado ENUM('OK'. 4 5 /* 6 * Este campo es llave foránea. Creación de la Tabla Material (“material.2.4.4. 1 CREATE TABLE material( 2 id INTEGER PRIMARY KEY AUTO_INCREMENT. Datos en las Tablas.'BAJA') Ilustración 6. Por esto se 3 * pone entre paréntesis los nombres de los campos cuyos valores se 4 * proporcionan. 2.5.sql”). 5 */ 6 INSERT INTO material(descripcion. 2. 3 descripcion VARCHAR(30) NOT NULL. La llave foránea la estamos indicando con FK. no se le pone valor.sql”). 10 11 /* El atributo “estado” solo puede tomar uno de los valores que están entre 12 * los paréntesis. 18 */ 19 INDEX(matricula).'DESCOMPUESTO'. Las listas de campos y de valores se relacionan por el orden.'EN REPARACION'. No puede tomar ningún otro. 1 /* 2 * Como el campo “id” es auto numérico. Vista de Datos. 19 . 23 */ 24 FOREIGN KEY(matricula) REFERENCES alumno(matricula) 25 ) TYPE = InnoDB. alumno material matricula nombre fecha de id descripcion matricula estado nacimiento 1 Banca con paleta 200141 OK 200141 Zoila Vaca 1978 – 02 – 03 2 Banca sin paleta 200142 DESCOMPUESTO 200142 Rolando Mota 1973 – 08 – 07 3 Paleta sin banca 200143 BAJA 200143 Armando Pacheco 1982 – 08 – 02 200144 Pancracio Wellington 1985 – 03 – 02 Ilustración 7.'DESCOMPUESTO'. 13 */ 14 estado ENUM('OK'.'EN REPARACION'.2. Su definición debe coincidir con la llave 7 * primaria de la tabla con la que enlaza 8 */ 9 matricula INTEGER NOT NULL. Vista de Dato para un Ejemplo que Realiza Validaciones.4. Ejemplo de datos para el ejemplo 2.3. estado) 7 VALUES('Banca con paleta'. 2.

33 rs. 8 private static final String password = "".matricula. 38 } 39 20 . 7 private static final String usuario = "root".4.7.setString(3. 22 validaInsercion(conexion.getGeneratedKeys(). 18 conexion. 29 ps. 3 import java. password). 2 import java. por lo cual tenemos 16 // una transacción con más de una instrucción. material 7 WHERE alumno.setString(1.close().sql”).*.getInt(1). 4 5 public class ctrlAccesoMaterial { 6 private static final String url = "jdbc:mysql://localhost/test". id.2. estado)" + 25 "VALUES(?. 35 conexion. matricula. 14 15 // Se van a realizar varias instrucciones de SQL. 34 ps. String estado) 11 throws Exception { 12 Connection conexion = 13 DriverManager.prepareStatement( 24 "INSERT INTO material(descripcion. descripcion). 1 /* 2 * Nota como se igualan la llave primaria de la tabla “alumno” con la llave 3 * foránea de la tabla “material”.util.close().setTransactionIsolation( 21 Connection.*.next(). 23 PreparedStatement ps = conexion. estado). usuario.close(). descripcion. descripcion 6 FROM alumno. 31 rs.text. Es necesario ejecutar 17 // explícitamente la instrucción "commit" o "rollback". Una Consulta de Dos Tablas (“se lect_alumno_y_material.4. Código de “c trlAccesoMaterial.matricula 2. 9 10 public int inserta(String descripcion. 1 import java.java”. 37 return id.commit().setInt(2.4.8. nombre. 27 ps. 30 ResultSet rs = ps. alumno.sql.getConnection(url. ?)").*. estado).6. 26 ps. 32 int id = rs. 28 ps. matricula. matricula). 36 conexion.setAutoCommit(false).matricula = material. ?.executeUpdate(). 4 */ 5 SELECT alumno. Resultado de la Consulta. int matricula. 19 20 conexion.TRANSACTION_SERIALIZABLE).matricula nombre id Material 200141 Zoila Vaca 1 Banca con paleta 200142 Rolando Mota 2 Banca sin paleta 200143 Armando Pacheco 3 Paleta sin banca 2.

o sea que no hay alumnos con esa 65 // matrícula. String estado) 73 throws Exception { 74 String[] estados = {"BAJA". estado) < 0) { 83 abortaConexion(conexion. "Descripción Incorrecta.").next()) { 67 ps. matricula). 52 } 53 } 54 55 void validaMatricula(Connection conexion. 69 } 70 } 71 72 void validaEstado(Connection conexion. 41 int matricula. regresa su posición en el arreglo. matricula). String descripcion. 61 ResultSet rs = ps.prepareStatement( 58 "SELECT matricula FROM alumno " + 59 "WHERE matricula = ?"). descripcion).close(). 78 // Si encuentra el dato. 77 // Los datos del arreglo deben estar ordenados o no funcionará.executeQuery(). String descripcion) 49 throws Exception { 50 if (descripcion. Cuando tienes muchos 80 // valores posibles es más eficiente realizar una búsqueda que 81 // poner un if por cada valor que deseas validar."OK"}. Cuando 79 // no lo encuentra regresa un valor negativo. 60 ps. 45 validaEstado(conexion. 62 63 // Si la primera vez que se ejecuta rs."). 90 conexion."EN REPARACION". String estado) 42 throws Exception { 43 validaDescripcion(conexion. 46 } 47 48 void validaDescripcion(Connection conexion. 82 if (Arrays. String causa) 88 throws Exception { 89 conexion.close(). entonces no 64 // tenemos datos en la consulta.next() es falso.length() == 0) { 51 abortaConexion(conexion.setInt(1. estado). int matricula) 56 throws Exception { 57 PreparedStatement ps = conexion."DESCOMPUESTO". "Estado Incorrecto. 91 throw new Exception(causa).rollback(). 68 abortaConexion(conexion."). 84 } 85 } 86 87 void abortaConexion(Connection conexion. 44 validaMatricula(conexion. 66 if (!rs.40 void validaInsercion(Connection conexion. "Matrícula Incorrecta. 92 } 93 21 .binarySearch(estados. 75 76 // Realiza una búsqueda binaria del estado buscado en el arreglo.

108 } 109 rs.matricula = material.getString("estado")). 130 } 131 rs. material " + 122 "WHERE alumno.close(). 125 while (rs. 103 while (rs. 134 } 135 22 .matricula.close().executeQuery().matricula").prepareStatement( 120 "SELECT alumno.println(rs.close().println("------------------------------------------"). 99 PreparedStatement ps = 100 conexion.getString("id") + "|" + 129 rs.println(rs.executeQuery().next()) { 126 System.out. 117 conexion.getConnection(url. 132 ps.getString("descripcion") + "|" + 106 rs.TRANSACTION_SERIALIZABLE). 111 conexion. usuario.println("------------------------------------------"). 123 ResultSet rs = ps.setTransactionIsolation( 98 Connection.next()) { 104 System. usuario. id. password). 97 conexion.getString("id") + "|" + 105 rs.out.getConnection(url.setTransactionIsolation( 118 Connection.close(). 112 } 113 114 public void muestraJoin() throws Exception { 115 Connection conexion = 116 DriverManager.getString("nombre") + "|" + 128 rs.out. 119 PreparedStatement ps = conexion.getString(1) + "|" + 127 rs.getString("descripcion")). 133 conexion. 101 ResultSet rs = ps. 94 public void muestraRegistros() throws Exception { 95 Connection conexion = 96 DriverManager. password).getString("matricula") + "|" + 107 rs. nombre.TRANSACTION_SERIALIZABLE).close().close(). 110 ps.out.prepareStatement("SELECT * FROM material"). 124 System. 102 System. descripcion " + 121 "FROM alumno.

muestraRegistros().getMessage()). 164 } catch (Exception e) { 165 e.jdbc. Parecería que el revisar las cuestiones de integridad en el programa y en la base de datos es un trabajo repetitivo. 147 try { //un ejemplo de error 148 a.8.forName("com. Primero debes insertar los datos en aquellas tablas que no manejan llaves foráneas y después debes insertar  en las tablas que apuntan hacia datos ya insertados. Al hacer la validación desde el programa haces que 23 .out.out.inserta("Banca con paleta". 163 a.inserta("Banca". 200141.mysql. 140 int id =a. Línea Salida en Pantalla 141 id = 1 150 Descripción Incorrecta. 136 public static void main(String[] args) { 137 try { 138 Class. "OK"). 141 System. 144 145 // Es importante que una prueba de unidad verifique el 146 // comportamiento de la clase en situaciones de error. "EN REPARACION").out. 102 ------------------------------------------ 104 – 1007 1|Banca con paleta|200141|OK 104 – 1007 2|Banca sin paleta|200142|DESCOMPUESTO 104 – 1007 3|Paleta sin banca|200143|BAJA 124 ------------------------------------------ 126 – 129 200141|Zoila Vaca|1|Banca con paleta 126 – 129 200142|Rolando Mota|2|Banca sin paleta 126 – 129 200143|Armando Pacheco|3|Paleta sin banca 2.println(e. 149 } catch (Exception e) { 150 System. y así es. Salida en Pantalla. 143 a.Driver"). 154 } catch (Exception e) { 155 System. 139 ctrlAccesoMaterial a = new ctrlAccesoMaterial(). pero existe una razón para ello. 142 a. "OK"). 200143.inserta("Banca sin paleta". 200141. Comentarios. 160 Estado Incorrecto.inserta("".9.inserta("Banca".getMessage()).printStackTrace().println(e.muestraJoin().println(e.out. 156 } 157 try { //un ejemplo de error 158 a.4. "MAL"). 161 } 162 a.inserta("Paleta sin banca". 151 } 152 try { //un ejemplo de error 153 a. 166 } 167 } 168 } 2. 159 } catch (Exception e) { 160 System. 200141.4. 200142. 155 Matrícula Incorrecta. "DESCOMPUESTO"). 2001.println("id = " + id).getMessage()). Cuando manejas llaves foráneas el orden de inserción es muy importante. "BAJA").

println(base. 46 47 // Busca desde el final.out. He aquí la respuesta. Por eso es importante poner reglas de negocio en la base de datos.out. Tambén hay una variante que busca a partir de 44 // cierta posición. regresa un valor 37 // negativo.out.charAt(7)). Tiene las mismas variantes que "indexOf".6)). 13 System. 41 System. 12 System.1.lastIndexOf('a')).println(base.println(base.equals("inicio")). Ejemplo de Manejo de Texto (“Cadenas. 39 40 // Igual que el anterior.println(base. 34 35 // Busca el caracter 'a' desde el inicio de la cadena y regresa la 36 // posición donde lo encontró.indexOf('a')).endsWith("ase")).out. 20 System. pero busca a partir de la posición 3.out.out. Por otro lado. 14 15 // Regresa 16 // > 0 si "a" > "sala" 17 // < 0 si "a" < "sala" 18 // == 0 si "a" == "sala" 19 System. 3)).println("a". pero no hace distinción de mayúsculas y 32 // minúsculas. 30 31 // Es como "equals". 23 System.equals("Cadena base")). 27 28 // Regresa el caracter en la posición 7.startsWith("Cad")).equalsIgnoreCase("TELA")). los datos no siempre son manipulados desde programa y los programas pueden tener errores en las validaciones.out. 7 8 // Obtiene una subcadena que va desde el caracter 2 hasta el 5.out. Si no aparece. 42 43 // Busca subcadenas.out.println("prefijo" + base). 48 System. 2. 49 24 .substring(2.compareTo("Cadena base")==0).println(base.println("tela".out.out. 10 11 // Regresa verdadero si las dos cadenas son el mismo texto. Tal vez te has preguntado como comparar y manipular cadenas.5.indexOf('a'. 21 22 // Verdadero si la cadena termina con "ase". 4 5 // Pega dos cadenas.out.println(base.out. 2. 1 public class Cadenas { 2 public static void main(String[] args) { 3 String base = "Cadena base".println(base. 29 System. 6 System.java”).println(base.indexOf("de")).println(base.println(base. 24 25 // Verdadero si la cadena comienza con ase.compareTo("sala")<0). Manejo de cadenas. empezando desde 0. 9 System.los mensajes de error sean más claros. 33 System.out.5. 38 System. 45 System. 26 System.println(base.

out.out. Salida en Pantalla. Pero puede suceder que dos cadenas sean objetos diferentes.trim() + "hola").println(" trim ".toLowerCase()). El resultado siempre se obtiene en una nueva cadena. 60 System. El resto de los caracteres no se modifican. El resto de los caracteres no se modifican. 53 54 // Convierte todas las letras de la cadena en su equivalente en 55 // minúscula. 52 System. ¿ Entiendes por qué? 25 . Nota que al comparar cadenas sucede que “10”  < “2”.out. En el caso de que tengas que comparar caracteres que no sean letras.2. 63 64 // Remueve los espacios al inicio y al final de una cadena. Las operaciones sobre cadenas no modifican la cadena base. ¿Qué significa que una cadena sea menor que otra? La cadena que aparece primero en el diccionario.3. 56 System.println(base.out. pero contengan el mismo texto. Línea Salida en Pantalla 6 prefijoCadena base 9 dena 12 true 13 false 19 true 20 true 23 true 24 true 29 b 33 true 38 1 41 5 45 2 48 8 52 11 56 cadena base 60 CADENA BASE 62 espacios hola 65 trimhola 2. su 51 // longitud.5. 66 } 67 } 2.println(base.5. 57 58 // Convierte todas las letras de la cadena en su equivalente en 59 // mayúscula. Las operaciones de comparación que se mostraron en el programa trabajan con el contenido de los objetos.out. 61 62 System. 50 // Regresa el número de posiciones que ocupa la cadena. ¿Por qué no comparar las cadenas con el signo “ ==”?  Este signo compara que dos objetos sean el mismo.length()). o sea. Comentarios. utiliza su código Unicode.println(base. 65 System.println(" espacios " + "hola").toUpperCase()). El valor más pequeño es el que aparece primero en el diccionario.

3. 26 . Interfaces Gráficas.

  Se   dice   que   “frm Sencilla” hereda todos los miembros de JPanel. Ilustración 8. Un Ejemplo Simple.1.txtDireccion: JTextField = new JTextField(10) . frmSencilla.1. Java tiene ya construidas clases para en desarrollo de interfaces gráficas. 3.3. A su vez. JPanel es clase padre de frmSencilla. Interfaces Gráficas. Especificación. El mecanismo principal que tiene Java para interactuar con el usuario es el uso de interfaces gráficas.  Al oprimir el botón “Púchale”  el contenido de este campo se copia a “dirección ” . Como el trabajo ya está hecho.2. La flecha del diagrama indica que la   clase   “ frmSencilla”   tiene   todos   los   miembros   (variables   y   métodos)   de   un   “JPanel”. JPanel frmSencilla .txtNombre: JTextField = new JtextField(10) .1.   pero   que extiende   su   funcionalidad   añadiéndole   los   miembros   que   se   muestran. El usuario debe proporcionar el valor de “nombre”.lblNombre: JLabel = new JLabel("Nombre:") .1. La clase JPanel representa formas en blanco a las cuales se pueden agregar componentes gráficos.serialVersionUID: long = 1L {frozen} . Vista Lógica. “frmSencilla”  es clase hija de JPanel o bien clase derivada. En este esquema. Vista Lógica de frmSencilla. vamos a utilizar un mecanismo que se conoce como generalización. 27 . 3. 3.lblDireccion: JLabel = new JLabel("Direccion:") .btnPuchale: JButton = new JButton("Puchale") + frmSencilla( ) + agregaEventos() + clickEnPuchale() + main(args: String[]) Ilustración 9.

3. Se le pasa el texto a mostrar. 15 16 // Definición de los componentes gráficos en Java. 8 */ 9 public class frmSencilla extends JPanel { 10 /** 11 * Esto es necesario por una característica de los objetos en Java que se 12 * conoce como serialización.swing. 48 setLayout(new GridLayout(3. Al crearla se le pasa el texto que despliega.awt.3. 13 */ 14 private static final long serialVersionUID = 1L. Se le pasa el número de caracteres a mostrar.“ JPanel”  es un conjunto de objetos.*. 53 add(lblDireccion). 4 5 /** 6 * La palabra extends indica que "frmSencilla" es clase hija de 7 * JPanel. 17 18 /** 19 * Etiqueta.  Código de “f rmSencilla. puedes usar un objeto de la clase hija. 55 } 56 28 . 33 */ 34 private JButton btnPuchale = new JButton("Púchale"). add(txtDireccion). // Para los eventos de los botones.awt.1. 20 */ 21 private JLabel lblNombre = new JLabel("Nombre:"). 30 31 /** 32 * Botón. continuando con el renglón inferior 52 add(lblNombre). // Para todos los componentes gráficos. 49 50 // Agrega los componentes en orden de izquierda a derecha hasta 51 // llenar el renglón. Permite inicializar valores y realizar 39 * procesos.java”. En este caso el 46 // objeto de clase "GridLayout" indica que se usarán tres renglones 47 // y dos columnas. 35 36 /** 37 * Constructor de la clase "frmSencilla". 27 28 private JLabel lblDireccion = new JLabel("Dirección:"). 2)).*. 3 import java. // Para la clase "GridLayout". Se invoca en el momento de 38 * crear un objeto de esta clase. 22 23 /** 24 * Cuadro de texto. 45 // Este les indica como organizar los componentes. En cualquier parte de código donde se requiera un objeto de la clase padre. 29 private JTextField txtDireccion = new JTextField(10).*. 1 import javax.event. 40 */ 41 public frmSencilla() { 42 agregaEventos(). 25 */ 26 private JTextField txtNombre = new JTextField(10). 2 import java. 43 44 // A los objetos de JPaneles hay que ponerles un layout. add(txtNombre). 54 add(btnPuchale). “frmSencilla”  es un subconjunto de esta.

78 // Al construir el objeto se le pasa el texto a desplegar en la 79 // barra de título. 71 72 // Cambia el contenido al cuadro de texto "txtDireccion".4. 60 btnPuchale.   la colocación en un JPanel es muy simple. 74 } 75 76 public static void main(String[] args) { 77 // JFrame representa a las ventanas principales de una aplicación.1. 63 } 64 }). En Java las clases pueden tener a lo más una clase padre. se coloca en un JscrollPane. la clase “frmSencilla”  también lo es. 95 // Muestra la ventana principal. 84 // Para ello. 96 frame.add(new JScrollPane(new frmSencilla())). 81 82 // Crea un objeto de "frmSencilla". 29 . 94 frame. 73 txtDireccion.  La clase JPanel es serializable y por lo tanto. o sea una forma. Finalmente este objeto 85 // se agrega a la ventana principal. 90 frame. 97 } 98 } 3.setDefaultCloseOperation(JFrame. La serialización es un mecanismo que permite a Java almacenar objetos y transportarlos a través de redes.getText(). 91 92 // Calcula el tamaño y coordenadas de todos los componentes gráficos 93 // que contiene la ventana principal.addActionListener(new ActionListener() { 61 public void actionPerformed(ActionEvent evt) { 62 clickEnPuchale(). 57 void agregaEventos() { 58 // Liga el método "clickEnPuchale" con la acción de apretar el 59 // botón btnPuchale.setText(nombre). 86 frame. y le pone 83 // barras de desplazamiento que se desplegarán cuando sea necesario. En compensación. 87 88 // Se configura la ventana principal para que termina la aplicación 89 // al cerrarse.   Todos   los   objetos   que   implementen   ese   mecanismo   deben   declarar   la   constante “serialV ersionUID”. pues hereda todas las características de su clase padre. Comentarios. 70 String nombre = txtNombre.setVisible(true).pack(). Más adelante se tocará la forma de construir interfaces con una mejor apariencia. 80 JFrame frame = new JFrame("Interfaz Simple"). Al   usar   un   “G ridLayout”  todos  los  componentes  quedan  del  mismo  tamaño.EXIT_ON_CLOSE). 65 } 66 67 public void clickEnPuchale() { 68 // Toma el contenido del cuadro de texto "txtNombre" y lo deja en la 69 // variable "nombre".

sql.3.btnGuardar: JButton = new JButton("Guardar") .2.1.serialVersionUID: long = 1L {frozen} .frmInsertaAlumno( ) ~agregaEventos( ) +clickEnGuardar( ) ~muestraMensaje(String mensaje) + main(args: String[]) 1 control ctrlInsertaAlumno alumno * matricula: int .txtNombre JTextField = new JTextField(10) . Vista Lógica para frmInsertaAlumno.password :String password = "" {frozen} + inserta(matricula: int. Vista Lógica. 3.2.lblFecha: JLabel = new JLabel("Fecha:") . Acceso a Bases de Datos Desde Interfaces Gráficas.2. En este caso dividimos las funciones en dos objetos: 30 .usuario: String = "root" {frozen} fecha_de_nacimiento: Date . Especificación.   “nom bre”   y   “fecha ”.2. frmInsertaAlumno.txtMatricula: JTextField = new JTextField(10) . Ahora vamos a integrar lo estudiado en este capítulo y en los anteriores. frmInsertaAlumno . fecha: java. nombre: String.Date ) Ilustración 11.txtFecha: JtextField = new JTextField(10) . El   usuario   debe   proporcionar   el   valor   de   “matrícula” .url: String = "jdbc:mysql://localhost/test" {frozen} nombre: String .lblMatricula: Jlabel = new JLabel("Matricula:") .formato: DateFormat = getDateInstance( ) . 3.   Al   oprimir   el   botón “Guarda r”  se toma el contenido de  los tres campos para insertar un registro en la tabla “ alumno” . Ilustración 10.lblNombre: JLabel = new JLabel("Nombre:") .

El encargado de validar la integridad de los registros a insertar.3.swing. puesto que se encargará del control de transacciones y acceso al almacén de datos. 11 private JTextField txtMatricula = new JTextField(10). add(txtMatricula). 20 */ 21 private ctrlInsertaAlumno control = new ctrlInsertaAlumno(). 26 add(lblMatricula).*. 30 } 31 32 void agregaEventos() { 33 btnGuardar.  al cual llamaremos objeto de control. Al destruir el objeto   de   interacción. 38 } 39 31 . 3. 4 import java.awt.   se   destruye   el   objeto   de   control. se usa un objeto de la clase “ ctrlInsertaAlumno”. es la base de datos.addActionListener(new ActionListener() { 34 public void actionPerformed(ActionEvent evt) { 35 clickEnGuardar().*. 16 private JButton btnGuardar = new JButton("Guardar"). 25 setLayout(new GridLayout(4. Por otro lado. 28 add(lblFecha). 15 private JTextField txtFecha = new JTextField(10).2.*. 22 23 public frmInsertaAlumno() { 24 agregaEventos(). 8 private static DateFormat formato = DateFormat. 12 private JLabel lblNombre = new JLabel("Nombre:"). 29 add(btnGuardar).getDateInstance().text.   Esta   relación   de   pertenencia   se   llama agregación y está representada por el rombo negro que une ambas clases. Creará el objeto de control y será su dueño.*. se usa un objeto de la clase “frmInserta Alumno”. Código de “f rmInsertaAlumno. add(txtFecha). 13 private JTextField txtNombre = new JTextField(10). 2)). 17 18 /** 19 * Crea el objeto de control y establece la relación con él. 9 10 private JLabel lblMatricula = new JLabel("Matrícula:").  que llamaremos objeto de interacción. add(txtNombre).awt. 5 6 public class frmInsertaAlumno extends JPanel { 7 private static final long serialVersionUID = 1L. 3 import java. 1 import javax.java”.Por un lado. 2 import java. 27 add(lblNombre). 36 } 37 }).event. 14 private JLabel lblFecha = new JLabel("Fecha:"). Este se encargará de la interfaz de usuario.

85 } catch (Exception e) { 86 e. 66 e.Driver").EXIT_ON_CLOSE).inserta(matricula.printStackTrace().setDefaultCloseOperation(JFrame.sql.getText()). 75 } 76 77 public static void main(String[] args) { 78 try { 79 Class. 50 } 51 String nombre = txtNombre. fecha).40 public void clickEnGuardar() { 41 int matricula = 0. 73 // El valor null se refiere al JFrame que debe bloquear. 87 } 88 } 89 } 32 . 83 frame. 74 JOptionPane.getText()).mysql.getMessage()). 84 frame. 42 boolean datosOk = true."). 80 JFrame frame = new JFrame("Inserta Alumno").parseInt(txtMatricula. nombre. 64 } catch (Exception e) { 65 muestraMensaje(e.showMessageDialog(null.pack().jdbc.setVisible(true). mensaje).parse(txtFecha. 58 datosOk = false. 53 try { 54 fecha = new java. 59 } 60 if (datosOk) { 61 try { 62 control. 47 } catch (Exception e) { 48 muestraMensaje("La matricula debe ser numerica. 49 datosOk = false. 46 matricula = Integer.forName("com."). 82 frame.printStackTrace().Date( 55 formato. 56 } catch (Exception e) { 57 muestraMensaje("Fecha en formato incorrecto.sql."). 63 muestraMensaje("Registro Insertado. 52 java. Si el contenido 45 // de la cadena no es un número. se genera una excepción. 81 frame.getText().getTime()). 43 try { 44 // parseInt convierte texto en un número entero. 67 } 68 } 69 } 70 71 public void muestraMensaje(String mensaje) { 72 // Muestra un cuadro de diálogo modal que despliega “mensaje”.add(new JScrollPane(new frmInsertaAlumno())).Date fecha = null.

1 import java. Permiten que la aplicación funcione normalmente cuando están abiertos. agrégala. ?.5.java”. password).*. 13 conexion. 33 . String nombre.setDate(3.getConnection(url. 3 4 public class ctrlInsertaAlumno { 5 private static final String url = "jdbc:mysql://localhost/test".sql. • No Modales. 20 ps.executeUpdate(). es conveniente que la incluyas. 23 } 24 } 3. Comentarios.prepareStatement( 16 "INSERT INTO alumno VALUES(?. nombre). 22 conexion.close(). 7 private static final String password = "". matricula).4.text. Nota que la interfaz gráfica debe coincidir con la base de datos. Bloquean la aplicación mientras están abiertos.Date fecha) 10 throws Exception { 11 Connection conexion = 12 DriverManager. fecha). 6 private static final String usuario = "root". 19 ps. 21 ps. usuario.setTransactionIsolation( 14 Connection. 17 ps.*. Aunque la clase de control no muestra la prueba de unidad. 8 9 public void inserta(int matricula. 2 import java. java. Tampoco se incluyó la función de validación. 15 PreparedStatement ps = conexion. ?)").sql.setInt(1. Código de “c trlInsertaAlumno. Los   cuadros  de   diálogo   normalmente   se   utilizan   para   obtener  información   complementaria   y   para mostrar los resultados de algún proceso.setString(2.close().3. 18 ps.TRANSACTION_SERIALIZABLE). Los cuadros de diálogo pueden ser de dos tipos: • Modales.2. El flujo normal debe realizarse a través de la ventana principal de tu aplicación.2.

4. Consultas y Manejo de Restricciones. 34 .

serialVersionUID: long = 1L {frozen} .txtNombre JTextField = new JTextField(10) .txtMatricula: JTextField = new JTextField(10) . Especificación. Una Consulta Simple. Consultas y Manejo de Restricciones. frmBuscaAlumno. frmBuscaAlumno .btnBuscar: JButton = new JButton("Buscar") . Ilustración 12.1.1. Vista Lógica para frmBuscaAlumno.lblNombre: JLabel = new JLabel("Nombre:") . 4. Al oprimir el botón “ Buscar”  se extrae de la base de datos la información del alumno que corresponde a esa matrícula. 4.lblMatricula: Jlabel = new JLabel("Matricula:") .formato: DateFormat = getDateInstance( ) .lblFecha: JLabel = new JLabel("Fecha:") .url: String = "jdbc:mysql://localhost/test" {frozen} nombre: String .2.1.frmBuscaAlumno( ) ~agregaEventos( ) +clickEnBuscar( ) ~muestraMensaje(String mensaje) + main(args: String[]) 1 control ctrlBuscaAlumno infoAlumno * matricula: int .password :String password = "" {frozen} +busca(int id): LinkedHashMap<String.1.4.txtFecha: JtextField = new JTextField(10) . Vista Lógica.usuario: String = "root" {frozen} fecha_de_nacimiento: Date . Object> Ilustración 13. 4. 35 . El usuario debe introducir un valor para matrícula.

lee(id) 2. El primero se conoce como llave y es como una llave primaria.3. get(matricula): ResultSet 6. Esta estructura es como una tabla de dos campos.. la clase infoAlumno se convierte en la tabla “alumno”. 4. Este diagrama funciona como pseudocódigo y establece el diseño. terminaConexion( ) 8. clickEnBuscar( ) 3. En el código. 36 . El control de errores se incorpora en el código.1. : frmBuscaAlumno control: ctrlBuscaAlumno : infoAlumno 1. respuesta 9.En este caso la clase de control regresa el contenido de un registro en una estructura que se llama LinkedHashMap. Aquí tenemos el flujo principal de la aplicación. muestraRegistro(respuesta) Dibujo 1. Al implementarse. Diagrama de Secuencia. Diagrama de Secuencia para frmBuscaAlumno. busca(matricula: int) 4. Nota que cada flecha es recibida por el objeto que va a realizar la operación. El segundo se conoce como valor asociado. seguida por el número que le corresponde en el diagrama. las instrucciones llevan comentarios que empiezan con una letra “D ” . estableceConexion( ) 5. guardaValores() 7.

Si 51 // encuentra el registro. //D2 33 } 34 }). 24 add(lblMatricula). 42 } catch (NumberFormatException e) { 43 muestraMensaje("La matricula debe ser numerica.getMessage()). 17 private JButton btnBuscar = new JButton("Buscar"). 40 try { 41 matricula = Integer.addActionListener(new ActionListener() { 31 public void actionPerformed(ActionEvent evt) { 32 clickEnBuscar(). 45 } 46 if (datosOk) { 47 try { 48 // El objeto de control busca en la base de datos los datos 49 // del alumno con la matrícula introducida. add(txtNombre). 25 add(lblNombre). 13 private JLabel lblNombre = new JLabel("Nombre:"). add(txtMatricula). 35 } 36 37 public void clickEnBuscar() { //D2 38 int matricula = 0.util. 16 private JTextField txtFecha = new JTextField(10). //D3 57 muestraRegistro(respuesta). 2 import javax.4. 44 datosOk = false. 9 private static final DateFormat formato = DateFormat.awt.1."). 18 19 private ctrlBuscaAlumno control = new ctrlBuscaAlumno().swing.getText()).Object> respuesta = //D3 56 control. 10 11 private JLabel lblMatricula = new JLabel("Matrícula:"). 23 setLayout(new GridLayout(4. 55 LinkedHashMap<String. 12 private JTextField txtMatricula = new JTextField(10). Si no encuentra 50 // ningún alumno con esa matrícula. 14 private JTextField txtNombre = new JTextField(10).2)). add(txtFecha).busca(matricula). Código de “f rmBuscaAlumno. 4 import java.*. 26 add(lblFecha). Todas las clases son hijas de 54 // la clase Object. 6 7 public class frmBuscaAlumno extends JPanel { 8 private static final long serialVersionUID = 1L. 20 21 public frmBuscaAlumno() { 22 agregaEventos(). regresa una tabla que tiene como 52 // campo llave el nombre del atributo y como valor asociado 53 // el valor de ese atributo. 60 } 61 } 62 } 63 37 .parseInt(txtMatricula.java”. // Para la clase "LinkedHashMap". 28 } 29 void agregaEventos() { 30 btnBuscar.event. lanza una excepción.awt. 3 import java.text.*.*. 27 add(btnBuscar). 5 import java.*.*. 15 private JLabel lblFecha = new JLabel("Fecha:").4. //D9 58 } catch (Exception e) { 59 muestraMensaje(e.getDateInstance(). 39 boolean datosOk = true. 1 import java.

//D9 69 txtNombre.add(new JScrollPane(new frmBuscaAlumno())).Driver").setText( //D9 76 formato.sql. 91 } catch (Exception e) { 92 e.mysql. 86 JFrame frame = new JFrame("Busca Alumno").toString()).sql.get("nombre"). La expresión "(java. recupera ese tipo. 81 } 82 83 public static void main(String[] args) { 84 try { 85 Class. 93 } 94 } 95 } 38 . 89 frame. se genera una excepción.printStackTrace(). 74 // Si el objeto si pertenece a esa clase.forName("com. //D9 70 71 // De todas formas las fechas se tienen que manejar con el objeto 72 // formateador.format((java.Object> respuesta) {//D9 65 // get recupera el valor asociado con el nombre del campo.setDefaultCloseOperation(JFrame.get("fecha"))).setText(respuesta.64 public void muestraRegistro(LinkedHashMap<String. mensaje).pack().setText(respuesta.setVisible(true).Date)respuesta. En caso de que no. 66 // Todos los objetos tienen una operación llamada toString que 67 // permite obtener su representación como cadena. //D9 77 } 78 79 public void muestraMensaje(String mensaje) { 80 JOptionPane. 87 frame. 75 txtFecha. 88 frame.EXIT_ON_CLOSE).jdbc.toString()). 68 txtMatricula. 90 frame.showMessageDialog(null.get("matricula").Date)" verifica si el objeto 73 // pertenece a esa clase.

matricula).").getString("nombre"). //D6 35 respuesta.sql. //D6 30 31 // Agrega un registro a la tabla. El campo llave es el nombre 32 // del campo y el valor asociado es el valor del campo.//D6 27 String nombre = rs. //D6 36 } else { // El dato no se encontró. El repartir el código en clases te ayuda a hacerlo más fácil de manejar.close(). usuario.next() es positivo. 7 private static final String password = "".Object>(). Flujo alterno.prepareStatement( //D5 15 "SELECT * FROM alumno WHERE matricula = ?"). //D6 34 respuesta. //D6 28 java. //D7 45 return respuesta. 3 4 public class ctrlBuscaAlumno { 5 private static final String url = "jdbc:mysql://localhost/test". rs. password).util. 24 if (rs.next()) { 25 Integer matricula = //D6 26 new Integer(rs.getConnection(url.close(). nombre). 39 . 6 private static final String usuario = "root".sql. la consulta tiene un registro.Date fecha_de_nacimiento = //D6 29 rs. Los   objetos   de   la   clase   LinkedHashMap   funcionan   como   diccionarios   y   son   muy   prácticos   para manejar parejas de información. //D6 20 21 // Si el dato se encuentra. //D4 14 PreparedStatement ps = conexion.4. //D7 44 conexion.*.1.//D4 12 conexion. 37 rs.//D5 16 ps.executeQuery(). porque te ayudan a clarificar tus ideas. Comentarios. Código de “c trlBuscaAlumno.setTransactionIsolation( //D4 13 Connection. 2 import java.close().Object> respuesta = //D6 19 new LinkedHashMap<String. 1 import java.getDate("fecha_de_nacimiento").put("nombre".put("fecha". id).6. //D5 18 LinkedHashMap<String. 33 respuesta. 8 9 public LinkedHashMap<String.close(). fecha_de_nacimiento).getInt("matricula")).setInt(1.5.java”. 41 } 42 rs. //D8 46 } 47 } 4. 39 conexion. Como solo queremos un campo usamos 23 // if.Object> busca(int id) throws Exception {//D3 10 Connection conexion = //D4 11 DriverManager. En ese 22 // caso.put("matricula".*.close(). //D7 43 ps. 38 ps.1. Se recomienda que realices los diagramas de análisis antes de programar. //D5 17 ResultSet rs = ps.close(). 40 throw new Exception("Registro no encontrado.TRANSACTION_SERIALIZABLE).

 Si te fijas.4. tenemos un dominio bien definido. El botón “ Buscar”  sirve para recuperar la los datos del material que corresponde al campo “Id”.*. Al capturar llaves foráneas. Código de “f rmRestricciones. Especificación.  Por otro lado el botón “Modificar”  muestra un cuadro de diálogo con la información que se enviaría a la base de datos. 16 private JComboBox cmbEstado = new JComboBox(). Por ello utilizaremos un LinkedHashMap para guardar las matrículas y el nombre que le corresponde.2. 8 9 private JLabel lblId = new JLabel("Id:"). en este ejemplo debes proporcionar la matrícula de su dueño. 2 import java. 4.*.*.  La interfaz gráfica debe ayudar al usuario a realizar su trabajo. 14 private JComboBox cmbMatricula = new JComboBox(). frmRestricciones.awt. En el caso del “estado” . 13 private JLabel lblMatricula = new JLabel("Responsable:"). Este ejemplo trabaja con las tablas “alumno”  y “ material”. 17 private JButton btnBuscar = new JButton("Buscar"). 15 private JLabel lblEstado = new JLabel("Estado:").2.awt. 11 private JLabel lblDescripcion = new JLabel("Descripción:").java”.2. 4 import java. En el caso del responsable solo se muestra la matrícula y se elimina en nombre. Ilustración 14. 4. la relación entre matrícula y nombre funciona como un diccionario.swing. Manejo de Restricciones.*.util. 3 import javax.event. 18 private JButton btnModificar = new JButton("Modificar"). 5 6 public class frmRestricciones extends JPanel { 7 private static final long serialVersionUID = 1L. Esto es más fácil de manejar. 10 private JTextField txtId = new JTextField(10).   pero.   ¿te   acuerdas   de   ellas?   Para   ayudar   al   usuario   le   presentamos   en   un   combo   box   las matrículas registradas y el nombre del alumno correspondiente. 19 40 .2.1. 1 import java. 12 private JTextField txtDescripcion = new JTextField(10). Por ello usamos un combo box con los únicos valores permitidos.

addItem("BAJA").getValue().String> e: matriculas. 45 cmbEstado.removeAllItems(). 44 cmbEstado. 59 } 60 } 61 62 void agregaMatriculas() { 63 // Borra todos los renglones del combo box. 29 agregaEventos(). String> matriculas. 41 42 // Se añaden renglones al combo box 43 cmbEstado.cargaMatriculas().RIGHT). 31 add(lblId). add(btnModificar). 33 add(lblMatricula). 40 txtId. add(cmbMatricula). 56 agregaMatriculas(). 32 add(lblDescripcion).20 /** 21 * El campo llave contiene la matrícula y el valor asociado es el nombre. 65 66 int i = 0. add(cmbEstado). // Recupera el valor asociado.entrySet()) { 71 String matricula = e.addItem(matricula + " . // Recupera el valor llave.setHorizontalAlignment(JTextField.Entry<String. add(txtId).getKey(). 30 setLayout(new GridLayout(5. 72 String nombre = e. 24 25 private ctrlRestricciones control = new ctrlRestricciones().getMessage()).addItem("DESCOMPUESTO"). 74 } 75 } 76 41 . 50 cargaMatriculas(). add(txtDescripcion). 57 } catch (Exception e) { 58 muestraMensaje(e. 36 } 37 38 void configuraComponentes() { 39 // Los campos numéricos se justifican a la derecha." + nombre). 51 } 52 53 void cargaMatriculas() { 54 try { 55 matriculas = control.addItem("EN REPARACION"). 35 add(btnBuscar). 73 cmbMatricula.addItem("OK"). 34 add(lblEstado). 67 68 // entrySet() nos proporciona una lista de las parejas almacenadas 69 // en el LinkedHashMap. 46 cmbEstado. 64 cmbMatricula. 2)). 70 for (Map. 22 */ 23 private LinkedHashMap<String. 26 27 public frmRestricciones() { 28 configuraComponentes(). 47 48 // hay que llenar cmbMatricula con la información de la base de 49 // datos.

getText().").busca(id). 117 } 118 String descripcion = txtDescripcion. 83 btnModificar.Object> respuesta = control. 119 42 . 88 } 89 90 public void clickEnBuscar() { 91 int id = 0. 77 void agregaEventos() { 78 btnBuscar. 92 boolean datosOk = true. 112 try { 113 id = Integer. 93 try { 94 id = Integer. 86 } 87 }).getText()).parseInt(txtId."). 111 boolean datosOk = true. 102 muestraRegistro(respuesta).getMessage()). 98 } 99 if (datosOk) { 100 try { 101 LinkedHashMap<String.addActionListener(new ActionListener() { 84 public void actionPerformed(ActionEvent evt) { 85 clickEnModificar().addActionListener(new ActionListener() { 79 public void actionPerformed(ActionEvent evt) { 80 clickEnBuscar().getText()). 114 } catch (NumberFormatException e) { 115 muestraMensaje("El id debe ser numerico. 103 } catch (Exception e) { 104 muestraMensaje(e. 95 } catch (Exception e) { 96 muestraMensaje("El id debe ser numerico. 81 } 82 }). 105 } 106 } 107 } 108 109 public void clickEnModificar() { 110 int id = 0.parseInt(txtId. 116 datosOk = false. 97 datosOk = false.

get("estado"). 152 cmbMatricula. 141 } 142 } 143 144 public void muestraRegistro(LinkedHashMap<String. 129 } catch (NumberFormatException e) { 130 muestraMensaje("La matricula debe ser numerica. 121 // Con “split” separa la matrícula del nombre.toString(). 132 } 133 String estado = cmbEstado. descripcion. 170 } catch (Exception e) { 171 e. 127 try { 128 matricula = Integer.getSelectedItem().pack().toString()). usando " .setDefaultCloseOperation(JFrame.get(matricula)). 151 // Con get(matricula) recuperas el nombre.add(new JScrollPane(new frmRestricciones())).get("matricula").parseInt(seleccion[0]). 160 } 161 162 public static void main(String[] args) { 163 try { 164 Class. 140 control. 134 if (datosOk) { 135 muestraMensaje("Se quiere modificar\n" 136 + "id = " + id + "\n" 137 + "descripcion = " + descripcion + "\n" 138 + "matricula = " + matricula + "\n" 139 + "estado = " + estado). 165 JFrame frame = new JFrame("Manejo de Restricciones").setSelectedItem( 153 matricula + " .getSelectedItem().Object> respuesta) { 145 txtDescripcion. 169 frame. 124 String[] seleccion = 125 cmbMatricula. 172 } 173 } 174 } 43 .mysql. matricula. 146 String matricula = respuesta.Driver"). mensaje).setVisible(true).setSelectedItem(respuesta. 167 frame.EXIT_ON_CLOSE).split(" .120 // Recupera la combinación de matrícula y nombre seleccionadas.get("descripcion"). 147 148 // En la base de datos solo está almacenada la matrícula.showMessageDialog(null.printStackTrace().")." + matriculas. Para 150 // ello podemos recurrir al LinkedHashMap llamado "matriculas". 168 frame."). Seleccion[0] es la matrícula y seleccion[1] el 123 // nombre.setText(respuesta. estado).toString(). 126 int matricula = 0." como 122 // separación. 154 155 cmbEstado.forName("com. 166 frame. pero para 149 // seleccionar en cmbMatricula necesitas también el nombre.jdbc. 131 datosOk = false.toString()).modifica(id.toString(). 156 } 157 158 public void muestraMensaje(String mensaje) { 159 JOptionPane.

java”.close().Object> busca(int id) throws Exception { 29 Connection conexion = 30 DriverManager.put(rs.getString("descripcion")). password). 44 .next()) { //Solo queremos un elemento 40 respuesta.close(). 43 } else { 44 rs.String>().getString("matricula"). rs.prepareStatement( 15 "SELECT matricula. 55 String estado) {} 56 } 4. 1 import java. 14 PreparedStatement matriculas = conexion.Object>(). 39 if (rs.getString("nombre")). 50 busca.close().getInt("matricula"))). 46 conexion.setInt(1.setTransactionIsolation( 13 Connection. 41 respuesta.close().close(). En muchos ambientes de desarrollo hay componentes especialmente diseñados para el manejo de llaves foráneas. 26 } 27 28 public LinkedHashMap<String.getConnection(url.getConnection(url. 2 import java. password). int matricula.put("estado"."). Comentarios. 31 conexion.4. usuario. 37 LinkedHashMap<String.*. rs. 42 respuesta.setTransactionIsolation( 32 Connection. 17 LinkedHashMap<String.2. 51 conexion. 47 throw new Exception("Registro no encontrado.TRANSACTION_SERIALIZABLE).close(). 16 ResultSet rs = matriculas.close(). 21 } 22 rs. 53 } 54 public void modifica(int id.close(). 8 9 public LinkedHashMap<String. 7 private static final String password = "".next()) { 20 respuesta. String descripcion. 25 return respuesta. 23 matriculas.sql.*.put("descripcion". 36 ResultSet rs = busca.put("matricula". 19 while (rs.2.executeQuery(). 52 return respuesta. 6 private static final String usuario = "root". 45 busca. usuario.String> respuesta = 18 new LinkedHashMap<String.TRANSACTION_SERIALIZABLE). 12 conexion.getString("estado")). String> cargaMatriculas() throws Exception { 10 Connection conexion = 11 DriverManager. rs. 24 conexion.executeQuery().3.4.close(). 48 } 49 rs.Object> respuesta = 38 new LinkedHashMap<String.util. Código de “c trlRestricciones. 3 4 public class ctrlRestricciones { 5 private static final String url = "jdbc:mysql://localhost/test".prepareStatement( 34 "SELECT * FROM material WHERE id = ?"). id). 33 PreparedStatement busca = conexion. Úsalos. new Integer(rs. 35 busca. nombre FROM alumno").

45 . Uso de JTable. 5.

2 import java.1. 5.swing. // Para "DefaultTableModel".*.1. 5 6 public class frmTablaSencilla extends JPanel { 7 private static final long serialVersionUID = 1L.5.event. 11 12 ctrlTablaSencilla control = new ctrlTablaSencilla(). frmTablaSencilla. Los datos pueden conectarse a uno o   más  objetos  de  la clase   “JTable”. Las modificaciones realizadas mientras la ventana se despliega no se muestran.   Los   datos   se   guardan   en   objetos   de   la   clase   “DefaultT ableModel”   .1.table.  En caso de que los datos no puedan desplegase en su totalidad dentro del espacio que ocupa la tabla. Código de “f rmTablaSencilla”. 1 import javax. Al manejar tablas surge la necesidad de desplegar el resultado de consultas o manipular relaciones de uno a muchos objetos.   Estos  se  encargan   exclusivamente  de  mostrar  la   información.*.2. 4 import javax. se pueden colocar dentro de un JScrollPane para que agregue barras de desplazamiento. el componente JTable permite usar simultáneamente muchos registros con los mismos atributos.awt. La funcionalidad de desplegarla se divide en dos   clases   de   objetos.awt. Uso de JTable.swing. 5. En esos casos. Especificación. 10 JScrollPane scroll = new JScrollPane(tblResultado). Despliega los datos almacenados en la tabla “ alumno”  en el momento de ejecutar la aplicación. 13 46 . Ilustración 15. La tabla está estructurada como un arreglo bidimensional. 3 import java.*. 8 9 JTable tblResultado = new JTable(). Ambos tipos de objetos están en constante comunicación. // Para "Dimension".*.   Estos permiten realizar cualquier tipo de modificaciones a la información. Un Ejemplo Sencillo. 5.1.

setDefaultCloseOperation(JFrame. 13 47 . 16 add(scroll). 32 } catch (Exception e) { 33 muestraMensaje(e. 31 tblResultado.obtenDatos(). 47 frame.*. 14 public frmTablaSencilla() { 15 configuraComponentes(). 100)). 17 } 18 19 void configuraComponentes() { 20 // Define el tamaño de la tabla. 49 frame. mensaje). 4 import javax.text. Código de “c trlTablaSencilla”.util. "Fecha de Nacimiento"}.Driver").swing.forName("com. 11 private static Object[] encabezados = 12 {"Matrícula".3.add(new JScrollPane(new frmTablaSencilla())).setVisible(true). 50 } catch (Exception e) { 51 e.*. Para ello se utilizan objetos 21 // de la clase Dimension. "Nombre".printStackTrace(). 45 JFrame frame = new JFrame("Consulta"). 23 scroll. 10 private static final String password = "". 24 25 cargaAlumnos(). 3 import java. 52 } 53 } 54 } 5. 2 import java.*.showMessageDialog(null.table.1.*. 46 frame.setModel(alumnos). 9 private static final String usuario = "root".getMessage()). 48 frame. 1 import java.EXIT_ON_CLOSE).jdbc.setPreferredSize(new Dimension(400.pack(). 34 e. 26 } 27 28 void cargaAlumnos() { 29 try { 30 DefaultTableModel alumnos = control.getDateInstance(). 8 private static final String url = "jdbc:mysql://localhost/test".sql. 5 6 class ctrlTablaSencilla { 7 private static DateFormat formato = DateFormat.printStackTrace(). 40 } 41 42 public static void main(String[] args) { 43 try { 44 Class. 35 } 36 } 37 38 public void muestraMensaje(String mensaje) { 39 JOptionPane.mysql. Su primer parámetro indica los pixeles 22 // de ancho y el segundo parámetro es la altura.

17 18 public boolean isCellEditable(int renglon. Ilustración 16. frmTablaCompleta. 24 modelo. De inicio la tabla está vacía. 28 conexion. 38 Object[] datos = {matricula. 22 23 // Le pone encabezado a las columnas del modelo. Una vez que el dato se ha modificado aparece un cuadro indicando que campo se quiere modificar en cual renglón. 48 . nombre.TRANSACTION_SERIALIZABLE). fecha}. El botón “Total”  muestra la suma de los goles. 33 while (rs. 39 40 // Agrega un renglón al final del modelo.setColumnIdentifiers(encabezados). usuario.close(). Al seleccionar un renglón y oprimir “Borrar ”. Cada vez que se oprime “F2”  se puede modificar el contenido de cada celda de la tabla.close().1. 35 String nombre = rs. 14 public DefaultTableModel obtenDatos() throws Exception { 15 DefaultTableModel modelo = new DefaultTableModel() { 16 private static final long serialVersionUID = 1L.getDate("fecha_de_nacimiento")).next()) { 34 String matricula = rs. Un Ejemplo más Completo. Cada vez que se oprime el botón “Nuevo”  se agrega un renglón en blanco.executeQuery(). 44 conexion. 46 } 47 } 5. 25 26 Connection conexion = 27 DriverManager.2.setTransactionIsolation( 29 Connection. 30 PreparedStatement consulta = conexion.getString("nombre").getString("matricula").format( 37 rs.2. 41 modelo. Especificación. int columna) { 19 return false. 5.prepareStatement( 31 "SELECT * FROM alumno"). 20 } 21 }.getConnection(url.  se elimina la línea seleccionada. 45 return modelo. 42 } 43 consulta.addRow(datos). 32 ResultSet rs = consulta. 36 String fecha = formato. password).

renglon.swing. 48 case 1: 49 cambiarGoles((Integer)valor.*. renglon). Aqu? se 39 // inserta el nuevo valor en el modelo.*.setValueAt(valor. 18 */ 19 public Class getColumnClass(int columna) { 20 switch (columna) { 21 case 0: return String. 22 case 1: return Integer. int renglon. 8 9 /** 10 * Se crea un DefaultTableModel. 25 default: return Object. renglon).java”. 14 15 /** 16 * Regresa una clase que representa el tipo de datos de 17 * cada columna. renglon). 57 } 58 } 59 }. 60 49 . 56 break. 24 case 3: return String. 2 import java.event. 11 */ 12 DefaultTableModel modelo = new DefaultTableModel() { 13 private static final long serialVersionUID = 1L. columna).awt. 54 case 3: 55 cambiarPosicion((String)valor. 41 42 // Ahora invocaremos un evento dependiendo de la 43 // columna que se está modificando. 36 int columna) { 37 // La palabra super representa a la clase padre. 51 case 2: 52 cambiarActivo((Boolean)valor.5. 38 // En este caso es DefaultTableModel. La numeración empieza en 0.2.table.class. 53 break. 3 import javax. 40 super. pero se le cambian algunas funciones.class. El JTable le envía el 32 * nuevo valor que el usuario quiere colocar en la 33 * celda. 44 switch (columna) { 45 case 0: 46 cambiarNombre((String)valor.swing. 47 break.class. 50 break. renglon). 26 } 27 } 28 29 /** 30 * Esta función se invoca cada vez que se quiere 31 * modificar una celda.class. 34 */ 35 public void setValueAt(Object valor.*. 5 6 public class frmTablaCompleta extends JPanel{ 7 private static final long serialVersionUID = 1L.class. 4 import java. 1 import javax. 23 case 2: return Boolean.awt.2.*. Código de “f rmTablaCompleta.

100)).addActionListener(new ActionListener() { 105 public void actionPerformed(ActionEvent evt) { 116 clickEnTotal(). 104 btnTotal. 113 modelo.setCellEditor(new DefaultCellEditor(comboBox)). 107 } 108 }). 102 } 103 }). 66 67 public frmTablaCompleta() { 68 configuraComponentes(). 79 modelo.getColumn(3). "Goles".setModel(modelo).getColumnModel(). 74 add(btnTotal). "Activo". 99 btnBorrar. 97 } 98 }). 70 71 add(scroll). 90 posiciones.addItem("Delantero"). 86 comboBox.addItem("Medio"). 114 } 115 50 . 109 } 110 111 public void clickEnNuevo() { 112 Object[] nuevo = {}. 88 comboBox.addItem("Portero"). 81 scroll. 65 JButton btnTotal = new JButton("Total"). 62 JScrollPane scroll = new JScrollPane(tblJugadores). 73 add(btnBorrar). 82 83 // Asigna un combo box para capturar la columna 3.setPreferredSize(new Dimension(300.setColumnIdentifiers(encabezados). 80 tblJugadores. 91 } 92 93 void agregaEventos() { 94 btnNuevo.addRow(nuevo). 63 JButton btnNuevo = new JButton("Nuevo"). 75 } 76 77 void configuraComponentes() { 78 Object[] encabezados = {"Nombre". 61 JTable tblJugadores = new JTable().addActionListener(new ActionListener() { 95 public void actionPerformed(ActionEvent evt) { 96 clickEnNuevo(). 85 JComboBox comboBox = new JComboBox(). 89 comboBox. 69 agregaEventos().addActionListener(new ActionListener() { 100 public void actionPerformed(ActionEvent evt) { 101 clickEnBorrar(). 72 add(btnNuevo). "Posici?n"}.addItem("Defensa"). 87 comboBox. 64 JButton btnBorrar = new JButton("Borrar"). 84 TableColumn posiciones = tblJugadores.

getValueAt(renglon. 127 } 128 } 129 130 public void clickEnTotal() { 131 //El numero de columnas se obtiene con getColumnCount() 132 int total = 0. Integer goles.getValueAt(renglon. 150 } 151 152 public void cambiarActivo(Boolean activo.setDefaultCloseOperation(JFrame. 170 frame. int renglon) { 153 muestraMensaje("Quieres cambiar activo del renglon " + renglon). 161 String posicion) { 162 muestraMensaje("Quieres borrar a " + nombre). 1). 125 } else { 126 muestraMensaje("No has seleccionado renglon. 167 frame.pack(). 135 total += subtotal.getRowCount(). 146 } 147 148 public void cambiarGoles(Integer goles. renglon < modelo. int renglon) { 149 muestraMensaje("Quieres cambiar los goles del renglon " + renglon). Boolean activo. posicion)."). 122 String posicion = (String)modelo. 123 borrar(nombre. activo.getValueAt(renglon.getSelectedRow(). 138 } 139 140 public void muestraMensaje(String mensaje) { 141 JOptionPane. 133 for (int renglon=0. goles.getValueAt(renglon. 121 Boolean activo = (Boolean)modelo.116 public void clickEnBorrar() { 117 int renglon = tblJugadores.1).setVisible(true). 124 modelo. renglon++) { 134 int subtotal = (Integer)modelo. 2). 168 frame. 0). mensaje). 142 } 143 144 public void cambiarNombre(String nombre. 158 } 159 160 public void borrar(String nombre. 169 frame.EXIT_ON_CLOSE). int renglon) { 157 muestraMensaje("Quieres cambiar la posicion del renglon " + renglon).add(new JScrollPane(new frmTablaCompleta())). 120 Integer goles = (Integer)modelo. 3). 118 if (renglon != -1) { 119 String nombre = (String)modelo. 163 } 164 165 public static void main(String[] args) { 166 JFrame frame = new JFrame("Tabla Completa"). int renglon) { 145 muestraMensaje("Quieres cambiar el nombre del renglon " + renglon).getValueAt(renglon.showMessageDialog(null. 154 } 155 156 public void cambiarPosicion(String posicion. 136 } 137 muestraMensaje("Total de goles: " + total).removeRow(renglon). 171 } 172 } 51 .

Java en Internet. 52 . 6.

6.1. 1 import javax. necesitas que tu navegador tenga registrada como plug­in   una   máquina   virtual  de   Java   compatible   con   la   versión   de   código   que   estás   usando. 1 <html> 2 <head> 3 <title>Applet de Prueba</title> 4 </head> 5 <body> 6 <h1>Applet de Prueba</h1> 7 <hr> 8 <applet code="AppletDePrueba.swing.   Este ejemplo muestra el mensaje “Hola”  en un renglón y “Adios”  inmediatamente abajo.out.awt. 16 </applet> 17 <hr> 18 </body> 19 </html> 6. 9 } 10 11 public void init() { // Se ejecuta al entrar a la página.html”. 6. 16 System.println("stop").java”.println("Constructor").out. Java en Internet.out.1. 6.println("init"). 13 } 14 15 public void start() { // Se ejecuta al entrar a la página. Son aplicaciones que se pueden insertar en una página HTML. 2 import java. Para ello. 17 } 18 19 public void stop() { // Se ejecuta al salir de la página. 21 } 22 53 . se despliega en la consola de Java. 6 7 public AppletDePrueba() { 8 System. ejecutando. Código de “AppletDePrueba. 3 4 public class AppletDePrueba extends JApplet { 5 private static final long serialVersionUID = 1L. 20 System.out. Código de “AppletDePrueba. Una de las formas más sencillas de usar Java en Internet es por medio de applets. Un Applet Sencillo.1.*.class" 9 width=100 10 height=120 11 alt="Tu navegador soporta applets pero no est&aacute. Cada vez que sucede un evento en el applet.1.2.*.println("start"). 12 System." 12 > 13 <PARAM NAME = parametro1 VALUE = Hola> 14 <PARAM NAME = parametro2 VALUE = Adios> 15 Tu navegador no soporta applets.

100). "cualquier dato2"} 48 }." 12 > 13 Tu navegador no soporta applets.2. 30 // getParameter recupera los parámetros que se pasaron desde 31 // el código en HTML. Las coordenadas son 29 // x = 0 y y = 80. 38 public String getAppletInfo() { 39 return "Titulo: AppletDePrueba\n" + 40 "Un applet de prueba. 0. "cualquier dato1"}. 32 g. Este Applet muestra “frmSencilla”  en tu navegador. 1 <html> 2 <head> 3 <title>Applet Sencillo</title> 4 </head> 5 <body> 6 <h1>Applet Sencillo</h1> 7 <hr> 8 <applet code="AppletSencillo. 47 {"parametro2". 0.". 28 // drawString permite desplegar un texto.html”. 49 return paramInfo. 14 </applet> 15 <hr> 16 </body> 17 </html> 54 .drawString(getParameter("parametro1"). ejecutando. 35 } 36 37 // Proporciona información sobre el applet. "texto2". 41 } 42 43 // Regresa una descripción de los parámetros. 6.1. 25 } 26 27 public void paint(Graphics g) { // Dibuja al componente gráfico. 23 public void destroy() { // Se ejecuta al salir de la página.println("paint"). 80).drawString(getParameter("parametro2"). "texto1".out. 34 System. 50 } 51 } 6.class" 9 width=250 10 height=100 11 alt="Tu navegador soporta applets pero no lo est&aacute. Código de “AppletSencil lo. Otro Applet.2. 24 System.out.println("destroy"). 33 g. 44 public String[][] getParameterInfo() { 45 String paramInfo[][] = { 46 {"parametro1".

next()) { 27 %> 28 <%-.forName("com.getString("nombre")%> 31 <TD> <%=rs.html”. 19 PreparedStatement alumnos = con.getString("matricula")%> 30 <TD> <%=rs. 1 import javax. Código de “AppletConsul ta. 3 --%> 4 5 <%-.sql. El siguiente ejemplo despliega una tabla con el contenido de la tabla “alumno”. 7 --%> 8 9 <%@ page import = "java.getString("fecha_de_nacimiento")%> 32 <% 33 } 34 %> 35 </TABLE> 55 . pero ha removido y ejecutado el código en Java. 1 <%-- 2 Este es un comentario.*. 21 ResultSet rs = alumnos.esta expresion funciona como print --%> 29 <TR><TD> <%= rs.executeQuery().3.6. Un JSP.getConnection( 18 "jdbc:mysql://localhost/test".jdbc.prepareStatement( 20 "SELECT * FROM alumno"). Un JSP  es un listado en HTML que contiene instrucciones de procesamiento en Java.*" %> 10 11 <HTML> 12 <HEAD><TITLE>Reporte de Alumnos</TITLE></HEAD> 13 <BODY> 14 <%! int n=0. 17 Connection con = DriverManager.mysql.2. 2 3 public class AppletSencillo extends JApplet { 4 private static final long serialVersionUID = 1L.Los imports van separados por comas y la lista de ellos va entre 6 comillas.Driver"). Código de “AppletSencil lo . "otro".java”. Actualmente se requiere que una buena parte de procesamiento sea realizada en el servidor web.1. 6. 5 6 public void init() { 7 add(new JScrollPane(new frmSencilla())). 22 %> 23 <TABLE BORDER = "1" WIDTH="3"> 24 <THEAD><TR><TH>MATRICULA<TH>NOMBRE<TH>FECHA DE NACIMIENTO 25 <TBODY> 26 <% while (rs. enmarcadas por los signos “<% ”  y “%> ”.3. 8 } 9 } 6.swing.2. "akt").  El servidor web procesa la página y regresa una página en HTML que contiene las instrucciones originales de HTML. %> 15 <% try { 16 Class.

36 <% 37 rs. 40 } catch(Exception e) { 41 %> 42 <%= e.getMessage() %> 43 <% } 44 %> 45 </BODY> 46 </HTML> 56 . 38 alumnos.close().close(). 39 con.close().

7.
Un
Ejemplo
de
Aplicación.

57

7. Un Ejemplo de Aplicación.
¿Cómo se pueden integrar todos los temas que hemos estudiado para desarrollar una aplicación mas
compleja? A continuación te presentamos la base de una y algunas técnicas adicionales.

7.1. La Especificación.
Lo primero por hacer es determinar el objetivo de la aplicación. En nuestro caso, el objetivo es facturar.
A partir de ellos se hace una definición de requerimientos. Después se elabora el análisis, donde se
definen   los   casos   de   uso   y   se   define   el   funcionamiento   de   cada   uno   de   ellos.   A   continuación   te
presentamos   el   funcionamiento  base   que  deseamos  implementar.   Es  una  parte   de  la  funcionalidad
completa.

Al iniciar la aplicación aparece una pantalla de bienvenida.

Ilustración 17. Portada.

Posteriormente se presenta un cuadro de diálogo que controla el acceso.

Ilustración 18. Control de Acceso.

El usuario introduce su nombre de usuario, su password y la base de datos con la que trabajará. Cuando
oprime  conectar,    la  aplicación  se  conecta a la  base de datos, la  cual  verifica que la  información
proporcionada   sea   válida.   El   usuario   solo   puede   usar   las   ventanas   a   las   que   tiene   permiso.   Estos
permisos se asignan en base a un rol. Si el usuario tiene el  rol “ SUPERVISOR”,  tiene acceso al
siguiente menú.

58

Ilustración 19. Menú de Supervisor.

Si   se   elige   “Reporte   de   Productos”  aparece   una  ventana   interna   donde  se   muestran   los   productos
registrados.

Ilustración 20. Reporte de Productos.

Cuando se presiona el botón “Imprimir”,  la información se envía a la impresora.

59

 Esta pantalla solo permite insertar. Cada uno de los componentes gráficos están en los siguientes estados. Cierra la ventana. 60 . El comportamiento de esta ventana lo describiremos por estados. Cancelar – deshabilitado.Cuando se selecciona “Catálogo de Clientes”  se muestra la siguiente pantalla.  Al   oprimirlo   para   al   estado INESERTANDO. Catálogo de Clientes.   Los   campos   de   texto   para   “ RFC”   y “Nombre”  aparecen en blanco. El estado de entrada es el estado “ BASE” . Insertar – habilitado. borrar y localizar registros. Este   tipo   de   pantallas   se   conoce   como   catálogo   y   permite   manipular   la   información   básica   de   la aplicación. Guardar – deshabilitado. Ilustración 21. Cerrar – habilitado. pero en la práctica también se necesitan opciones para modificar. Para   el   estado  BASE  tenemos   las   siguientes   características. Nombre – deshabilitado. RFC – deshabilitado. Un estado es cada una de las posibles combinaciones válidas de valores que puede tener.

Ilustración 22. registro   con   la   información mostrada   en   la   ventana. Después se introduce el RFC o parte del mismo y se oprime el botón RFC. Se añade el valor de cantidad. 61 .  Para registrar productos. Insertar – deshabilitado. se oprime el botón “Imprimir”. Se introduce el código del producto. Para registrar la información en la base de datos se oprime el botón guardar. se oprime el botón “Nuevo ”  y se agrega un renglón en blanco. Se recupera el nombre del cliente buscándolo en la base de datos.   Si   la inserción   es   válida.   regresa   al estado BASE.  Cerrar – deshabilitado. Menú del Vendedor. Cancelar – deshabilitado. Se   debe  introducir  el   número  de  folio  de  la  factura. Si el usuario tiene el rol “ VENDEDOR”. Si se quiere imprimir la factura. tendrá  el siguiente menú.  A continuación se presenta un ejemplo de factura impresa.   valor  que  normalmente  se  toma de  la   forma continua a imprimir.En el estado INSERTANDO tenemos lo siguiente: RFC – habilitado. Nombre – habilitado. Este se busca en la base de datos y se recupera tanto la descripción como el precio. Guardar – habilitado. Inserta   en   la   base   de   datos   un Regresa al estado BASE.

00 Ilustración 23.00 Total: 38. El menú Archivo. folio: 19 fecha: 30/04/2004 RFC: PH Nombre: Usuario 8. El botón “ Cerrar”  cierra la ventana. Ejemplo de Factura Impresa. Ilustración 24. 62 .00| Chocolate|$3.00| Dulce|$1. En cualquiera de los dos roles hay dos menús que son iguales. Menú Archivo. Al seleccionas “Salir”  se cierra la aplicación.50 10.

Diseño. 63 . Acerca De. Se encarga del control transaccional. Cada una de las ventanas con acceso a la base de datos se diseñará en tres capas.”  aparece el siguiente cuadro de diálogo modal. • Entity.El menú Ayuda es el siguiente. Interactúa con el usuario. Al seleccionar “Acerc a de. Estas clases usan el prefijo frm. Menú Ayuda. • Control. Tablas de la base de datos. Ilustración 25.. Ilustración 26. 7. • Boundary.2..

 Carta de Estados para “frmClient es”.7.   pero   son   muy   similares   a   los   que   se   han estudiado. Carta de Estados para frmClientes.2. Los diagramas de estado son bastante buenos para diseñar el comportamiento de interfaces de usuario y proporcionan una buena base para obtener programas claros y fáciles de mantener. frmLogin frmMenu 1 control 1 1 factura 1 productos clientes ctrlLogin frmClientes frmFactura frmProductos * 1 control 1 control 1 control ctrlClientes ctrlFactura ctrlProductos infoUsuario * * * 1 * * * infoCliente infoFactura infoProducto Ilustración 27. Vista Lógica del Ejemplo.2. 7. Vista Lógica. Faltan   los   diagramas   de   secuencia   para   las   interfaces. Las operaciones “base(  )”  e “insertando ( )” realiz an todas las actividades marcadas en la especificación.1. 64 .2. insertar Base Insertando guardar/insertar entry/ base( ) entry/ insertando( ) cancelar cerrar show Cerrado entry/ close( ) Ilustración 28.

5 import javax. 14 pr_cantidad DECIMAL(10.1. 25 26 CREATE TABLE detalle( 27 pr_id INTEGER NOT NULL. 3. 3 */ 4 import java. 9 10 private GridBagLayout gridbag = new GridBagLayout(). fac_folio). 30 det_precio DECIMAL(10. 31 PRIMARY KEY(pr_id. 28 fac_folio INTEGER NOT NULL. 17 18 CREATE TABLE factura( 19 fac_folio INTEGER PRIMARY KEY.*.2) NOT NULL) 16 TYPE = InnoDB. 1 /** 2 * Un panel que permite colocar componentes fácilmente. pr_precio) 42 VALUES ('Dulce'. 21 cli_rfc VARCHAR(13). 1 CREATE TABLE usuario( 2 usu_nombre VARCHAR(13) PRIMARY KEY. 7.0). 35 FOREIGN KEY(fac_folio) REFERENCES factura(fac_folio)) 36 TYPE = InnoDB.java”.3. Implementación. 22 INDEX(cli_rfc).sql”. 20 fac_fecha DATE NOT NULL. 32 INDEX(pr_id).3.50). 2) NOT NULL. 7.swing. pr_cantidad. 12 65 . 40 41 INSERT INTO producto (pr_descripcion. 3 usu_rol ENUM('SUPERVISOR'. 37 38 INSERT INTO producto (pr_descripcion. 34 INDEX(fac_folio). 8 cli_nombre VARCHAR(30) NOT NULL) 9 TYPE = InnoDB. 100.*. 23 FOREIGN KEY(cli_rfc) REFERENCES cliente(cli_rfc)) 24 TYPE = InnoDB. 15 pr_precio DECIMAL(10. 29 det_cantidad DECIMAL(10. 5 6 CREATE TABLE cliente( 7 cli_rfc VARCHAR(13) PRIMARY KEY. pr_cantidad. 2) NOT NULL. 10 11 CREATE TABLE producto( 12 pr_id INTEGER PRIMARY KEY AUTO_INCREMENT.'VENDEDOR') NOT NULL) 4 TYPE = InnoDB. pr_precio) 39 VALUES ('Chocolate'.7. 6 7 public class GridBagPanel extends JPanel { 8 private static final long serialVersionUID = 1L.3. 13 pr_descripcion VARCHAR(30) NOT NULL. Código de “f actura. 300. 33 FOREIGN KEY(pr_id) REFERENCES producto(pr_id).2. 11 private GridBagConstraints c = new GridBagConstraints().awt. 1.2) NOT NULL. Código de “Grid BagPanel.

gridx = x.ipadx = pIpadx.ipady. 23 c.WEST. c).13 public GridBagPanel() { 14 // De entrada los componentes se alínean a la izquierda. 25 gridbag. 47 } 48 49 public int getIpady() { 50 return c.ipadx. 59 } 60 61 public void setAnchor(int pAnchor) { 62 c. 31 } 32 33 public int getFill() { 34 return c. 27 } 28 29 public void setFill(int pFill) { 30 c.setConstraints(componente.anchor = pAnchor.gridwidth = ancho. 81 } 82 83 public double getWeightx() { 84 return c. 16 setLayout(gridbag). 17 } 18 19 public void add(int y.insets.gridy = y. 35 } 36 37 public void setIpadx(int pIpadx) { 38 c.fill. 63 } 64 65 public int getAnchor() { 66 return c.fill = pFill. 20 Component componente) { 21 c. 43 } 44 45 public void setIpady(int pIpady) { 46 c.ipadx = pIpady. 26 add(componente).insets = pInsets.anchor. 15 c. 24 c.weightx.weightx = pWeightx. 51 } 52 53 public void setInsets(Insets pInsets) { 54 c. 39 } 40 41 public int getIpadx() { 42 return c. 85 } 86 66 . int x.anchor = GridBagConstraints. int alto. 55 } 56 57 public Insets getInsets() { 58 return c. 22 c. 67 } 68 69 public void setWeightx(double pWeightx) { 80 c. int ancho.gridheight = alto.

renglón 0.1. 23 24 public frmProductos() { 25 // La palabra "super" se refiere al constructor de la clase padre. ponla en "false".3.setPreferredSize(new Dimension(400. 21 JScrollPane scroll = new JScrollPane(tblResultado).*.java” 1 import javax. 26 // que en este caso es JInternalFrame.weighty. 30 super("Reporte de Productos".table. 16 */ 17 private GridBagPanel grid = new GridBagPanel(). true.3. 44 pack().event. 31 configuraComponentes().*. 43 init(). 20 JTable tblResultado = new JTable(). true). 40 grid. 18 19 ctrlProductos control = new ctrlProductos(). Si no 29 // quieres alguna de ellas. 100)). 37 38 // coloca "btnImprimir" en la columna 10. true. 28 // se puede cerrar. ocupando 10 35 // renglones de alto y 4 columnas de ancho. 3 import java.text.swing. 2 import java.0. 33 34 // coloca "scroll" en la columna 0.*. 36 grid. btnImprimir).awt. 89 } 90 91 public double getWeighty() { 92 return c. 93 } 94 } 7. 5 import java.4. scroll). se puede maximizar y se puede minimizar. 32 agregaEventos().swing.*. 6 7 /** 8 * Un JInternalFrame es una ventana que se abre de forma no modal dentro 9 * de una ventana de aplicación. Código de “f rmProductos. 4 import javax.10. 13 14 /** 15 * Usamos un objeto de la clase GridBagPanel para colocar componentes.*.add(10. renglón 0.add(0. 41 42 add(new JScrollPane(grid)).weighty = pWeighty.awt. 87 public void setWeighty(double pWeighty) { 88 c. ocupando 1 39 // renglón de alto y 1 columna de ancho.0.1. Los valores "true" hacen 27 // referencia a 4 características: se le puede cambiar el tamaño. 45 } 46 47 void configuraComponentes() { 48 scroll. 49 } 50 67 . 10 */ 11 public class frmProductos extends JInternalFrame { 12 private static final long serialVersionUID = 1L. 22 JButton btnImprimir = new JButton("Imprimir"). true.

*. 62 } 63 } 64 65 void agregaEventos() { 66 btnImprimir.sql.NORMAL.obtenDatos(). Código de “c trlProductos. 9 68 . 84 } 85 } 86 87 public void muestraMensaje(String mensaje) { 88 JOptionPane.{0}")).*.3. 54 */ 55 void init() { 56 try { 57 DefaultTableModel clientes = control. 61 e. "Cantidad". "Precio"}. 89 } 90 } 7. {0} se refiere al n?mero de página.printStackTrace(). "Descripcion".setModel(clientes). 80 new MessageFormat("Reporte_de_Productos"). 5 6 class ctrlProductos { 7 private static final Object[] encabezados = 8 {"Clave".java” 1 import java.PrintMode.print(JTable.getMessage()). 51 /** 52 * Esta rutina se invoca para reiniciar el estado de la ventana cada 53 * vez que se vuelve a abrir.table. 82 } catch (Exception e) { 83 muestraMensaje(e.addActionListener(new ActionListener() { 67 public void actionPerformed(ActionEvent evt) { 68 clickEnImprimir(). 81 new MessageFormat("pagina .swing.*. 2 import java.util. 69 } 70 }). 59 } catch (Exception e) { 60 muestraMensaje(e.getMessage()). 71 } 72 73 public void clickEnImprimir() { 74 try { 75 // Imprime el contenido de "tblResultado" sin hacer 76 // modificaciones en la apariencia de sus celdas. 79 tblResultado. mensaje). El segundo 77 // par?metro es el encabezado y el tercero es el pie de 78 // página. 4 import javax.text.4. 58 tblResultado.*.showMessageDialog(null. 3 import java.

cantidad.getInt("pr_id")). 20 21 // Para un mejor control del contenido de la ventana.*.getTime()). 23 } 24 } 25 }. 18 */ 19 private enum Estado {BASE.table.getString("pr_descripcion").close().text. 4 import javax.swing. 11 private static DateFormat formato = DateFormat. 33 String descripcion = rs.*.getDouble("pr_precio")). 20 case 2: return Double.*. 34 Double cantidad = new Double(rs. 6 import java.swing.event.Date hoy = 13 new java.util.sql. 36 Object[] datos = {id.util. 26 modelo. INSERTANDO}.// Para "EtchedBorder" y "LineBorder" 5 import java. 42 } 43 } 7.prepareStatement( 29 "SELECT * FROM producto"). 14 15 /** 16 * Define constantes para cada uno de los estados que puede tomar esta 17 * ventana.class. 28 PreparedStatement consulta = conexion.java”. 31 while (rs. 19 case 1: return String.getDateInstance(). "Font" e "Insets".*.class.getDouble("pr_cantidad")). los componentes 22 // se agrupan en páneles. 2 import java.*. 10 public DefaultTableModel obtenDatos() throws Exception { 11 DefaultTableModel modelo = new DefaultTableModel() { 12 private static final long serialVersionUID = 1L. 13 public boolean isCellEditable(int renglon.*.setColumnIdentifiers(encabezados).close().conecta().awt.class. // Para "KeyEvent". 8 9 public class frmClientes extends JInternalFrame { 10 private static final long serialVersionUID = 1L.next()) { 32 Integer id = new Integer(rs. precio}.awt. 1 import javax. // Para "Color".sql. 7 import java.swing. 41 return modelo. 21 case 3: return Double.executeQuery(). 40 conexion. 37 modelo.class. 23 69 . 38 } 39 consulta. 35 Double precio = new Double(rs.Date().3. Código de “f rmClientes.5. descripcion. int columna) { 14 return false. 15 } 16 public Class getColumnClass(int columna) { 17 switch (columna) { 18 case 0: return Integer. 27 Connection conexion = ctrlLogin. 30 ResultSet rs = consulta.addRow(datos).*. 22 default: return Object. 12 private static java. 3 import javax.class.Date(new java.border.

46 new ImageIcon("cara. 56 JLabel. 48 new ImageIcon("cara. 55 new ImageIcon("cara. 83 84 add(new JScrollPane(gridFondo)). true.1.1. 32 private JTextField txtNombre = new JTextField(30). 54 private JLabel lblHola = new JLabel("Hola".0.0. lblHola).1. 67 configuraComponentes().add(0. 74 gridLateral.0. gridLateral).1.add(0.2.add(0.1. btnCancelar). 62 63 private ctrlClientes control = new ctrlClientes().add(0. gridInfo.gif").1.1. true. 52 */ 53 private GridBagPanel gridFondo = new GridBagPanel(). 86 pack(). btnCerrar). 29 private JLabel lblRfc = new JLabel("RFC"). 27 */ 28 private GridBagPanel gridInfo = new GridBagPanel(). 33 34 /** 35 * Controla los botones que realizan operaciones.24 /** 25 * El objeto gridInfo incluye a los componentes 26 * que manejan datos.gif")). 72 73 gridLateral. gridInferior).1. txtRfc). 39 private JButton btnCancelar = new JButton("Cancelar").1.add(0.0. 43 */ 44 private GridBagPanel gridInferior = new GridBagPanel().1. 69 70 gridInfo. 45 private JButton btnInsertar = new JButton("Insertar". 78 79 gridFondo. 75 76 gridInferior.CENTER).1. 30 private JTextField txtRfc = new JTextField(13).4. 77 gridInferior.1.1.0.1.gridInfo.add(0.1.1. true. 60 */ 61 private Estado estado. 68 agregaEventos(). txtNombre). 40 41 /** 42 * Controla los botones de mayor jerarquía.1.DO_NOTHING_ON_CLOSE).1. lblNombre).add(1.1. 87 } 88 70 .add(1.1.1. 81 gridFondo.add(1. 47 private JButton btnCerrar = new JButton("Cerrar". gridInfo).1.1. 80 gridFondo. lblRfc).add(1. 38 private JButton btnGuardar = new JButton("Guardar").add(1.1.0.1.1. btnGuardar). 85 setDefaultCloseOperation(JInternalFrame. 57 58 /** 59 * Es el estado de operación en el cual se encuentra la ventana. 36 */ 37 private GridBagPanel gridLateral = new GridBagPanel(). 64 65 public frmClientes() { 66 super("Catalogo de Clientes".1. true).gif")).0. 31 private JLabel lblNombre = new JLabel("Nombre"). 71 gridInfo.add(0. 82 gridFondo. 49 50 /** 51 * Agrupa a los demás páneles. btnInsertar).

137 gridLateral. Font. true)). 180)). 99 lblNombre.BLUE).WHITE). 138 139 // La separación entre los componentes del panel se pone de 4 140 // pixeles. 103 Font sansSerif = new Font("SansSerif". 109 110 btnCancelar. 18). 114 btnCancelar.ITALIC.setFont(centuryGothic).setBackground(Color.setFont(impact).setMnemonic(KeyEvent.setBackground(Color. Font. 117 btnCancelar. 92 Font centuryGothic = new Font("Century Gothic".setBorder(new LineBorder(Color. 100 txtNombre. 94 txtRfc. 108 btnGuardar. 145. 126 127 // El botón "btnInsertar" se puede activar con la combinación de 128 // teclas "ALT+I". 145 de verde y 180 de azul. 16). 153 base(). 16). 111 112 // Pone como color de letra un color con 200 de intensidad de 113 // rojo.setFont(sansSerif).setMnemonic(KeyEvent.LOWERED)). 71 . "KeyEvent.3.VK_I" representa a la tecla "I". 134 135 136 // Pone un borde donde el panel se muestra hundido. 115 116 // Usa un blanco predefinido para el fondo.BLACK.setMnemonic(KeyEvent.VK_I).setMnemonic(KeyEvent.setForeground(new Color(200. 149 150 gridInferior. y si el "look 147 // and feel" lo permite. "KeyEvent. 95 96 // "Selecciona el font "Impact" normal de 16 puntos para 97 // los componentes "lblNombre" y "txtNombre".setFont(centuryGothic).4)).PLAIN. 130 131 // El botón "btnCerrar" se puede activar con la combinación de 132 // teclas "ALT+R". 125 btnCancelar.setToolTipText("Cierra el Catalogo").3)). 142 gridLateral. El valor mayor es 255.PLAIN.VK_C). 118 119 // Define el texto a mostrar cuando el cursor del mouse se coloca 120 // sobre el botón. 151 152 // Pone el estado inicial. 105 106 // El botón "btnGuardar" se puede activar con la combinación de 107 // teclas "ALT+G". 89 void configuraComponentes() { 90 // "Selecciona el font "Century Gothic" normal de 16 puntos para 91 // los componentes "lblRfc" y "txtRfc".BOLD|Font.VK_R" representa a la tecla "R".setFont(impact). 133 btnCerrar.VK_R). los bordes no se ven.4.setInsets(new Insets(3.setBorder(new EtchedBorder(EtchedBorder. "KeyEvent. 129 btnInsertar.VK_G" representa a la tecla "G".4. 145 146 // Pone un borde dibujado con una línea en negro.VK_G). 143 144 gridLateral. Al hacer esto se puede ver el efecto del borde. "KeyEvent. las esquinas redondeadas. 2. 104 btnGuardar. 122 123 // El botón "btnCancelar" se puede activar con la combinación de 124 // teclas "ALT+C".setInsets(new Insets(4. 93 lblRfc.VK_C" representa a la tecla "C". 141 // Si no lo pones. 98 Font impact = new Font("Impact".3. 101 102 // "Selecciona el font "SansSerif" en negrillas e itálica.setFont(sansSerif). Font. 148 gridInferior. 121 btnCancelar.

164 txtNombre.setEnabled(false).requestFocus(). 191 btnCancelar. 182 txtRfc.addActionListener(new ActionListener() { 202 public void actionPerformed(ActionEvent evt) { 203 clickEnCerrar().setEnabled(false). 179 btnCancelar. 165 txtRfc.BASE.setEnabled(true). // Deshabilita el componente.addActionListener(new ActionListener() { 187 public void actionPerformed(ActionEvent evt) { 188 clickEnGuardar(). 180 btnInsertar. 166 txtNombre. 206 } 207 72 .setEnabled(true). // Posiciona el cursor del teclado.setEnabled(false). 201 btnCerrar. 176 txtRfc. 189 } 190 }). 178 btnGuardar.setText(""). 158 base(). 171 btnInsertar.setText(""). 168 btnCancelar.setEnabled(false). 194 } 195 }).addActionListener(new ActionListener() { 197 public void actionPerformed(ActionEvent evt) { 198 clickEnInsertar(). 199 } 200 }). 204 } 205 }).setEnabled(false).setEnabled(true).setEnabled(false).INSERTANDO. 167 btnGuardar. // Habilita el componente. 183 } 184 185 void agregaEventos() { 186 btnGuardar. 181 btnCerrar. 159 } 160 161 public void base() { 162 estado = Estado.154 } 155 156 public void init() { 157 // Estado inicial al abrir la ventana. 196 btnInsertar.setEnabled(true). 172 } 173 174 public void insertando() { 175 estado = Estado. 169 btnInsertar.addActionListener(new ActionListener() { 192 public void actionPerformed(ActionEvent evt) { 193 clickEnCancelar(). 163 txtRfc.requestFocus(). 177 txtNombre.setEnabled(true).setEnabled(true). 170 btnCerrar.

showMessageDialog(null.3. 239 } 240 } 241 242 public void muestraMensaje(String mensaje) { 243 JOptionPane. String nombre) throws Exception { 6 Connection conexion = ctrlLogin.inserta(rfc.executeUpdate(). 1 import java. 14 } 15 } 73 .INSERTANDO) { 226 base(). nombre). 214 base(). 212 try { 213 control. 211 String nombre = txtNombre. ?)").text. 217 } 218 } 219 } 220 221 public void clickEnCancelar() { 222 // Cada botón puede realizar una función diferente dependiendo 223 // del estado en que se encuentre.INSERTANDO) { 210 String rfc = txtRfc. 215 } catch (Exception e) { 216 muestraMensaje(e. Código de “c trlClientes.close(). 244 } 245 } 7.close().*. 11 ps.sql. 9 ps.conecta(). mensaje). Por ello utilizamos una 224 // condición. rfc).BASE) { 238 dispose().getMessage()).java”.getText(). 3 4 public class ctrlClientes { 5 public void inserta(String rfc. 233 } 234 } 235 236 public void clickEnCerrar() { 237 if (estado == Estado.6. 7 PreparedStatement ps = conexion. 10 ps. 13 conexion.getText().*. 12 ps. nombre). 2 import java.BASE) { 232 insertando(). 208 public void clickEnGuardar() { 209 if (estado == Estado.prepareStatement( 8 "INSERT INTO cliente VALUES(?.setString(2. 227 } 228 } 229 230 public void clickEnInsertar() { 231 if (estado == Estado. 225 if (estado == Estado.setString(1.

18 private JTextField txtRfc = new JTextField(13).event. 13 private GridBagPanel grid = new GridBagPanel().swing. 11 private static java. 38 break. 31 } 32 } 33 public void setValueAt(Object valor. 48 49 private ctrlFactura control = new ctrlFactura(). 15 private JTextField txtFolio = new JTextField(11). Código de “f rmFactura. 6 import java. 44 private JButton btnNuevo = new JButton("Nuevo"). int columna) { 34 super. 10 private static DateFormat formato = DateFormat. 4 import java. 22 private DefaultTableModel detalle = new DefaultTableModel() { 23 private static final long serialVersionUID = 1L.sql. 45 private JButton btnGuardar = new JButton("Guardar"). 27 case 1: return String. 21 private JTextField txtNombre = new JTextField(30).getDateInstance().class.util.*.3.java”.getTime()).util. 2 import java.class.Date(new java. 29 case 3: return Double. 5 import java.de Folio").sql. 17 private JLabel lblRfc = new JLabel("RFC"). 3 import javax. 50 74 .7.class. 35 switch (columna) { 36 case 0: 37 cambiarCodigo((Integer)valor. 47 private JButton btnCerrar = new JButton("Cerrar").table.*.Date().awt. 16 private JLabel lblFecha = new JLabel("Fecha"). columna). 30 default: return Object. 24 public Class getColumnClass(int columna) { 25 switch (columna) { 26 case 0: return Integer.*. int renglon.swing. 14 private JLabel lblFolio = new JLabel("No.*.Date hoy = 12 new java. 42 private JTable tblDetalle = new JTable().*. renglon).text. 19 private JButton btnBusca = new JButton("Busca RFC"). 28 case 2: return Double.awt.class.*. 46 private JButton btnImprimir = new JButton("Imprimir").setValueAt(valor. 43 private JScrollPane scroll = new JScrollPane(tblDetalle). 39 } 40 } 41 }.class.7. 20 private JLabel lblNombre = new JLabel("Nombre"). renglon. 1 import javax. 7 8 public class frmFactura extends JInternalFrame { 9 private static final long serialVersionUID = 1L.

addActionListener(new ActionListener() { 92 public void actionPerformed(ActionEvent evt) { 93 clickEnBusca(). //maximizable 55 true).1.removeRow(0).add(1. 87 } 88 } 89 90 void agregaEventos() { 91 btnBusca.1.1.setHorizontalAlignment(JTextField.add(13.setHorizontalAlignment(JTextField. 104 } 105 }). 67 setFrameIcon(new ImageIcon("icono.1. grid. 99 } 100 }). 64 grid. 78 scroll.1.1."Descripcion".0.setText("").setText("fecha : " + formato.add(13.//iconifiable 56 configuraComponentes().3. 100)).jpg")). txtFolio). btnNuevo). 109 } 110 }). lblNombre). grid. 106 btnImprimir.setColumnIdentifiers(encabezados).grid. scroll).add(0. 65 grid.1.add(13. 66 add(new JScrollPane(grid)). 62 grid.1. 96 btnNuevo.1.getRowCount() > 0) { 86 detalle. 76 detalle. txtNombre). 68 pack().addActionListener(new ActionListener() { 102 public void actionPerformed(ActionEvent evt) { 103 clickEnGuardar(). //closable 54 true."Cantidad".setPreferredSize(new Dimension(400.1.add(13. lblFecha).1. 84 txtNombre. 83 txtRfc.1.2.add(1.5.addActionListener(new ActionListener() { 97 public void actionPerformed(ActionEvent evt) { 98 clickEnNuevo(). 101 btnGuardar. 94 } 95 }).1.1.0.addActionListener(new ActionListener() { 107 public void actionPerformed(ActionEvent evt) { 108 clickEnImprimir(). 114 } 115 }).0.add(0.0.add(0.1.10. txtRfc).3. 111 btnCerrar."Precio"}.add(2. lblFolio). 69 } 70 71 void configuraComponentes() { 72 txtFolio. 60 grid. 74 lblFecha. 61 grid.setModel(detalle).3.1. 77 tblDetalle.2. 51 public frmFactura() { 52 super("Elaboracion de Factura". 79 } 80 81 public void init() { 82 txtFolio. true. 85 while (detalle.addActionListener(new ActionListener() { 112 public void actionPerformed(ActionEvent evt) { 113 clickEnCerrar(). btnImprimir).add(3.add(1.1. btnCerrar).format(hoy)). 75 Object[] encabezados = {"Codigo".4. //resizable 53 true.RIGHT).grid. btnBusca). 75 .RIGHT). 58 grid. 57 agregaEventos().setText(""). btnGuardar).1.grid.setText("").1.2.0.1. 59 grid. 63 grid.1.1.1.1.add(2.1. 73 lblFecha. lblRfc).

getText(). 140 } catch (Exception e) { 141 muestraMensaje("El folio debe ser numerico. 126 LinkedHashMap<String.getText(). 120 detalle. 121 } 122 123 public void clickEnBusca() { 124 try { 125 String rfc = txtRfc.addRow(nuevo). 161 datosOk = false. 176 } 177 76 .getMessage()). 170 } 171 } 172 } 173 174 public void clickEnCerrar() { 175 dispose(). 137 boolean datosOk = true.getMessage()). 165 if (datosOk) { 166 try { 167 control. 157 try { 158 folio = Integer. 150 } 151 } 152 } 153 154 public void clickEnImprimir() { 155 int folio = 0. rfc. rfc.116 } 117 118 public void clickEnNuevo() { 119 Object[] nuevo = {}. 142 datosOk = false. 131 e."). 148 } catch (Exception e) { 149 muestraMensaje(e. detalle).parseInt(txtFolio. 132 } 133 } 134 135 public void clickEnGuardar() { 136 int folio = 0.getMessage()).printStackTrace().guarda(folio. 159 } catch (Exception e) { 160 muestraMensaje("El folio debe ser numerico.getText()). 138 try { 139 folio = Integer. nombre.getText(). 143 } 144 String rfc = txtRfc. hoy. Object> respuesta = 127 control. 128 muestraCliente(respuesta). hoy.buscaCliente(rfc). 164 String nombre = txtNombre."). 129 } catch (Exception e) { 130 muestraMensaje(e. 156 boolean datosOk = true.getText()). 162 } 163 String rfc = txtRfc.imprime(folio. detalle). 145 if (datosOk) { 146 try { 147 control. 168 } catch (Exception e) { 169 muestraMensaje(e.getText().parseInt(txtFolio.

print.*. 196 } 197 198 void muestraProducto(LinkedHashMap<String.getMessage()). mensaje). 3).setText(respuesta. 180 } 181 182 public void cambiarCodigo(Integer codigo.Object>respuesta.java” 1 import java. 187 } catch (Exception e) { 188 muestraMensaje(e. renglon. 5 import javax.*. int renglon) { 183 try { 184 LinkedHashMap<String.get("descripcion").*.print. 2 import java.io. 205 } 206 } 7.sql.awt.toString()). 186 muestraProducto(respuesta.get("precio"). 189 } 190 191 } 192 193 public void muestraCliente(LinkedHashMap<String.buscaProducto(codigo.*. 201 } 202 203 public void muestraMensaje(String mensaje) { 204 JOptionPane.print.table. 3 import javax.int renglon) { 199 detalle. renglon).swing. 195 txtNombre.util.standard. Object> respuesta = 185 control.*.*. 8 import java. renglon.showMessageDialog(null.*.*.toString()). Código de “c trlFactura.intValue()).setText(respuesta. 6 import javax. 200 detalle.print.attribute. 178 public void clickEnCerrar() { 179 dispose().attribute.get("rfc").8. 7 import javax. 1).Object> respuesta) { 194 txtRfc.setValueAt(respuesta. 9 10 public class ctrlFactura { 77 .setValueAt(respuesta.get("nombre"). 4 import java.3.

'%' + rfc + '%').put("descripcion". 29 throw new Exception("Cliente no encontrado.close().close().close(). 35 } 36 37 public LinkedHashMap<String. 61 } 62 78 . new Double(precio)). 46 if (rs. 16 PreparedStatement busca = conexion. 60 return respuesta. 59 conexion. Object>(). 18 busca.next()) { //Solo queremos un elemento 47 String descripcion = rs.close(). id). 51 } else { 52 rs.put("precio". 15 Connection conexion = ctrlLogin. 20 if (rs.setString(1.getDouble("pr_precio").close(). rfc). 42 PreparedStatement busca = conexion. 48 double precio = rs.executeQuery().Object> buscaProducto(int id) 38 throws Exception { 39 LinkedHashMap<String.11 public LinkedHashMap<String. 41 Connection conexion = ctrlLogin.Object> buscaCliente(String rfc) 12 throws Exception { 13 LinkedHashMap<String."). 33 conexion.put("rfc".close(). 32 busca.conecta(). 22 String nombre = rs. nombre).close().prepareStatement( 43 "SELECT * FROM producto WHERE pr_id = ?").close(). 45 ResultSet rs = busca. 19 ResultSet rs = busca. 27 busca. 24 respuesta. 56 } 57 rs.prepareStatement( 17 "SELECT * FROM cliente WHERE cli_rfc LIKE ?"). 34 return respuesta.getString("pr_descripcion").").getString("cli_nombre").next()) { //Solo queremos un elemento 21 rfc = rs. 55 throw new Exception("Producto no encontrado.conecta(). 54 conexion. 30 } 31 rs.close().executeQuery(). descripcion). 44 busca.close(). 53 busca.close(). 23 respuesta. 28 conexion. Object>(). 49 respuesta. 50 respuesta. Object> respuesta = 40 new LinkedHashMap<String.close(). Object> respuesta = 14 new LinkedHashMap<String.getString("cli_rfc"). 58 busca. 25 } else { 26 rs.put("nombre".setInt(1.

renglon < detalle. 93 } 94 95 } 96 79 . 86 ps. 71 ps.Date hoy.setString(3. 92 conexion.getValueAt(renglon. folio).close(). renglon++) { 81 Integer codigo = (Integer)detalle.setDouble(4. hoy). 88 ps. rfc). 68 ps = conexion. 64 DefaultTableModel detalle) throws Exception { 65 Connection conexion = ctrlLogin. 0).getValueAt(renglon.getValueAt(renglon. 83 Double precio = (Double)detalle.63 public void guarda(int folio.executeUpdate().commit().setAutoCommit(false). 85 ps.setInt(1. java.setInt(2. 67 PreparedStatement ps.cli_rfc)" + 70 "VALUES(?.close(). ?)"). codigo.?.sql. ?.conecta(). 66 conexion.executeUpdate().getRowCount(). 75 ps. 82 Double cantidad = (Double)detalle. 91 conexion.fac_folio. String rfc. 72 ps.?)").setDate(2. 74 ps. 80 for (int renglon = 0.det_precio)" 79 + "VALUES(?.setDouble(3. cantidad). precio).fac_fecha.prepareStatement( 69 "INSERT INTO factura(fac_folio.det_cantidad.setInt(1.prepareStatement( 77 "INSERT INTO detalle " 78 + "(pr_id. 3).intValue()). 76 ps = conexion. folio). 73 ps. 2).close(). 87 ps. 84 ps. 89 } 90 ps. ?.

97 public void imprime(int folio, java.sql.Date hoy, String rfc,
98 String nombre, DefaultTableModel detalle)
99 throws Exception {
100 // Abre el archivo "salida.txt" para impresión.
101 PrintWriter salida = new PrintWriter(
102 new BufferedWriter(
103 new FileWriter("salida.txt")));
104
105 // Esto funciona como el printf del lenguaje C.
106 // "%d" representa a "folio". La "d" significa entero.
107 // "%2$te" es el día del segundo parámetro("hoy").
108 // "%2$tm" es el mes del segundo parámetro("hoy").
109 // "%2$tY" es el año en cuatro dígitos de "hoy".
110 imprime(salida, "folio: %d fecha: %2$te/%2$tm/%2$tY",
111 folio, hoy);
112
113 imprime(salida, "");
114 imprime(salida, "");
115
116 // "%s" significa que se evalua la operacion toString() del
117 // objeto.
118 imprime(salida, "RFC: %s", rfc);
119
120 imprime(salida, "Nombre: %s", nombre);
121 imprime(salida, "");
122 double total = 0;
123 for (int renglon = 0; renglon < detalle.getRowCount(); renglon++) {
124 String descripcion = (String)detalle.getValueAt(renglon, 1);
125 Double cantidad = (Double)detalle.getValueAt(renglon, 2);
126 Double precio = (Double)detalle.getValueAt(renglon, 3);
127 // "%10.2f" despliega un flotante con 10 cifras y 2 decimales y
128 // justificación a la derecha.
129 // "%30s" despliega un texto en 30 espacios y justificación a
130 // la derecha.
131 // "%.2f" despliega un flotante con 2 decimales.
132 imprime(salida, "%10.2f|%30s|$%.2f", cantidad, descripcion,
133 precio);
134
135 total += cantidad * precio;
136 }
137 imprime(salida, "Total: %.2f", total);
138 salida.close();
139
140 // Realiza la impresión del archivo "salida.txt".
141 PrintRequestAttributeSet aset =
142 new HashPrintRequestAttributeSet();
143 PrinterJob pj = PrinterJob.getPrinterJob();
144 if(pj.printDialog(aset)) {
145 FileInputStream textStream = new FileInputStream("salida.txt");
146 DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
147 Doc myDoc = new SimpleDoc(textStream, flavor, null);
148 DocPrintJob job = pj.getPrintService().createPrintJob();
149 job.print(myDoc, aset);
150 }
151 }
152
153 public void imprime(PrintWriter salida, String texto, Object ... datos) {
154 salida.println(String.format(texto, datos));
155 }
156 }

80

7.3.9. Código de “f rmLogin.java”.
1 /**
2 * Una clase para controlar el acceso a bases de datos
3 */
4 import javax.swing.*;
5 import java.awt.*;
6 import java.awt.event.*;
7 import java.util.*;
8
9 /**
10 * Clase de acceso a la aplicación. JDialog representa cuadros de diálogo.
11 */
12 public class frmLogin extends JDialog {
13 private static final long serialVersionUID = 1L;
14
15 /**
16 * Esta tabla de búsqueda se usar? para almacenar parejas del tipo
17 * <<nombre - URL>>. El nombre de un URL puede ser difícil de
18 * recordar. Mejor lo asociamos con un nombre corto, más representativo
19 * y por lo mismo más fácil de recordar.
20 */
21 private static LinkedHashMap<String, String> basesDeDatos =
22 new LinkedHashMap<String, String>();
23
24 private GridBagPanel panel = new GridBagPanel();
25 private JLabel lblUsuario = new JLabel("Usuario: ");
26 private JTextField txtUsuario = new JTextField(10);
27 private JLabel lblPassword = new JLabel("Password: ");
28 private JPasswordField txtPassword = new JPasswordField(10);
29 private JLabel lblBaseDeDatos =
30 new JLabel("Base de datos: ");
31 private JComboBox cmbBaseDeDatos = new JComboBox();
32 private JButton btnConectar = new JButton("Conectar");
33 private JButton btnCancelar = new JButton("Cancelar");
34
35 private ctrlLogin control = new ctrlLogin();
36
37 public frmLogin() {
38 // Aquí se invoca el constructor de la clase padre. En este caso
39 // JDialog. El parámetro null indica el frame a bloquear. El
40 // segundo es el texto de la barra de título y finalmente se
41 // usa "true" para indicar que es "modal" y "false" para indicar
42 // que es "no modal".
43 super((JFrame)null, "Login", true);
44 configuraComponentes();
45 agregaEventos();
46 panel.add(0,0,1,1, lblUsuario);
47 panel.add(0,1,1,1, txtUsuario);
48 panel.add(1,0,1,1, lblPassword);
49 panel.add(1,1,1,1, txtPassword);
50 panel.add(2,0,1,1, lblBaseDeDatos);
51 panel.add(2,1,1,1, cmbBaseDeDatos);
52 panel.add(3,0,1,1, btnConectar);
53 panel.add(3,1,1,1, btnCancelar);
54
55 // No hace nada al oprimir el botón para cerrar en la barra de
56 // título
57 setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
58
59 add(new JScrollPane(panel));
60 pack();
61 }
62

81

63 public static void registra(String nombre, String url) {
64 basesDeDatos.put(nombre, url);
65 }
66
67 void configuraComponentes() {
68 cmbBaseDeDatos.removeAllItems();
69 for (String s: basesDeDatos.keySet()) {
70 cmbBaseDeDatos.addItem(s);
71 }
72 }
73
74 void agregaEventos() {
75 btnCancelar.addActionListener(new ActionListener() {
76 public void actionPerformed(ActionEvent evt) {
77 clickEnCancelar();
78 }
79 });
80 btnConectar.addActionListener(new ActionListener() {
81 public void actionPerformed(ActionEvent evt) {
82 clickEnConectar();
83 }
84 });
85 }
86
87 public void clickEnCancelar() {
88 System.exit(0);
89 }
90
91 public void clickEnConectar() {
92 String bd = cmbBaseDeDatos.getSelectedItem().toString();
93 String url = basesDeDatos.get(bd);
94 String usuario = txtUsuario.getText();
95 String password = new String(txtPassword.getPassword());
96 try {
97 String rol = control.obtenRol(url, usuario, password);
98 dispose(); // Cierra el cuadro de di?logo.
99 frmMenu menu = new frmMenu(rol);
100 } catch (Exception e) {
101 muestraMensaje(e.getMessage());
102 }
103 }
104
105 public void muestraMensaje(String mensaje) {
106 JOptionPane.showMessageDialog(null, mensaje);
107 }
108

82

117 118 // El frame no lleva barra de t?tulo ni m?rgenes. 150 Class. 159 frmLogin. 111 * @param nombre Nombre de la imagen a presentar. 167 } catch (Exception e) { 168 e.setLookAndFeel( 144 // UIManager.getDefaultToolkit(). 113 */ 114 public static void showSplash(String nombre. 152 153 // Registra los diferentes URL a los que puede comunicarse tu 154 // aplicación. 121 d.Driver").height / 2)). 127 d. 161 frmLogin. 142 // try { 143 // UIManager. 112 * @param tiempo Tiempo en milisegundos que se mostrar? la imagen. VALE LA PENA QUE HAGAS LA PRUEBA.setVisible(true). 148 try { 149 // Esta aplicaci?n funciona con MySQL o con Oracle. Esto evita que tengas que modificarla y 155 // recompilarla para cambiar la base de datos.add(new JLabel(new ImageIcon(nombre))). 129 d.getScreenSize(). "jdbc:mysql://localhost/test"). 119 d. El primer 156 // par?metro es un nombre corto que se despliega en el cuadro 157 // de login en vez del URL para que no tengas que aprendértelo.getSize().sleep(tiempo). 164 165 // Los cuadros de di?logo se abren con setVisible(true): 166 login.DO_NOTHING_ON_CLOSE). 162 "jdbc:mysql://192.pack(). 151 Class. 130 try { 131 // Suspende la ejecuci?n de la aplicaci?n durante el tiempo 132 // indicado.251/test"). 134 } catch(InterruptedException e) {} 135 d. 122 123 // Obtiene la resoluci?n del monitor.251/test").(t.(t. 145 // } catch (Exception e) {} 146 147 showSplash("portada.registra("MySQL Remoto".jpg".registra("Oracle".setUndecorated(true). 160 "jdbc:mysql://192.OracleDriver").forName("oracle.jdbc.jdbc.setLocation((max.forName("com.registra("MySQL".getSystemLookAndFeelClassName()).dispose(). 128 (max.printStackTrace(). 116 d.109 /** 110 * Muestra una imagen de presentación durante el tiempo especificado. 120 d.width / 2) .168. 136 } 137 138 public static void main(String[] args) { 139 // Si quitas los comentarios a las lineas 102 . 125 126 Dimension t = d.width / 2). 124 Dimension max = Toolkit.height / 2) .168.setVisible(true). 5000). 158 frmLogin. 163 frmLogin login = new frmLogin().7.7. 169 } 170 } 171 } 83 .setDefaultCloseOperation(JFrame.105 la apariencia 140 // de la aplicación cambiar? y se ver? como si fuera nativa de tu 141 // sistema operativo. int tiempo) { 115 JFrame d = new JFrame().mysql. 133 Thread.

String rol) throws Exception { 43 if (rol == null) { 44 conexion. 12 Connection conexion = conecta(). pUsuario.close(). 45 throw new Exception("Usuario Incorrecto. 25 return rol.sql. 26 } 27 28 public void guarda(String pUrl. 32 } 33 34 public static Connection conecta() throws SQLException { 35 Connection conexion = 36 DriverManager.*.3. 18 String rol = null. String pUsuario. Código de “c trlLogin.getConnection(url. String pPassword) { 29 url = pUrl.next()) { 20 rol = rs.close(). 24 conexion.7. 40 } 41 42 void validaRol(Connection conexion.10.TRANSACTION_SERIALIZABLE). 1 import java. 16 ps.executeQuery(). String pUsuario. 19 if (rs. 37 conexion. pPassword). String pPassword) 10 throws Exception { 11 guarda(pUrl. 3 4 public class ctrlLogin { 5 private static String url. 46 } 47 } 48 } 84 . 39 return conexion. 31 password = pPassword.close(). 17 ResultSet rs = ps. 13 14 PreparedStatement ps = conexion. usuario.setTransactionIsolation( 38 Connection. 6 private static String usuario. 2 import java.").prepareStatement( 15 "SELECT usu_rol FROM usuario WHERE usu_nombre = ?").getString("usu_rol"). password). rol).setString(1. 23 validaRol(conexion. 8 9 public String obtenRol(String pUrl.*.java”. 7 private static String password. 21 } 22 rs.util. 30 usuario = pUsuario. usuario).

addActionListener(new ActionListener() { 50 public void actionPerformed(ActionEvent event) { 51 clickEnSalir().jpg".VK_A).createHorizontalGlue()).java”.equals("SUPERVISOR")) { 24 menuDeSupervisor().add(factura).exit(0).VK_S). 58 } 59 85 . 1 import javax.createHorizontalGlue()).*.awt. 47 JMenuItem salir = addItem(archivo. 12 private frmProductos reporte = new frmProductos(). 11 private frmClientes clientes = new frmClientes(). 48 KeyEvent. "icono. 36 } 37 38 public void menuDeSupervisor() { 39 menuArchivo().add(reporte). 16 desktop. 18 desktop. 7 private JMenuBar menuBar = new JMenuBar().jpg". 17 desktop. 2 import java. KeyEvent. 54 } 55 56 public void clickEnSalir() { 57 System. 23 } else if (rol.swing. 9 10 private frmFactura factura = new frmFactura(). "Salir".event.equals("VENDEDOR")) { 22 menuDeVendedor(). 25 } 26 setVisible(true).7. Código de “f rmMenu. 15 configuraFrame(). 8 private JDesktopPane desktop = new JDesktopPane(). 32 33 menuBar.add(Box. 27 } 28 29 public void menuDeVendedor() { 30 menuArchivo().add(Box. 13 public frmMenu(String rol) { 14 super("Facturaci?n").*. 31 menuFacturacion().VK_S. 49 salir. 4 5 public class frmMenu extends JFrame { 6 private static final long serialVersionUID = 1L.add(clientes). 42 menuAyuda(). 41 menuBar. 3 import java.3. 21 if (rol. KeyEvent.awt. 19 20 // Dependiendo del Rol cambia la barra de men?. "icono.11.*. 43 } 44 45 public void menuArchivo() { 46 JMenu archivo = addMenu("Archivo". 52 } 53 }). 34 35 menuAyuda(). 40 menuSupervisor().

100 facturar. KeyEvent. 67 "Reporte de Productos. 123 } 124 86 ."icono. 121 } 122 }). 103 } 104 }).."Acerca De. 87 } 88 89 public void clickEnReporteDeProductos() { 90 if (reporte. 68 "icono. "icono.. KeyEvent.addActionListener(new ActionListener() { 119 public void actionPerformed(ActionEvent evt) { 120 clickEnAcercaDe(). 118 acercaDe.VK_C). 64 "icono. 63 "Catalogo de Clientes.VK_A. 105 } 106 107 public void clickEnFacturar() { 108 if (factura.jpg". 117 KeyEvent.KeyEvent..".init().VK_C. KeyEvent.. KeyEvent.".jpg".VK_R).addActionListener(new ActionListener() { 76 public void actionPerformed(ActionEvent event) { 77 clickEnReporteDeProductos().. 94 } 95 96 public void menuFacturacion() { 97 JMenu facturacion = addMenu("Facturacion". 116 JMenuItem acercaDe = addItem(ayuda. 75 reporteDeProductos.KeyEvent. 60 public void menuSupervisor() { 61 JMenu supervisor = addMenu("Supervisor".VK_Y). 98 JMenuItem facturar = addItem(facturacion.. KeyEvent.VK_S).addActionListener(new ActionListener() { 101 public void actionPerformed(ActionEvent event) { 102 clickEnFacturar(). 69 KeyEvent."icono.addActionListener(new ActionListener() { 71 public void actionPerformed(ActionEvent event) { 72 clickEnCatalogoDeClientes()..jpg". "Facturar.. 65 KeyEvent.jpg". "icono. 110 } 111 showFrame(factura). 62 JMenuItem catalogoDeClientes = addItem(supervisor.VK_A). 92 } 93 showFrame(reporte). 73 } 74 }). 66 JMenuItem reporteDeProductos = addItem(supervisor.jpg". KeyEvent.isClosed()) { 109 factura.VK_F). 80 } 81 82 public void clickEnCatalogoDeClientes() { 83 if (clientes.init(). 70 catalogoDeClientes.VK_F.VK_R.isClosed()) { 84 clientes.".isClosed()) { 91 reporte. 112 } 113 114 public void menuAyuda() { 115 JMenu ayuda = addMenu("Ayuda".init(). 85 } 86 showFrame(clientes).jpg".jpg". 78 } 79 }).".VK_F). 99 "icono.

int nemonico) { 151 JMenu submenu = new JMenu(texto).OUTLINE_DRAG_MODE).setSelected(true). 150 String icono.showMessageDialog(null.setPreferredSize(new Dimension(600. 154 submenu.setIcon(new ImageIcon(icono)).beans. 155 return submenu.add(menu). 146 return item.setLocation(0.getDefaultToolkit().setMnemonic(nemonico).setDragMode(JDesktopPane. 177 desktop.setMnemonic(nemonico).show(). int nemonico. 133 menu. 300)). 176 desktop. 162 desktop.WHITE).isVisible()) { 165 frame.setIcon(new ImageIcon(icono)).PropertyVetoException e) {} 170 } 171 172 public void configuraFrame() { 173 setContentPane(desktop). 0).setAccelerator(KeyStroke. 153 submenu. String icono. 134 menuBar. 152 menu.add(item).add(frame).jpg").add(submenu). 182 } 183 184 void setIcono(String nombre) { 185 Image icono = Toolkit. 147 } 148 149 public static JMenu addSubMenu(JMenu menu. 181 agregaImagenDeFondo("portada.getImage("icono. 142 menu. 140 int acelerador) { 141 JMenuItem item = new JMenuItem(texto.jpg"). 143 item. 132 menu.125 public void clickEnAcercaDe() { 126 JOptionPane.show(). String texto. 163 frame. ActionEvent. 186 setIconImage(icono). 174 desktop. 136 } 137 138 public static JMenuItem addItem(JMenu menu. 175 setJMenuBar(menuBar). 179 setDefaultCloseOperation(JFrame.setMnemonic(nemonico). new ImageIcon(icono)).isClosed()) { 161 frame.getKeyStroke( 145 acelerador. 135 return menu. 139 String icono. 168 } 169 } catch (java.EXIT_ON_CLOSE).setBackground(Color.jpg"). 144 item. 127 "<html>Ejemplo de Menu<br>por: <i>Yo</i></html>"). int nemonico) { 131 JMenu menu = new JMenu(nombre). 164 } else if (frame. 128 } 129 130 public JMenu addMenu(String nombre. 180 pack(). 156 } 157 158 public void showFrame(JInternalFrame frame) { 159 try { 160 if (frame. String texto. 166 } else { 167 frame.CTRL_MASK)). 187 } 188 87 . 178 setIcono("icono.

192 // setExtendedState(JFrame.class donde “proyecto. 1 Main-Class: frmLogin 2 Class-Path: (3)mysql-connector-java-3.getSize().width / 2) .getIconWidth().jar”.MAXIMIZED_BOTH).ja r”  es el nombre que le pondrás a tu ejecutable. Generación del Ejecutable. iheight).4.jar o bien dar doble click al archivo desde el ambiente gráfico. 196 int iwidth = imagen.getIconHeight(). 199 iwidth.jar (4)ojdbc14.jar manifest. new Integer(-1)). 88 . solo necesitas cambiarte al directorio de tu proyecto y ejecutar la instrucción jar cvfm proyecto. 189 void agregaImagenDeFondo(String nombre) { 190 ImageIcon imagen = new ImageIcon(nombre).getScreenSize().getDefaultToolkit().  Para ejecutar el programa debes ejecutar la siguiente instrucción desde la línea de comando java -jar proyecto. Tu ambiente de desarrollo puede incorporar algunas facilidades para generar el archivo ejecutable.11-stable-bin.(iheight / 2). 193 // Dimension max = Toolkit. Código de “m anifest. Si tienes el directorio de ejecutables de Java en tu ruta de ejecutables.1. 200 desktop.jar 3 Este código se utiliza para crear el ejecutable de java. 201 } 202 } 7. 7. 195 int iheight = imagen. 194 Dimension max = desktop. 197 label. manteniendo la extensión “. 198 (max.txt”.setBounds((max.txt *.(iwidth / 2).add(label.4. 191 JLabel label = new JLabel(imagen).0.height / 2) .