Sie sind auf Seite 1von 108

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

FACULTAD DE INGENIERIA DE SISTEMAS


E.A.P INGENIERIA DE SISTEMAS

Notas del Curso Algoritmica II


Conceptos. Programas en Java

Luis Guerra Grados

Lima, Marzo 2014


INDICE

Pg.

1. Java ................................................ 1

2. Clase, objeto, campos, mtodos. 3

3. Lectura de datos en Java ... 16

4. Arreglo de objetos .. 24

5. Relacin entre clases.... 31

6. Herencia Simple.. 46

7. Clase abstracta - Polimorfismo . 51

8. Algunos Componentes GUI .. 62

9. Clases Genricas .. 76

10. Excepciones ...... 78

11. Persistencia ...... 82

12. Conexin a Base de Datos ...... 90

13. Patrones de diseo. MVC ...... 103


Agradecimiento:

A Dios, a mis padres, a los que


fueron mis alumnos, y todos
los que colaboraron en la
presente gua.
JAVA

Java es un lenguaje de programacin creado por Sun Microsystems para poder funcionar en
distintos tipos de procesadores. Su sintaxis es muy parecida a la de C o C++, e incorpora como
propias algunas caractersticas que en otros lenguajes son extensiones: gestin de hilos,
ejecucin remota, etc.
El cdigo Java, una vez compilado, puede llevarse sin modificacin alguna sobre cualquier
mquina, y ejecutarlo. Esto se debe a que el cdigo se ejecuta sobre una mquina hipottica o
virtual, la Java Virtual Machine, que se encarga de interpretar el cdigo (ficheros compilados
.class) y convertirlo a cdigo particular de la CPU que se est utilizando (siempre que se soporte
dicha mquina virtual).
Cuando se programa con Java, se dispone de antemano de un conjunto de clases ya
implementadas. Estas clases (aparte de las que pueda hacer el usuario) forman parte del propio
lenguaje (lo que se conoce como API (Application Programming Interface) de Java).

Tipos de datos

Se tienen los siguientes tipos de datos simples. Adems, se pueden crear complejos, todos los
cuales sern subtipos de Object .

Tipo Tamao/Formato Descripcin Ejemplos


Byte 8 bits, complemento a 2 Entero de 1 byte 210, 0x456
Short 16 bits, complemento a 2 Entero corto "
Int 32 bits, complemento a 2 Entero "
Long 64 bits, complemento a 2 Entero largo "
Float 32 bits, IEEE 754 Real simple precisin 3.12, 3.2E13
Double 64 bits, IEEE 754 Real doble precisin "
Char 16 bits, carcter Carcter simple 'a'
String Cadena de caracteres "cadena"
Bolean true / false verdadero / falso true, false

Identificadores
Nombran variables, funciones, clases y objetos. Comienzan por una letra, carcter de subrayado
_ o smbolo $. El resto de caracteres pueden ser letras o dgitos (o _). Se distinguen
maysculas de minsculas, y no hay longitud mxima. Las variables en Java slo son vlidas
desde el punto donde se declaran hasta el final de la sentencia compuesta (las llaves) que la
engloba. No se puede declarar una variable con igual nombre que una de mbito exterior.
En Java se tiene tambin un trmino NULL, pero si bien el de C es con maysculas (NULL),
ste es con minsculas (null):

String a = null;
...
if (a == null)...

______________________________________________________________________
FISI UNMSM 1 Luis Guerra G.
Operadores
Se muestra una tabla con los operadores en orden de precedencia:

Operador Ejemplo Descripcin


. a.length Campo o mtodo de
objeto
[] a[6] Referencia a elemento
de array
() (a + b) Agrupacin de
operaciones
++ , -- a++; b-- Autoincremento /
Autodecremento de 1
unidad
!, ~ !a ; ~b Negacin /
Complemento
instanceof a instanceof TipoDato Indica si a es del tipo
TipoDato
*, /, % a*b; b/c; c%a Multiplicacin, divisin
y resto de divisin
entera
+, - a+b; b-c Suma y resta
<<, >> a>>2; b<<1 Desplazamiento de bits
a izquierda y derecha
<, >, <=, >=, ==, != a>b; b==c; c!=a Comparaciones
(mayor, menor, igual,
distinto...)
&, |, ^ a&b; b|c AND, OR y XOR
lgicas
&&, || a&&b; b||c AND y OR
condicionales
?: a?b:c Condicional: si a
entonces b , si no c
=, +=, -=, *=, /= ... a=b; b*=c Asignacin. a += b
equivale a (a = a + b)

______________________________________________________________________
FISI UNMSM 2 Luis Guerra G.
1. Clase, Objeto, Campos, Mtodos

Conceptos de la POO, veremos los conceptos de clase, atributo y operacin usando


notacin UML; luego su implementacin utilizando Java, donde se conoce como clase,
campo y mtodo.

Definicin de una clase


Una clase define un tipo de objeto en particular.
Por ejemplo, en una empresa la clase Factura define a todas las facturas que la
empresa emite.
Su sintaxis en Java es:

[ModificadorClase] class NombreClase {


// Campos
// Mtodos
}

El ModificadorClase se resume en el siguiente cuadro:


Palabra Clave Descripcin
public Define una clase como pblica; en caso contrario su visibilidad
ser solamente a nivel del paquete donde se encuentra.
abstract Esta palabra clave determina que la clase no puede ser
instanciada; es decir no podemos crear objetos de este tipo de
clase.
Este tipo de clase solo puede ser heredada.
Final Esta palabra clave determina que la clase no puede ser
heredada, quiere decir que no podemos crear subclases de
este tipo de clase.
Este tipo de clase solo puede ser instanciada.

Ejemplo:
class Factura {
// Campos

______________________________________________________________________
FISI UNMSM 3 Luis Guerra G.
private int numero;
private double importe;

// Mtodos
public void grabar () {
...
...
}
} // Factura

Representacin UML de una Clase


Para tener una representacin grfica de una clase se utiliza UML (Unified Modeling
Language), tal como se ilustra en la figura:

Figura 1: Representacin UML de una clase

Declaracin de Objetos
El operador new se utiliza para crear un objeto de un tipo de clase especfica, es decir,
que asigne memoria para el objeto.
Para utilizar el operador new tenemos dos sintaxis.

Sintaxis 1
NombreDeClase nombreDeVariable;
nombreDeVariable = new NombreDeClase ( );

En la primera instruccin se define la variable que apuntar a un objeto que se crea en


la segunda instruccin.

Sintaxis 2
NombreDeClase nombreDeVariable = new NombreDeClase ( );
En este caso tanto la creacin de la variable y la creacin del objeto se realizan en la
misma instruccin.

______________________________________________________________________
FISI UNMSM 4 Luis Guerra G.
Figura 2: Instanciacin de una clase (Creacin de un objeto)

Asignacin de Objetos
Cuando creamos un objeto internamente existe un puntero al que no tenemos acceso,
pero cuando asignamos objetos, lo que realmente estamos asignando son las
direcciones de memoria donde estn definidos los objetos, como se explica en la figura
3.

Figura 3: Asignacin de objetos

TRABAJANDO CON CAMPOS

Definicin
Los campos definen los datos de un objeto; cuando definimos una clase debemos
definirlos y establecer su visibilidad:
La visibilidad determina desde que parte del cdigo se puede acceder al campo.
Sintaxis:
[TipoAcceso] [ModificadorCampo] Tipo nombreCampo [= ValorInicial];

El TipoAcceso puede tomar los valores que se resume en el siguiente cuadro:


Palabra Clave Descripcin UML
public Indica que el campo es de acceso pblico. El acceso

______________________________________________________________________
FISI UNMSM 5 Luis Guerra G.
se realiza a travs de una instancia del objeto. +
abstract Indica que solo se puede acceder al campo desde
mtodos de la misma clase y clases derivadas
(subclases)
Final Indica que solo se puede acceder al campo desde -
mtodos de la misma clase.
Sin especificar Indica acceso de paquete1, se puede acceder al campo
a travs de una instancia, pero slo desde clases que
se encuentren en el mismo paquete.

El ModificadorCampo puede tomar los valores que se resumen en el siguiente cuadro:


Palabra Clave Descripcin
static El campo pertenece a la clase, no a los objetos creados a
partir de ella.
Final El campo es una constante, en ese caso debe tener un
valor inicial obligatoriamente. Por convenio en java las
constantes se escriben en maysculas.
transient Marca el campo como transitorio, para no ser serializado.
Se usa cuando se trabaja con java beans.
volatile Es un campo accedido de forma asncrona mediante hilos,
con este modificador se lo notificamos a java.

El ValorInicial permite inicializar la variable con un valor.

De acuerdo a la forma en que se especifica un atributo, objetos de otras clases tienen


distintas posibilidades de accederlos, tal como se resume en el siguiente cuadro:
Acceso Desde private protected public (package)
La propia clase Si Si Si Si
Subclase en el mismo paquete No Si Si Si
Otras clases en el mismo paquete No No Si Si
Subclases en otros paquetes No Si Si No
Otras clases en otros paquetes No No Si No

Ocultando los Datos

1 Los paquetes permiten organizar clases segn su naturaleza.


______________________________________________________________________
FISI UNMSM 6 Luis Guerra G.
Uno de los fundamentos de la programacin orientada a objetos es que el usuario solo
debe tener acceso a los datos que le son de su inters, y del modo que le corresponde,
por ejemplo solo lectura, solo escritura, ambos.
Para conseguir esto se debe declarar los atributos como privados, y se debe
implementar mtodos para acceder a ellos. Existe un estndar para definir estos
mtodos, por ejemplo, si el campo es nombre los mtodos son:
- setNombre Este mtodo permite asignar un valor al campo.
- getNombre Este mtodo permite leer el valor del campo.
Como puede apreciar existen dos prefijos, el prefijo set que se utiliza para asignar un
valor al campo y el prefijo get para leer el valor del campo; de esta manera podemos
seleccionar si se implementa el mtodo set, get, ambos, y restringir el nivel de acceso
a los datos.
Otra posibilidad que nos da la implementacin de estos mtodos es de poder agregar
funcionalidad que puede servir para verificar, por ejemplo, si el dato que se est
signando es correcto no.

Ejemplo:
En este ejemplo se lustra el uso de los mtodos set y get.
class Factura {
// Campos
private int numero;
// Mtodos set y get
public void setNumero (int numero) {
this.numero = numero;
}
public int getNumero ( ) {
return this.numero;
}
. . .
. . .
} // Factura

Como puede apreciar en el cdigo, el mtodo setNumero se utiliza para asignar un


valor al campo numero, mientras que el mtodo getNumero se utiliza para leer su valor.
Es posible agregar lgica en cualquiera de los dos mtodos, o en ambos si el caso lo
amerita.

______________________________________________________________________
FISI UNMSM 7 Luis Guerra G.
TRABAJANDO CON MTODOS

Definicin
Los mtodos definen el comportamiento de un objeto de una clase concreta y tienen las
siguientes caractersticas:
- Agrupan las responsabilidades del objeto (competencias).
- Describen sus acciones.
Las acciones realizadas por un objeto son consecuencia directa de un estmulo externo
(un mensaje enviado desde otro objeto) y dependen del estado del objeto. El estado y
comportamiento de un objeto estn relacionados. Por ejemplo, un avin no puede
aterrizar (accin) sino est en vuelo (estado).

Sintaxis:
[TipoAcceso] [ModificadorMtodo]
Tipo NombreMtodo ( [ ListaDeParmetros ] ) {
// Cuerpo de mtodo
}

El TipoAcceso puede tomar los valores que se resumen en el siguiente cuadro:


Palabra Clave Descripcin UML
Public Indica que el mtodo es de acceso pblico. El acceso
se realiza a travs de una instancia del objeto. +
Protected Indica que solo se puede acceder al mtodo desde
mtodos de la misma clase y clases derivadas
(subclases)
private Indica que solo se puede acceder al mtodo desde -
mtodos de la misma clase.
sin especificar Indica visibilidad de paquete, se puede acceder al
mtodo a travs de una instancia, pero slo desde
clases que se encuentren en el mismo paquete.

El ModificadorMtodo puede tomar los valores que se resumen en el siguiente cuadro:


Palabra Clave Descripcin
static El mtodo pertenece a la clase, no a los objetos creados a
partir de ella.
______________________________________________________________________
FISI UNMSM 8 Luis Guerra G.
Final El mtodo es definido como mtodo definitivo, esto quiere
decir que no se puede redefinir en una subclase.
transient Determina que el mtodo no se implementa en la clase, su
implementacin ser en las clases heredadas o subclases.
volatile Permiten sincronizar varios threads para el caso en que
dos o ms accedan concurrentemente a los mismos datos.

El Tipo determina el tipo de dato que debe retornar el mtodo, puede ser cualquier tipo
vlido, incluso los tipos de clases creados por el programador. Si el mtodo no retorna
ningn valor se debe especificar void.
Los parmetros son opcionales, pero si son necesarios se deben especificar de la
siguiente manera:
Tipol parmetro1, tipo2 parametro2, ... ;
Los parmetros son variables que reciben valores de los argumentos que se le pasan
al mtodo cuando ste es invocado.
Los mtodos que son de un tipo diferente de void, deben retornan un valor a la
instruccin que realiza la llamada mediante la instruccin return, utilizando la siguiente
sintaxis:
return expresin;
Donde expresin representa el valor que retorna el mtodo.

Sobrecarga de Mtodos
Un mtodo se identifica por su nombre, la cantidad de parmetros y el tipo de sus
parmetros; esto constituye la firma del mtodo (signature).
La sobrecarga permite tener varios mtodos con igual nombre pero con diferente
forma, o sea, con diferente cantidad de parmetros y diferentes tipos de datos de sus
parmetros. Los mtodos tendrn comportamientos diferentes segn el tipo de dato,
cantidad de parmetros o ambos. Al invocar un mtodo, el compilador busca en la
clase el mtodo que corresponda a los argumentos de la invocacin.
Un ejemplo ilustrativo lo tenemos con el mtodo valueOf de la clase String.

A continuacin tenemos su implementacin en Java:

public class Clasel {


// Mtodos sobrecargados
public void Operacin1 () {
______________________________________________________________________
FISI UNMSM 9 Luis Guerra G.
// Implementacin
}
public void Operacion1 (int Param1) {
// Implementacin
}
public void Operacion1 (String Param1) {
// Implementacin
}
public int Operacion1 (int Param1, String Param2) {
// Implementacin
return 0;
}
public String Operacion1 (long Param1, String Param2) {
// Implementacin
return null;
}
} // Clase1

Ejemplo:
Supongamos que queremos un mtodo que sume dos nmeros, podras necesitar que
sume dos nmeros de tipo int o double; entonces debemos implementar dos mtodos
con el mismo nombre por que se trata de la misma operacin, podra ser sumar, pero
con diferentes tipos de datos de sus parmetros, tal como se lustra a continuacin:

package egcc;
public class Matematica {
public int sumar (int n1, int n2) {
int suma;
suma = n1 + n2;
return suma;
}
public double sumar (double n1, doble n2
double suma;
suma = n1 + n2;
return suma;
}

______________________________________________________________________
FISI UNMSM 10 Luis Guerra G.
} // Matemtica

Cuando usamos la clase Matemtica el IDE nos permite visualizar los diversos
mtodos que estn sobrecargados:

Matematica obj=new Matematica();


System.out.println(obj.sumar(.));

EJEMPLO

Una institucin financiera necesita de un programa que le permita encontrar el importe


que deben pagar sus clientes por los prstamos que realiza, se sabe que se trata de un
inters compuesto, capitalizare mensualmente. La formula que debe aplicarse es:
M= C(1+i)n
Donde:
C : Capital
I : Tasa de inters por periodo, por ejemplo puede ser mensual
n : Nmero de periodos
M : Importe acumulado en el nmero de periodos

Abstraccin
A continuacin tenemos algunas alternativas de abstraer el problema.

Caso 01
En este caso los atributos son pblicos (visibilidad publica) por
Banco
lo tanto se puede acceder de manera directa desde + capital : double
+ interes : double
cualquier otra clase u objeto. + periodo : int
El mtodo calcularlmporte hace el clculo en funcin al
+ calcularImporte()
valor de los campos capital, inters y periodo.

Caso 02
En este caso tenemos un solo mtodo que tiene tres parmetros, a travs de los cuales
recibe los datos para hacer el clculo y retorna el resultado correspondiente.

Banco
+ calcularImporte(capital: double, interes : double, periodos : int) : Double

______________________________________________________________________
FISI UNMSM 11 Luis Guerra G.
package tpagoxPrestamo;
public class Banco {
private double capital;
private double interes;
private int periodos;

public void setCapital(double capital){


this.capital=capital;
}
public double getCapital(){
return this.capital;
}
public void setInteres(double interes){
this.interes=interes;
}
public double getInteres(){
return this.interes;
}
public void setPeriodos(int periodos){
this.periodos=periodos;
}
public int getPeriodos(){
return this.periodos;
}
public double getImporte(){
double importe;
importe=this.getCapital()*Math.pow((1+this.getInteres()),this.getPeriodos());
return importe;
______________________________________________________________________
FISI UNMSM 12 Luis Guerra G.
}
}

public class Principal extends javax.swing.JFrame {

/** Creates new form Principal */


public Principal() {
initComponents();
}

private void btnCalcularActionPerformed(java.awt.event.ActionEvent evt) {


double capital=Double.parseDouble(this.txtCapital.getText());
double interes=Double.parseDouble(this.txtInteres.getText());
int periodos=Integer.parseInt(this.txtPeriodos.getText());

//Instanciar la clase Banco


tpagoxPrestamo.Banco objBanco=new tpagoxPrestamo.Banco();

//Proceso
objBanco.setCapital(capital);
objBanco.setInteres(interes);
objBanco.setPeriodos(periodos);
double importe=objBanco.getImporte();

//Redondear importe a dos decimales


importe =importe*100;
importe=Math.round(importe);
importe=importe/100;

//resultado
this.txtImporte.setText(String.valueOf(importe));
}

private void btnLimpiarActionPerformed(java.awt.event.ActionEvent evt) {


this.txtCapital.setText("");
this.txtInteres.setText("");
this.txtPeriodos.setText("");
this.txtImporte.setText("");
}

private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) {


System.exit(0);
}

public static void main(String args[]) {


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}

// Variables declaration - do not modify


private javax.swing.JButton btnCalcular;
private javax.swing.JButton btnCerrar;
private javax.swing.JButton btnLimpiar;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
______________________________________________________________________
FISI UNMSM 13 Luis Guerra G.
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JTextField txtCapital;
private javax.swing.JTextField txtImporte;
private javax.swing.JTextField txtInteres;
private javax.swing.JTextField txtPeriodos;
// End of variables declaration

Referencia:
Desarrollando soluciones con Java y MySql.
Eric Gustavo Coronel.
Captulo 3

Ejemplo
Dada la clase persona con los atributos: nombre, edad, generar dos instancias de la clase:
alumno, profesor; y los mtodos: para asignar nombre nombre, edad, y luego visualizar dichos
datos.

public class Persona {


//privados:
String nombre;
int edad;

//publicos:
public void AsignarNombre(String nom){
nombre=nom;
}
public void AsignarEdad(int e){
edad=e;
}
public String ObtenerNombre(){
return nombre;
}

public int ObtenerEdad(){


return edad;
______________________________________________________________________
FISI UNMSM 14 Luis Guerra G.
}

public static void main(String[] args) {


Persona alumno=new Persona();
Persona profesor=new Persona();
alumno.AsignarNombre("Miguel");
alumno.AsignarEdad(20);
profesor.AsignarNombre("Jos");
System.out.println("Nombre del alumno:"+alumno.ObtenerNombre());
System.out.println("edad del alumno:"+alumno.ObtenerEdad());
System.out.println("Nombre del profesor:"+profesor.ObtenerNombre());

}
}

******************************

Ejemplo 2
public class CComputador {
String marca;
String procesador;
boolean computadorencendido=true;

public void encendercomputador() {


if(computadorencendido==true)
System.out.println("\n computador encendido");
else
System.out.println("\n computador apagado");

public void estado() {


System.out.println("\n Estado del computador:"+"\n Marca:" +marca+ "\n
procesador:" +procesador);
if(computadorencendido==true)
System.out.println("\n computador encendido");
else
System.out.println("\n computador apagado");

}
public static void main(String[] args) {
CComputador computador1=new CComputador();
computador1.marca="DELL";
computador1.procesador="Core 2 duo";
computador1.encendercomputador();
computador1.estado();

______________________________________________________________________
FISI UNMSM 15 Luis Guerra G.
Inicializacin y Constructores

public class cRectangulo {


private float x1,y1,x2,y2;

public static void main(String[] args) {


cRectangulo prueba=new cRectangulo();
System.out.println(prueba.CalcularArea());
cRectangulo prueba1=new cRectangulo(1,4,7,6);
System.out.println(prueba1.CalcularArea());

public cRectangulo() {
x1=0;
y1=0;
x2=0;
y2=0;
}

public cRectangulo(float ex1, float ey1,float ex2, float ey2) {


x1=ex1;
y1=ey1;
x2=ex2;
y2=ey2;
}

public float CalcularArea() {


return (x2-x1)*(y2-y1);
}
}

2. Lectura de datos en Java

Lectura de un dato entero en Java


Clase Leer:
import java.io.*;

public class Leer {

public static void main(java.lang.String[] args) {


// Inserte aqu cdigo para iniciar la aplicacin.
int dato_int=0;
System.out.print("Ingrese un dato entero : ");
dato_int=Leer.datoInt();
System.out.println("El numero ingresado fue : "+dato_int);
}

//Mtodo datoInt :
public static int datoInt() {
______________________________________________________________________
FISI UNMSM 16 Luis Guerra G.
return Integer.parseInt(dato());
}

//Mtodo dato:
public static String dato() {
String sdato="";
try
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
sdato=flujoE.readLine();
}
catch (IOException e)
{
System.err.println("ERROR:"+e.getMessage());
}
return sdato;
}
}

Leer un caracter desde el teclado

import java.io.*;

public class leercaracter {

public static void main(String[] args) {

int n;

try{

System.out.print("Dato(Caracter o letra): ");

n=System.in.read(); // Leer caracter desde teclado

System.out.println("Dato ingresado: "+(char)n); // Visualiza el caracter

catch(IOException e){

System.err.println("Error: "+e.getMessage());

}
}
}

Leer y mostrar un caracter desde el teclado

import java.io.*;
public class LeerMostrarCaracter {

public static void main(String[] args) {


char opcion;

______________________________________________________________________
FISI UNMSM 17 Luis Guerra G.
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader flujoE=new BufferedReader(isr);
PrintStream flujoS=System.out;
try{
do{
flujoS.print("Continuar<s/n>: ");
opcion=(char)flujoE.read();
flujoE.readLine(); //Limpiar caracteres: \r\n
//flujoS.print("Opcion ingresada:"+opcion);
System.out.println("Opcion ingresada: "+opcion);
}while(opcion!='n');
}
catch(IOException e){
System.out.println("Error:"+e.getMessage());
}

}
}

Leer los datos de un arreglo entero en Java


Clase ALeer
import java.io.*;

public class ALeer {

public static void main(java.lang.String[] args) {


int nElementos;
System.out.print("Numero de elementos del arreglo: ");
nElementos=ALeer.datoInt();
int[] m=new int[nElementos];
int i=0,j=0;
System.out.print("Valores del arreglo: ");
for(i=0;i<nElementos;i++)
{
j=i+1;
System.out.print("m["+j+"]=");
m[i]=ALeer.datoInt();
}

System.out.println();
for(i=0;i<nElementos;i++)
{
j=i+1;
System.out.println("m["+j+"]="+m[i]);

}
}

//Mtodo datoInt
public static int datoInt() {
return Integer.parseInt(dato());

//Mtodo dato
public static String dato() {
String sdato="";
try
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
______________________________________________________________________
FISI UNMSM 18 Luis Guerra G.
sdato=flujoE.readLine();
}
catch (IOException e)
{
System.err.println("ERROR:"+e.getMessage());
}
return sdato;

Leer una cadena de caracteres o un texto


Utilizando flujo de caracteres de entrada: flujoE, y, para imprimir, referencia al flujo estndar de salida: flujoS.

import java.io.*;
public class leerunacadena_u_fe_fs {

public static void main(String[] args) {


//Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader flujoE=new BufferedReader(isr);
//Definir una referencia al flujo estandar de salida: flujoS
PrintStream flujoS=System.out;
String sdato;
try{
flujoS.print("Ingrese un texto: ");
sdato=flujoE.readLine();
flujoS.println("Texto ingresado: "+sdato);
}
catch(IOException e){
System.err.println("Error:"+e.getMessage());
}
}
}

EJERCICIO

1. Programa en Java para leer datos de alumnos: cdigo, nombre, edad, nacionalidad y notas; hallar el promedio
de las notas, y mensaje de aprobado o desaprobado.

import java.io.*;
public class CAlumno {
public static void main(java.lang.String[] args) {
// Inserte aqu cdigo para iniciar la aplicacin.
int cod;
String nom;
int edad,cant,i;
String nac;
double nota1,nota2,nota3,prom;

System.out.print("Ingrese la cantidad de alumnos:");


cant=Leer.datoInt();
for(i=0;i<cant;i++)
{
System.out.println("Alumno["+(i+1)+"] ");
System.out.print("codigo["+(i+1)+"]:");
cod=Leer.datoInt();
System.out.print("Nombre["+(i+1)+"]:");
nom=Leer.dato();
System.out.print("Edad["+(i+1)+"]:");

______________________________________________________________________
FISI UNMSM 19 Luis Guerra G.
edad=Leer.datoInt();
System.out.print("Nacionalidad["+(i+1)+"]:");
nac=Leer.dato();
//INGRESE LAS NOTAS

System.out.print("Nota [1]: ");


nota1=Leer.datoDouble();
System.out.print("Nota [2]: ");
nota2=Leer.datoDouble();
System.out.print("Nota [3]: ");
nota3=Leer.datoDouble();

//PROMEDIO
prom=(nota1+nota2+nota3)/3;
if(prom>=10.5){
System.out.print("El promedio de "+nom+"es :"+prom+" APROBADO");
}
else {
System.out.print("El promedio de "+nom+"es :"+prom+".DESAPROBADO");
}

System.out.println();
}
}

import java.io.*;
public class Leer {
//Mtodo datoInt :
public static int datoInt() {
return Integer.parseInt(dato());
}

// datoDouble
public static double datoDouble() {
return Double.parseDouble(dato());
}

//Mtodo dato:
public static String dato() {
String sdato="";
try
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
sdato=flujoE.readLine();
}
catch (IOException e)
{
System.err.println("ERROR:"+e.getMessage());
}
return sdato;
}
}

______________________________________________________________________
FISI UNMSM 20 Luis Guerra G.
Ejercicios Propuestos

1. Realizar un programa que muestre una clase para representar nmeros racionales. Por
ejemplo: el nmero racional 1/3 representado por un nmero fraccionario sera 0,333333,
Valor mas fcil de manipular, pero a costa de perder precisin. Evidentemente, 1/3 * 3 = 1,
pero 0,333333 * 3 = 0,999999; para esto se recomiendo utilizar dos mtodos: uno para
asignar datos y el otro para visualizar los datos.
2. Realizar un programa que utilice objetos de una clase ecuacin para evaluar las ecuaciones
de la forma: ax3 + bx2 + cx + d
3. Implementar una clase bancaria simule el comportamiento bsico de una cuenta abierta en
una entidad bancaria cualquiera. Para esto se tiene en cuenta los siguientes datos como:
inters, ingresar dinero, retirar dinero, saldo actual, despus de abonado el inters.
4. Realizar una aplicacin que d como resultado los intereses producidos y el capital total
acumulado de una cantidad c, invertida en un inters r durante t das.

La formula a utilizar es:

I = c*r*t
360*100

5. Realizar una aplicacin que d como resultado las soluciones reales x 1 y x2 de una ecuacin
de segundo grado, de la forma:

ax2 + bx + c = 0
Las soluciones de una ecuacin de segundo grado viene dadas por la formula:

b 4ac
2


b
x1
2a

6. Realizar un programa que a travs de un men permita realizar las operaciones de sumar,
restar, multiplicar, dividir y salir. Las operaciones constarn solamente de dos operandos.
El men ser visualizado por un mtodo sin argumentos, que devolver como resultado la
opcin elegida.

7. Realizar un programa que calcule e imprima la suma de los mltiplos de 5 comprendidos


entre dos valores a y b. El programa permitir introducir valores negativos para a y b, y
verificar que a es menor que b. si a es mayor que b, intercambiar estos valores.

8. Realizar un programa que lea una lista de nombres y los almacene en una matriz. Una vez
construida la matriz, visualizaremos su contenido.

9. Realizar un programa que lea una lista de valores introducidas por el teclado. A
continuacin, y sobre las listas, buscar los valores mximo y mnimo, y escribirlos.

10. Realizar un programa que los peso e imprima el histograma correspondiente. Suponer
que los pesos estn comprendidos entre los valores 10 y 100 Kg. En el histograma slo
aparecer los pesos que se corresponden con 1 o mas alumnos.

11. Utilizando el mtodo random de la clase Math del paquete java.lang, realizar un
programa que muestre 6 nmeros aleatorios entre 1 y 49 ordenados ascendentemente.

______________________________________________________________________
FISI UNMSM 21 Luis Guerra G.
12. Realizar un programa que partiendo de dos matrices de cadenas de caracteres clasificadas
en orden ascendente, construya y visualice una tercera matriz tambin clasificada en
orden ascendente; est tercera matriz ser el resultado de la fusin de las dos primeras
matrices.

13. Escribir un programa que calcule la serie:

2 3

e 1 x1! x2! x3! ...


x

Para un valor de x dado, se calcularn y se sumarn trminos sucesivos de la serie, hasta


que el ltimo trmino sumado sea menor o igual que una constante de error
predeterminada (por ejemplo 1 e-7).

14. Elaborar un programa de directorios telefnicos est aplicacin mostrar un men que
presentar las operaciones que se pueden realizar sobre la lista de telfonos. Como
Aadir, Buscar, Buscar Siguiente, Eliminar y salir; pero despus de realizada una de las
opciones deber regresar al men principal.

15. Elaborar un programa que permita operar con nmeros racionales en: la suma, resta,
multiplicacin, divisin, si son iguales, si es mayor o menor, que acepte entrar tanto
negativos como positivos.

16. Construir una clase llamada Luz que simule una luz de semforo. El atributo color de la
clase debe cambiar de Verde a Amarillo y a Rojo y de nuevo regresar a Verde mediante
la funcin Cambio. Cuando se crea un objeto Luz, su color inicial ser Rojo.

Acceso en Java usando los mtodos getXXX( ), setXXX( ), operador this


Asignar y mostrar el nombre y nmero de dni de una persona

public class PruebaPersona {

public static void main(String[] args) {


Persona persona1=new Persona();
persona1.setNombre("Misael");
persona1.setDni("15645459");
System.out.println("El nombre de persona1 es: "+persona1.getNombre());
System.out.println("y su numero de DNI es : "+persona1.getDni());

public class Persona {


private String nombre,dni;

public void setNombre(String nom) {


nombre=nom;
}

______________________________________________________________________
FISI UNMSM 22 Luis Guerra G.
public String getNombre() {
return nombre;
}

public void setDni(String dni) {


this.dni=dni;
}

public String getDni() {


return this.dni;
}

Arreglos Bidimensionales (Matrices)

Declaracin:
tipo identificador[][];

o bien:
tipo[][] identificador;

Creacin:
Utilizando el operador new.

matriz = new tipo [filas][columnas];

Ejemplo:
int[][] temperaturas = new int[12][30];

*************************
matriz[ndice1][ndice2]
*************************
En Java el ndice de la primera componente de un vector es 0 , por lo que matriz[0][0], ser el
primer elemento de la matriz.
El tamao del arreglo puede obtenerse utilizando la propiedad: length
matriz.length : nos da el nmero de filas
matriz[0].length : nos da el nmero de columnas

Ejemplo
Dada una matriz de reales de dos dimensiones, visualizar la suma de cada fila de la matriz.

public class sumafilasdeunamatriz {

public static void main(String[] args) {


int nfilas, ncols; // filas y columnas de la matriz
do
{
System.out.print("Nmero de filas de la matriz: ");
nfilas = Leer.datoInt();
}
while (nfilas < 1); // no permitir un valor negativo
______________________________________________________________________
FISI UNMSM 23 Luis Guerra G.
do
{
System.out.print("Nmero de columnas de la matriz: ");
ncols = Leer.datoInt();
}
while (ncols < 1); // no permitir un valor negativo

float[][] m = new float[nfilas][ncols]; // crear la matriz m


int fila = 0, col = 0; // subndices
float sumafila = 0; // suma de los elementos de una fila

System.out.println("Introducir los valores de la matriz.");


for (fila = 0; fila < nfilas; fila++)
{
for (col = 0; col < ncols; col++)
{
System.out.print("m[" + fila + "][" + col + "] = ");
m[fila][col] = Leer.datoFloat();
}
}

// Visualizar la suma de cada fila de la matriz


System.out.println();
for (fila = 0; fila < nfilas; fila++)
{
sumafila = 0;
for (col = 0; col < ncols; col++)
sumafila += m[fila][col];
System.out.println("Suma de la fila " + fila + ": " + sumafila);
}
System.out.println("\nFin del proceso.");

Arreglo de objetos
Cuando el tipo de dato de un arreglo es una clase, hablamos de arreglo de objetos, donde cada
elemento del arreglo es un objeto.

Ejemplo:

Alumno[ ] ca; //Un arreglo de objetos de la clase Alumno (arreglo de registros de alumno)

public class Alumno { // Registro de datos de un alumno


String codigo;
String nombre;
int promediofinal;
public Alumno(){ }
..
.. }

Ejercicios usando arreglo de objetos

1.Definir un vector de objetos de la clase Alumno, esta clase contiene el cdigo, nombre y nota,
adems los mtodos para ingresar y presentar los datos.

______________________________________________________________________
FISI UNMSM 24 Luis Guerra G.
2. Con el vector de objetos del ejercicio 1, presentar los Alumnos de un curso y generar el
promedio de la nota del curso.

Ejemplo usando arreglo de objetos


Generar una lista de telfonos. La lista debe ser un objeto que encapsula la matriz de objetos
persona, la clase CPersona define los atributos privados nombre, direccin, telfono relativos a
una persona, mtodos respectivos que en un men de opciones permita: aadir, eliminar y buscar
en una lista.
/////////////////////////////////////////////////////////////////
// Ejemplo para trabajar con matriz de objetos
//
import java.io.*;
public class Test {

public static void main(String[] args) {

// Definir un flujo de caracteres de entrada: flujoE


InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
// Definir una referencia al flujo estndar de salida: flujoS
PrintStream flujoS = System.out;

// Crear un objeto lista de telfonos vaco (con cero elementos)


CListaTfnos listatfnos = new CListaTfnos();
int opcion = 0, pos = -1;
String cadenabuscar = null;
String nombre, direccion;
long telefono;
boolean eliminado = false;
do
{
try
{
opcion = menu();
switch (opcion)
{
case 1: // buscar
flujoS.print("conjunto de caracteres a buscar ");
cadenabuscar = flujoE.readLine();
pos = listatfnos.buscar(cadenabuscar, 0);
if (pos == -1)
if (listatfnos.longitud() != 0)
flujoS.println("bsqueda fallida");
else
flujoS.println("lista vaca");
else
{
flujoS.println(listatfnos.valorEn(pos).obtenerNombre());
flujoS.println(listatfnos.valorEn(pos).obtenerDireccion());
flujoS.println(listatfnos.valorEn(pos).obtenerTelefono());
}
break;
case 2: // buscar siguiente
______________________________________________________________________
FISI UNMSM 25 Luis Guerra G.
pos = listatfnos.buscar(cadenabuscar, pos + 1);
if (pos == -1)
if (listatfnos.longitud() != 0)
flujoS.println("bsqueda fallida");
else
flujoS.println("lista vaca");
else
{
flujoS.println(listatfnos.valorEn(pos).obtenerNombre());
flujoS.println(listatfnos.valorEn(pos).obtenerDireccion());
flujoS.println(listatfnos.valorEn(pos).obtenerTelefono());
}
break;
case 3: // aadir
flujoS.print("nombre: "); nombre = flujoE.readLine();
flujoS.print("direccin: "); direccion = flujoE.readLine();
flujoS.print("telfono: "); telefono = Leer.datoLong();
listatfnos.aadir(new CPersona(nombre, direccion, telefono));
break;
case 4: // eliminar
flujoS.print("telfono: "); telefono = Leer.datoLong();
eliminado = listatfnos.eliminar(telefono);
if (eliminado)
flujoS.println("registro eliminado");
else
if (listatfnos.longitud() != 0)
flujoS.println("telfono no encontrado");
else
flujoS.println("lista vaca");
break;
case 5: // salir
listatfnos = null;
}
}
catch (IOException ignorada) {}
}
while(opcion != 5);

public static int menu() {


System.out.print("\n\n");
System.out.println("1. Buscar");
System.out.println("2. Buscar siguiente");
System.out.println("3. Aadir");
System.out.println("4. Eliminar");
System.out.println("5. Salir");
System.out.println();
System.out.print(" Opcin: ");
int op;
do
op = Leer.datoInt();
while (op < 1 || op > 5);
return op;
______________________________________________________________________
FISI UNMSM 26 Luis Guerra G.
}

/////////////////////////////////////////////////////////////////
// Definicin de la clase CListaTfnos.
//
public class CListaTfnos {

private CPersona[] listaTelefonos; // matriz de objetos


private int nElementos; // nmero de elementos de la matriz

public CListaTfnos() {
// Crear una lista vaca
nElementos = 0;
listaTelefonos = new CPersona[nElementos];

}
/**
* Method unElementoMas
* @param listaActual
*/
private void unElementoMas(CPersona[] listaActual) {
nElementos = listaActual.length;
listaTelefonos = new CPersona[nElementos + 1];
// Copiar la lista actual
for ( int i = 0; i < nElementos; i++ )
listaTelefonos[i] = listaActual[i];
nElementos++;

/**
* Method unElementoMenos
* @param listaActual
*/
private void unElementoMenos(CPersona[] listaActual) {
if (listaActual.length == 0) return;
int k = 0;
nElementos = listaActual.length;
listaTelefonos = new CPersona[nElementos - 1];
// Copiar la lista actual
for ( int i = 0; i < nElementos; i++ )
if (listaActual[i] != null)
listaTelefonos[k++] = listaActual[i];
nElementos--;

/**
* Method ponerValorEn
______________________________________________________________________
FISI UNMSM 27 Luis Guerra G.
* @param i
* @param objeto
*/
public void ponerValorEn(int i, CPersona objeto) {
if (i >= 0 && i < nElementos)
listaTelefonos[i] = objeto;
else
System.out.println("ndice fuera de lmites");

/**
* Method valorEn
* @param i
*/
public CPersona valorEn(int i) {
if (i >= 0 && i < nElementos)
return listaTelefonos[i];
else
{
System.out.println("ndice fuera de lmites");
return null;
}

/**
* Method longitud
*/
public int longitud() {
return nElementos;
}

/**
* Method aadir
*/
public void aadir(CPersona obj) {
unElementoMas(listaTelefonos);
ponerValorEn( nElementos - 1, obj );

/**
* Method eliminar
*/
public boolean eliminar(long tel) {
// Buscar el telfono y eliminar registro
for ( int i = 0; i < nElementos; i++ )
if (listaTelefonos[i].obtenerTelefono() == tel)
{
listaTelefonos[i] = null;
unElementoMenos(listaTelefonos);
return true;
}
______________________________________________________________________
FISI UNMSM 28 Luis Guerra G.
return false;

/**
* Method buscar
* @param str
* @param pos
* @return
*/
public int buscar(String str, int pos) {
String nom;
if (str == null) return -1;
if (pos < 0) pos = 0;
for ( int i = pos; i < nElementos; i++ )
{
nom = listaTelefonos[i].obtenerNombre();
if (nom == null) continue;
// str est contenida en nom?
if (nom.indexOf(str) > -1)
return i;
}
return -1;

}
}

/////////////////////////////////////////////////////////////////
// Definicin de la clase CPersona
//
public class CPersona {

// Atributos
private String nombre;
private String direccion;
private long telefono;

public CPersona() {}

public CPersona(String nom, String dir, long tel) {


nombre = nom;
direccion = dir;
telefono = tel;
}

/**
* Method asignarNombre
*/
public void asignarNombre(String nom) {
nombre = nom;
}

/**
* Method obtenerNombre
______________________________________________________________________
FISI UNMSM 29 Luis Guerra G.
*/
public String obtenerNombre() {
return nombre;
}

/**
* Method asignarDireccion
*/
public void asignarDireccion(String dir) {
direccion = dir;
}
/**
* Method obtenerDireccion
*/
public String obtenerDireccion() {
return direccion;
}

/**
* Method asignarTelefono
*/
public void asignarTelefono(long tel) {
telefono = tel;
}

/**
* Method obtenerTelefono
*/
public long obtenerTelefono() {
return telefono;
}
}

/////////////////////////////////////////////////////////////////
// Definicin de la clase Leer
//
import java.io.*;
public class Leer {

public static int datoInt() {


return Integer.parseInt(dato());
}
public static String dato() {
String sdato="";
try
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
sdato=flujoE.readLine();
}
catch (IOException e)
{
System.err.println("ERROR:"+e.getMessage());
}
______________________________________________________________________
FISI UNMSM 30 Luis Guerra G.
return sdato;

public static long datoLong() {


return Long.parseLong(dato());
}

Relacin entre clases


Ejemplo de Composicin y dependencia
Construir una aplicacin que permita pintar un tringulo en la pantalla. La aplicacin debe
permitir que el usuario introduzca los datos del tringulo: coordenada x del vrtice superior,
coordenada y del vrtice superior, base, altura, seleccin del color a travs de un combobox en
un formulario, usando la siguiente relacin de clases:

FormularioTriangulo
-int verticesuperiorx
-int verticesuperiory
-int base
-int altura
-Color color
-JLabel verticesuperiorLabel
Triangulo -JLabel verticesuperiorLabel
-int verticesuperiorx -JLabel baseLabel
-int verticesuperiory -JLabel alturaLabel
Ventana
-int base -JLabel colorLabel
-Triangulo triangulo -int altura -String verticesuperiorxString
+Ventana() -Color color -String verticesuperioryString
-asignarLookAndFeel() -boolean haydatos -String baseString
-setCloseClick() +Triangulo() -String alturaString
+paint(entrada Graphics g) +paint(entrada Graphics g) -String colorString
+main(entrada String[] args) +mover(entrada int desplazamientox, entrada int desplazamientoy) -JTextField verticesuperiorxTextField
+ampliar(entrada int zoomout) -JTextField verticesuperioryTextField
+reducir(entrada int zoomin) -JTextField baseTextField
+borrar() -JTextField alturaTextField
-JComboBox colorField
+FormularioTriangulo()
+obtenerVerticeSuperiorx()
+obtenerVerticeSuperiory()
+obtenerBase()
+obtenerAltura()
+obtenerColor()

Fig. 1. Diagrama de clases para pintar un Tringulo

En JCreator:

File-New-Project

//Clase Ventana
public class Ventana {

public static void main(String[] args) {

// Create application frame.


VentanaFrame frame = new VentanaFrame();

______________________________________________________________________
FISI UNMSM 31 Luis Guerra G.
// Show frame.
frame.setVisible(true);
}
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class VentanaFrame extends JFrame {
private Triangulo triangulo;
/**
* The constructor
*/
public VentanaFrame() {
//Pintar la ventana vaca
setTitle("Pintar Triangulo ");
asignarLookAndFeel();
setCloseClick();
setExtendedState(MAXIMIZED_BOTH);
setVisible(true);

//Crear un triangulo y aadirlo a la ventana


triangulo=new Triangulo();
getContentPane().add(triangulo);

//Repintar la ventana con el triangulo


pack();
setExtendedState(MAXIMIZED_BOTH);
repaint();

}
private void asignarLookAndFeel()
{
//Forzar el Look and Feel de la ventana al del sistema
String laf = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(laf);
}

catch (UnsupportedLookAndFeelException exc)


{System.err.println("Unsupported: " + laf);}
catch (Exception exc)
{System.err.println("Error cargando: " + laf);}
}
private void setCloseClick()
{
//Controlar el cierre de la ventana
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{System.exit(0);}
});
}
public void paint (Graphics g)
______________________________________________________________________
FISI UNMSM 32 Luis Guerra G.
{
super.paint(g);
if (triangulo!=null)
triangulo.paint(g);

// Clase JPanel: Triangulo


import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;
public class Triangulo extends JPanel {

private int verticesuperiorx;


private int verticesuperiory;
private int base;
private int altura;
private Color color;
private boolean haydatos=false;

public Triangulo() {
//Mostrar el formulario para obtener
//los datos del triangulo
FormularioTriangulo formulario=new FormularioTriangulo();
JDialog dialog =new JDialog();
dialog.setTitle("Introduzca los datos del triangulo");
dialog.setModal(true);
dialog.setContentPane(formulario);
dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
dialog.pack();
dialog.show();

// Obtener los datos introducidos por el usuario


verticesuperiorx=formulario.obtenerVerticeSuperiorx();
verticesuperiory=formulario.obtenerVerticeSuperiory();
base=formulario.obtenerBase();
altura=formulario.obtenerAltura();
color=formulario.obtenerColor();
haydatos=true;
}
public void paint(Graphics g) {

int [] coordenadasx=getCoordenadasX();
int [] coordenadasy=getCoordenadasY();

super.paint(g);
//Si el usuario ha introducido los datos pinta el triangulo
if (haydatos){
g.setColor(color);
g.drawPolygon(coordenadasx, coordenadasy, 3);
g.fillPolygon(coordenadasx, coordenadasy, 3);
g.dispose();
______________________________________________________________________
FISI UNMSM 33 Luis Guerra G.
}
}

private int [] getCoordenadasX() {


int [] coordenadasx = new int [3];

coordenadasx[0]=verticesuperiorx;
coordenadasx[1]=verticesuperiorx-(base/2);
coordenadasx[2]=verticesuperiorx+(base/2);

return coordenadasx;

}
private int [] getCoordenadasY() {

int [] coordenadasy= new int[3];

coordenadasy[0]=verticesuperiory;
coordenadasy[1]=verticesuperiory+altura;
coordenadasy[2]=verticesuperiory+altura;

return coordenadasy;

public void mover(int desplazamientox, int desplazamientoy) {


verticesuperiorx = verticesuperiorx + desplazamientox;
verticesuperiory = verticesuperiory + desplazamientoy;

}
public void ampliar(int zoomin) {
if (zoomin > 0){
base= base * zoomin;
altura=altura*zoomin;
}
}

public void reducir(int zoomout) {


if (zoomout > 0){
base = base / zoomout;
altura = altura / zoomout;
}

public void borrar() {


//Pintarme del color del fondo de la ventana
color= this.getBackground();
repaint();
}

______________________________________________________________________
FISI UNMSM 34 Luis Guerra G.
// Clase JPanel: FormularioTriangulo
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FormularioTriangulo extends JPanel {
//Valores de los cuadros de texto
private int verticesuperiorx;
private int verticesuperiory;
private int base;
private int altura;
private Color color;

//Etiquetas de los campos de texto


private JLabel verticesuperiorxLabel;
private JLabel verticesuperioryLabel;
private JLabel baseLabel;
private JLabel alturaLabel;
private JLabel colorLabel;

//Textos de las etiquetas


private static String verticesuperiorxString = "Coordenada x del vrtice superior: ";
private static String verticesuperioryString = "Coordenada y del vrtice superior: ";
private static String baseString = "Base: ";
private static String alturaString = "Altura: ";
private static String colorString = "Color: ";

//Campos de texto y combo para introducir los datos


private JTextField verticesuperiorxTextField;
private JTextField verticesuperioryTextField;
private JTextField baseTextField;
private JTextField alturaTextField;
private JComboBox colorField;

public FormularioTriangulo() {
//crear las etiquetas
verticesuperiorxLabel = new JLabel(verticesuperiorxString);
verticesuperioryLabel= new JLabel(verticesuperioryString);
baseLabel= new JLabel(baseString);
alturaLabel= new JLabel(alturaString);
colorLabel= new JLabel(colorString);

//crear los campos de texto


verticesuperiorxTextField = new JTextField(5);
verticesuperioryTextField= new JTextField(5);
baseTextField= new JTextField(5);
alturaTextField= new JTextField(5);

//crear el combo de colores


String [] colorValues= {"Azul","Naranja","Verde","Rojo","Amarillo","Gris"};
colorField = new JComboBox(colorValues);
colorField.setEditable(false);
______________________________________________________________________
FISI UNMSM 35 Luis Guerra G.
//Asignar las etiquetas a los campos de texto
verticesuperiorxLabel.setLabelFor(verticesuperiorxTextField);
verticesuperioryLabel.setLabelFor(verticesuperioryTextField);
baseLabel.setLabelFor(baseTextField);
alturaLabel.setLabelFor(alturaTextField);
colorLabel.setLabelFor(colorField);

//Distribuir las etiqueta en un panel


JPanel labelPane = new JPanel();
labelPane.setLayout(new GridLayout(0, 1));
labelPane.add(verticesuperiorxLabel);
labelPane.add(verticesuperioryLabel);
labelPane.add(baseLabel);
labelPane.add(alturaLabel);
labelPane.add(colorLabel);

//Distribuir los campos de texto en otro panel.


JPanel fieldPane = new JPanel();
fieldPane.setLayout(new GridLayout(0, 1));
fieldPane.add(verticesuperiorxTextField);
fieldPane.add(verticesuperioryTextField);
fieldPane.add(baseTextField);
fieldPane.add(alturaTextField);
fieldPane.add(colorField);

//Poner los dos paneles en un nuevo panel, las etiquetas a la izquierda,


//los campos de texto a la derecha.

JPanel contentPane = new JPanel();


contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
contentPane.setLayout(new BorderLayout());
contentPane.add(labelPane, BorderLayout.CENTER);
contentPane.add(fieldPane, BorderLayout.EAST);
add(contentPane);

}
public Color obtenerColor() {
String string=(String)colorField.getSelectedItem();
Color color;

if (string.equals("Azul"))
color=Color.BLUE;
else if (string.equals("Verde"))
color=Color.GREEN;
else if (string.equals("Naranja"))
color=Color.ORANGE;
else if (string.equals("Rojo"))
color=Color.RED;
else if (string.equals("Amarillo"))
color=Color.YELLOW;
else if (string.equals("Gris"))
______________________________________________________________________
FISI UNMSM 36 Luis Guerra G.
color=Color.GRAY;
else
color=Color.BLACK;

return color;

public int obtenerVerticeSuperiorx() {


//Obtiene la coordenada x del vertice superior introducida por el usuario
if (verticesuperiorxTextField.getText()!= null)
return Integer.parseInt(verticesuperiorxTextField.getText());
else
return 0;
}

public int obtenerVerticeSuperiory() {


//Obtiene la coordenada y del vertice superior introducida por el usuario
if (verticesuperioryTextField.getText()!= null)
return Integer.parseInt(verticesuperioryTextField.getText());
else
return 0;

}
public int obtenerBase() {
if (baseTextField.getText()!= null)
return Integer.parseInt(baseTextField.getText());
else
return 0;

public int obtenerAltura() {


if (alturaTextField.getText()!= null)
return Integer.parseInt(alturaTextField.getText());
else
return 0;

}
}

______________________________________________________________________
FISI UNMSM 37 Luis Guerra G.
______________________________________________________________________
FISI UNMSM 38 Luis Guerra G.
En NetBeans IDE 6.1

File New Project Java Java Application Next - Nombre del Proyecto
desactivar: Create Main Class y Set as Main Project finish.
Luego de creada la Aplicacin sobre el paquete click derecho New JFrame
para la clase con el mtodo principal, luego similar para las otras clases JPanel.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Ventana extends javax.swing.JFrame {

private Triangulo triangulo;

public Ventana() {

//Pintar la ventana vaca


setTitle("Pintar Triangulo ");
asignarLookAndFeel();
setCloseClick();
setExtendedState(MAXIMIZED_BOTH);
setVisible(true);

//Crear un triangulo y aadirlo a la ventana


triangulo=new Triangulo();
getContentPane().add(triangulo);

______________________________________________________________________
FISI UNMSM 39 Luis Guerra G.
//Repintar la ventana con el triangulo
pack();
setExtendedState(MAXIMIZED_BOTH);
repaint();
}

private void asignarLookAndFeel()


{
//Forzar el Look and Feel de la ventana al del sistema
String laf = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(laf);
}

catch (UnsupportedLookAndFeelException exc)


{System.err.println("Unsupported: " + laf);}
catch (Exception exc)
{System.err.println("Error cargando: " + laf);}
}

private void setCloseClick()


{
//Controlar el cierre de la ventana
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{System.exit(0);}
});
}
public void paint (Graphics g)
{
super.paint(g);
if (triangulo!=null)
triangulo.paint(g);

public static void main(String args[]) {


new Ventana();
}

import java.awt.*;
import javax.swing.*;

public class Triangulo extends javax.swing.JPanel {

//Coordenada x del vertice superior


private int verticesuperiorx;

//Coordenada y del vertice superior


private int verticesuperiory;

______________________________________________________________________
FISI UNMSM 40 Luis Guerra G.
//Base
private int base;

//Altura
private int altura;

//Color
private Color color;

private boolean haydatos=false;

// Crea una nueva instancia de Triangulo */


public Triangulo() {

// Mostrar el formulario para obtener los datos del triangulo


FormularioTriangulo formulario= new FormularioTriangulo();
JDialog dialog =new JDialog();
dialog.setTitle("Introduzca los datos del triangulo");
dialog.setModal(true);
dialog.setContentPane(formulario);
dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
dialog.pack();
dialog.show();

// Obtener los datos introducidos por el usuario


verticesuperiorx=formulario.obtenerVerticeSuperiorx();
verticesuperiory=formulario.obtenerVerticeSuperiory();
base=formulario.obtenerBase();
altura=formulario.obtenerAltura();
color=formulario.obtenerColor();
haydatos=true;

public void paint(Graphics g) {

int [] coordenadasx=getCoordenadasX();
int [] coordenadasy=getCoordenadasY();

super.paint(g);
//Si el usuario ha introducido los datos pinta el triangulo
if (haydatos){
g.setColor(color);
g.drawPolygon(coordenadasx, coordenadasy, 3);
g.fillPolygon(coordenadasx, coordenadasy, 3);
g.dispose();
}

private int [] getCoordenadasX(){

int [] coordenadasx = new int [3];

______________________________________________________________________
FISI UNMSM 41 Luis Guerra G.
coordenadasx[0]=verticesuperiorx;
coordenadasx[1]=verticesuperiorx-(base/2);
coordenadasx[2]=verticesuperiorx+(base/2);

return coordenadasx;
}

private int [] getCoordenadasY(){

int [] coordenadasy= new int[3];

coordenadasy[0]=verticesuperiory;
coordenadasy[1]=verticesuperiory+altura;
coordenadasy[2]=verticesuperiory+altura;

return coordenadasy;
}

public void mover (int desplazamientox, int desplazamientoy){

verticesuperiorx = verticesuperiorx + desplazamientox;


verticesuperiory = verticesuperiory + desplazamientoy;
}

public void ampliar (int zoomin){

if (zoomin > 0){


base= base * zoomin;
altura=altura*zoomin;
}

public void reducir (int zoomout){

if (zoomout > 0){


base = base / zoomout;
altura = altura / zoomout;
}

public void borrar(){

//Pintarme del color del fondo de la ventana


color= this.getBackground();
repaint();
}

import java.awt.*;
import javax.swing.JPanel;
import java.awt.event.*;
______________________________________________________________________
FISI UNMSM 42 Luis Guerra G.
import javax.swing.*;
public class FormularioTriangulo extends javax.swing.JPanel {

//Valores de los cuadros de texto


private int verticesuperiorx;
private int verticesuperiory;
private int base;
private int altura;
private Color color;

//Etiquetas de los campos de texto


private JLabel verticesuperiorxLabel;
private JLabel verticesuperioryLabel;
private JLabel baseLabel;
private JLabel alturaLabel;
private JLabel colorLabel;

//Textos de las etiquetas


private static String verticesuperiorxString = "Coordenada x del vrtice superior: ";
private static String verticesuperioryString = "Coordenada y del vrtice superior: ";
private static String baseString = "Base: ";
private static String alturaString = "Altura: ";
private static String colorString = "Color: ";

//Campos de texto y combo para introducir los datos


private JTextField verticesuperiorxTextField;
private JTextField verticesuperioryTextField;
private JTextField baseTextField;
private JTextField alturaTextField;
private JComboBox colorField;

//Crea una nueva instancia de FormularioTriangulo


public FormularioTriangulo() {

//crear las etiquetas


verticesuperiorxLabel = new JLabel(verticesuperiorxString);
verticesuperioryLabel= new JLabel(verticesuperioryString);
baseLabel= new JLabel(baseString);
alturaLabel= new JLabel(alturaString);
colorLabel= new JLabel(colorString);

//crear los campos de texto


verticesuperiorxTextField = new JTextField(5);
verticesuperioryTextField= new JTextField(5);
baseTextField= new JTextField(5);
alturaTextField= new JTextField(5);

//crear el combo de colores


String [] colorValues= {"Azul","Naranja","Verde","Rojo","Amarillo","Gris"};
colorField = new JComboBox(colorValues);
colorField.setEditable(false);
______________________________________________________________________
FISI UNMSM 43 Luis Guerra G.
//Asignar las etiquetas a los campos de texto
verticesuperiorxLabel.setLabelFor(verticesuperiorxTextField);
verticesuperioryLabel.setLabelFor(verticesuperioryTextField);
baseLabel.setLabelFor(baseTextField);
alturaLabel.setLabelFor(alturaTextField);
colorLabel.setLabelFor(colorField);

//Distribuir las etiqueta en un panel


JPanel labelPane = new JPanel();
labelPane.setLayout(new GridLayout(0, 1));
labelPane.add(verticesuperiorxLabel);
labelPane.add(verticesuperioryLabel);
labelPane.add(baseLabel);
labelPane.add(alturaLabel);
labelPane.add(colorLabel);

//Distribuir los campos de texto en otro panel.


JPanel fieldPane = new JPanel();
fieldPane.setLayout(new GridLayout(0, 1));
fieldPane.add(verticesuperiorxTextField);
fieldPane.add(verticesuperioryTextField);
fieldPane.add(baseTextField);
fieldPane.add(alturaTextField);
fieldPane.add(colorField);

//Poner los dos paneles en un nuevo panel, las etiquetas a la izquierda,


//los campos de texto a la derecha.

JPanel contentPane = new JPanel();


contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
contentPane.setLayout(new BorderLayout());
contentPane.add(labelPane, BorderLayout.CENTER);
contentPane.add(fieldPane, BorderLayout.EAST);
add(contentPane);

//Obtiene el Color seleccionado por el usuario


public Color obtenerColor()
{
String string=(String)colorField.getSelectedItem();
Color color;

if (string.equals("Azul"))
color=Color.BLUE;
else if (string.equals("Verde"))
color=Color.GREEN;
else if (string.equals("Naranja"))
color=Color.ORANGE;
else if (string.equals("Rojo"))
color=Color.RED;
______________________________________________________________________
FISI UNMSM 44 Luis Guerra G.
else if (string.equals("Amarillo"))
color=Color.YELLOW;
else if (string.equals("Gris"))
color=Color.GRAY;
else
color=Color.BLACK;

return color;
}

//Obtiene la coordenada x del vertice superior introducida por el usuario


public int obtenerVerticeSuperiorx(){

if (verticesuperiorxTextField.getText()!= null)
return Integer.parseInt(verticesuperiorxTextField.getText());
else
return 0;
}

//Obtiene la coordenada y del vertice superior introducida por el usuario


public int obtenerVerticeSuperiory(){

if (verticesuperioryTextField.getText()!= null)
return Integer.parseInt(verticesuperioryTextField.getText());
else
return 0;
}

//Obtiene la base introducida por el usuario


public int obtenerBase(){

if (baseTextField.getText()!= null)
return Integer.parseInt(baseTextField.getText());
else
return 0;
}

//Obtiene la altura introducida por el usuario


public int obtenerAltura(){

if (alturaTextField.getText()!= null)
return Integer.parseInt(alturaTextField.getText());
else
return 0;
}

EJERCICIOS
1. Construir una aplicacin que pinte un rectngulo en la pantalla. La aplicacin debe permitir
que el usuario ingrese los datos del rectngulo: coordenada x del vrtice superior
izquierdo, coordenada y del vrtice superior izquierdo, base, altura, seleccin del color a
travs de un combobox en un formulario, usar diagrama de clases similar al ejercicio
anterior.
______________________________________________________________________
FISI UNMSM 45 Luis Guerra G.
2. Implementar un juego que consista en ir formando una tortuga con los valores que los
jugadores obtengan de los nmeros al tirar un dado: seis para el cuerpo, uno para cada pata y
dos para la cabeza. Las reglas son las siguientes:
Pueden jugar N jugadores
El dado ira pasando de mano en mano por todos los jugadores y cada jugador
tirar el dado una vez que le toque.
Cuando saque 6 significa que form el cuerpo, y puede recin formar las
patas.
Cuando halla formado el cuerpo y todas las patas, recin puede buscar la
cabeza.
Gana el que primero forme la tortuga
Elaborar diagrama de clases, programa en Java.

HERENCIA SIMPLE

Ejercicio 1
Elaborar una aplicacin dada una clase Test que permita crear objetos de la clase
CCuentaAhorro con el atributo cuota de mantenimiento o comisin, sta clase es derivada de la
clase base CCuenta que tiene los atributos: nombre, cuenta, saldo, inters. Mostrar: nombre,
cuenta, saldo, inters para dos clientes.

// Aplicacin para trabajar con la clase base: CCuenta...


//
public class Test
{
public static void main(String[] args)
{
CCuentaAhorro cliente01 = new CCuentaAhorro();
CCuentaAhorro cliente02 = new CCuentaAhorro("Un nombre", "Una cuenta", 1000000, 3.5,
300);
cliente01.asignarNombre("Un nombre");
cliente01.asignarCuenta("Una cuenta");
cliente01.asignarTipoDeInters(2.5);
cliente01.asignarCuotaManten(300);

cliente01.ingreso(1000000);
cliente01.reintegro(500000);
cliente01.comisiones();

System.out.println("Cliente 1");
System.out.println("Nombre: "+cliente01.obtenerNombre());
System.out.println("Cuenta: "+cliente01.obtenerCuenta());
System.out.println("Saldo: "+cliente01.estado());
System.out.println("Inters: "+cliente01.obtenerTipoDeInters());
System.out.println();
System.out.println("Cliente 2");
System.out.println("Nombre: "+cliente02.obtenerNombre());
System.out.println("Cuenta: "+cliente02.obtenerCuenta());
System.out.println("Saldo: "+cliente02.estado());
System.out.println("Inters: "+cliente02.obtenerTipoDeInters());

______________________________________________________________________
FISI UNMSM 46 Luis Guerra G.
}
}

//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// Clase CCuentaAhorro: clase derivada de CCuenta
//
import java.util.*;
public class CCuentaAhorro extends CCuenta
{
// Atributos
private double cuotaMantenimiento;

// Mtodos
public CCuentaAhorro() {} // constructor sin parmetros
public CCuentaAhorro(String nom, String cue, double sal,
double tipo, double mant)
{
super(nom, cue, sal, tipo); // invoca al constructor CCuenta
asignarCuotaManten(mant); // inicia cuotaMantenimiento
}

public void asignarCuotaManten(double cantidad)


{
if (cantidad < 0)
{
System.out.println("Error: cantidad negativa");
return;
}
cuotaMantenimiento = cantidad;
}

public double obtenerCuotaManten()


{
return cuotaMantenimiento;
}

public void comisiones()


{
// Se aplican mensualmente por el mantenimiento de la cuenta
GregorianCalendar fechaActual = new GregorianCalendar();
int da = fechaActual.get(Calendar.DAY_OF_MONTH);

if (da == 1) reintegro(cuotaMantenimiento);
}
}
//////////////////////////////////////////////////////////////////
// Clase CCuenta: clase abstracta que agrupa los datos comunes a
// cualquier tipo de cuenta bancaria.
//
public abstract class CCuenta
{
// Atributos
______________________________________________________________________
FISI UNMSM 47 Luis Guerra G.
private String nombre;
private String cuenta;
private double saldo;
private double tipoDeInters;

// Mtodos
public CCuenta() {};
public CCuenta(String nom, String cue, double sal, double tipo)
{
asignarNombre(nom);
asignarCuenta(cue);
ingreso(sal);
asignarTipoDeInters(tipo);
}

public void asignarNombre(String nom)


{
if (nom.length() == 0)
{
System.out.println("Error: cadena vaca");
return;
}
nombre = nom;
}

public String obtenerNombre()


{
return nombre;
}

public void asignarCuenta(String cue)


{
if (cue.length() == 0)
{
System.out.println("Error: cuenta no vlida");
return;
}
cuenta = cue;
}

public String obtenerCuenta()


{
return cuenta;
}

public double estado()


{
return saldo;
}

public abstract void comisiones();

public void ingreso(double cantidad)


{
______________________________________________________________________
FISI UNMSM 48 Luis Guerra G.
if (cantidad < 0)
{
System.out.println("Error: cantidad negativa");
return;
}
saldo += cantidad;
}

public void reintegro(double cantidad)


{
if (saldo - cantidad < 0)
{
System.out.println("Error: no dispone de saldo");
return;
}
saldo -= cantidad;
}

public void asignarTipoDeInters(double tipo)


{
if (tipo < 0)
{
System.out.println("Error: tipo no vlido");
return;
}
tipoDeInters = tipo;
}

public double obtenerTipoDeInters()


{
return tipoDeInters;
}
}

Bibliografa: Cap. 10 - Java 2 - Fco. Javier Ceballos.

Ejercicio 2
Dada la clase base Figura y las clases derivadas crculo y rectngulo hallar el rea de dos objetos
Crculo y rectngulo dada la clase base respectiva y datos dados, desde el programa principal
como radio, largo y ancho, respecto a un punto en la clase base.

import java.io.*;
public class JerarquiadeClases {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Figura f=new Circulo(0,0,5.5);
______________________________________________________________________
FISI UNMSM 49 Luis Guerra G.
System.out.println("Area del circulo: "+f.area());
//f=new Rectangulo(0,0,5.5,2.0);
Figura r=new Rectangulo(0,0,5.5,2.0);
//Rectangulo r=new Rectangulo(0,0,5.5,2.0);
System.out.println("Area del rectangulo: "+r.area());
}

public abstract class Figura {


protected int x;
protected int y;
public Figura(int x,int y){
this.x=x;
this.y=y;
}
public abstract double area();
}

class Circulo extends Figura{


protected double radio;
public Circulo(int x,int y,double radio){
super(x,y);
this.radio=radio;
}
public double area(){
return Math.PI*radio*radio;
}
}

class Rectangulo extends Figura{


protected double ancho,alto;
public Rectangulo(int x,int y, double ancho, double alto){
super(x,y);
this.ancho=ancho;
this.alto=alto;
}
public double area(){
return ancho*alto;
}
}

______________________________________________________________________
FISI UNMSM 50 Luis Guerra G.
CLASE ABSTRACTA POLIMORFISMO
Dada un clase CBanco que define una matriz de referencias a objetos de tipo cuenta bancaria (clase
CCuenta), siendo CCuenta una clase abstracta con los atributos: nombre, cuenta, saldo, inters, que
incluye a dos clases derivadas: CCuentaAhorro con el atributo cuota de mantenimiento; y la clase
CCuentaCorriente con los atributos: transacciones, importe por transacciones, transacciones exentas; y,
a la vez CCuentaCorriente es clase base de CCuentaCorrienteConIn (Cuenta corriente con intereses).
En una clase Test definir un men de opciones que permita:

1. Saldo
2. Buscar siguiente
3. Ingreso
4. Reintegro // Ingreso
5. Aadir
6. Eliminar
7. Mantenimiento
8. Salir
Seleccione opcin:
Asimismo en la clase Test en el mtodo principal crear un objeto banco del tipo CBanco ( con cero
elementos).

import java.io.*;
/////////////////////////////////////////////////////////////////
// Aplicacin para trabajar con la clase CBanco y la jerarqua
// de clases derivadas de CCuenta
//
public class Test
{
// Para la entrada de datos se utiliza Leer.class
public static CCuenta leerDatos(int op)
{
CCuenta obj = null;
String nombre, cuenta;
double saldo, tipoi, mant;
System.out.print("Nombre.................: ");
nombre = Leer.dato();
System.out.print("Cuenta.................: ");
cuenta = Leer.dato();
System.out.print("Saldo..................: ");
saldo = Leer.datoDouble();
System.out.print("Tipo de inters........: ");
tipoi = Leer.datoDouble();
if (op == 1)
{
System.out.print("Mantenimiento..........: ");
mant = Leer.datoDouble();
obj = new CCuentaAhorro(nombre, cuenta, saldo, tipoi, mant);
}
else
{
int transex;
double imptrans;
System.out.print("Importe por transaccin: ");
imptrans = Leer.datoDouble();
System.out.print("Transacciones exentas..: ");
transex = Leer.datoInt();
if (op == 2)
obj = new CCuentaCorriente(nombre, cuenta, saldo, tipoi,
imptrans, transex);
______________________________________________________________________
FISI UNMSM 51 Luis Guerra G.
else
obj = new CCuentaCorrienteConIn(nombre, cuenta, saldo,
tipoi, imptrans, transex);
}
return obj;
}

public static int men()


{
System.out.print("\n\n");
System.out.println("1. Saldo");
System.out.println("2. Buscar siguiente");
System.out.println("3. Ingreso");
System.out.println("4. Reintegro");
System.out.println("5. Aadir");
System.out.println("6. Eliminar");
System.out.println("7. Mantenimiento");
System.out.println("8. Salir");
System.out.println();
System.out.print(" Opcin: ");
int op;
do
op = Leer.datoInt();
while (op < 1 || op > 8);
return op;
}

public static void main(String[] args)


{
// Definir una referencia al flujo estndar de salida: flujoS
PrintStream flujoS = System.out;

// Crear un objeto banco vaco (con cero elementos)


CBanco banco = new CBanco();

int opcin = 0, pos = -1;


String cadenabuscar = null;
String nombre, cuenta;
double cantidad;
boolean eliminado = false;

do
{
opcin = men();
switch (opcin)
{
case 1: // saldo
flujoS.print("Nombre o cuenta, total o parcial ");
cadenabuscar = Leer.dato();
pos = banco.buscar(cadenabuscar, 0);
if (pos == -1)
if (banco.longitud() != 0)
flujoS.println("bsqueda fallida");
else
flujoS.println("no hay clientes");
else
{
flujoS.println(banco.clienteEn(pos).obtenerNombre());
flujoS.println(banco.clienteEn(pos).obtenerCuenta());
______________________________________________________________________
FISI UNMSM 52 Luis Guerra G.
flujoS.println(banco.clienteEn(pos).estado());
}
break;
case 2: // buscar siguiente
pos = banco.buscar(cadenabuscar, pos + 1);
if (pos == -1)
if (banco.longitud() != 0)
flujoS.println("bsqueda fallida");
else
flujoS.println("no hay clientes");
else
{
flujoS.println(banco.clienteEn(pos).obtenerNombre());
flujoS.println(banco.clienteEn(pos).obtenerCuenta());
flujoS.println(banco.clienteEn(pos).estado());
}
break;
case 3: // ingreso
case 4: // reintegro
flujoS.print("Cuenta: "); cuenta = Leer.dato();
pos = banco.buscar(cuenta, 0);
if (pos == -1)
if (banco.longitud() != 0)
flujoS.println("bsqueda fallida");
else
flujoS.println("no hay clientes");
else
{
flujoS.print("Cantidad: "); cantidad = Leer.datoDouble();
if (opcin == 3)
banco.clienteEn(pos).ingreso(cantidad);
else
banco.clienteEn(pos).reintegro(cantidad);
}
break;
case 5: // aadir
flujoS.print("Tipo de cuenta: 1-(CA), 2-(CC), 3-CCI ");
do
opcin = Leer.datoInt();
while (opcin < 1 || opcin > 3);
banco.aadir(leerDatos(opcin));
break;
case 6: // eliminar
flujoS.print("Cuenta: "); cuenta = Leer.dato();
eliminado = banco.eliminar(cuenta);
if (eliminado)
flujoS.println("registro eliminado");
else
if (banco.longitud() != 0)
flujoS.println("cuenta no encontrada");
else
flujoS.println("no hay clientes");
break;
case 7: // mantenimiento
for (pos = 0; pos < banco.longitud(); pos++)
{
banco.clienteEn(pos).comisiones();
banco.clienteEn(pos).intereses();
}
______________________________________________________________________
FISI UNMSM 53 Luis Guerra G.
break;
case 8: // salir
banco = null;
}
}
while(opcin != 8);
}
}
/////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// Clase CBanco: clase que mantiene una matriz de referencias a
// objetos de cualquier tipo de cuenta bancaria.
//
public class CBanco
{
private CCuenta[] clientes; // matriz de objetos
private int nElementos; // nmero de elementos de la matriz
public CBanco()
{
// Crear una matriz vaca
nElementos = 0;
clientes = new CCuenta[nElementos];
}
private void unElementoMs(CCuenta[] clientesActuales)
{
nElementos = clientesActuales.length;
// Crear una matriz con un elemento ms
clientes = new CCuenta[nElementos + 1];
// Copiar los clientes que hay actualmente
for ( int i = 0; i < nElementos; i++ )
clientes[i] = clientesActuales[i];
nElementos++;
}
private void unElementoMenos(CCuenta[] clientesActuales)
{
if (clientesActuales.length == 0) return;
int k = 0;
nElementos = clientesActuales.length;
// Crear una matriz con un elemento menos
clientes = new CCuenta[nElementos - 1];
// Copiar los clientes no nulos que hay actualmente
for ( int i = 0; i < nElementos; i++ )
if (clientesActuales[i] != null)
clientes[k++] = clientesActuales[i];
nElementos--;
}

public void insertarCliente( int i, CCuenta objeto )


{
// Asignar al elemento i de la matriz, un nuevo objeto
if (i >= 0 && i < nElementos)
clientes[i] = objeto;
else
System.out.println("ndice fuera de lmites");
}

public CCuenta clienteEn( int i )


{
// Devolver la referencia al objeto i de la matriz
______________________________________________________________________
FISI UNMSM 54 Luis Guerra G.
if (i >= 0 && i < nElementos)
return clientes[i];
else
{
System.out.println("ndice fuera de lmites");
return null;
}
}

public int longitud() { return nElementos; }

public void aadir(CCuenta obj)


{
// Aadir un objeto a la matriz
unElementoMs(clientes);
insertarCliente( nElementos - 1, obj );
}

public boolean eliminar(String cuenta)


{
// Buscar la cuenta y eliminar el objeto
for ( int i = 0; i < nElementos; i++ )
if (cuenta.compareTo(clientes[i].obtenerCuenta()) == 0)
{
clientes[i] = null; // enviar el objeto a la basura
unElementoMenos(clientes);
return true;
}
return false;
}

public int buscar(String str, int pos)


{
// Buscar un objeto y devolver su posicin
String nom, cuen;
if (str == null) return -1;
if (pos < 0) pos = 0;
for ( int i = pos; i < nElementos; i++ )
{
// Buscar por el nombre
nom = clientes[i].obtenerNombre();
if (nom == null) continue;
// str est contenida en nom?
if (nom.indexOf(str) > -1)
return i;
// Buscar por la cuenta
cuen = clientes[i].obtenerCuenta();
if (cuen == null) continue;
// str est contenida en cuen?
if (cuen.indexOf(str) > -1)
return i;
}
return -1;
}
}
//////////////////////////////////////////////////////////////////

______________________________________________________________________
FISI UNMSM 55 Luis Guerra G.
//////////////////////////////////////////////////////////////////
// Clase CCuenta: clase abstracta que agrupa los datos comunes a
// cualquier tipo de cuenta bancaria.
//
public abstract class CCuenta
{
// Atributos
private String nombre;
private String cuenta;
private double saldo;
private double tipoDeInters;

// Mtodos
public CCuenta() {};
public CCuenta(String nom, String cue, double sal, double tipo)
{
asignarNombre(nom);
asignarCuenta(cue);
ingreso(sal);
asignarTipoDeInters(tipo);
}

public void asignarNombre(String nom)


{
if (nom.length() == 0)
{
System.out.println("Error: cadena vaca");
return;
}
nombre = nom;
}

public String obtenerNombre()


{
return nombre;
}

public void asignarCuenta(String cue)


{
if (cue.length() == 0)
{
System.out.println("Error: cuenta no vlida");
return;
}
cuenta = cue;
}

public String obtenerCuenta()


{
return cuenta;
}

public double estado()


{
return saldo;
}

public abstract void comisiones();

______________________________________________________________________
FISI UNMSM 56 Luis Guerra G.
public abstract double intereses();

public void ingreso(double cantidad)


{
if (cantidad < 0)
{
System.out.println("Error: cantidad negativa");
return;
}
saldo += cantidad;
}

public void reintegro(double cantidad)


{
if (saldo - cantidad < 0)
{
System.out.println("Error: no dispone de saldo");
return;
}
saldo -= cantidad;
}

public void asignarTipoDeInters(double tipo)


{
if (tipo < 0)
{
System.out.println("Error: tipo no vlido");
return;
}
tipoDeInters = tipo;
}

public double obtenerTipoDeInters()


{
return tipoDeInters;
}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.io.*;
public class Leer {

public static int datoInt() {


return Integer.parseInt(dato());
}
public static String dato() {
String sdato="";
try
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
sdato=flujoE.readLine();
}
catch (IOException e)
{
System.err.println("ERROR:"+e.getMessage());
}
return sdato;

______________________________________________________________________
FISI UNMSM 57 Luis Guerra G.
}

public static long datoLong() {


return Long.parseLong(dato());
}
public static double datoDouble() {
return Double.parseDouble(dato());
}
}
import java.util.*;
//////////////////////////////////////////////////////////////////
// Clase CCuentaAhorro: clase derivada de CCuenta
//
public class CCuentaAhorro extends CCuenta
{
// Atributos
private double cuotaMantenimiento;

// Mtodos
public CCuentaAhorro() {} // constructor sin parmetros

public CCuentaAhorro(String nom, String cue, double sal,


double tipo, double mant)
{
super(nom, cue, sal, tipo); // invoca al constructor CCuenta
asignarCuotaManten(mant); // inicia cuotaMantenimiento
}

public void asignarCuotaManten(double cantidad)


{
if (cantidad < 0)
{
System.out.println("Error: cantidad negativa");
return;
}
cuotaMantenimiento = cantidad;
}

public double obtenerCuotaManten()


{
return cuotaMantenimiento;
}

public void comisiones()


{
// Se aplican mensualmente por el mantenimiento de la cuenta
GregorianCalendar fechaActual = new GregorianCalendar();
int da = fechaActual.get(Calendar.DAY_OF_MONTH);

if (da == 1) reintegro(cuotaMantenimiento);
}

public double intereses()


{
GregorianCalendar fechaActual = new GregorianCalendar();
int da = fechaActual.get(Calendar.DAY_OF_MONTH);

if (da != 1) return 0.0;


// Acumular los intereses por mes slo los das 1 de cada mes
______________________________________________________________________
FISI UNMSM 58 Luis Guerra G.
double interesesProducidos = 0.0;
interesesProducidos = estado() * obtenerTipoDeInters() / 1200.0;
ingreso(interesesProducidos);

// Devolver el inters mensual por si fuera necesario


return interesesProducidos;
}
}
//////////////////////////////////////////////////////////////////

import java.util.*;
//////////////////////////////////////////////////////////////////
// Clase CCuentaCorriente: clase derivada de CCuenta
//
public class CCuentaCorriente extends CCuenta
{
// Atributos
private int transacciones;
private double importePorTrans;
private int transExentas;

// Mtodos
public CCuentaCorriente() {} // constructor sin parmetros

public CCuentaCorriente(String nom, String cue, double sal,


double tipo, double imptrans, int transex)
{
super(nom, cue, sal, tipo); // invoca al constructor CCuenta
transacciones = 0; // inicia transacciones
asignarImportePorTrans(imptrans); // inicia importePorTrans
asignarTransExentas(transex); // inicia transExentas
}

public void decrementarTransacciones()


{
transacciones--;
}

public void asignarImportePorTrans(double imptrans)


{
if (imptrans < 0)
{
System.out.println("Error: cantidad negativa");
return;
}
importePorTrans = imptrans;
}

public double obtenerImportePorTrans()


{
return importePorTrans;
}

public void asignarTransExentas(int transex)


{
if (transex < 0)
{
System.out.println("Error: cantidad negativa");
return;
______________________________________________________________________
FISI UNMSM 59 Luis Guerra G.
}
transExentas = transex;
}

public int obtenerTransExentas()


{
return transExentas;
}

public void ingreso(double cantidad)


{
super.ingreso(cantidad);
transacciones++;
}

public void reintegro(double cantidad)


{
super.reintegro(cantidad);
transacciones++;
}

public void comisiones()


{
// Se aplican mensualmente por el mantenimiento de la cuenta
GregorianCalendar fechaActual = new GregorianCalendar();
int da = fechaActual.get(Calendar.DAY_OF_MONTH);
if (da == 1)
{
int n = transacciones - transExentas;
if (n > 0) reintegro(n * importePorTrans);
transacciones = 0;
}
}

public double intereses()


{
GregorianCalendar fechaActual = new GregorianCalendar();
int da = fechaActual.get(Calendar.DAY_OF_MONTH);

if (da != 1) return 0.0;

// Acumular los intereses por mes slo los das 1 de cada mes
double interesesProducidos = 0.0;
// Hasta 3000 euros al 0.5%. El resto al inters establecido.
if (estado() <= 3000)
interesesProducidos = estado() * 0.5 / 1200.0;
else
{
interesesProducidos = 3000 * 0.5 / 1200.0 +
(estado() - 3000) * obtenerTipoDeInters() / 1200.0;
}
ingreso(interesesProducidos);
// Este ingreso no debe incrementar las transacciones
decrementarTransacciones();

// Devolver el inters mensual por si fuera necesario


return interesesProducidos;
}
}
______________________________________________________________________
FISI UNMSM 60 Luis Guerra G.
//////////////////////////////////////////////////////////////////

import java.util.*;
//////////////////////////////////////////////////////////////////
// Clase CCuentaCorrienteConIn: clase derivada de CCuentaCorriente
//
public class CCuentaCorrienteConIn extends CCuentaCorriente
{
// Mtodos
public CCuentaCorrienteConIn() {} // constructor sin parmetros

public CCuentaCorrienteConIn(String nom, String cue, double sal,


double tipo, double imptrans, int transex)
{
// Invocar al constructor de la superclase
super(nom, cue, sal, tipo, imptrans, transex);
}

public double intereses()


{
GregorianCalendar fechaActual = new GregorianCalendar();
int da = fechaActual.get(Calendar.DAY_OF_MONTH);

if (da != 1 || estado() < 3000) return 0.0;

// Acumular inters mensual slo los das 1 de cada mes


double interesesProducidos = 0.0;
interesesProducidos = estado() * obtenerTipoDeInters() / 1200.0;
ingreso(interesesProducidos);
// Este ingreso no debe incrementar las transacciones
decrementarTransacciones();

// Devolver el inters mensual por si fuera necesario


return interesesProducidos;
}
}
//////////////////////////////////////////////////////////////////

Interfaz IFecha

import java.util.*;
//////////////////////////////////////////////////////////////////
// Interfaz IFecha: mtodos y constantes para obtener
// el da, mes y ao
//
public interface IFecha
{
public final static int DIA_DEL_MES = Calendar.DAY_OF_MONTH;
public final static int MES_DEL_AO = Calendar.MONTH;
public final static int AO = Calendar.YEAR;

public abstract int da();


public abstract int mes();
public abstract int ao();
}

______________________________________________________________________
FISI UNMSM 61 Luis Guerra G.
EJERCICIOS

1. Vaca, cerdo son animales que tienen peso y no hablan pero si dicen algo, es el caso de la
vaca (muu), o, caso del cerdo (oinc). Crear una instancia de vaca por ejemplo daisy, una
instancia de cerdo por ejemplo porky. Usando polimorfismo redefinir un mtodo para que al
seleccionar un animal de los indicados se diga algo de uno de ellos, y el proceso continu
mientras no se desee salir, en un men de opciones.

2. Controlar o manejar una excepcin de divisin por cero, dados dos nmeros enteros
cualesquiera. Cuando los datos son correctos el proceso continua, y pregunta si desea
terminar.

3. Dado las instancias cuadrado, crculo, rectngulo, adems una clase base Figura; redefinir el
mtodo calcular el rea, para cada una de las figuras, cuando se solicite en el programa
principal desde un men de opciones el rea de ellas. Recuerde leer: lado, radio, largo y
ancho,

MENU
1. rea de un cuadrado
2. Area de un crculo
3. Area de un rectngulo
4. Salir

Seleccione opcin:

Algunos Componentes GUI de Swing en NetBeans

Ejemplo 1.
Disear lo siguiente:

______________________________________________________________________
FISI UNMSM 62 Luis Guerra G.
package numeros;
import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;
public class NumerosApp extends SingleFrameApplication {
@Override protected void startup() {
show(new NumerosView(this));
}
@Override protected void configureWindow(java.awt.Window root) {
}
public static NumerosApp getApplication() {
return Application.getInstance(NumerosApp.class);
}
public static void main(String[] args) {
launch(NumerosApp.class, args);
}
}
package numeros;
import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import java.lang.String;

private void eventoHallar(java.awt.event.ActionEvent evt) {

int n1 = Integer.parseInt(jTextField1.getText());
int n2 = Integer.parseInt(jTextField2.getText());
int n3 = Integer.parseInt(jTextField3.getText());
int n4 = Integer.parseInt(jTextField4.getText());
int n5 = Integer.parseInt(jTextField5.getText());
float media=(n1+n2+n3+n4+n5)/5;
jTextField6.setText(Float.toString(media));
}
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private javax.swing.JTextField jTextField4;
private javax.swing.JTextField jTextField5;
private javax.swing.JTextField jTextField6;
private javax.swing.JTextField jTextField7;
private javax.swing.JTextField jTextField8;
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel statusAnimationLabel;
private javax.swing.JLabel statusMessageLabel;

______________________________________________________________________
FISI UNMSM 63 Luis Guerra G.
private javax.swing.JPanel statusPanel;
// End of variables declaration

private final Timer messageTimer;


private final Timer busyIconTimer;
private final Icon idleIcon;
private final Icon[] busyIcons = new Icon[15];
private int busyIconIndex = 0;

private JDialog aboutBox;


}

Ejemplo 2:

/*********************************************************
package interfaz_grafica_1;

import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;

public class Interfaz_grafica_1App extends SingleFrameApplication {

@Override protected void startup() {


show(new Interfaz_grafica_1View(this));
}
@Override protected void configureWindow(java.awt.Window root) {
}

public static Interfaz_grafica_1App getApplication() {


return Application.getInstance(Interfaz_grafica_1App.class);
}

/**
* Main method launching the application.
*/
public static void main(String[] args) {
launch(Interfaz_grafica_1App.class, args);//lanzar,emprender,iniciar

______________________________________________________________________
FISI UNMSM 64 Luis Guerra G.
}
}

/***************************************************************
package interfaz_grafica_1;

import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JFrame;

/**
* The application's main frame.
*/
public class Interfaz_grafica_1View extends FrameView {

public Interfaz_grafica_1View(SingleFrameApplication app) {


super(app);

initComponents();

// status bar initialization - message timeout, idle icon and busy animation, etc
ResourceMap resourceMap = getResourceMap();
int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
messageTimer = new Timer(messageTimeout, new ActionListener() {
public void actionPerformed(ActionEvent e) {
statusMessageLabel.setText("");
}
});
messageTimer.setRepeats(false);
int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
for (int i = 0; i < busyIcons.length; i++) {
busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
}
busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
public void actionPerformed(ActionEvent e) {
busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
}
});
idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);

// connecting action tasks to status bar via TaskMonitor


TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
if ("started".equals(propertyName)) {
if (!busyIconTimer.isRunning()) {
statusAnimationLabel.setIcon(busyIcons[0]);
______________________________________________________________________
FISI UNMSM 65 Luis Guerra G.
busyIconIndex = 0;
busyIconTimer.start();
}
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
} else if ("done".equals(propertyName)) {
busyIconTimer.stop();
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
progressBar.setValue(0);
} else if ("message".equals(propertyName)) {
String text = (String)(evt.getNewValue());
statusMessageLabel.setText((text == null) ? "" : text);
messageTimer.restart();
} else if ("progress".equals(propertyName)) {
int value = (Integer)(evt.getNewValue());
progressBar.setVisible(true);
progressBar.setIndeterminate(false);
progressBar.setValue(value);
}
}
});
}

@Action
public void showAboutBox() {
if (aboutBox == null) {
JFrame mainFrame = Interfaz_grafica_1App.getApplication().getMainFrame();
aboutBox = new Interfaz_grafica_1AboutBox(mainFrame);
aboutBox.setLocationRelativeTo(mainFrame);
}
Interfaz_grafica_1App.getApplication().show(aboutBox);
}

/** This method is called from within the constructor to


* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

mainPanel = new javax.swing.JPanel();


jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jTextField3 = new javax.swing.JTextField();
menuBar = new javax.swing.JMenuBar();
javax.swing.JMenu fileMenu = new javax.swing.JMenu();
javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenu helpMenu = new javax.swing.JMenu();
javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
statusPanel = new javax.swing.JPanel();
javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
statusMessageLabel = new javax.swing.JLabel();
statusAnimationLabel = new javax.swing.JLabel();
______________________________________________________________________
FISI UNMSM 66 Luis Guerra G.
progressBar = new javax.swing.JProgressBar();

mainPanel.setName("mainPanel"); // NOI18N

private void eventoComparar(java.awt.event.ActionEvent evt) {


// TODO add your handling code here:
String resultado="";
if(evt.getSource() == jButton1){
String cadena1=jTextField1.getText();
String cadena2=jTextField2.getText();
if(cadena1.equals(cadena2))
resultado="Son iguales";
else
resultado="No son iguales";
jTextField3.setText(resultado);

}
}

// Variables declaration - do not modify


private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel statusAnimationLabel;
private javax.swing.JLabel statusMessageLabel;
private javax.swing.JPanel statusPanel;
// End of variables declaration

private final Timer messageTimer;


private final Timer busyIconTimer;
private final Icon idleIcon;
private final Icon[] busyIcons = new Icon[15];
private int busyIconIndex = 0;

private JDialog aboutBox;

______________________________________________________________________
FISI UNMSM 67 Luis Guerra G.
Radio Buttons

Radio buttons (javax.swing.JRadioButton) son usados en grupos (java.awt.ButtonGroup), donde


pueden ser seleccionado.

Checkbox

Crea una casilla de verificacin.

import java.awt.Checkbox; o import java.awt.*;

Ejercicio:
En un Applet de Java, mostrar un Checkbox, y tres JRadioButton: tibio, frio, caliente.

Ejemplo:

import java.applet.Applet;
import java.awt.event.*;
import javax.swing.*;

public class RB extends Applet implements ActionListener, ItemListener {

private JCheckBox casilla;


private JRadioButton caliente,tibio,frio;

@Override
public void init() {

casilla=new JCheckBox("Un CheckBox");

add(casilla);

casilla.addItemListener(this);

tibio=new JRadioButton("tibio",false);
______________________________________________________________________
FISI UNMSM 68 Luis Guerra G.
add(tibio);
tibio.addItemListener(this);

frio=new JRadioButton("frio",false);

add(frio);
frio.addItemListener(this);

caliente=new JRadioButton("caliente",false);

add(caliente);
caliente.addItemListener(this);

public void actionPerformed(ActionEvent e) {


throw new UnsupportedOperationException("Not supported yet.");
}

public void itemStateChanged(ItemEvent e) {


throw new UnsupportedOperationException("Not supported yet.");
}

Clase JComboBox :

Jerarqua de clases y herencia :


java.lang.Object

java.awt.Component

java.awt.Container

javax.swing.JComponent

javax.swing.JComboBox

Por herencia, la clase JComboBox puede utilizar los datos y/o mtodos de las superclases
JComponent de la librera swing y de las superclases Container, Component y Object de la
librera awt.
Un objeto JComboBox es un componente que combina un botn o un texto editable y una lista
drop-down. Se puede seleccionar un item de la lista, el cual aparece como respuesta de la
seleccin.

______________________________________________________________________
FISI UNMSM 69 Luis Guerra G.
Ejercicio
En una aplicacin Swing de Java, en un jComboBox considerar los rubros: Color, Verde, Azul,
Amarillo, Rojo, al dar clic derecho sobre: el objeto ComboBox, en Propiedades model.

Luego en Events Item ItemStateChanged :

private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {


// Obtener el index del item seleccionado
int orden=jComboBox1.getSelectedIndex();
// Mostrar en una etiqueta el color seleccionado
switch(orden){
case 1: jLabel2.setText("Color seleccionado: Verde"); break;
case 2: jLabel2.setText("Color seleccionado: Azul"); break;
case 3: jLabel2.setText("Color seleccionado: Amarillo"); break;
case 4: jLabel2.setText("Color seleccionado: Rojo"); break;
}
}

Sobre el botn de mensaje Restablecer, se puede seleccionar el item de index 0 del ComboBox.
En el botn clic derecho: Events Action ActionPerformed:

private void btnRestablecerActionPerformed(java.awt.event.ActionEvent evt) {


// Seleccionar el item de index 0 del combobox
jComboBox1.setSelectedIndex(0);
}

______________________________________________________________________
FISI UNMSM 70 Luis Guerra G.
Ejercicio
Elabore un programa que permita leer los datos de un empleado: Nombre, Tipo de empleado, nmero de horas
trabajadas y pago por hora; calcular e imprimir el sueldo a pagar. Si el empleado es tipo 1 se le pagan las horas
extras (ms de 40 horas) a 1.5 del pago por cada hora, si es tipo 2 a 2, si es tipo 3 a 2.5 y si es tipo 4 a 3 veces el
pago por hora.

private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {

// Obtener el index del item seleccionado


int orden=jComboBox1.getSelectedIndex();
double spagar;
switch(orden){
case 1: if(Float.parseFloat(jTextField2.getText())>40)
spagar=(Float.parseFloat(jTextField2.getText())-
40)*1.5*Float.parseFloat(jTextField3.getText())+
(40*Float.parseFloat(jTextField3.getText()));

else
spagar=(Float.parseFloat(jTextField2.getText()))*Float.parseFloat(jTextField3.getTe
xt());

jLabel7.setText(Double.toString(spagar)); break;

case 2: break;

case 3: break;

case 4: break;

______________________________________________________________________
FISI UNMSM 71 Luis Guerra G.
JMenu

import java.awt.event.*;
import javax.swing.*;

public class MenuSimple extends javax.swing.JFrame implements ActionListener{


JMenuBar barraMenusCompleta;
JMenu archivoMenu,edicionMenu;
JMenuItem abrirItem;
public MenuSimple() {
initComponents();
barraMenusCompleta=new JMenuBar();
setJMenuBar(barraMenusCompleta);

archivoMenu=new JMenu("Archivo");
abrirItem=new JMenuItem("Abrir");
archivoMenu.add(abrirItem);
abrirItem.addActionListener(this);
barraMenusCompleta.add(archivoMenu);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==abrirItem){
JFileChooser selectorArchivos=new JFileChooser();
int respuestaUsuario=selectorArchivos.showOpenDialog(this);
if(respuestaUsuario==JFileChooser.CANCEL_OPTION)
JOptionPane.showMessageDialog(null, "El usuario cancelo");
else
JOptionPane.showMessageDialog(null, "El usuario
selecciono"+selectorArchivos.getSelectedFile());
}
}

public static void main(String args[]) {


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MenuSimple().setVisible(true);
}
});
}

______________________________________________________________________
FISI UNMSM 72 Luis Guerra G.
JList

Componente(clase), que permite al usuario seleccionar uno o ms objetos de una lista. Necesita
de un objeto modelo de la clase ListModel o DefaultListModel, quin representar el contenido
de la lista.

Por herencia la clase JList puede utilizar los datos y/o mtodos de las superclases JComponent de
la librera swing y de las superclases Container, Component y Object de la librera awt.

java.lang.Object

java.awt.Component

java.awt.Container

javax.swing.JComponent

javax.swing.JList

El contenido de un JList puede ser dinmico, la lista de elementos pueden cambiar de valor y el
tamao de lista tambin puede cambiar despus de haber sido creada. Los cambios que ocurren en un
JList son registrados por la interface ListDataListener.

Mtodo setModel(ListModel model)


Establece como contenido de la lista el contenido del modelo dado como parmetro.

Ejemplo:

En una aplicacin considere una lista para colocar nombres ingresados e implementar botones para
administrar la lista, agregando, hacer seleccin mltiple, seleccin simple, botn libre.

En un Proyecto nuevo- Java Application, dar nombre al proyecto por ejemplo: EjemploList, paquete:
ejemplolist, clic derecho en
el paquete, nuevo JPanel Form, por ejemplo: PanelPrincipal, y agregar los siguientes controles:

______________________________________________________________________
FISI UNMSM 73 Luis Guerra G.
Cdigo fuente, PanelPrincipal:

package ejemplolist;
import javax.swing.*;

public class PanelPrincipal extends javax.swing.JPanel {


DefaultListModel modNombres;
public PanelPrincipal() {
initComponents();
modNombres=new DefaultListModel();
jList1.setModel(modNombres);
}

Botn Agregar:
private void botonAgregarActionPerformed(java.awt.event.ActionEvent evt) {
String nombre=jTextField1.getText();
if(nombre.length()==0)
JOptionPane.showMessageDialog(this,"Debe ingresar un nombre");
else{
modNombres.addElement(nombre);
jTextField1.setText("");
}
//jLabel2.setText("En Lista: "+modNombres.size());
jTextField1.requestFocus();
}

Botn Seleccin Mltiple:


private void botonMultipleActionPerformed(java.awt.event.ActionEvent evt) {
botonMultiple.setEnabled(false);
botonSimple.setEnabled(true);
jList1.setSelectionMode(2);
}

Botn Seleccin Simple


private void botonSimpleActionPerformed(java.awt.event.ActionEvent evt) {
botonSimple.setEnabled(false);
botonMultiple.setEnabled(true);
______________________________________________________________________
FISI UNMSM 74 Luis Guerra G.
jList1.setSelectionMode(0);
}

Luego crear un nuevo JFrame Form de nombre Principal, para colocar el panel principal:

package ejemplolist;
public class Principal extends javax.swing.JFrame {
static int w=500, h=400;
public Principal() {
//initComponents();
add(new PanelPrincipal());
setSize(w,h);
setLocation((getToolkit().getScreenSize().width-w)/2,(getToolkit().getScreenSize().height-h)/2);

public static void main(String args[]) {


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
}

Ejecutar la aplicacin.

Referencia:
Java for Windows with NetBeans IDE
Julio Vasquez Paragulla

______________________________________________________________________
FISI UNMSM 75 Luis Guerra G.
CLASES GENERICAS
Clases con variables o parmetros que representan tipos.
Por ejemplo, dada una clase genrica Par que permita establecer un tipo T, para manejar enteros y
caracteres, y luego a travs de un mtodo intercambiar los valores, para luego presentar intercambiado los
valores en el programa principal.

public class Par <T>{


private T a, b;
public Par(T a, T b){
this.a = a;
this.b = b;
}
public void setA(T a){this.a=a;}
public T getA(){return a;}
public void setB(T b){this.b=b;}
public T getB(){return b;}
public Par<T> swap(){
return new Par<T>(b, a);
}
}

import java.io.*;
import javax.swing.JOptionPane;
public class Prueba {

public static void main(String[] args) {


int n1,n2;
char ca=' ',cb=' ';
System.out.println("Numeros para intercambiar usando clase generica");
n1=Integer.parseInt(JOptionPane.showInputDialog("Primer numero:"));
n2=Integer.parseInt(JOptionPane.showInputDialog("Segundo numero:"));

// Instanciacin de la clase genrica para Integer(Enteros)


// No se puede usar int porque no es una clase
Par<Integer> p = new Par<Integer>(n1,n2);
System.out.println("Par de enteros, antes del cambio: n1="+p.getA()+" n2="+p.getB());
p = p.swap();
System.out.println("Par de enteros, despues del cambio: n1="+p.getA()+" n2="+p.getB());

System.out.println("Caracteres para intercambiar usando clase generica");


InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader flujoE=new BufferedReader(isr);
PrintStream flujoS=System.out;
try{
flujoS.print("Primer caracter<letra>: ");
ca=(char)flujoE.read();
flujoE.readLine(); //Limpiar caracteres: \r\n
flujoS.print("Segundo caracter<letra>: ");
cb=(char)flujoE.read();
flujoE.readLine(); //Limpiar caracteres: \r\n
}
catch(IOException e){
System.out.println("Error:"+e.getMessage());
}
______________________________________________________________________
FISI UNMSM 76 Luis Guerra G.
// Instanciacin de la clase genrica para Character(Caracteres)
//Par<Character> p1 = new Par<Character>('a','b');
Par<Character> p1 = new Par<Character>(ca,cb);
System.out.println("Par de aracteres, antes del cambio: ca="+p1.getA()+" cb="+p1.getB());
p1=p1.swap();
System.out.println("Par de caracteres, despues del cambio: ca="+p1.getA()+" cb="+p1.getB());

}
}

Ejercicios:
1. Programa utilizando clase genrica, para hallar el menor, intemedio y mayor de tres nmeros
enteros, a su vez de tres letras.
2. Programa utilizando clase genrica para ordenar cinco nmeros y ordenar cinco letras,
ascendente y/o descendente.

Clase genrica de Conexin a Bases de datos


Una clase Genrica de conexin a bases de datos.

Una clase generica que realiza una conexin a bases de datos mysql, la cual esta declarada dentro del
paquete conexin, recibe cuatro parametros:
String ip, String bd, String usr, String pass, los cuales se pueden enviar desde otra clase en donde se
instancie y se invoque... ejemplo:

GenericaDb np = new GenericaDb("192.168.54.2","listadb","admin","4dm1n1str");

despues se puede acceder a los elementos de la clase de la siguiente forma:

//Para obtener la conexion


Connexion conexion = qpn.getConexion();

package conexion;

/****************************************
** http://www.comunidadjava.org/?q=node/430
* @author Marco A. Trejo Lemus *
* 17/06/2008 09:47:01 AM *
****************************************/

import java.sql.*;

public class GenericaDb


{
public String driver,url,ip,bd,usr,pass;
public Connection conexion;

public GenericaDb(String ip, String bd, String usr, String pass)


{ driver="com.mysql.jdbc.Driver";
this.bd = bd;
this.usr = usr;
this.pass = pass;
url = new String("jdbc:mysql://"+ip+"/"+bd);
try
{ Class.forName(driver).newInstance();
conexion=DriverManager.getConnection(url,usr,pass);

______________________________________________________________________
FISI UNMSM 77 Luis Guerra G.
System.out.println("Conexion a Base de Datos "+bd+" Ok");
}

catch (Exception exc)


{ System.out.println("Error al tratar de abrir la base de Datos"+bd+" : "+exc);
}
}

public Connection getConexion()


{ return conexion;
}

public Connection CerrarConexion() throws SQLException


{ conexion.close(); conexion = null;
return conexion;
}

} //fin de la clase

"Por mas dificil que parezca un reto si se puede alcanzar si realmente lo intentamos"

Marco Antonio Trejo Lemus ******** Comunidad Java Mxico

*****************************************************************

EXCEPCIONES
Excepciones en Java pemiten manejar situaciones anmalas.
Las palabras try y catch trabajan conjuntamente y pueden traducirse: probar un fragmento de cdigo, si es
satisfactorio continuar con la ejecucin del programa, de no ser as atrapar la excepcin y manejarla.
Ejemplo:
Dado un arreglo de objeto, para guardar diez nmeros reales, si se ingresara otro carcter(s) que no sea
nmero real, manejar la excepcin, indicando, Ese dato no es vlido. Teclee otro.
Utilizar la clase Leer, dada anteriormente.

public class LeerDatos


{
public static void main(String[] args)
{
boolean eof = true;
float[] a = new float[10];
int i = 0;
System.out.println("Ingresar datos ");
System.out.print("Dato float: ");
while (i < 10 && Float.isNaN(a[i] = Leer.datoFloat()) != eof)
{
i++;
System.out.print("Dato float: ");
}
System.out.println();
for (int k = 0; k < i; k++)
System.out.print(a[k] + " ");
System.out.println();

}
}
import java.io.*;
public class Leer
{
public static String dato()
______________________________________________________________________
FISI UNMSM 78 Luis Guerra G.
{
String sdato = "";
try
{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
// Leer. La entrada finaliza al pulsar la tecla Entrar
sdato = flujoE.readLine();
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
return sdato; // devolver el dato tecleado
}

public static short datoShort()


{
try
{
String sdato = dato();
if (sdato == null)
{
System.out.println();
return Short.MIN_VALUE;
}
else
return Short.parseShort(sdato);
}
catch(NumberFormatException e)
{
System.out.print("Ese dato no es vlido. Teclee otro: ");
return datoShort();
}
}

public static int datoInt()


{
try
{
String sdato = dato();
if (sdato == null)
{
System.out.println();
return Integer.MIN_VALUE;
}
else
return Integer.parseInt(sdato);
}
catch(NumberFormatException e)
{
System.out.print("Ese dato no es vlido. Teclee otro: ");
return datoInt();
}
}

public static long datoLong()


{
______________________________________________________________________
FISI UNMSM 79 Luis Guerra G.
try
{
String sdato = dato();
if (sdato == null)
{
System.out.println();
return Long.MIN_VALUE;
}
else
return Long.parseLong(sdato);
}
catch(NumberFormatException e)
{
System.out.print("Ese dato no es vlido. Teclee otro: ");
return datoLong();
}
}

public static float datoFloat()


{
try
{
String sdato = dato();
if (sdato == null)
{
System.out.println();
return Float.NaN; // No es un Nmero; valor float.
}
else
{
Float f = new Float(sdato);
return f.floatValue();
}
}
catch(NumberFormatException e)
{
System.out.print("Ese dato no es vlido. Teclee otro: ");
return datoFloat();
}
}
/*
public static float datoFloat()
{
try
{
Float f = new Float(dato());
return f.floatValue();
}
catch(NumberFormatException e)
{
System.out.print("Ese dato no es vlido. Teclee otro: ");
return datoFloat();
}
catch(NullPointerException e)
{
return Float.NaN; // No es un Nmero; valor float.
}
}
*/
______________________________________________________________________
FISI UNMSM 80 Luis Guerra G.
public static double datoDouble()
{
try
{
Double d = new Double(dato());
return d.doubleValue();
}
catch(NumberFormatException e)
{
System.out.print("Ese dato no es vlido. Teclee otro: ");
return datoDouble();
}
catch(NullPointerException e)
{
return Double.NaN; // No es un Nmero; valor double.
}
}
} //******** Bibliografa Cap. 11 Ceballos Java 2

Excepciones Propias
Ejemplo:
Se conoce la longitud de los tres lados enteros de un tringulo, el rea puede calcularse de la
siguiente manera:

area = Math.sqrt(s*(s-a)*(s-b)*(s-c));
donde: s=(a+b+c)/2

En un programa elabore un mtodo para calcular y devolver el rea; permita que lance una
excepcin cuando las tres longitudes no puedan formar un tringulo. Desarrolle un mtodo
invocador que atrape la excepcin

import java.util.InputMismatchException;
import java.util.Scanner;
class Cuando3LnofT extends Exception{}
public class ExcepcionCuando3LnofT {
public static double area(double l1,double l2, double l3) throws Exception, InputMismatchException{
double s,carea;
if(l1<l2+l3 && l2<l1+l3 && l3<l1+l2){
s=(l1+l2+l3)/2;
carea=Math.sqrt(s*(s-l1)*(s-l2)*(s-l3));
return carea;
}
else
throw new Cuando3LnofT();
}
public static void main(String[] args) throws Exception{
Scanner lado=new Scanner(System.in);
double resultado=0;
try{
System.out.println("Tres lados enteros de un triangulo para hallar area:");
System.out.println("\n 1er lado: ");
double lado1=lado.nextDouble();
System.out.println("\n 2do lado: ");
______________________________________________________________________
FISI UNMSM 81 Luis Guerra G.
double lado2=lado.nextDouble();
System.out.println("\n 3er lado: ");
double lado3=lado.nextDouble();
resultado = area(lado1, lado2, lado3);
System.out.println("El area es:"+resultado);
}
catch(Cuando3LnofT e){
System.err.println("ERROR: los tres lados no forman un triangulo");
}
catch(InputMismatchException inputMismatchException){
System.err.printf("\n Excepcion: %s\n",inputMismatchException);
System.out.println("Debe ingresar numeros enteros. Intente de nuevo\n");
}
}
}

PERSISTENCIA
Caracterstica de la programacin orientada a objetos que permite la persistencia de los objetos.
Llevar la informacin a disco, y reconstruir despus en el momento de la lectura.

import java.io.*;
/////////////////////////////////////////////////////////////////
// Aplicacin: Lista de telfonos. Cuando la aplicacin finaliza
// la lista es salvada en un archivo "listatfnos.dat" y cuando
// se inicia se recupera de ese archivo.
//
public class Test
{
public static int men()
{
System.out.print("\n\n");
System.out.println("1. Buscar");
System.out.println("2. Buscar siguiente");
System.out.println("3. Aadir");
System.out.println("4. Eliminar");
System.out.println("5. Salir");
System.out.println();
System.out.print(" Opcin: ");
int op;
do

______________________________________________________________________
FISI UNMSM 82 Luis Guerra G.
op = Leer.datoInt();
while (op < 1 || op > 5);
return op;
}

public static void main(String[] args)


{
// Definir un flujo de caracteres de entrada: flujoE
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader flujoE = new BufferedReader(isr);
// Definir una referencia al flujo estndar de salida: flujoS
PrintStream flujoS = System.out;

CListaTfnos listatfnos;
int opcin = 0, pos = -1;
String cadenabuscar = null;
String nombre, direccin;
long telfono;
boolean eliminado = false;
boolean listaModificada = false;

try
{
// Crear un objeto lista de telfonos vaco (con 0 elementos)
// o, crear un objeto con el contenido del archivo listatfnos.dat si existe.
File fichero = new File("listatfnos.dat");
if (!fichero.exists())
{
listatfnos = new CListaTfnos();
flujoS.println("Se ha creado una lista de telfonos nueva");
}
else
{
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("listatfnos.dat"));
listatfnos = (CListaTfnos)ois.readObject();
ois.close();
flujoS.println("Se carg la lista de telfonos con xito");
}
do
{

______________________________________________________________________
FISI UNMSM 83 Luis Guerra G.
opcin = men();

switch (opcin)
{
case 1: // buscar
flujoS.print("conjunto de caracteres a buscar ");
cadenabuscar = flujoE.readLine();
pos = listatfnos.buscar(cadenabuscar, 0);
if (pos == -1)
if (listatfnos.longitud() != 0)
flujoS.println("bsqueda fallida");
else
flujoS.println("lista vaca");
else
{
flujoS.println(listatfnos.valorEn(pos).obtenerNombre());
flujoS.println(listatfnos.valorEn(pos).obtenerDireccin());
flujoS.println(listatfnos.valorEn(pos).obtenerTelfono());
}
break;
case 2: // buscar siguiente
pos = listatfnos.buscar(cadenabuscar, pos + 1);
if (pos == -1)
if (listatfnos.longitud() != 0)
flujoS.println("bsqueda fallida");
else
flujoS.println("lista vaca");
else
{
flujoS.println(listatfnos.valorEn(pos).obtenerNombre());
flujoS.println(listatfnos.valorEn(pos).obtenerDireccin());
flujoS.println(listatfnos.valorEn(pos).obtenerTelfono());
}
break;
case 3: // aadir
flujoS.print("nombre: "); nombre = flujoE.readLine();
flujoS.print("direccin: "); direccin = flujoE.readLine();
flujoS.print("telfono: "); telfono = Leer.datoLong();
listatfnos.aadir(new CPersona(nombre, direccin, telfono));
listaModificada = true;
break;

______________________________________________________________________
FISI UNMSM 84 Luis Guerra G.
case 4: // eliminar
flujoS.print("telfono: "); telfono = Leer.datoLong();
eliminado = listatfnos.eliminar(telfono);
if (eliminado)
{
flujoS.println("registro eliminado");
listaModificada = true;
}
else
if (listatfnos.longitud() != 0)
flujoS.println("telfono no encontrado");
else
flujoS.println("lista vaca");
break;
case 5: // salir
// guardar lista
if (listaModificada)
{
ObjectOutputStream ous = new ObjectOutputStream(
new FileOutputStream("listatfnos.dat"));
ous.writeObject(listatfnos);
ous.close();
}
listatfnos = null;
}
}
while(opcin != 5);
}
catch (IOException e)
{
System.out.println("Error: " + e.getMessage());
}
catch (ClassNotFoundException e)
{
System.out.println("Error: " + e.getMessage());
}
}
}
/////////////////////////////////////////////////////////////////
// Definicin de la clase CListaTfnos.
//

______________________________________________________________________
FISI UNMSM 85 Luis Guerra G.
import java.io.*;
public class CListaTfnos implements Serializable
{
private CPersona[] listaTelfonos; // matriz de objetos
private int nElementos; // nmero de elementos de la matriz

private CPersona[] asignarMemoria(int nElementos)


{
try
{
return new CPersona[nElementos];
}
catch (OutOfMemoryError e)
{
System.out.println(e.getMessage());
return listaTelfonos;
}
}

public CListaTfnos()
{
// Crear una lista vaca
nElementos = 0;
listaTelfonos = asignarMemoria(nElementos);
}

private void unElementoMs(CPersona[] listaActual)


{
nElementos = listaActual.length;
listaTelfonos = asignarMemoria(nElementos + 1);
// Copiar la lista actual
for ( int i = 0; i < nElementos; i++ )
listaTelfonos[i] = listaActual[i];
nElementos++;
}

private void unElementoMenos(CPersona[] listaActual)


{
if (listaActual.length == 0) return;
int k = 0;
nElementos = listaActual.length;

______________________________________________________________________
FISI UNMSM 86 Luis Guerra G.
listaTelfonos = asignarMemoria(nElementos - 1);
// Copiar la lista actual
for ( int i = 0; i < nElementos; i++ )
if (listaActual[i] != null)
listaTelfonos[k++] = listaActual[i];
nElementos--;
}

public void ponerValorEn( int i, CPersona objeto )


{
if (i >= 0 && i < nElementos)
listaTelfonos[i] = objeto;
else
System.out.println("ndice fuera de lmites");
}

public CPersona valorEn( int i )


{
if (i >= 0 && i < nElementos)
return listaTelfonos[i];
else
{
System.out.println("ndice fuera de lmites");
return null;
}
}

public int longitud() { return nElementos; }

public void aadir(CPersona obj)


{
unElementoMs(listaTelfonos);
ponerValorEn( nElementos - 1, obj );
}

public boolean eliminar(long tel)


{
// Buscar el telfono y eliminar registro
for ( int i = 0; i < nElementos; i++ )
if (listaTelfonos[i].obtenerTelfono() == tel)
{

______________________________________________________________________
FISI UNMSM 87 Luis Guerra G.
listaTelfonos[i] = null;
unElementoMenos(listaTelfonos);
return true;
}
return false;
}

public int buscar(String str, int pos)


{
String nom;
if (str == null) return -1;
if (pos < 0) pos = 0;
for ( int i = pos; i < nElementos; i++ )
{
nom = listaTelfonos[i].obtenerNombre();
if (nom == null) continue;
// str est contenida en nom?
if (nom.indexOf(str) > -1)
return i;
}
return -1;
}
}
/////////////////////////////////////////////////////////////////
// Definicin de la clase CPersona
//
import java.io.*;
public class CPersona implements Serializable
{
// Atributos
private String nombre;
private String direccin;
private long telfono;

// Mtodos
public CPersona() {}
public CPersona(String nom, String dir, long tel)
{
nombre = nom;
direccin = dir;
telfono = tel;

______________________________________________________________________
FISI UNMSM 88 Luis Guerra G.
}

public void asignarNombre(String nom)


{
nombre = nom;
}

public String obtenerNombre()


{
return nombre;
}

public void asignarDireccin(String dir)


{
direccin = dir;
}

public String obtenerDireccin()


{
return direccin;
}

public void asignarTelfono(long tel)


{
telfono = tel;
}

public long obtenerTelfono()


{
return telfono;
}
}

______________________________________________________________________
FISI UNMSM 89 Luis Guerra G.
CONEXIN A BASE DE DATOS: JAVA SQL SERVER

Probar DSN en SQL SERVER

package paquetePconexion;

import java.sql.*;

public class PanelPrincipal extends javax.swing.JPanel {

/** Creates new form PanelPrincipal */


public PanelPrincipal() {
initComponents();
}

private void btnProbarDsnDatosActionPerformed(java.awt.event.ActionEvent evt) {


try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa","");
DatabaseMetaData meta=cn.getMetaData();
txtSalida.append("\nDatabase:\t"+meta.getDatabaseProductName());
txtSalida.append("\nversion:\t"+meta.getDatabaseProductVersion());
cn.close();
}
catch(Exception ex){
txtSalida.setText("La conexion fracas por:\n\n");
txtSalida.append(ex.toString());
}
}

private javax.swing.JButton btnProbarDsnDatos;


private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea txtSalida;

public class Principal extends javax.swing.JFrame {

/** Creates new form Principal */


public Principal() {
initComponents();
add(new PanelPrincipal());
setSize(300,200);
}

public static void main(String args[]) {


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}

______________________________________________________________________
FISI UNMSM 90 Luis Guerra G.
}

Mantenimiento a una Base de Datos

Se podr insertar, eliminar y actualizar registros de una tabla mediante las sentencias del SQI:
Insert, Delete y Update.

La sentencia INSERT
INSERT INTO NombreTabla (ColumnasDeTabla) VALUES (DatosParaColumnas)

Ejemplo:
Insert Into Personas (Nombre, edad) Values (Sergio Vsquez Fano,17)

La sentencia DELETE
DELETE FROM NombreTabla WHERE CondicinDeBsqueda

Ejemplo:
Delete From Personas Where Nombre like Sergio Vsquez Fano

La sentencia UPDATE
UPDATE Nombre Tabla SET Columna 1 = Expresin, Columna 2 = Expresin...
WHERE CondicinDeBsqueda

Ejemplos:
Update Personas Set Edad = 22 Where Nombre = Diva Martinez

______________________________________________________________________
FISI UNMSM 91 Luis Guerra G.
EJEMPLO (NetBeans SqlServer)
Desarrollar una aplicacin que permite dar mantenimiento (nuevo, eliminar y
actualizar datos) a una tabla de una base de datos creada con SQL Server en
un men de opciones.

Paso 1:
Ejecutar en el Analizador de Consultas(Quero Analyzer) del SQL Server el siguiente script:

-- Crea base de datos con nombre: Datos


CREATE DATABASE Datos
ON PRIMARY(NAME=DatosData, FILENAME='c:\Datos.mdf')
LOG ON(NAME=DatosLog, FILENAME='c:\Log.ldf')

GO
USE Datos -- activa Datos
GO
-- crea tabla Personas
Create Table Personas(idPersona int identity(1,1),Nombre varchar(60) NOT NULL,Email
varchar(60),Telefono varchar(10))
-- Inserta filas a tabla personas
Insert Personas values('Joel Penia','jp99@gmail.com','1234567')
Insert Personas(Nombre,Email,Telefono) values('Beatriz Llontop','btop777@hotmail.com','7654321')

Paso 2:
El paso consiste en crear el dsn: dsnDatos mediante ODBC y debe apuntar a la base de datos:
Datos del paso 1.

______________________________________________________________________
FISI UNMSM 92 Luis Guerra G.
Paso 3:
Una vez creada la base de datos (Datos) y el dsn (dsnDatos), entonces podemos iniciar el
desarrollo de nuestra aplicacin.

Nuevo proyecto de nombre ProyectoBds1, nuevo paquete de nombre proyectobds1.

Las clases para sta aplicacin son: JDBComboBox, JDBTable, Mantenimiento, MiMenu,
PanelNuevo, PanelEliminar y PanelActualizar.

package proyectobds1;

import java.sql.*;
import javax.swing.*;

public class JDBComboBox extends JComboBox{


// constructor
public JDBComboBox(String select, String dsn, String login, String password){
try{
Class.forName("sun.jdbc.odbc.Jdbc0dbcDriver");
Connection cn = DriverManager.getConnection("jdbc:odbc:"+dsn, login, password);
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(select);

while(rs.next()) addItem(rs.getString(1)); // columna 1


cn.close ( );
}
catch(Exception ex){
String s = "La consulta fracas por: \n\n" + ex.toString();
JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE);
} // fin del catch
} // fin del constructor
} // fin de la clase

package proyectobds1;

import java.sql.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;

public class JDBTable extends JTable{


Vector cache;

______________________________________________________________________
FISI UNMSM 93 Luis Guerra G.
int colCount;
String[] headers;
public JDBTable(String dsn, String login, String password, String query){
setModel(formaMiTabla(dsn,login,password,query));
}
public TableModel formaMiTabla(String dsn, String login, String password, String query){
cache=new Vector();
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:"+dsn,login,password);
Statement st=cn.createStatement();
ResultSet rs=st.executeQuery(query);
ResultSetMetaData meta=rs.getMetaData();
colCount =meta.getColumnCount();

// nombres de columnas
headers=new String[colCount];
for(int h=1;h<=colCount;h++){
headers[h-1]=meta.getColumnName(h);
}
while(rs.next()){
String[] record=new String[colCount];
for(int i=0;i<colCount;i++)
record[i]=rs.getString(i+1);
cache.addElement(record);
}
// notifica que tenemos una nueva tabla
((AbstractTableModel)getModel()).fireTableChanged(null);
cn.close();
}
catch(Exception e){
JOptionPane.showMessageDialog(null, "Fracas por:\n\n"+e.toString());
}
return new AbstractTableModel(){
//titulo de columna
@Override
public String getColumnName(int i){
return headers[i];
}
// cuntas columnas
public int getColumnCount(){ return colCount;}

______________________________________________________________________
FISI UNMSM 94 Luis Guerra G.
// cuntas filas
public int getRowCount(){ return cache.size();}
//cadena en fila, columna. Inicia en (0,0)
public Object getValueAt(int row, int col){
return ((String[])cache.elementAt(row))[col];
}
};
}
}
package proyectobds1;
import java.awt.event.*;
import javax.swing.*;
public class Mantenimiento extends JFrame{
public Mantenimiento(String s,JPanel p, int width, int height){
super(s);
getContentPane().add(p);
addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
setVisible(false);
dispose();
}
});
setSize(width,height);
setVisible(true);
}
}

A continuacin, construimos un Frame para el men en una clase de nombre MiMen. Clic
derecho en el paquete proyectobds1, nuevo JFrame, nuevo JFrame Form de nombre MiMenu
donde hacemos el siguiente diseo:

Mi Menu con BorderLayout. En el norte colocamos una barra de men (jMenuBar1) donde
modificamos las opciones por defecto y agregamos un nuevo men para Ver la tabla de
personas. En cada opcin de men colocamos sus respectivos Menu Items hasta lograr el diseo
requerido. Utilice la propiedad title para escribir un ttulo del frame.
Observe la distribucin de los objetos y los nombres de variable utilizados.

______________________________________________________________________
FISI UNMSM 95 Luis Guerra G.
Vamos al cdigo fuente (source) de MiMenu para establecer el tamao de la ventana y escribir
un mtodo que retorne el men Item que permite ver la tabla de personas.

package proyectobds1;
import java.sql.*;
import javax.swing.*;
public class MiMenu extends javax.swing.JFrame {
public MiMenu() {
initComponents();
setSize(500,400);
}
public JMenuItem getMniVerTablaPersonas(){
return mniVerTablaPersonas;
}

Regresamos al diseo de MiMenu y hacemos clic derecho en el menultem Salir, elegimos


Events, Action, ActionPerformed para programar su accin

private void mniArchivoSalirActionPerformed(java.awt.event.ActionEvent evt) {


dispose();
System.exit(0);
}
______________________________________________________________________
FISI UNMSM 96 Luis Guerra G.
Regresamos al diseo de MiMenu y hacemos clic derecho en el menultem Mantenimiento-
Nuevo, elegimos Events, Action, ActionPerformed para programar su accin.

private void mniMantenimientoNuevoActionPerformed(java.awt.event.ActionEvent evt) {


new Mantenimiento("Nuevo Registro", new PanelNuevo(this),300,200);
}

Regresamos al diseo de MiMenu y hacemos clic derecho en el menultem Ver Tabla de


Personas, elegimos Events, Action, ActionPerformed para programar su accin.

private void mniVerTablaPersonasActionPerformed(java.awt.event.ActionEvent evt) {


JDBTable jdbt=new JDBTable("dsnDatos","sa","","Select Nombre, Email, Telefono from
Personas");
getContentPane().removeAll();
getContentPane().add(jdbt);
paintComponents(getContentPane().getGraphics());
}
public boolean hayRegistros(String select){
boolean hay=false;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa","");
Statement st=cn.createStatement();
ResultSet rs=st.executeQuery(select);
hay=rs.next();
cn.close();
}
catch(Exception ex){
String s="El Select fracas por:\n\n"+ex.toString();
JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE);
}
return hay;
}

public static void main(String args[]) {


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MiMenu().setVisible(true);
}
});
}
______________________________________________________________________
FISI UNMSM 97 Luis Guerra G.
// Variables declaration - do not modify
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem mniArchivoSalir;
private javax.swing.JMenuItem mniMantenimientoActualizar;
private javax.swing.JMenuItem mniMantenimientoEliminar;
private javax.swing.JMenuItem mniMantenimientoNuevo;
private javax.swing.JMenuItem mniVerTablaPersonas;
private javax.swing.JMenu mnuArchivo;
private javax.swing.JMenu mnuMantenimiento;
private javax.swing.JMenu mnuVer;
// End of variables declaration

}
A continuacin diseamos el PanelNuevo. Clic derecho en el paquete proyectobds1, nuevo
JPanelForm de nombre PanelNuevo donde hacemos el siguiente diseo.

PanelNuevo con BorderLayout. En el sur colocamos un botn para grabar.

En el centro colocamos otro panel (jPanel1) con BorderLayout. En el oste colocamos otro
panel (jPanel2) con GridLayout de 1 columna, 3 filas donde colocamos las etiquetas.

En el centro del panel jPanel1 colocamos otro panel (jPanel3) con GridLayout de 1 columna,
3. filas donde colocamos las cajas de texto.

Observe la distribucin de los objetos y los nombres de variable utilizados.

______________________________________________________________________
FISI UNMSM 98 Luis Guerra G.
Vamos al cdigo fuente (source) de PanelNuevo para declarar un objeto Men y recibirlo a
travs de su constructor:
package proyectobds1;

import java.sql.*;
import javax.swing.*;

public class PanelNuevo extends javax.swing.JPanel {


MiMenu menu=null;
/** Creates new form PanelNuevo */
public PanelNuevo(MiMenu menu) {
initComponents();
this.menu=menu;
}

Regresamos al diseo del PanelNuevo y hacemos doble clic en el botn Grabar para
programar su accin:

______________________________________________________________________
FISI UNMSM 99 Luis Guerra G.
private void btnGrabarActionPerformed(java.awt.event.ActionEvent evt) {
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa","");
Statement st=cn.createStatement();

String no=txtNombre.getText();
String em=txtEmail.getText();
String te=txtTelefono.getText();

if(no.length()!=0)
st.execute("Insert Into Personas Values('"+no+"','"+em+"','"+te+"')");
cn.close();
menu.getMniVerTablaPersonas().doClick(); // Actualiza JTable
} catch(Exception ex){
String s = "La sentencia fracas por: \n\n" + ex.toString();
JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE);
}
// cierra el formulario
((Mantenimiento) getTopLevelAncestor()).dispose();
}

Referencia:
Java for Windows with NetBeans IDE
Julio Vsquez Paragulla
Captulo 13

______________________________________________________________________
FISI UNMSM 100 Luis Guerra G.
Seguidamente diseamos el PanelEliminar. Clic derecho en el paquete proyectobds1, nuevo
JPanelForm de nombre PanelEliminar donde hacemos el siguiente diseo:
PanelEliminar con BorderLayout. En el sur colocamos un botn para eliminar un registro.
En el norte colocaremos un comboBox con los nombres de personas que se encuentren en la
tabla de la base de datos, pero lo haremos escribiendo el cdigo.

Vamos al cdigo fuente (source) del PanelEliminar para escribir lo siguiente:

package proyectobds1;
import java.awt.BorderLayout;
import proyectobds1.JDBComboBox;
public class PanelEliminar extends javax.swing.JPanel {
JDBComboBox lst = new JDBComboBox("Select Nombre From
Personas","dsnDatos","sa","");
MiMenu menu = null;

public PanelEliminar(MiMenu menu) {


initComponents();
this.menu=menu;
add(lst,BorderLayout.NORTH);

______________________________________________________________________
FISI UNMSM 101 Luis Guerra G.
}
private javax.swing.JButton btnEliminar;
}

Observe que el objeto lst de la clase JDBComboBox es creado y agregado al norte del panel.
Regresamos al diseo del PanelEliminar y hacemos doble clic en el botn Eliminar para
programar su accin:

private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {


try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa","");
Statement st=cn.createStatement();
String n=lst.getSelectedItem().toString();
st.execute("Delete From Personas Where Nombre like '"+n+"'");
cn.close();
menu.getMniVerTablaPersonas().doClick(); // Actualiza JTable
}
catch(Exception ex){
String s="La sentencia fracas por:\n\n"+ex.toString();
JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE);
}
// cierra el formulario
((Mantenimiento) getTopLevelAncestor()).dispose();
}

private void mniMantenimientoEliminarActionPerformed(java.awt.event.ActionEvent evt) {


if(hayRegistros("select * from Personas"))
new Mantenimiento("Eliminar Registro", new PanelEliminar(this),300,200);
else
JOptionPane.showMessageDialog(null,"No hay Registros..!","Sin
Registros!",JOptionPane.ERROR_MESSAGE);
}

public boolean hayRegistros(String select){


boolean hay=false;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:dsnDatos","sa","");
Statement st=cn.createStatement();
ResultSet rs=st.executeQuery(select);
hay=rs.next();
______________________________________________________________________
FISI UNMSM 102 Luis Guerra G.
}
catch(Exception ex){
String s="El select fracas por:\n\n"+ex.toString();
JOptionPane.showMessageDialog(null,s,"Error",JOptionPane.ERROR_MESSAGE);
}
return hay;

Patrones de diseo

Modelo Vista Controlador (MVC) es un patrn de arquitectura de software que separa los
datos de una aplicacin, la interfaz de usuario, y la lgica de negocio en tres componentes
distintos. El patrn de llamada y retorno MVC (segn CMU), se ve frecuentemente en
aplicaciones web, donde la vista es la pgina HTML y el cdigo que provee de datos dinmicos a
la pgina. El modelo es el Sistema de Gestin de Base de Datos y la Lgica de negocio, y el
controlador es el responsable de recibir los eventos de entrada desde la vista.

Un diagrama sencillo que muestra la relacin entre el modelo, la vista y el


controlador. Nota: las lneas slidas indican una asociacin directa, y las
punteadas una indirecta (por ejemplo, patrn Observer

Historia
El estilo fue descrito por primera vez en 19791 por Trygve Reenskaug, entonces trabajando en
Smalltalk en laboratorios de investigacin de Xerox. La implementacin original est descrita en
Programacin de Aplicaciones en Smalltalk-80(TM): Como utilizar Modelo Vista Controlador.

Descripcin del patrn

Modelo: Esta es la representacin especfica de la informacin con la cual el sistema


opera. En resumen, el modelo se limita a lo relativo de la vista y su controlador
facilitando las presentaciones visuales complejas. El sistema tambin puede operar con
ms datos no relativos a la presentacin, haciendo uso integrado de otras lgicas de
negocio y de datos afines con el sistema modelado.
Vista: Este presenta el modelo en un formato adecuado para interactuar, usualmente la
interfaz de usuario.
Controlador: Este responde a eventos, usualmente acciones del usuario, e invoca
peticiones al modelo y, probablemente, a la vista.
______________________________________________________________________
FISI UNMSM 103 Luis Guerra G.
Muchos de los sistemas informticos utilizan un Sistema de Gestin de Base de Datos para
gestionar los datos: en lneas generales del MVC corresponde al modelo. La unin entre capa de
presentacin y capa de negocio conocido en el paradigma de la Programacin por capas
representara la integracin entre Vista y su correspondiente Controlador de eventos y acceso a
datos, MVC no pretende discriminar entre capa de negocio y capa de presentacin pero si
pretende separar la capa visual grfica de su correspondiente programacin y acceso a datos,
algo que mejora el desarrollo y mantenimiento de la Vista y el Controlador en paralelo, ya que
ambos cumplen ciclos de vida muy distintos entre s.
Aunque se pueden encontrar diferentes implementaciones de MVC, el flujo que sigue el control
generalmente es el siguiente:

1. El usuario interacta con la interfaz de usuario de alguna forma (por ejemplo, el usuario
pulsa un botn, enlace, etc.)
2. El controlador recibe (por parte de los objetos de la interfaz-vista) la notificacin de la
accin solicitada por el usuario. El controlador gestiona el evento que llega,
frecuentemente a travs de un gestor de eventos (handler) o callback.
3. El controlador accede al modelo, actualizndolo, posiblemente modificndolo de forma
adecuada a la accin solicitada por el usuario (por ejemplo, el controlador actualiza el
carro de la compra del usuario). Los controladores complejos estn a menudo
estructurados usando un patrn de comando que encapsula las acciones y simplifica su
extensin.
4. El controlador delega a los objetos de la vista la tarea de desplegar la interfaz de usuario.
La vista obtiene sus datos del modelo para generar la interfaz apropiada para el usuario
donde se reflejan los cambios en el modelo (por ejemplo, produce un listado del
contenido del carro de la compra). El modelo no debe tener conocimiento directo sobre la
vista. Sin embargo, se podra utilizar el patrn Observador para proveer cierta indireccin
entre el modelo y la vista, permitiendo al modelo notificar a los interesados de cualquier
cambio. Un objeto vista puede registrarse con el modelo y esperar a los cambios, pero
aun as el modelo en s mismo sigue sin saber nada de la vista. Este uso del patrn
Observador no es posible en las aplicaciones Web puesto que las clases de la vista estn
desconectadas del modelo y del controlador. En general el controlador no pasa objetos de
dominio (el modelo) a la vista aunque puede dar la orden a la vista para que se actualice.
Nota: En algunas implementaciones la vista no tiene acceso directo al modelo, dejando
que el controlador enve los datos del modelo a la vista. Por ejemplo en el MVC usado
por Apple en su framework Cocoa. Suele citarse como Modelo-Interface-Control, una
variacin del MVC ms puro
5. La interfaz de usuario espera nuevas interacciones del usuario, comenzando el ciclo
nuevamente.

______________________________________________________________________
FISI UNMSM 104 Luis Guerra G.
REFERENCIAS

1. Joyanes, Luis; Zahonero, Luis. Programacin en C, C++, Java y UML. 2010. Edit. Mc
Graw Hill. Mxico.

2. Deitel & Deitel. Java como programar. 2008. Edit. Pearson Prentice Hall. Mxico.

3. Francisco, Javier Ceballos. Java 2. Curso de Programacin. 2000 . Edit. Alfa Omega Ra-
ma. Espaa.

4. Douglas Bell, Mike Parr. Java para estudiantes. 2003. Edit. Pearson.

5. Jhon Zukowski. Java 2. 2003. Edit. Anaya Multimedia.

6. Marco Trejo Lemus. Comunidad Java Mxico.


http://www.comunidadjava.org/?q=node/43. 17-6-2008.

7. Garca-Bermejo, Jos Rafael. Java SE6 & Swing. 2007. Edit. Pearson. Espaa.

8. Coronel Castillo, Eric. Java y MySql. 2009. Editora Macro. Per.

9. Vsquez Paragulla, Julio. Java SE for Windows with NetBeans IDE. 2008. Lima.

______________________________________________________________________
FISI UNMSM 105 Luis Guerra G.

Das könnte Ihnen auch gefallen