Programación Orientada a Objetos. Antecedentes del Lenguaje Java

Texto completo

(1)

Programación Orientada a Objetos

La Programación Orientada a Objetos es un paradigma de programación diferente a la

Programación Estructurada o a la misma Programación Procedural al que la mayoría de los

programadores están acostumbrados a utilizar.

En la Programación Estructurada y la Programación Procedural lo mas importante es el

procedimiento que se esta desarrollando a través de un lenguaje de programación.

En Programación Orientada a Objetos, se hace un gran énfasis a los datos, y todo gira alrededor de

ellos.

Cada vez que alguien quiere hacer una aplicación, debe de pensar en los elementos (datos) que va

a utilizar para programar, y la relación que existe entre estos datos, en su forma de interactuar

entre si.

Cuando queremos hacer una aplicación de alumnos que estan inscritos en algunas materias con

ciertos profesores, entonces debemos de pensar en los diferentes datos a manejar: Alumnos,

Materias, Profesores, etc.

Pensar en estos elementos y pensar en todo lo que esta alrededor de ellos para poder tipificarlos en

los elementos que definen la Programación Orientada a Objetos.

El mundo esta lleno de objetos y estos objetos tienen ciertas características que los hacen únicos y

esas características se derivan de atributos que agrupadas representan a una clase que compone a

los objetos definidos.

Java es un lenguaje que nos ayuda a entender mucho mejor el paradigma Orientado a Objetos de

una manera mas sencilla y natural.

Antecedentes del Lenguaje Java

Java se creó como parte de un proyecto de investigación para el desarrollo de software avanzado para una amplia variedad de dispositivos de red y sistemas embebidos. La meta era diseñar una plataforma operativa sencilla, segura, portable, distribuida y de tiempo real. Cuando se inició el proyecto, C++ era el lenguaje del momento. Pero a lo largo del tiempo, las dificultades encontradas con C++ crecieron hasta el punto en que se pensó que los problemas podrían resolverse mejor creando una plataforma de lenguaje completamente nueva.

Se hizo uso de la arquitectura y diseño de una amplia variedad de lenguajes como Eiffel, SmallTalk, Objetive C y Cedar/Mesa. El resultado es un lenguaje que se ha mostrado ideal para desarrollar aplicaciones de usuario final seguras, distribuidas y basadas en red en un amplio rango de entornos desde los dispositivos de red embebidos hasta su uso para soluciones en Internet.

Características en el Diseño de Java

(2)

esfuerzos de entrenamiento para los desarrolladores. Orientado a objetos, porque la tecnología de objetos se considera madura y es el enfoque más adecuado para las

necesidades de los sistemas distribuidos y/o cliente/servidor. Familiar, porque aunque se rechazó C++, se mantuvo Java lo más parecido posible a C++, eliminando sus

complejidades innecesarias, para facilitar la migración al nuevo lenguaje.

- Robusto y seguro: Robusto, simplificando la administración de memoria y eliminando las complejidades del uso de apuntadores y aritmética de apuntadores del C. Seguro para que pueda operar en un entorno de red.

- Independiente de la arquitertura y portable: Java está diseñado para soportar aplicaciones que serán instaladas en un entorno de red heterogéneo, con hardware y sistemas operativos diversos. Para hacer esto posible el compilador Java genera un código llamado 'bytecodes' o comúnmente conocido como código byte, un formato de código independiente de la plataforma diseñado para transportar código eficientemente a través de múltiples plataformas de hardware y software. Es además portable en el sentido de que es rigurosamente el mismo lenguaje en todas las plataformas. El 'bytecode' es traducido a código máquina y ejecutado por la Java Virtual Machine, que es la implementación Java para cada plataforma hardware-software concreta.

- Alto rendimiento: A pesar de ser interpretado, Java tiene en cuenta el rendimiento, y particularmente en las últimas versiones dispone de diversas herramientas para su optimización. Cuando se necesitan capacidades de proceso intensivas, pueden usarse llamadas a código nativo.

- Interpretado, multi-hilo y dinámico: El intérprete Java puede ejecutar codigo byte en cualquier máquina que disponga de una Máquina Virtual Java (JVM). Además Java incorpora capacidades avanzadas de ejecución multi-hilo (ejecución simultánea de más de un flujo de programa) y proporciona mecanismos de carga dinámica de clases en tiempo de ejecución.

Características del Lenguaje

ü Lenguaje de propósito general. ü Lenguaje Orientado a Objetos. ü Sintaxis inspirada en la de C/C++.

ü Lenguaje multiplataforma: Los programas Java se ejecutan sin variación (sin recompilar) en cualquier plataforma soportada (Windows, UNIX, Mac, etc.) ü Lenguaje interpretado: El intérprete a código máquina (dependiente de la

plataforma) se llama Java Virtual Machine (JVM). El compilador produce un código intermedio independiente del sistema denominado bytecode ó código byte. ü Lenguaje gratuito: Creado por SUN Microsystems, que distribuye gratuitamente el

producto base, denominado JDK (Java Development Toolkit) o actualmente J2SE (Java 2 Standard Edition).

ü API distribuida con el J2SE muy amplia. Código fuente de la API disponible.

Facilidades del J2SE (Java 2 Estándar Edition)

ü Herramientas para generar programas Java. Compilador, depurador, herramienta para documentación, etc.

ü La JVM, necesaria para ejecutar programas Java. ü La API de Java (jerarquía de clases).

(3)

ü Documentación.

Java Runtime Environment (JRE)

JRE es el entorno mínimo para ejecutar programas Java 2. Incluye la JVM y la API. Está incluida en el J2SE aunque puede descargarse e instalarse separadamente. En aquellos sistemas donde se vayan a ejecutar programas Java, pero no compilarlos, el JRE es suficiente.

El JRE incluye el Java Plug-in, que es el 'añadido' que necesitan lo navegadores (Explorer o Netscape) para poder ejecutar programas Java 2. Es decir que instalando el JRE se tiene soporte completo Java 2, tanto para aplicaciones normales (denominadas 'standalone') como para Applets (programas Java que se ejecutan en una página Web, cuando esta es accedida desde un navegador).

Variables, Operaciones y Jerarquía en las Operaciones

En Java existen dos categorías de tipos de datos: • Tipos Primitivos. Los cuales se definen abajo.

• Referencias. Las cuales corresponden a clases y objetos que se tratarán posteriormente.

Tipos primitivos

Los tipos primitivos son los que permiten manipular valores numéricos (con distintos grados de precisión), caracteres y valores boléanos (verdadero / falso). Los Tipos Primitivos son:

boolean: Puede contener los valores true o false. byte: Enteros. Tamaño 8-bits. Valores entre -128 y 127. short: Enteros. Tamaño 16-bits. Entre -32768 y 32767.

int: Enteros. Tamaño 32-bits. Entre -2147483648 y 2147483647. long: Enteros. Tamaño 64-bits. Entre -9223372036854775808 y

9223372036854775807.

float: Números en coma flotante. Tamaño 32-bits. double: Números en coma flotante. Tamaño 64-bits.

char: Caracteres. Tamaño 16-bits. Unicode. Desde '\u0000' a '\uffff' inclusive. Esto es desde 0 a 65535

Variables

Una variable es un área en memoria que tiene un nombre y un Tipo asociado. El Tipo es o bien un Tipo primitivo o una Referencia.

Es obligatorio declarar las variables antes de usarlas. Para declararlas se indica su nombre y su Tipo, de la siguiente forma:

(4)

Ejemplos:

int i; // Declaracion de un entero char letra; // Declaracion de un caracter boolean flag; // Declaracion de un booleano

El; es el separador de instrucciones en Java.

• El símbolo // indica comentarios de línea, se ponen después de una instrucción para comentarla, el compilador no las toma al detectarlas.

• En Java las mayúsculas y minúsculas son significativas. No es lo mismo el nombre letra que Letra.

• Todas las palabras reservadas del lenguaje van en minúsculas.

Se pueden asignar valores a las variables mediante la instrucción de asignación (=). Por ejemplo:

i = 5; // a la variable i se le asigna el valor 5 letra = 'c'; // a la variable letra se le asigna el valor 'c' flag = false; // a la variable flag se le asigna el valor false

La declaración y la asignación se pueden combinar en una sola expresión: int i = 5;

char letra = 'c'; boolean flag = false;

Operaciones Básicas

En java al igual que en C++ se tienen una serie de operadores que ayudan a obtener cálculos, dependiendo de los valores a utilizar, Java trabaja con los siguientes operadores:

Operadores Aritméticos

Operador en Java Significado

+ suma

- resta

* multiplicación

/ división

% residuo

Todos los operadores que se muestran en esta tabla son binarios; es decir, trabajan con dos operandos.

Los operadores +, - y * funcionan de la manera conocida.

El operador / funciona de diferente manera si trabaja con datos de tipo entero o de tipo flotante. Con datos de tipo flotante funciona de la manera tradicional; pero al realizarse una

(5)

división entre dos números enteros, el operador / regresa el cociente de la división entera; es decir, regresa la parte entera del resultado (si hay fracción la elimina).

Por ejemplo: 2/3 da como resultado 0

pero

2.0/3.0 da como resultado 0.66666

Una manera de visualizar esto es a través de un applet que dibuje el resultado de una

operación entera, en este caso utilizaremos el método drawString() como lo hicimos antes, y hacemos uso del operador + que cuando es utilizado después de un String (cadena de caracteres) en Java funciona como concatenación.

Tenemos entonces que la siguiente codificación: import java.awt.*;

import java.applet.*;

// <applet width="200" height="200" code="Pru"></applet> public class Pru extends Applet {

public void paint(Graphics g) { int x;

x = 2 / 3;

g.drawString("2 / 3 = "+x, 100, 100); }

}

Dará como resultado:

Observa como utilizamos dentro del applet Pru.java el comentario // <applet width="200" height="200" code="Pru"></applet>

(6)

navegador o visualizador de applets lo que requiere para ejecutar el applet es solamente la directiva <applet>, hacemos uso de esta línea como comentario dentro del applet, de manera que al compilar no da un error por esta instrucción y al usar el visualizador de applets, se utiliza el mismo archivo, como se muestra en la ventana de comandos de DOS donde se compilo y uso la clase anterior:

Al estar haciendo operaciones, si hay operandos de diferentes tipos de datos, se convierten al tipo de datos más amplio y el tipo del valor resultante es del tipo más amplio. Por ejemplo, si hay enteros y flotantes, todos los números se convierten a flotantes y el resultado se calcula como flotante.

Por ejemplo: 4/3.0 da como resultado 1.3333

El operador % calcula el residuo de la división entera y sólo existe para datos de tipo entero Por ejemplo:

10%3 da como resultado 1

Otros operadores de Asignación

En Java, como en C++, es posible abreviar algunas expresiones de asignación como se muestra en la siguiente tabla:

Operador Expresión equivalente

v + = e v = v + e

v - = e v = v – e

v * = e v = v * e

v / = e v = v / e

v % = e v = v % e

Otros Operadores aritméticos

(7)

++ incremento -- decremento Es decir:

x++ ó ++x es equivalente a x = x+1 x-- ó --x es equivalente a x = x-1

Estos operadores son unitarios, es decir, trabajan con un solo operando y solamente se pueden utilizar con variables de tipo

entero.

Los operadores se pueden utilizar antes o después del nombre de la variable y funcionan de diferente manera:

• Si se ponen antes, primero se realiza la operación (incremento o decremento) y luego se utiliza el valor de la variable en la

expresión en la que se encuentre.

• Si se pone después, primero se utiliza el valor de la variable en la expresión y luego se lleva a cabo la operación (incremento o decremento).

Por ejemplo:

Supón que a = 10 y c = 4

La operación v = a * c++; v toma el valor de 40 y c queda con el valor de 5 La operación v = a * ++c; v toma el valor de 50 y c queda con el valor de 5 Jerarquía de los operadores aritméticos

Priorida

d Operadores Asociatividad

1 ( ) Empezando por los paréntesis más internos 2 ++, --, +(positivo), - (negativo) De derecha a izquierda, ++ y -- dependiendo de la posición

3 *,/,% De izquierda a derecha

4 +, - De izquierda a derecha

5 =,+=,-=,*=, /=,%= De derecha a izquierda Algunos Métodos Matemáticos Predefinidos

(8)

Java contiene una serie de métodos matemáticos que puedes utilizar en tus clases, para realizar algún cálculo, son tomados de la clase Math, esta viene dentro del paquete

java.lang, entonces para poder tomarlos dentro de una clase debes de usar la instrucción import java.lang.Math;

Antes de iniciar tu applet o aplicación. Algunos de los métodos a utilizar son: public final static double e da el valor de e.

public final static double PI da el valor de pi.

public static int abs(int a) da el valor absoluto de un entero dado.

public static long abs(float a) da el valor absoluto de un numero de punto flotante. public static double cos(double a) que te da el coseno de un valor de doble precisión.

public static double exp(double a) te da el valor de ea para un valor a de doble

precisión.

public static double pow(double a, double b) te da el valor de ab para a y b de

doble precisión.

public static double sqrt(double a) obtiene el valor de la raíz cuadrada de un valor a de doble precisión.

¿Cómo se utilizan?

Lo anterior es la definición de cada uno de los métodos de la clase Math, tu aun no estar familiarizado con esta definición, pero poco a poco entenderás su uso, vamos a entender el uso de uno de ellos.

public static double sqrt(double a) obtiene el valor de la raíz cuadrada de un valor a de doble precisión.

La definición anterior describe que sqrt es un método de tipo double y el parámetro que toma es un double, entonces algunos ejemplos de su uso son:

Ejemplo1 double a, b; a = 25.0 b = Math.sqrt(a); Ejemplo 2 int a; double b;

(9)

a = 25;

b = Math.sqrt(a);

En ejemplo 1 vemos claramente como a b le será asignado el valor real 5.0, ya que esa es la raíz cuadrada de 25.0

En ejemplo 2 pensaríamos que sería un error el tener el uso de una variable entera en lugar de una real, pero es valido asignarle a una variable real un valor entero, pero lo contrario es un error.

Utilizando Clases Definidas en Java

La manera de utilizar una clase previamente definida en Java es a través de una Aplicación modo texto o Aplicación modo gráfico (clase Frame) o un Applet (clase Applet).

Una aplicación es una clase de Java que corre como una específica aplicación en cualquier ambiente operativo, puede tener referencias a archivos, interfaz gráfica (si se desea), etc. Un applet es una clase de Java que corre dentro de un navegador y que no puede hacer referencias a archivos, también posee su interfaz gráfica.

Una aplicación debe compilarse con el archivo ejecutable javac que es el que compila dentro del paquete de java y ejecutarse con el archivo ejecutable java, se genera un archivo de

código byte (extensión .class) que es el que se interpreta por la Java Virtual Machine, que es la que depende de la máquina que utilices y de esa manera se ejecuta en cualquier ambiente, como se muestra en la figura:

(10)

El comando que aparece después del prompt > es el que se teclea dentro de una ventana de comandos del DOS.

Un applet sigue un camino parecido pero para poder visualizarse se requiere que este applet este inmerso en una página de Web, lo cual se puede hacer a través de algun editor de páginas Web, insertando un java applet en alguna opción avanzada o incrustando dentro del código de HTML las siguientes instrucciones:

<applet width="500" height="700" code="nombreapplet">

</applet>

Donde nombreapplet es el nombre del applet a utilizar, se sugiere que cuando se pruebe un applet para revisar su operación, se utilice el visualizador de applets provisto por java, tal como se muestra la figura:

(11)

Esta recomendación de la prueba de applets obedece a que si se prueba bajo un navegador de Web, aunque se hagan cambios al applet, el navegador mostrara el codigo cargado en el momento que se ejecutó por primera vez el navegador, por lo cual tendria que abandonarse la aplicación del navegador y volver a abrirla para poder ver los cambios en el applet que se este trabajando.

Aplicación

La manera de definir una Aplicación es muy sencilla, es una clase que tiene un método llamado main, dentro del cual se escriben las instrucciones que se requiere sean ejecutadas por el tiempo que dure la aplicación, muy parecido como pasa con el lenguaje de programación C++. A continuación se muestra una aplicación muy sencilla:

public class Hola {

public static void main(String args[]) {

System.out.println("Hola a todos"); }

(12)

}

(13)

Un ejemplo de la presentación de esta clase sería:

Esto sería una aplicación con interfaz modo texto para desplegar un Hola.

Toda aplicación en Java utiliza clases ya creadas anteriormente, y a través de definir y crear objetos de esas clases, es como puede llevar a cabo las funciones necesarias y propias de la aplicación. La aplicación anterior utiliza un método llamado println(), el cual se utiliza para desplegar algo en la ventana en modo texto, su uso más sencillo sin tener que crear un objeto de una clase es a través de llamarlo mediante la clase System.out. Posteriormente

revisaremos alguna aplicación donde el método println() es utilizado a través de un objeto que maneja el flujo de salida, lo cual sería la manera más adecuada de hacerlo.

La manera de hacer lo mismo en forma gráfica sería que la clase Hola fuera una clase que herede de la clase Frame, la cual en Java es utilizada para manejar una aplicación con Interfaz Gráfica.

A continuación se muestra un ejemplo de esta misma clase de aplicación con Interfaz Gráfica:

import java.awt.*;

import java.awt.event.*;

public class Holag extends Frame implements WindowListener { public static void main(String[] args) {

Holag x = new Holag(); x.setSize(400,500);

x.setTitle("Aplicación Gráfica Hola"); x.setVisible(true);

}

public Holag() {

addWindowListener(this); }

public void paint(Graphics g) { g.drawString("Hola", 100, 100); }

public void windowClosing(WindowEvent e) { System.exit(0);

(14)

public void windowOpened(WindowEvent e){} public void windowClosed(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} }

(15)

Dicha clase mostrará la siguiente ventana:

Algunas cosas que puedes entender por ahora es que cuando se trabaja en POO (Programación Orientada a Objetos) la mejor manera de hacer esto es a través de definir y crear objetos de clases, por lo mismo se esta creando un objeto de la misma aplicación, lo cual es muy común cuando hacemos aplicaciones gráficas. Observarás varios métodos que están vacios, esto es porque esta clase aplicación está heredando de una clase llamada Frame y existe una clausula llamada implements WindowListener, lo cual nos permite implementar algunos métodos de otras clases (ya que como mencionamos anteriormente no hay herencia múltiple), esta es la mejor manera de utilizar los métodos de otras clases. Todos los métodos que se nombran con la palabra window al principio pertenecen a esta clase y al implementar la clase debemos escribir todos los métodos de la clase que implementamos, aunque no tengan instrucciones en el.

Posteriormente se explicarán algunos detalles que ahora no comprenderás de la clase mostrada anteriormente, la idea aquí es que conozcas las dos diferentes maneras de mostrar una aplicación: texto y gráfica.

Applet

Un applet es una clase que posee interfaz gráfica y que está inmerso en un navegador, de manera que para poderlo utilizar requieres ejecutar el navegador o el visualizador de applets de Java.

Un applet (que es el que manejaremos más en este curso) esta compuesto por varios métodos que utlizamos de acuerdo a lo que deseamos realizar en nuestra aplicación en Web.

Como puedes revisar en la clase anterior la Holag, las primeras instrucciones son de import, estas sirven para poder incluir en nuestra aplicación de Java, otras clases que han sido codificadas anteriormente, como lo hace cualquier otro lenguaje, como el include de C++.

(16)

En la carpeta de java, existen algunas carpetas que tienen clases que estan separadas por paquetes, de acuerdo a la función de estas clases, todas las clases que tienen que ver con interfaz gráfica estan dentro del paquete awt, es por eso que necesitamos incluir todas las clases que estan dentro de este paquete, para eso utilizamos la instrucción de java import java.awt.*; lo cual le dice a Java que si se requiere alguna clase que no se encuentre en el directorio en el cual esta la clase actual, la busque en el paquete descrito, en este caso dentro de java, la carpeta awt.

Existe una clase de java muy peculiar llamada Applet, esta clase se encarga de mostrar una aplicación en Web, esta clase ya esta previamente definida, y para poder hacer un applet es necesario que se defina una clase que herede de la clase Applet, de manera que el usuario solo se encarga de reescribir los métodos necesarios para definir su nueva aplicación en Web. Veamos un ejemplo de un applet sencillo Hola y analicemos este applet (AppletHola.java):

import java.awt.*; import java.applet.*;

public class AppletHola extends Applet { public void paint(Graphics g) {

g.drawString("Hola", 100, 100); }

}

La manera de visualizar este applet es a traves de una página de Web, como la siguiente (AppletHola.html):

<html> <head>

<title>Applet Hola </title> </head>

<body>

<applet width="200" height="400" code="AppletHola"></applet> </body>

</html>

Nota: Jcreator crea automáticamente el archive html

Los archivos de cada proyecto quedan guardados en la ruta

(17)

Una muestra del applet en pantalla inmerso en la pagina de Web seria:

(18)

algunos métodos predefinidos a través de los cuales vamos a dibujar o desplegar los elementos gráficos en nuestra ventana, es por esto que utilizamos el método paint, en este método desplegamos lo que deseamos aparezca en la pantalla, y eso es a través de un objeto de la clase Graphics, entonces ahora entendemos que solo a través de este objeto es que podemos dibujar.

Normalmente se define el objeto de la clase Graphics como g, pero puede ser que tu uses otro, dentro del método paint, la manera de dibujar es utilizando los métodos de la clase Graphics, en este caso para dibujar letras podemos usar el método drawString(), el cual requiere se le defina un string (cadena de caracteres) y la coordenada en la cual se desea dibujar, empezando por la coordenada x y siguiendo la coordenada y.

Existen una serie de métodos posibles a utilizar con el objeto gráfico de la clase Graphics, como por ejemplo el drawLine(), el cual dibuja una línea, tiene los parámetros coordenadas iniciales "x" y "y", y coordenadas finales "x" y "y". Una ejemplo pudiera ser g.drawLine(10,10, 100, 100); el cual dibuja una linea de la coordenada 10, 10 a la coordenada 100,100. A continuación utilizaremos un ejemplo de un applet dibujando líneas, rectángulos y círculos:

Esto se hace a través de utilizar el método mencionado drawLine() y los métodos nuevos drawRect() y drawOval(), como se observa en el código siguiente:

import java.awt.*; import java.applet.*;

public class AppletDibujos1 extends Applet { public void paint(Graphics g) {

g.drawString("Hola", 100, 100); g.drawLine(10,10, 100, 100); g.drawRect(0, 0, 150, 150); g.drawOval(100, 100, 100, 100); } }

(19)

A partir de este momento es importante que aprendas a conocer y utilizar la definición de las clases descritas en la API (App¿) , cada vez que utilices una clase nueva que no conoces es importante que visites su documentación en la java API, ya que de esa manera puedes saber que constructores tienen, que métodos pueden ser utilizados y cuales son los parámetros a utilizar en cada uno.

Como ejercicio entra a revisar la clase Graphics y reconoce como están definidos los parámetros de los métodos drawString(), drawLine(), drawRect() y drawOval() utilizados en el applet anterior.

Compilando y Ejecutando

Toma el siguiente código correspondiente a un applet y crea un proyecto Basic Java Applet

AppletReloj

import java.applet.Applet; import java.util.Date;

public class AppletReloj extends Applet implements Runnable { Date d;

(20)

Thread t; boolean activo; public void run() { while ( activo ) { repaint(); try {

Thread.sleep(1000);

} catch (InterruptedException e) { e.printStackTrace(); } }

}

public void init() { t = new Thread(this); }

public void start() { activo = true; t.start(); }

public void stop() { activo = false; }

public void paint(java.awt.Graphics g) { d = new Date();

g.drawString( d.getHours()+":"+ d.getMinutes()+ ":"+d.getSeconds(), 10, 10); }

}

Ahora ejecuta el applet.

(21)

Otros ejemplos de

applet.

Linea en diagonal

import java.awt.*;

import java.applet.*;

public class AppletDiagonal extends Applet

{

public void paint(Graphics g)

{

g.setColor( Color.red );

g.drawLine(0, 0, getWidth(), getHeight() );

}

(22)

Círculos

import java.awt.*;

import java.applet.*;

public class circulo extends Applet {

public void paint(Graphics g) {

g.setColor( Color.green );

g.drawOval(100, 100, 100, 100);

g.setColor( Color.blue );

g.drawOval(50, 50, 60, 80);

g.setColor( Color.yellow);

g.drawOval(110, 50, 90, 90);

}

}

Cuadrados

(23)

import java.awt.*;

import java.applet.*;

public class cuadrado extends Applet {

public void paint(Graphics g) {

g.setColor( Color.green );

g.drawRect(10, 10, 50, 50);

g.setColor( Color.blue );

g.drawRect(40, 20, 100, 100);

g.setColor( Color.red );

g.drawRect(30, 20, 10, 60);

}

}

Figure

Actualización...

Referencias

Actualización...