Manual de Java FP
Manual de Java FP
Este curso de Java trata de ser una guía paso a paso, desde cero, para crear una aplicación de
escritorio que se conecte al servidor de MySQL; está dirigido a quienes dominan los fundamentos de
programación en algún otro lenguaje, que además tienen los rudimentos de las consultas a las bases
de datos relacionales. A lo largo del curso se usan diversas librerías de la Java Estándar Edition tales
como java.lang, java.awt, javax.swing y java.sql de las que se estudian, ejemplifican y aplican las
clases esenciales.
La estructura del texto sigue el modelo de enseñanza de los tres primeros módulos de Java
impartidos por el Ing. Jorge Sánchez Barrueta, profesor de 3CT.
Julio César López Dávila pertenece a la plantilla de profesores de Java SE y EE en 3CT; además,
imparte allí mismo los cursos de Fundamentos de programación y XHTML, de los servidores de bases
de datos MySQL y SQL Server, así como de los lenguajes de programación PHP y NET.
¿QUÉ ES JAVA Y POR QUE LA NECESITO?
Java es un lenguaje de programación y una plataforma informática lanzado por primera vez por Sun
Microsystems en 1995. Ha evolucionado desde sus humildes comienzos hasta impulsar una gran
parte del mundo digital actual, proporcionando la plataforma confiable sobre la que se construyen
muchos servicios y aplicaciones. Los productos nuevos e innovadores y los servicios digitales
diseñados para el futuro también continúan confiando en Java.
Si bien la mayoría de las aplicaciones Java modernas combinan el tiempo de ejecución de Java y la
aplicación, todavía hay muchas aplicaciones e incluso algunos sitios web que no funcionarán a
menos que tenga instalado un Java de escritorio. Java.com, este sitio web, está destinado a los
consumidores que aún pueden necesitar Java para sus aplicaciones de escritorio, específicamente
aplicaciones destinadas a Java 8. Los desarrolladores y los usuarios que deseen aprender a
programar en Java deben visitar el sitio web dev.java y los usuarios comerciales. debe visitar
oracle.com/java para obtener más información.
Ahora bien, es del conocimiento general que la curva de aprendizaje de Java es ardua. Esto se debe
principalmente a que los desarrolladores no trabajan con el lenguaje en sí sino con la plataforma. En
el momento que iniciamos una aplicación debemos usar algunos objetos preexistentes que son
parte de la edición estándar y que realizan las labores comunes; además, es necesario elegir de
entre varios cientos de otros objetos aquéllos que son útiles para alcanzar las metas del sistema. Así
que en la edición estándar hay un amplio número de librerías que contienen una multitud de objetos
que se deben conocer suficientemente para comenzar a programar.
Así que hay que aprender mucho antes de lograr una aplicación robusta; la tarea puede ser agotara y
confusa, y los resultados, muy pobres. Ante esto, la metodología de este curso será explicar los
elementos y la sintaxis básica con un grado suficiente de profundidad; y, después, crear una
aplicación de muestra, un “paso a paso” con lo mínimo necesario para hacer un programa Java
funcional. Entonces, los objetivos serán dos: 1) Explicar lo esencial del lenguaje, y 2) Hacer una
aplicación de ejemplo que sea una interfaz gráfica que haga consultas a una base de datos de MySQL
y muestre los resultados en tablas.
C:\Programa Files\Java\jre1.8.0_341\bin\javaw.exe
Para que los programas puedan ejecutarse hay que asegurarse que el JRE (java run enviroment) esté
instalado (que es lo más probable); si no, se descarga de www.java.com que es un sitio dedicado
exclusivamente a la disponibilidad de la máquina virtual de Java.
Para programar es necesario el kit de desarrollo (JDK) que sirve para crear y probar las aplicaciones y
que ya incluye el JRE. En el momento de la escritura de este curso la URL de descarga es:
http://java.sun.com/javase/downloads/index.jsp
En la que, de la misma manera, versión es un número como 12, 14, 15, etc.
Hay otras descargas que tienen JFX, JEE o NetBeans pero son más grandes y los
complementos que ofrecen no son necesarios para los objetivos de este curso, aunque
Una vez instalado el JDK estará en un subdirectorio semejante a este al que se le conoce
como [JAVA-HOME]:
C:\Program Files\Java\jdk[versión]
con cualquier editor de texto plano, aquí lo haremos con la versión LE de JCreator cuya
http://www.jcreator.com/download.htm
Para probar que todo está como se espera debemos ejecutar JCreator y crear un archivo
nuevo vacío:
Oprimimos <Next> y en el Name escribimos HolaMundo, así, todo junto y respetando
oprimimos <Finish>:
compilamos con los botones que indica la figura siguiente y debe aparecer el mensaje
interpretar.
Definición breve de la Programación Orientada a Objetos (POO)
Antes de establecer los elementos del lenguaje, es necesario tener presentes los
menudo hacían cosas raras. Un caso es el del Centro de Cómputo Noruego en Oslo en el
que desarrollaban simuladores de vuelo; sucedía, cuando los ejecutaban, que las naves
Se concluyó que esto se debía al modo como programaban y que los lenguajes de
entonces eran incapaces de resolver el problema. Ante esto, los expertos del Centro
Así que la POO es una manera de diseñar y desarrollar software que trata de imitar la
simples:
abstraen en clases. Por ejemplo: de la clase perro pueden existir dos objetos Fido y
edad; mientras que Firuláis es un labrador, negro, de 3 años (este es su estado). Ambos
anterior haríamos la clase Perro que tendría las variables raza, color y edad, y los
métodos ladrar(), merodear(), juguetear(), comer() y dormir(). Firuláis y Fido son los
identificadores que podríamos usar en una aplicación que pretenda mostrar dos
muy ligados y tienen que ver con el diseño de programas. Ambos se refieren a que los
objetos deben hacer tareas que les son propias y no de otros. Por lo común, los objetos
de la realidad no dan problemas porque ya existen. No fue difícil abstraer la clase Perro
del software analicemos el caso del programa Hola Mundo. Hagamos el proceso de
El primer Hola Mundo lo popularizó Brian Kernighan en los años 70 del siglo XX, en
un libro que causó mucho interés en su tiempo y que escribió junto a Dennis Ritchie:
The C Programming Language. Hoy en día, es una tradición presentar los lenguajes con
un programa de este tipo, que lo que debe hacer es mostrar la frase “Hola mundo” en la
pantalla, y sirve para probar que el lenguaje está debidamente instalado y funcionando.
Entonces, abstrayendo esto, podemos decir que el comportamiento de los objetos del
Lo que sigue es mostrar cómo los elementos de lenguaje Java nos permiten apegarnos a
la orientación a objetos; para eso es necesario conocer dichos elementos, pero antes,
3. El comportamiento, que indica los métodos que se deben programar para que
El siguiente programa presenta la primera versión del Hola Mundo orientado a objetos:
HolaMundoOO.java
saludo=”Hola mundo”;
• Identificadores
• Sentencias
• Bloques de código
• Comentarios
• Expresiones
• Operadores
• Metacaracteres
• Palabras reservadas
HolaMundo.java.
Identificadores
Son los nombres que pueden tener las clases, los métodos y las variables y no pueden
Si el identificador está formado por más de un vocablo, a partir del segundo las iniciales
deben ser mayúsculas. Además, se recomienda que los nombres de las clases sean
sustantivos, los de los métodos verbos y que las variables expresen con claridad su
contenido.
Sentencias
Son las órdenes que se deben ejecutar en el programa y terminan siempre con un punto
y coma:
Por ejemplo:
String saludo;
Bloques de código
y de otros bloques de código delimitados por una llave de apertura y una de cierre
{}
Por ejemplo:
{
saludo=”Hola mundo”;
System.out.println(saludo);//La clase System la importamos de java.lang
}
Comentarios
Son líneas de texto insertas en el programa para documentarlo y facilitar su lectura. Los
Las expresiones son entidades formadas por dos o más miembros separados entre sí por
Por ejemplo;
saludo=“Hola Mundo”;
Operadores
Los operadores son signos especiales para hacer acciones específicas y son el
mecanismo con el cual los objetos interactúan relacionando los datos y devolviendo
Aritméticos
De comparación y lógicos
De asignación
Metacaracteres
Existen otro tipo de caracteres particulares que sirven para el control y la significación
([{\^-$|]})?*+
Palabras reservadas
Hay un grupo de palabras en Java con las cuales, entre otras cosas, se realizan las tareas
principales, se delimitan los alcances de los objetos, sus datos y sus métodos, etc. Se
• Tipos de datos
• Sentencias condicionales
• Sentencias iterativas
• Estructura de datos
(Obsérvese que la línea saludo= “Hola mundo”; es, además, una expresión porque
La imagen anterior muestra que, a pesar de la sencillez del programa, son muchos los
Para comprender mejor la sintaxis del programa debemos pensar en términos de ámbito
o alcance. Primero hay que saber que los comentarios están fuera del programa, no
El ámbito más externo es donde importamos los recursos que se requerirán para el
librería java que el compilador importa por omisión, aunque aquí (ya lo decíamos en un
didácticas.
Así que al comenzar a desarrollar un programa debemos primero determinar las clases
externas necesarias para ayudar a la clase que crearemos nosotros, y después crear ésta.
Para la primera labor usamos la palabra reservada import y todas las clases invocadas
así podrán ser utilizadas en cualquier lugar del bloque de código de la clase; para la
segunda, empleamos las palabras reservadas public class seguidas del nombre que
después van dos llaves que contendrán el bloque de código, como muestra la figura
siguiente.
El rectángulo representa el ámbito o alcance. Los objetos del paquete lang están
Dentro del bloque de la clase está el lugar donde deben crearse las propiedades o
atributos y declararse los métodos. Las propiedades deben escribirse primero, fuera de
cualquier método y su alcance será toda la clase, que es lo que significa el rectángulo
Java, toda variable se crea estableciendo su tipo seguido de un nombre, que deberá ser
único en el ámbito donde se le declara; se inicializan siempre con una expresión. Crear
Cuando las variables son atributos deben crearse únicamente y debe hacerse fuera de los
métodos; por otro lado, serán inicializadas dentro de alguno de ellos en el que
convenga. Es posible hacer ambas labores en una sola línea pero será sólo aquéllas que
Los métodos, por su parte, se declaran estableciendo primero el nivel de acceso. En este
caso mostrarSaludo() tiene acceso público (para eso usamos la palabra reservada
public), que significa que cualquier objeto externo puede invocar la tarea encapsulada
en el método. Hay otras posibilidades, por ejemplo prívate, que es también una palabra
reservada, y que significa que el método sólo puede ser usado al interior de la clase en
la que es declarado. Después del nivel de acceso, está el tipo de datos que el método
devuelve; mostrarSaludo() no regresa ningún valor; para indicar esto se usa otra palabra
reservada: void, que, como veremos después, podrá ser sustituida por cualquier tipo de
datos. Todos los métodos deben tener su propio bloque de código, en el que, como ya
clase System (que importamos del paquete lang al principio) cuyo atributo out es un
objeto que tiene el método println(cadena) cuya tarea es imprimir una línea con el texto
siguiente figura.
En cuanto a la sintaxis, falta decir que otra de las responsabilidades de cualquier clase
es autoconstruirse por lo que tendrá un método que se llamará igual que la clase misma,
deberá ser público, no tiene modificador del tipo que devuelve y lo llamamos el
constructor, con lo anterior la clase queda como sigue (obsérvese que en este método
se inicializa el atributo):
import java.lang.*;
las clases que hacen labores afines. Esto se logra con la palabra reservada package
seguida del nombre que identificará al paquete; éstos se escriben sólo con minúsculas.
holamundo, que importa de java.lang las clases String y System, que tiene el atributo
método que muestra saludo usando la clase System queda así (Atiéndanse los
comentarios):
import java.lang.System;
public class HolaMundoOO{
String saludo;
}
public void mostrarSaludo(){
System.out.println(saludo);
}
Si aplicamos al programa anterior los mismos pasos del apartado de instalación para
probar JCreator, excepto el de ejecución; es decir, crear un nuevo documento vacío con
Dentro del paquete queda el archivo .class, que es el que la máquina virtual puede
interpretar:
Ejecución y flujo de datos
Ejecución
Falta decir que en toda aplicación Java debe haber una clase que tenga un método main
que es el primero que se ejecuta. La clase que hemos creado no lo tiene porque no es su
Para eso haremos otra clase llamada EjecutorHolaMundoOO cuya responsabilidad será
Esto nos servirá como práctica de sintaxis y para analizar el flujo de datos en Java.
package util;
import holamundo.HolaMundoOO;
public class EjecutorHolaMundoOO {
2. Creamos una propiedad del tipo o clase HolaMundoOO con el identificador hola:
package util;
import holamundo.HolaMundoOO;
public class EjecutorHolaMundoOO {
HolaMundoOO hola;
}
3. Añadimos los métodos:
que es el metacaracter que nos permite invocar los atributos y los métodos de los
objetos:
package util;
import holamundo.HolaMundoOO;
public class EjecutorHolaMundoOO {
HolaMundoOO hola;
public EjecutorHolaMundoOO(){
hola=new HolaMundoOO();
hola.mostrarSaludo();
los paréntesis del método debe inquietarnos. Por el momento, basta con saber
package util;
import holamundo.HolaMundoOO;
public class EjecutorHolaMundoOO {
HolaMundoOO hola;
public EjecutorHolaMundoOO(){
hola=new HolaMundoOO();
hola.mostrarSaludo();
}
}
En JCreator, en un archivo vacío llamado igual que la clase (EjecutorHolaMundoOO) y
siguiente resultado:
La estructura de directorios debe presentar los archivos .java y los dos subdirectorios de
los paquetes dentro de los cuales debe estar cada uno de los archivos .class:
Flujo de datos
clase.
Generalidades
En Java, las variables podrán ser de dos tipos: objetos y tipos primitivos. Hay
diferencias entre unos y otros. En realidad las primeras clases que conforman la
plataforma están hechas sólo de tipos primitivos. Estos se obtienen con las palabras
reservadas: byte, short, int, long, float, double, char y bolean. En este curso usaremos
solamente int para enteros, double para números con punto decimal, y bolean para los
valores lógicos. Por su parte, los objetos siempre son tomados de una clase que lo
mismo puede estar en alguna librería del JDK o en algún archivo creado por nosotros.
Siempre que se necesite una variable debe ser declarada especificando su tipo seguido
int valor=12
La diferencia central entre los tipos primitivos y los objetos es que éstos disponen de los
atributos y los métodos que les confieren las clases a las que pertenecen; como también
cadena.length()
propias clases base con las que programaremos están en la API, que está publicada en:
http://java.sun.com/javase/api/
Las JFC en sí están en el JDK y por eso lo descargamos e instalamos. Hemos usado dos
de ellas: String y System; sólo hemos invocado la propiedad out de ésta; no obstante,
cada una tiene muchos métodos y muchas propiedades que están descritas en la API; de
programador de Java, es una exigencia obligatoria. Se puede decir que del mayor
Ya dijimos que los métodos pueden devolver cualquier tipo de datos; falta agregar que
también pueden recibir parámetros. Esto hace que existan cuatro tipos de métodos:
void tarea() No No
Tipo tarea() Sí No
DemoMetodoSiTipoNoParametros.java
public DemoMetodoSiTipoNoParametros() {
*método
*/
saludo=devuelveHolaMundo();
muestraSaludo();
*/
return hola;
new DemoMetodoSiTipoNoParametros();
En este código, la propiedad saludo es inicializada no con una cadena sino con el valor
hemos creado otra variable del mismo tipo, y la hemos inicializado con la cadena “Hola
mundo”. La palabra reservada return sirve para indicar cuál es el valor que devolverán
los métodos.
public DemoMetodoNoTipoSiParametros() {
saludo="Hola mundo";
//Se envía la variable 'saludo' para que el método la use como parámetro
muestraSaludo(saludo);
System.out.println(recibido);
new DemoMetodoNoTipoSiParametros();
Es fácil deducir de los ejemplos anteriores el último caso. No obstante, falta decir que
mientras que los métodos pueden devolver sólo un tipo, el número de parámetros puede
ser múltiple. Véase el ejemplo que calcula el área de un triángulo con la base y la altura
como argumentos:
DemoMetodoSiTipoSiParametros.java
public DemoMetodoSiTipoSiParametros() {
Falta decir solamente que los parámetros no deben ser necesariamente del mismo tipo y
Un comentario final sobre la API. Cuando buscamos los atributos y los métodos de una
de los métodos se indicarán, también, los parámetros con su tipo. A partir de ahora,
siempre que citemos una clase nueva de las JFC, será con un enlace a la API.
Estructuras de control
Introducción
el flujo de datos. Para empezar, es útil decir que en todos los lenguajes de programación
existen tres tipos de sentencias: las secuenciales, las selectivas y las repetitivas. Hasta
ahora, sólo hemos usado el primer tipo, en el que las posibilidades del flujo de datos se
reducen a una secuencia de pasos; para hacer que exista más de una alternativa o que
cierta tarea se repita varias veces, en Java usa un grupo de palabras reservadas para
JOptionPane que sirve para mostrar cuadros de diálogo y tiene los métodos
variante de nuestro tan traído HolaMundo, que primero pedirá el nombre del usuario y
luego lo saludará.
Antes de seguir, hagamos un poco de abstracción. Obsérvese que lo que queremos hacer
nombre será una propiedad. Cabe aclarar que como el sentido de la clase será dar una
DemoIOJOptionPane.java
muestraSaludo();
/*La palabra reservada null del primer atributo en los dos métodos
*de JOptionPane es porque, por lo común, esta clase es llamada desde una ventana
}
public static void main(String[] args) {
new DemoIOJOptionPane();
}
Al ejecutar el programa, aparece un cuadro de diálogo con el mensaje que le mandamos
Dentro del cuadro de texto se debe escribir un nombre y oprimir el botón <aceptar>:
Luego de lo cual aparecerá otro cuadro de diálogo con la cadena “Hola ” concatenada
(usando el operador +) con el nombre escrito por el usuario; el valor obtenido de esta
showMessageDialog():
Con esto podemos empezar a trabajar con el flujo de datos. Si se ejecuta el programa y
que mostrará después será Hola null, que no es el resultado esperado, si se quisiera
controlar esto, se tendría que controlar el flujo. Existen varias posibilidades para esto y
Analice y ejecute el siguiente programa (que es una variante del anterior) oprimiendo el
botón cancelar:
muestraSaludo();
}else {
//Fin de la estructura
}
En este caso, si el usuario decide no escribir el nombre y cancelar, el programa lo
muestra.
escribe el nombre pero oprime el botón aceptar, la cadena mostrada será Hola
solamente; si queremos que aparezca otro mensaje para este caso, hay más de una
DemoIfElseAnidado.java
muestraSaludo();
/*La palabra reservada null del primer atributo en los dos métodos
*de JOptionPane es porque, por lo común, esta clase es llamada desde una ventana
}else
}else{ {
1. Mandar el saludo
Operadores lógicos
a que los valores de las variables, al compararse, siguen ciertas normas. En el programa
que hemos estado trabajando ya mostramos que el argumento que recibe la palabra
reservada if es un valor boléano. Es decir, una expresión que devuelve verdadero o falso
(para las que se usa las palabras reservadas true y false, respectivamente). En este tipo
binarios, es decir que tienen un operando a cada lado, y que se muestran en la siguiente
tabla:
Operador Significado Es true cuando: Es false cuando:
! Negación. Cambia el valor El objeto que modifica es El objeto que modifica es
de verdad del objeto que falso verdadero
modifica
== Compara si los miembros Ambos objetos son iguales Los objetos son distintos
que están a ambos lados son
iguales
!= Compara si los miembros Los objetos son distintos Ambos objetos son
que están a ambos lados son iguales
distintos
> Compara si el objeto de la Si el objeto de la izquierda es Si el objeto de la
izquierda es mayor que el mayor que el de la derecha izquierda no es mayor
de la derecha que el de la derecha
< Compara si el objeto de la Si el objeto de la izquierda es Si el objeto de la
izquierda es menor que el de menor que el de la derecha izquierda no es menor
la derecha que el de la derecha
>= Compara si el objeto de la Si el objeto de la izquierda es Si el objeto de la
izquierda es mayor o igual mayor o igual que el de la izquierda no es mayor ni
que el de la derecha derecha igual que el de la derecha
<= Compara si el objeto de la Si el objeto de la izquierda es Si el objeto de la
izquierda es menor o igual menor o igual que el de la izquierda no es menor ni
que el de la derecha derecha igual que el de la derecha
Junto con estos, existen otros que sirven para hacer operaciones entre objetos boléanos.
AND
El operador OR se representa en Java con un doble pipe (||. Este caracter normalmente
está en la misma tecla del número 1. Es esa línea vertical cortada en el centro. Su código
Con lo anterior podemos hacer una nueva versión del programa en el que, en lugar de
DemoIfElseOr.java
public DemoIfElseOr() {
pideNombre();
muestraSaludo();
}
}
DemoWhile.java
public DemoWhile() {
pideNombre();
muestraSaludo()
;
while(nombre==null||nombre.equals("")){
nombre=JOptionPane.showInputDialog(null,"Debes escribir tu nombre");
}
public static void main(String[] args) {
new DemoWhile();
}
El programa anterior mostrará reiterativamente el cuadro de diálogo que solicita el
El bloque try…catch es un poco más complejo que el for y el switch, que veremos
después, pero el uso combinado con try catch facilita su comprensión por lo que
La estructura de control en cuestión se usa para capturar el flujo de datos cuando, por la
intervención del usuario o de algún dispositivo externo, sucede un error. Por ejemplo,
valores numéricos, lo que normalmente sucede es que el sistema recibirá cadenas que
deberán ser convertidas a un tipo útil para las operaciones; pero si el usuario ingresa
DemoErrorNumero.java
import javax.swing.JOptionPane;
public class DemoErrorNumero {
String mensaje;
public DemoErrorNumero() {
*/
int valorNumero=Integer.parseInt(valorCadena);
JOptionPane.showMessageDialog(null,"El valor es "+valorCadena);
}
}
Al ejecutar este programa, si en el primer cuadro de diálogo escribimos un entero,
Configuration: <Default>
at java.lang.Integer.parseInt(Integer.java:497)
at DemoErrorNumero.<init>(DemoErrorNumero.java:6)
at DemoErrorNumero.main(DemoErrorNumero.java:10)
La línea que esta subrayada indica cuál fue el error: la cadena „Juanito‟ (que fue lo que
DemoTryCatch.java
import javax.swing.JOptionPane;
public class DemoTryCatch {
String mensaje;
public DemoTryCatch() {
int valorNumero=Integer.parseInt(valorCadena);
*/
mensaje="Gracias";
}
catch (NumberFormatException ex) {//El bloque catch indica el error que captura.
mensaje="No escribiste un Entero";
Se debe saber que existe la clase Exception que captura todos los errores, y que
derivadas de ella hay muchas otras para atender faltas específicas, como el caso que
acabamos de probar. Más adelante en este curso, veremos algunas otras excepciones.
El bloque for
El bloque for sirve para hacer ciclos controlados por un contador. La sintaxis que exige
Parámetro Utilidad
Segundo Establece mediante un operador boléano (> , <, <=, etc) el límite final del
contador
import javax.swing.JOptionPane;
public class DemoFor {
String mensaje;
public DemoFor() {
*/ mensaje=mensaje+i+"x"+valorCadena+"="+(i*valorEntero)+"\
n";
}catch(NumberFormatException ex){
mensaje="No es un entero";
}
JOptionPane.showMessageDialog(null,mensaje);
menos que el usuario no haya escrito un número, ante lo cual mostrará el mensaje “No
es un entero”
El bloque switch
Esta es una estructura de control selectiva que elige de entre un grupo de alternativas en
virtud de una variable entera. Esta aplicación solicita un valor entre cero y diez; en
DemoSwitch.java
import javax.swing.JOptionPane;
public class DemoSwitch {
String mensaje;
public DemoSwitch() {
switch(califNum){
*/
case 0: calif="NA";break;
case 1: calif="NA";break;
case 2: calif="NA";break;
case 3: calif="NA";break;
case 4: calif="NA";break;
case 5: calif="NA";break;
case 6: calif="S";break;
case 7: calif="S";break;
case 8: calif="B";break;
case 9: calif="MB";break;
*entre 0 y 10
*/
}catch(NumberFormatException ex){
mensaje="No escribió un
número";
}
JOptionPane.showMessageDialog(null,mensaje);
Con esto terminamos el tema de las estructuras de control. Téngase en cuenta que en
todos los casos el flujo de datos puede cambiar en virtud de las posibles respuestas del
usuario; y que todas las estructuras vistas aquí son anidables prácticamente sin
restricciones.
Segunda parte. Aplicación de
ejemplo
Como hasta ahora, cuando mencionemos una clase de la API, aparecerá en una liga que
nos remitirá a la página web que la describe. No obstante, pondremos en el código una
descripción de lo que hace cada uno de los métodos usados aun cuando en muchos de
Consideraciones preliminares
Herencia y polimorfismo
orientada a objetos. Para explicar este término, haremos otro Hola Mundo que usará una
ventana, que contendrá una etiqueta; esto requiere tres clases de la librería swing:
DemoClasesColaborando.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
//Agrega la etiqueta al
panel panel.add(etiqueta);
//Agrega el panel a la
ventana ventana.add(panel);
Cada una de las clases que estamos usando pertenece a tres ámbitos distintos:
JFrame es una ventana que sirve como contenedor principal; JPanel es un contenedor
de propósito general que se usará para albergar a los componentes como JLabel, o los
botones, los campos de texto, etc. Todas están colaborando con la clase que acabamos
cada uno de éstos nuevos contenedores. No obstante, esto es una mala práctica. Muy
frecuentemente, es conveniente crear clases que al momento de declararlas obtengan
todos los métodos y las propiedades de otra; a esto se le conoce como „herencia‟ en la
POO. De hecho, todas las clases (aun las que creamos nosotros) heredan de la clase
Object si no se indica otra cosa; dicha clase tiene casi una docena de métodos que están
Object
Component
Container
Window
Frame
JFrame
De tal manera que esta clase tiene todos los métodos de las que le anteceden, además de
los propios (que, en total, resultan ser cientos). Este beneficio lo tienen todas las
ventajas de la herencia van más lejos. Sucede que si yo quiero tratar al objeto ventana
DemoVentanaComoObjeto.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
*/
String claseObjeto=objetoVentana.getClass().toString();
etiqueta.setText(claseObjeto);
panel.add(etiqueta);
ventana.add(panel);
ventana.pack();
ventana.setVisible(true)
;
Este programa usa los métodos de la clase Object para obtener el nombre de la clase a la
polimórficas a las clases: se les puede tratar como si fueran cualquiera de aquellas que
Muy frecuentemente será conveniente hacer clases que hereden de otra. En un buen
diseño, si necesitamos usar una ventana, conviene que la clase sea un JFrame. La
herencia se logra con la palabra reservada extends escrita a reglón seguido después del
nombre de la clase y sólo se puede heredar de otra. El código siguiente es nuestro tan
traído Hola Mundo pero ahora usando los conceptos que estamos explicando.
DemoHeredaJFrame.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
*/
organizaComponentes()
; pack();
setVisible(true);
panel.add(etiqueta);
un método para mostrar que, en términos de sintaxis, los métodos propios de las clases
se portan igual que los heredados. Por otro lado, al haber extendido los alcances de
nuestra clase para heredar los de JFrame, se convierte en parte su linaje; ahora es
Object
Component
Container
Window
Frame
JFrame
DemoHeredaJFrame
Captura de eventos
Desde el apartado anterior hemos estado tratando conceptos que son del entorno de las
relacionan con objetos visuales, está el tema de los eventos que se desencadenan por las
acciones del usuario sobre éstos con los dispositivos de entrada tales como el teclado y
De dichos eventos el más usado es, precisamente, el clic del Mouse, de cuya
ejemplo sólo usaremos este caso. Para hacer que una clase capture los eventos es
necesario usar otra palabra reservada: implements, que sirve para agregar interfaces a las
sentencia extends (si existe); es útil decir que se puede implementar más de una interfaz.
Todos los programas que requieran responder al clic del Mouse usarán la interfaz
(Las interfaces son clases especiales que es inútil explicar aquí y que casi siempre
exigen que se agreguen métodos específicos). Los clics capturados remitirán el flujo del
ActionEvent .
Para mostrar esto haremos una clase que sea un JFrame, que contenga un JButton y que
DemoEventoCapturado.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
/*Las interfaces se implementan
*después de la definición de extends */
organizaComponentes()
; pack();
setVisible(true);
panel.add(elBoton);
*/
}
Aplicación de ejemplo
Abstracción
Para mostrar una aplicación funcional haremos un visor de resulsets para el servidor de
difícil ver que se necesitarán al menos dos ventanas: aquélla para la autenticación del
usuario y la que sirve para escribir las consultas y mostrar sus resultados. Desde esta
Conexión a datos
Autenticación de
Vista de resultados
Con esto hemos encapsulado lo que podríamos llamar los meta-objetos de nuestra
aplicación. Esto significa que cada uno de los ítems anteriores se debe estructurar con al
menos una clase, o con algunas en colaboración. Entonces, atenderemos cada una de
Conexión
Para conectarse a cualquier servidor de base de datos hace falta una aplicación que sirva
como enlace. A ese tipo de clases se les llama conectores. En el caso de MySQL, debe
descargarse de su sitio web. En dicha descarga, se obtiene todo el código fuente de las
[JAVA-HOME]\jre\lib\ext
Hecho lo cual, estamos listos para escribir el siguiente código:
Conector.java
package
visorconsultas.controlador; import
java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Conector {
Connection conexion;
String error;
}
//Este método devuelve la
conexión public Connection
getConexion(){
return conexion;
conexion.close();
return error;
El código anterior trata de obtener una conexión a MySQL usando las clases Class,
es como sigue:
1. Con el método forname() de Class, se crea una asociación entre nuestra clase
con la ClassNotFoundException
dispara la SQLException
dentro de un bloque try…catch, por eso está así la única línea que necesaria
4. Por supuesto, se debe tener acceso a una base de datos de un servidor MySQL
Para hacer consultas a la base de datos hacen falta una serie de clases que colaboran
la SQLException.
ConsultasSQL.java
package
visorconsultas.controlador; import
java.sql.Connection;
import
java.sql.Statement;
import java.sql.ResultSet;
import
java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class ConsultaSQL {
private ResultSetMetaData
metaDatos; private String consulta;
consulta=consultaRecibida;
try {
catch (SQLException e) {
error=e.getMessage();
}
public String[][] getDatosDevueltos(){
if(error==null){
try {
for(int i=0;i<filas;i++){
datosDevueltos[i][j]=resultadoConsulta.getString(j+1);
return datosDevueltos;
try{
}catch(SQLException ex){
}
return nombresColumnas;
Connection y otro de String; éste contendrá una sentencia SELECT; Statement es una
interfaz que puede ejecutar sentencias en lenguaje SQL a través de una conexión; su
ResultSet, que contiene una imagen de los datos devueltos por el servidor MySQL en
formato de tabla, es decir, filas y columnas; además los ResultSet tienen un apuntador o
cursor que sirve para recorrer los registros de la tabla; el recorrido se hace con métodos
como next(). No obstante, no toda la información necesaria está en los datos que ya se
obtuvieron (por ejemplo, falta el nombre de las columnas); para obtener dicha
arreglos, uno contiene la tabla y el otro la lista de los nombres de los atributos de dicha
Aquí debemos hablar de los arreglos en Java. Para obtener una colección de datos hay
String [] nombresColumnas
Hecho lo cual, se debe inicializar cada uno de los elementos agregando el índice
datosDevueltos[0][0]=“Hola”
Como en todos los lenguajes de programación, los arreglos se leen o escriben casi
Autenticación
Como ya vimos, para que el servidor de MySQL permita el acceso se necesitan cuatro
datos: Nombre del servidor, nombre del usuario, contraseña y nombre de la base de
datos; mismos que conviene pedir desde un cuadro de diálogo que se presente antes de
que la ventana principal aparezca. Para esto crearemos dos clases: un panel para los
Panel autenticador
Esta clase la haremos con objetos del tipo JDialog, JPanel, GridLayout JPasswordField
JLabel, JTextField y JButton. Para eso, la clase será un panel que contendrá todos los
PanelAutenticador.java
package visorconsultas.vista;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JButton;
import java.awt.GridLayout;
//Dos botones
iniciaComponentes();
agregaComponentes()
;
aceptar=new JButton("Aceptar");
*/
add(servidor);
add(new JLabel("Usuario",JLabel.RIGHT));
add(usuario);
add(new JLabel("Contraseña",JLabel.RIGHT));
add(password);
add(aceptar);
add(cancelar)
;
Diálogo autenticador
Después creamos un cuadro de diálogo que lo único que hace es contener y mostrar al
panel anterior:
package visorconsultas.vista;
import javax.swing.JDialog;
}
Vista de resultados
Para mostrar los resultados, creamos cuatro clases: un área de texto para que el usuario
escriba las consultas, una tabla para mostrar los resultados, un panel de botones para la
ejecución de las acciones y una ventana para mostrar a todos los anteriores.
Área de texto para las consultas
Como los objetos de tipo JTextArea son multilínea, puede suceder que el contenido
exceda la zona visible; por eso se deben poner dentro de un objeto de la clase
JScrollPane, que es un panel que pone a la disposición de los componentes con partes
AreaConsulta.java
package visorconsultas.vista;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public AreaConsulta() {
texto=new JTextArea(4,30);
mostrar los datos guardados en objetos del tipo DefaultTableModel; éstos almacenan los
valores de las celdas y dimensionan la tabla. En general, conviene que las tablas estén
Modelo
ModeloTabla.java
package visorconsultas.modelo;
import javax.swing.table.DefaultTableModel;
setRowCount(30);
Tabla
TablaResultados.java
package visorconsultas.vista;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import
visorconsultas.modelo.ModeloTabla;
import javax.swing.table.TableModel;
public TablaResultados() {
modelo=new ModeloTabla();
Panel de botones
un contenedor con dos JButton. Una diferencia central es que JPanel tiene por omisión
un manejador de diseño que organiza los componentes como un flujo que se reparte en
el espacio disponible desde el centro de la parte superior, y que es de la clase
FlowLayout.
PanelBotonesConsulta.java
package visorconsultas.vista;
import javax.swing.JPanel;
import javax.swing.JButton;
public PanelBotonesConsulta() {
iniciaComponentes();
agregaComponentes();
add(salir);
Ventana de consultas
La ventana para mostrar las consultas contiene al área de texto, a los botones y a la tabla
que acabamos de hacer. Es pertinente decir aquí que los objetos del tipo JFrame usan el
manejador de diseño BorderLayout que usa los bordes de los contendores para su
ordenamiento. Por eso, el método add() recibe como segundo parámetro cuál borde
usarán los componentes para agruparse en la ventana: North para arriba, East para la
derecha, etc. Obsérvese que uno de los beneficios de haber creado las demás clases
componentes que reciben eventos del Mouse: los dos botones del panel autenticador, y
que es modal, es decir, que toma el control de la aplicación. Será la intervención del
Por el último es de notar que las líneas que se refieren al Controlador están comentadas
VentanaConsultas.java
package visorconsultas.vista;
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import
java.awt.event.ActionListener;
//import visorconsultas.controlador.Controlador;
iniciaComponentes();
agregaComponentes()
; agregaListeners();
inicio();
botones=new PanelBotonesConsulta();
}
private void agregaComponentes(){
add(resultados,"South");
add(area,"West");
add(botones,"East");
pack();
setLocation(100,100);
}
// controlDe=new Controlador();
setVisible(true);
autenticador.setLocationRelativeTo(this)
; autenticador.setModal(true);
autenticador.setVisible(true);
//controlDe.acciones(this,evt);
Controlador
cada uno de los cuatro botones en la aplicación (aquéllos a los que le agregamos listener
en la ventana y a los que nos referiremos con su nombre en cursiva). Los objetos
cancelar y salir, cerrarán la aplicación. Por su parte, aceptar tomará los valores de los
Controlador.java
package visorconsultas.controlador;
import
visorconsultas.vista.VentanaConsultas;
import java.awt.event.ActionEvent;
Conector conMySQL;
public Controlador() {
String host=visor.autenticador.panel.servidor.getText();
String
usuario=visor.autenticador.panel.usuario.getText();
String pw=new
String(visor.autenticador.panel.password.getPassword()); String
base=visor.autenticador.panel.base.getText();
conMySQL=new Conector(host,usuario,pw,base);
if(conMySQL.getConexion()!=null)
visor.autenticador.dispose();
else
if(clicado==visor.botones.consultar){
ConsultaSQL consulta=
new ConsultaSQL(conMySQL.getConexion(),visor.area.texto.getText());
if(consulta.getMensajeError()==null)
visor.resultados.modelo.setDataVector
(consulta.getDatosDevueltos(),consulta.getNombresColumnas());
else
if(clicado==visor.autenticador.panel.cancelar||clicado==visor.botones.salir)
System.exit(0);
new visorconsultas.vista.VentanaConsultas();
Compilación y ejecución
Cada una de las clases que acabamos de crear debe ser compilada en el orden sucesivo
después de lo cual, ésta última clase se puede ejecutar, en tanto que es ella la que tiene
el método main().
Presentación.......................................................................................................................1
Instalación......................................................................................................................
Identificadores.........................................................................................................
Sentencias................................................................................................................
Bloques de código...................................................................................................
Comentarios............................................................................................................. 105
Expresiones..............................................................................................................
Operadores...............................................................................................................
Metacaracteres.........................................................................................................
Palabras reservadas..................................................................................................
Sintaxis........................................................................................................................
Ejecución.................................................................................................................
Flujo de datos..........................................................................................................
Tipos de datos..............................................................................................................
Generalidades..........................................................................................................
Los tipos de datos y los métodos.............................................................................
Estructuras de control..................................................................................................
Introducción.............................................................................................................
El bloque if…else.....................................................................................................
Operadores lógicos..................................................................................................
AND....................................................................................................................
OR........................................................................................................................
El bloque for............................................................................................................
El bloque switch......................................................................................................
Herencia y polimorfismo.........................................................................................
Captura de eventos..................................................................................................
Aplicación de ejemplo.................................................................................................
Abstracción..............................................................................................................
Conexión..................................................................................................................
Consultas SQL.........................................................................................................
Autenticación...........................................................................................................
Panel autenticador...............................................................................................
Diálogo autenticador...........................................................................................
Vista de resultados...................................................................................................
Panel de botones..................................................................................................
Ventana de consultas...........................................................................................
Controlador..............................................................................................................
Compilación y ejecución.....................................................................................
107