Introducción a la programación orientada a objetos
Introducción a Java
Herramientas necesarias para desarrollar en Java
Gramática de Java
Estructura de componentes AWT
Aplicaciones vs. Applets
Clases, métodos, atributos y objetos en Java
Creación de applets sencillos
Animaciones simples y multithreading
Interfaz gráfica de usuario (AWT)
Control de eventos (Event Handling)
Introducción a la OOP (programación orientada a objetos)
Junto con el paradigma de la orientación a procedimientos, son las dos filosofías generales de diseño más importantes. A diferencia de la orientación a procedimientos (OP), la orientación a objetos (OO) no concibe los procesos como una secuencia de procedimientos con su entrada y salida sino que se basa en un conjunto de objetos interactuando:
Veamos a continuación los aspectos más destacados de esta
filosofía general de diseño.
1. Clases y objetos
Es importante distinguir entre los conceptos de clase y objeto:
Las clases no son entidades independientes sino que se agrupan jerárquicamente heredando características y atributos. Cada instancia o implementación real de una clase constituirá un nuevo objeto por lo que se pueden crear infinitos objetos distintos a partir de una sola clase.
2. Encapsulación
Se define como el proceso de empaquetar juntos los métodos y los datos en un objeto. El objeto se encarga de ocultar sus datos al resto de objetos. La encapsulación permite una seguridad mayor en el acceso a los datos ya que este acceso depende directamente de cada objeto. Asimismo, permite abstraer los detalles internos de funcionamiento del objeto.
3. Intercambio de mensajes
Los objetos se comunican entre sí mediante mensajes de invocación a métodos:
4. Herencia
Es el concepto que define la adopción de todas las características de una clase por parte de otra clase que es definida como descendiente o heredera de la primera.
La principal consecuencia de la herencia es la posibilidad de reutilizar clases ya que se pueden crear nuevas a partir de las ya creadas.
La herencia puede ser de dos tipos, simple si sólo es posible heredar características de una sola clase, o múltiple si se pueden heredar características de varias clases.
1. Historia de JAVA
A finales de los años ochenta Sun Microsystems decide introducirse en el mercado de la electrónica de consumo y más concretamente en los equipos domésticos, incluyendo la televisión interactiva. Java, nace como un lenguaje ideado en sus comienzos para programar electrodomésticos!
En sus primeras versiones, se llamó OAK.
2. Objetivos de diseño de los creadores de JAVA
LENGUAJE FAMILIAR:
Java no sería un lenguaje totalmente nuevo, se parecería a lo que conocemos como C++, así que no le sería tan complicado recalar en los programadores escépticos.
LENGUAJE ORIENTADO A OBJETOS:
Para que un lenguaje pueda considerarse orientado a
objetos debe soportar como mínimo las características de:
- encapsulación
- herencia
- polimorfismo
- enlace dinámico.
LENGUAJE ROBUSTO:
Uno de los problemas más comunes en los lenguajes de programación es la posibilidad de escribir programas que pueden bloquear el sistema. Algunas veces este bloqueo puede ser inmediato, pero en otras ocasiones llega a aparecer inesperadamente porque, por ejemplo, la aplicación accede a zonas de memoria que no estaban siendo ocupadas por otros programas hasta ese momento. Un ejemplo claro de lenguaje no robusto es C. Al escribir código en C o C++ el programador debe hacerse cargo de la gestión de memoria de una forma explícita, solicitando la asignación de bloques a punteros y liberándolos cuando ya no son necesarios.
En Java, los punteros, la aritmética de punteros y las funciones de asignación y liberación de memoria (malloc( ) y free( ) ) no existen. En lugar de los punteros se emplean referencias a objetos, los cuales son identificadores simbólicos. El gestor de memoria de Java lleva una contabilidad de las referencias a los objetos. Cuando ya no existe una referencia a un objeto, éste se convierte en candidato para la recogida de basura (garbage collection).
LENGUAJE DE ALTO RENDIMIENTO ( MÚLTIPLES THREADS ):
Una de las características del lenguaje es que soporta la concurrencia a través de threads. En ocasiones puede interesarnos dividir una aplicación en varios flujos de control independientes, cada uno de los cuales lleva a cabo sus funciones de manera concurrente. Cuando los distintos flujos de control comparten un mismo espacio lógico de direcciones, se denominan threads.
LENGUAJE PORTABLE:
El principal objetivo de los diseñadores de Java, y dado el gran crecimiento de las redes en los últimos años, fue el de desarrollar un lenguaje cuyas aplicaciones una vez compiladas pudiesen ser inmediatamente ejecutables en cualquier máquina y sobre cualquier sistema operativo. Por ejemplo, un programa desarrollado en Java en una estación de trabajo Sun que emplea el sistema operativo Solaris, debería poderse llevar a un PC que utilice sistema operativo Windows NT.
LENGUAJE LO MÁS SIMPLE POSIBLE:
Los diseñadores de Java trataron de mantener las facilidades básicas del lenguaje en un mínimo y proporcionar un gran número de extras con las librerías de clases.
LENGUAJE SEGURO:
Se pretendía construir un lenguaje de programación que fuese seguro, esto es, que no pudiera acceder a los recursos del sistema de manera incontrolada. Por este motivo se eliminó la posibilidad de manipular la memoria mediante el uso de punteros y la capacidad de transformación de números en direcciones de memoria ( tal y como se hace en C ) evitando así todo acceso ilegal a la memoria. Esto se asegura porque el compilador Java efectúa una verificación sistemática de conversiones.
3. Lo nuevo en JAVA
La gran novedad que aporta Java dentro de las nuevas generaciones de navegadores es la capacidad de desplazar el control de la interactividad de los servidores hacia las máquinas de los usuarios que se utilizan para recorrer Internet. Por la misma estructura del lenguaje, los nuevos navegadores permiten la telecarga de "applets", pequeños fragmentos de programas compactos, precompilados, que pueden entonces interpretar de modo distinto los datos telecargados para producir por ejemplo animaciones, sonido y especialmente la verdadera interactividad.
El lenguaje Java, visto desde un navegador de Internet, es pues un lenguaje que no es ni totalmente interpretado, ni totalmente compilado. El lenguaje se transforma en un código elemental parecido al ensamblador, llamado también p-code o byte-code.
Posee la particularidad de ser compacto y por tanto puede ser compilado (traducido a lenguaje máquina) muy rápidamente, en el transcurso de la propia ejecución del programa. El p-code constituye una capa intermedia que facilita enormemente la portabilidad de un entorno o de una máquina a otra. La facilita hasta el punto de lograrla desaparecer.
Aparece entonces la "máquina virtual". Una máquina virtual es una capa lógica que hace creer al programa Java que se ejecuta en un ordenador real (con registros, memoria y procesador), cuando en realidad sólo ve una reconstrucción lógica de un ordenador.
Para ejecutar un programa Java compilado (que está en p-code), es preciso también que cuente con una implementación de la máquina virtual específica donde se desea ejecutar, la cual efectúa la transformación del p-code en un programa comprensible para la máquina.
Herramientas necesarias para desarrollar en Java
Para desarrollar programas en Java es suficiente con instalar el paquete JDK de Sun, que es de libre distribución. En el site de Sun podemos encontrar toda clase de información relacionada con Java: Ejemplos de programas escritos en Java, tutoriales, documentación, bugs conocidos y su solución, etc..
La dirección base es : www.sun.com
La ultima version disponible hasta la fecha es la JDK 1.2
Pasos para crear un programa en Java
- Aplicaciones
- Applets
<HTML> <BODY> <APPLET code="miProgramaApplet.class" width=400 height=400> </APPLET> </BODY> </HTML> |
- Lanzar un navegador y cargar la pagina html, o bien
- Usar el programa provisto por Sun para ver applets: appletviewer
miProgramaApplet.html
Un ejemplo de herramientas básicas para comenzar a programar en lenguaje JAVA podría ser:
1.- Editor de código multilenguaje y con utilidades de edición y detección automática de errores. Un muy buen editor con estas propiedades y muchas más es ED for Windows v3.80 (www.getsoft.com) pero existen muchos otros y casi todos de libre distribución.
2.- JDK1.1.x, con el que podemos compilar y probar las aplicaciones y applets realizados.
3.- Documentación HTML de las clases JAVA.
Además de lo arriba indicado, es aconsejable trabajar con paquetes de componentes que no pertenecen a los básicos de Java, como puede ser swing o symbeans. Estos componentes o beans proporcionan utilidades y facilidades añadidas al paquete básico de jdk.
Otra posibilidad para desarrollar en JAVA es utilizar una herramienta Visual como Visual Cafe o V++. Estas herramientas suponen un entorno integrado de programación con módulos editor, de diseño visual, compilador, depurador, etc. Además proporcionan componentes propios especialmente útiles en diseño de interfaces gráficas.
1. Comentarios
En Java hay tres tipos de comentarios:
//
comentarios para una sola línea /* comentarios de una o más líneas */ /** comentario de documentación, de una o más líneas */ |
Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentación, colocados inmediatamente antes de una declaración (de variable o función), indican que ese comentario ha de ser colocado en la documentación que se genera automáticamente cuando se utiliza la herramienta de Java, javadoc. Dichos comentarios sirven como descripción del elemento declarado permitiendo generar una documentación de nuestras clases escrita al mismo tiempo que se genera el código.
2. Identificadores
Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar.
En Java, un identificador comienza con una letra, un subrayado (_) o un símbolo de dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen las mayúsculas de las minúsculas y no hay longitud máxima.
Ejemplos de identificadores válidos:
Identificador nombre_usuario Nombre_Usuario _variable_de_sistema $transaccion |
y su uso sería, por ejemplo:
int contador_principal; char _lista_de_ficheros; float cantidad_en_Ptas; |
3. Palabras clave
Las siguientes son las palabras clave que están definidas en Java y que no se pueden utilizar como identificadores:
abstract continue
for new switch boolean default goto null synchronizedbreak do if package thisbyte double implements private threadsafebyvalue else import protected throwcase extends instanceof public transient catch false int return true char final interface short try class finally long static void const float native super while |
4. Palabras reservadas
Además, el lenguaje se reserva unas cuantas palabras más, pero que hasta ahora no tienen un cometido específico. Son:
cast future generic inneroperator outer rest var |
5. Tags HTML
Atributos del tag <APPLET>; (en negrita los imprescindibles)
<APPLETCODEBASE=url
raizCODE=fichero con la clase principal WIDTH=anchura HEIGTH=altura ALT=texto alternativo (para navegadores sin soporte Java pero que saben interpretar el tag APPLET) NAME=nombre del applet. Para hacer referencia al applet desde otro o desde JavaScript ALIGN=alineacion (hasta 9 valores: LEFT, RIGHT, TOP, MIDDLE, etc...) VSPACE=espacio en pixeles dejado en blanco como margen en la ventana del applet HSPACE=idem izqda-dcha >
<PARAM NAME=unPArametro VALUE=valorDelParametro> <PARAM NAME=otroParametro VALUE=valor> <ídem etc> Texto alternativo </APPLET> |
Las características propias del lenguaje JAVA hacen que además de poder desarrollar aplicaciones que se ejecutan en el intérprete local, se puedan desarrollar módulos descargables a través de una página web y ejecutables en la JVM (Java Virtual Machine) del navegador. Estos módulos reciben el nombre de Applets.
Veamos ejemplos sencillos de cada tipo de desarrollo para apreciar las diferencias de estructura gramatical.
1. Aplicaciones
class EchoArgs { public static void main (String args[]) { for ( int i = 0;i<args.length ; i++ ) { System.out.println("Argumento " + i + ": " + args[i]); } } } |
2. Applets
//
HolaMundoCruelApplet.java import java.awt.Graphics; import java.awt.Font; import java.awt.Color; public class HolaMundoCruelApplet extends java.applet.Applet { Font f = new Font("Arial", Font.BOLD, 36); public void paint(Graphics g) { } |
Clases, métodos, atributos y objetos en Java
Veamos a continuación mediante un ejemplo cómo se implementan los conceptos más importantes vistos teóricamente en la introducción a la OOP en JAVA:// Moto.java package java.testJavadoc;
{
{
{ {
{
{ {
{
- apagarMotor
- al no declarar que hereda de nadie, se asume que es de Object
{
|
1. Tipos de Clases
Hasta ahora sólo se ha utilizado la palabra clave public para calificar el nombre de las clases que hemos visto, pero hay tres modificadores más. Los tipos de clases que podemos definir son:
abstract
Una clase abstract tiene al menos un método abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia.
final
Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final.
public
Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas.
synchronizable
Este modificador especifica que todos los métodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban.
2. Variables y métodos de instancia
Una clase en Java puede contener variables y métodos. Las variables pueden ser tipos primitivos como int, char, etc. Los métodos son funciones.
Por ejemplo, en el siguiente trozo de código podemos observarlo:
public MiClase {
int i;
public MiClase() {
i = 10;
}
public void Suma_a_i( int j ) {
i = i + j;
}
}
La clase MiClase contiene una variable (i) y dos métodos, MiClase que es el constructor de la clase y Suma_a_i( int j ).
3. Métodos y Constructores
Los métodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. El constructor es un tipo específico de método que siempre tiene el mismo nombre que la clase.
Cuando se declara una clase en Java, se pueden declarar uno o más constructores opcionales que realizan la inicialización cuando se instancia (se crea una ocurrencia) un objeto de dicha clase.
Utilizando el código de ejemplo anterior, cuando se crea una nueva instancia de MiClase, se crean (instancian) todos los métodos y variables, y se llama al constructor de la clase:
MiClase mc;
mc = new MiClase();
La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaración de tipo. Después de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc será igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto:
mc.i++; // incrementa la instancia de i de mc
Al tener mc todas las variables y métodos de MiClase, se puede usar la primera sintaxis para llamar al método Suma_a_i() utilizando el nuevo nombre de clase mc:
mc.Suma_a_i( 10 );
y ahora la variable mc.i vale 21.
4. Herencia
La Herencia es el mecanismo por el que se crean nuevos objetos definidos en términos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Pato, que es una especialización de Ave.
class Pato extends Ave {
int numero_de_patas;
}
La palabra clave extends se usa para generar una subclase (especialización) de un objeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definición de Ave será copiada a la clase Pato, además, en Pato se pueden definir sus propios métodos y variables de instancia. Se dice que Pato deriva o hereda de Ave.
Además, se pueden sustituir los métodos proporcionados por la clase base. Utilizando nuestro anterior ejemplo de MiClase, aquí hay un ejemplo de una clase derivada sustituyendo a la función Suma_a_i():
import MiClase;
public class MiNuevaClase extends MiClase {
public void Suma_a_i( int j ) {
i = i + ( j/2 );
}
}
Ahora cuando se crea una instancia de MiNuevaClase, el valor de i también se inicializa a 10, pero la llamada al método Suma_a_i() produce un resultado diferente:
MiNuevaClase mnc;
mnc = new MiNuevaClase();
mnc.Suma_a_i( 10 );
En Java no se puede hacer herencia múltiple. Por ejemplo, de la clase aparato con motor y de la clase animal no se puede derivar nada, sería como obtener el objeto toro mecánico a partir de una máquina motorizada (aparato con motor) y un toro (aminal). En realidad, lo que se pretende es copiar los métodos, es decir, pasar la funcionalidad del toro de verdad al toro mecánico, con lo cual no sería necesaria la herencia múltiple sino simplemente la compartición de funcionalidad que se encuentra implementada en Java a través de interfaces.
5. Control de acceso
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las variables de instancia y los métodos definidos en la clase:
public
public void CualquieraPuedeAcceder(){}
Cualquier clase desde cualquier lugar puede acceder a las variables y métodos de instacia públicos.
protected
protected void SoloSubClases(){}
Sólo las subclases de la clase y nadie más puede acceder a las variables y métodos de instancia protegidos.
private
private String NumeroDelCarnetDeIdentidad;
Las variables y métodos de instancia privados sólo pueden ser accedidos desde dentro de la clase. No son accesibles desde las subclases.
friendly (sin declaración específica)
void MetodoDeMiPaquete(){}
Por defecto, si no se especifica el control de acceso, las variables y métodos de instancia se declaran friendly (amigas), lo que significa que son accesibles por todos los objetos dentro del mismo paquete, pero no por los externos al paquete. Es lo mismo que protected.
Los métodos protegidos (protected) pueden ser vistos por las clases derivadas, como en C++, y también, en Java, por los paquetes (packages). Todas las clases de un paquete pueden ver los métodos protegidos de ese paquete. Para evitarlo, se deben declarar como private protected, lo que hace que ya funcione como en C++ en donde sólo se puede acceder a las variables y métodos protegidos de las clases derivadas.
6. Variables y métodos estadísticos
En un momento determinado se puede querer crear una clase en la que el valor de una variable de instancia sea el mismo (y de hecho sea la misma variable) para todos los objetos instanciados a partir de esa clase. Es decir, que exista una única copia de la variable de instancia. Se usará para ello la palabra clave static.
class Documento extends Pagina {
static int version = 10;
}
El valor de la variable version será el mismo para cualquier objeto instanciado de la clase Documento. Siempre que un objeto instanciado de Documento cambie la variable version, ésta cambiará para todos los objetos.
De la misma forma se puede declarar un método como estático, lo que evita que el método pueda acceder a las variables de instancia no estáticas:
class Documento extends Pagina {
static int version = 10;
int numero_de_capitulos;
static void annade_un_capitulo() {
numero_de_capitulos++; // esto no funciona
}
static void modifica_version( int i) {
version++; // esto si funciona
}
}
La modificación de la variable numero_de_capitulos no funciona porque se está violando una de las reglas de acceso al intentar acceder desde un método estático a una variable no estática.
Todas las clases que se derivan, cuando se declaran estáticas, comparten la misma página de variables; es decir, todos los objetos que se generen comparten la misma zona de memoria. Las funciones estáticas se usan para acceder solamente a variables estáticas.
class UnaClase {
int var;
UnaClase()
{
var = 5;
}
UnaFuncion()
{
var += 5;
}
}
En el código anterior, si se llama a la función UnaFuncion a través de un puntero a función, no se podría acceder a var, porque al utilizar un puntero a función no se pasa implícitamente el puntero al propio objeto (this). Sin embargo, sí se podría acceder a var si fuese estática, porque siempre estaría en la misma posición de memoria para todos los objetos que se creasen de UnaClase.
7. Interfaces
Los métodos abstractos son útiles cuando se quiere que cada implementación de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los métodos abstractos.
Los interfaces proporcionan un mecanismo para abstraer los métodos a un nivel superior.
Un interface contiene una colección de métodos que se implementan en otro lugar. Los métodos de una clase son public, static y final.
La principal diferencia entre interface y abstract es que un interface proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia.
Por ejemplo:
public interface VideoClip {
// comienza la reproduccion del video
void play();
// reproduce el clip en un bucle
void bucle();
// detiene la reproduccion
void stop();
}
Las clases que quieran utilizar el interface VideoClip utilizarán la palabra implements y proporcionarán el código necesario para implementar los métodos que se han definido para el interface:
class MiClase implements VideoClip {
void play() {
<código>
}
void bucle() {
<código>
}
void stop() {
<código>
}
Al utilizar implements para el interface es como si se
hiciese una acción de copiar-y-pegar del código del interface, con lo cual no se
hereda nada, solamente se pueden usar los métodos.
La ventaja principal del uso de interfaces es que una clase interface puede ser
implementada por cualquier número de clases, permitiendo a cada clase compartir
el interfaz de programación sin tener que ser consciente de la implementación
que hagan las otras clases que implementen el interface.
class MiOtraClase implements VideoClip {
void play() {
<código nuevo>
}
void bucle() {
<código nuevo>
}
void stop() {
<código nuevo>
}
Permitidas
Key
Meaning
"file.separator"
File separator (for example, "/")
"java.class.version" Java class version number
"java.vendor"
Java vendor-specific string
"java.vendor.url" Java
vendor URL
"java.version"
Java version number
"line.separator"
Line separator
"os.arch"
Operating system architecture
"os.name"
Operating system name
"path.separator" Path
separator (for example, ":")
Ejemplo de uso: String s = System.getProperty("os.name");
No permitidas
Key
Meaning
"java.class.path"
Java classpath
"java.home"
Java installation directory
"user.dir"
User's current working directory
"user.home"
User home directory
"user.name"
User account name
Ocurre cuando se carga por 1º vez el applet o al recargar. Crea objetos,
estado inicial, carga imagenes o fuentes. Solo ocurre 1 vez en la vida
de un applet.
Despues de init o de stop: por ejemplo si vamos a otra pagina y despues
volvemos. Ocurre 1 o mas veces por tanto
Contrapartida de start(). Cuando el usuario deja una pagina, los
threads lanzados se siguen ejecutando(¡!??)
No es destruccion como en C++. Sirve para dejar bien atadas los
cosas, p.ej. matar threads.
Similar a finalize(), que es para objetos individuales. Destroy() solo
en applets!
Ejemplo1:
// CicloVidaApplet.java
import java.awt.Graphics;
import java.applet.Applet;
public class CicloVidaApplet extends Applet
{
int contadorInit = 0;
int contadorStart = 0;
int contadorPaint = 0;
int contadorStop = 0;
int contadorDestroy = 0;
public void init() {contadorInit++;}
public void start() {contadorStart++;}
public void paint(Graphics g)
{
contadorPaint++;
g.drawString("Contador Init: " + contadorInit, 25,25);
g.drawString("Contador Start: " + contadorStart, 25,50);
g.drawString("Contador Paint: " + contadorPaint, 25,75);
g.drawString("Contador Stop: " + contadorStop, 25,100);
g.drawString("Contador Destroy: " + contadorDestroy, 25,125);
}
public void stop() {contadorStop++;}
public void destroy() {contadorDestroy++;}
}
Ejemplo2:
// HolaMundoCruelApplet.java
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public class HolaMundoCruelApplet extends java.applet.Applet
{
Font f = new Font("Arial", Font.BOLD, 36);
public void paint(Graphics g)
{
g.setFont(f);
g.setColor(Color.red);
g.drawString("Hola mundo cruel",5,50);
}
}
Crear HolaMundoCruelApplet.HTML:
<HTML>
<BODY>
<applet code="HolaMundoCruelApplet.class" width=400 height=400>
</applet>
</BODY>
</HTML>
En el applet Java:
En el HTML:
<APPLET
CODEBASE=url raiz
CODE=fichero con la clase principal
WIDTH=anchura
HEIGTH=altura
ALT=texto alternativo (para navegadores sin soporte Java pero que
saben interpretar el tag APPLET
NAME=nombre del applet. Para hacer referencia al applet desde otro o
desde JavaScript
ALIGN=alineacion (hasta 9 valores: LEFT, RIGHT, TOP, MIDDLE, etc...)
VSPACE=espacio en pixeles dejado en blanco como margen por el N (ver
p.141 21days)
HSPACE=idem izqda-dcha
>
[* Parametros: explicado mas adelante]
<PARAM NAME=unPArametro VALUE=valorDelParametro>
<PARAM NAME=otroParametro VALUE=valor>
<idem etc>
Texto alternativo
</APPLET>
Ej:
<PARAM NAME=fuente
VALUE="TimesRoman">
y
String nombreDeLaFuente = getParameter("fuente");
Proteccion: se añade a continuacion;
If(nombreDelaFuente == null)
nombreDeLaFuente == "Courier";
Ej:
<PARAM NAME=tamañoLetras
VALUE="36">
y
int tamañoDeLetra;
String tam = getParameter("tamaño");
If (tam == null)
tamañoDeLetra = 20;
}
else tamañoDeLetra = Integer.parseInt(tam);
// OtroHolaMundoCruelApplet.java
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public class OtroHolaMundoCruelApplet extends
java.applet.Applet
{
Font f = new Font("Arial", Font.BOLD, 36);
String nombre; // nuevo
// nuevo
public void init()
{
nombre = getParameter("Nombre");
if (nombre == null) nombre = "Fulanito";
nombre = "Hola " + nombre + "!!!";
}
//
public void paint(Graphics g)
{
g.setFont(f);
g.setColor(Color.red);
g.drawString("Hola mundo cruel",5,50);
}
}
Si se sumara "Hola " + etc... en paint, seria menos eficiente.
En init(), solo se ejecuta 1 vez!
Graficos, texto y sonido
Ej:
g.drawRect(x,y,anchura,altura)
g.fillRect(20,20,80,80)
g.drawRoundRect(a,b,c,d,E,F) (ver p151 21days)
g.fillRoundRect(...)
g.draw3Drect(20,20,60,60,true);
Ej:
int listaCoordX[] = {0,10,20,10,50,0};
int listaCoordY[] = {0,20,30,60,40,0};
int numeroPuntosPoligono = listaCoordX.length;
g.drawPolygon(listaCoordX,listaCoordY,numeroPuntosPoligono);
Con objetos;
int listaCoordX[] = {0,10,20,10,50,0};
int listaCoordY[] = {0,20,30,60,40,0};
int numeroPuntosPoligono = listaCoordX.length;
Polygon poligono = new Polygon(listaCoordX,
listaCoordY,numeroPuntosPoligono);
g.drawPolygon(poligono);
// poligono.addPoint(20,30);
// boolean estaDentro = poligono.contains(x,y);
g.copyAerea(origenX,origenY,anchura,altura,destinoX,destinoY)
// Borrar un area. Se rellena con el color de fondo
// Para borrar todo el applet;
g.clearRect(0,0,size().width,size().heigth)
// size() devuelve un objeto Dimension
Font f = new Font("Helvetica", Font.BOLD, 14);
// Font f = new Font("Helvetica", Font.BOLD + Font.ITALIC, 14);
g.setFont(f);
g.drawString("Texto en Helvetica y negrita", 10, 10);
Color.white, Color.yellow, Color.lightGray,etc..
Ej:
Color miColor = new Color(130,124,31);
g.setColor(miColor); // empieza a dibujar con el nuevo
color
setBackground(Color.blue); // cambia el color de fondo del
applet
setForegrounf(Color.black(; // cambia de golpe el color de
todo lo dibujado
// CajasDeColores.java
import java.awt.Graphics;
import java.awt.Color;
public class CajasDeColores extends java.applet.Applet
{
public void paint(Graphics g)
{
int rojo,verde,azul;
for (int j = 30; j < (size().height - 25); j += 30)
{
for (int i = 5; i < (size().width - 25); i += 30)
{
rojo = (int) Math.floor(Math.random() * 256);
verde = (int) Math.floor(Math.random() * 256);
azul = (int) Math.floor(Math.random() * 256);
g.setColor(new Color(rojo,verde,azul));
g.fillRect(i,j,25,25);
g.setColor(Color.black);
g.drawRect(i-1, j-1, 25, 25);
}
}
}
}
// PintaFoto.java
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
public class PintaFoto extends Applet
{
Image imagen;
public void init()
{
imagen = getImage(getCodeBase(), "orb.gif");
//poner orb.gif en el directorio java ¡!!
}
public void paint(Graphics g)
{
int alturaImagen = imagen.getHeight(this);
int anchuraImagen = imagen.getWidth(this);
g.drawImage(imagen, 0, 0, this);
g.drawImage(imagen,
anchuraImagen,0,anchuraImagen/2, alturaImagen*2,
this); // dibuja la imagen deformada
}
}
play(getCodeBase(), "audio/violin.au");
// SonidoApplet.java
public class SonidoApplet extends java.applet.Applet
{
public void init()
{
play(getCodeBase(), "yahoo1.au"); // poner yahoo1.au
en dir java!
}
}
Ej:
import java.applet.AudioClip;
AudioClip clip = getAudioClip(getCodeBase(),
"audio/ruidoDeFondo.au");
clip.play(); // suena solo una vez
clip.loop(); // suena indefinidamente
clip.stop(); // obliga a que se pare
Ej:
// SonidoApplet.java
import java.applet.AudioClip;
public class SonidoApplet extends java.applet.Applet
{
AudioClip sonido;
public void init()
{
sonido = getAudioClip(getCodeBase(), "yahoo1.au");
}
public void start()
{
sonido.loop();
}
public void stop()
{
sonido.stop();
}
}
No se cuenta exhaustivamente todo lo que se puede hacer con las clases de Java. VER DOCUMENTACION!!!!
Animaciones simples y multithreading
Se puede hablar de dos tipos:
// MalRelojDigitalApplet.java
import java.awt.Graphics;
import java.awt.Font;
import java.util.Date;
public class MalRelojDigitalApplet extends
java.applet.Applet
{
Font fuente = new Font("TimesRoman", Font.BOLD, 24);
Date fecha;
public void start()
{
while (true)
{
fecha = new Date();
repaint();
try
{
Thread.sleep(10000);
} catch(InterruptedException e)
{;}
}
}
public void paint(Graphics g)
{
g.setFont(fuente);
g.drawString(fecha.toString(), 10, 50);
}
}
Ej:
// BienRelojDigitalApplet.java
import java.awt.Graphics;
import java.awt.Font;
import java.util.Date;
public class BienRelojDigitalApplet extends
java.applet.Applet implements Runnable //cambio
{
Font fuente = new Font("TimesRoman", Font.BOLD, 24);
Date fecha;
Thread runner; //cambio
//cambio
public void start()
{
if (runner == null)
{
runner = new Thread(this);
runner.start();
}
else
{
System.out.println("Stop");
}
}
//cambio
public void stop()
{
if (runner != null)
{
runner.stop();
runner = null;
}
else
{
System.out.println("Stop");
}
}
//cambio
public void run()
{
while (true)
{
fecha = new Date();
repaint();
try
{
Thread.sleep(1000);
} catch(InterruptedException e)
{;}
}
}
public void paint(Graphics g)
{
{
g.setFont(fuente);
g.drawString(fecha.toString(), 10, 50);
}
}
}
public void update(Graphics g)
{
g.setColor(getBackground());
g.fillRect(0,0,width,height);
g.setColor(getForeground());
paint(g);
Eventos y respuesta al usuario
Ej:
// PosicionDeClickApplet.java
import java.awt.Event;
import java.awt.Graphics;
public class PosicionDeClickApplet extends
java.applet.Applet
{
int x,y;
//Point ultimo = null;
//Point nuevo = null;
public void paint(Graphics g)
{
if ( x*y != 0)
{
g.drawString("Has hecho CLICK en x = " + x +" , y = " +
y,0,10);
g.fillOval(x,y,10,10);
}
}
public boolean mouseDown(Event evt, int x,int y)
{
this.x = x;
this.y = y;
System.out.println("Has hecho CLICK en x = " + x +" , y =
" + y);
repaint();
return true;
}
}
Ej:
public boolean mouseEnter(Event evt, int x, int y)
{
setBackground(java.awt.Color.blue);
repaint();
return true;
}
public boolean mouseExit(Event evt, int x, int y)
{
setBackground(java,awt.Color.red);
repaint();
return true; }
Ej:
public boolean mouseDown(Event evt, int x, int y)
{
if (evt.shiftDown()) {// tratar el evento shift+click}
else {// tratar el evento click simple}
}
Interfaz gráfica de usuario (AWT)
1. Controles basicos
2. Otros controles
Ejemplo: appletviewer GUIWindow.html (tutorial SUN)
Jerarquia de clases (ver grafico)
Los menus dependen de otra rama de Object;
3. Concepto de Jerarquia de Componentes del
programa
4. Como usar Labels
// EjemploLabelApplet.java
import java.awt.*;
public class EjemploLabelApplet extends java.applet.Applet
{
public void init()
{
Label etiqueta1 = new Label("Label1");
Label etiqueta2 = new Label("Label2");
Label etiqueta3 = new Label("Label3");
add(etiqueta1);
add(etiqueta2);
add(etiqueta3);
}
}
5. Como usar Buttons
//EjemploButtonApplet.java
import java.awt.*;
public class EjemploButtonApplet extends java.applet.Applet
{
public void init()
{
Label etiqueta1 = new Label("Label1");
Button boton1 = new Button("Boton 1");
Button boton2 = new Button("Boton 2");
add(boton1);
add(etiqueta1);
add(boton2);
}
}
Probar a cambiar las dimensiones de la ventana de appletviewer: la disposicion de los elementos es automatica.
6. Como usar Checkboxes
// EjemploAWTApplet.java
...
add(new Checkbox("Pamplona"));
add(new Checkbox("Bilbao", null, true));
add(new Checkbox("Madrid"));
add(new Checkbox("Barcelona"));
...
Metodos utiles:
setState() //consulta el estado del checkbox
setState() //altera el estado del checkbox
etc...
...
CheckboxGroup cbg = new CheckboxGroup();
add(new Checkbox("Rojo", cbg, false));
add(new Checkbox("Azul", cbg, false));
add(new Checkbox("Verde", cbg, true));
add(new Checkbox("Negro", cbg, false));
...
7. Como usar Choice Menu
...
Choice c = new Choice(); // crea el menu desplegable
c.addItem("Naranja");
c.addItem("Manzana");
c.addItem("Pera");
add(c); // añade el menu al panel
...
Metodos utiles:
getItem(int n) devuelve el string de la opcion n-esima
getSelectedIndex() devuelve el indice de la opcion seleccionada
//Este tipo de menus solo permiten seleccionar una opcion. Para
multiples opciones, usar una lista
8. Como usar TextFields
...
add(new Label("Nombre completo"));
add(new TextField("-esciba aqui su nombre-"));
add(new Label("Telefono"));
add(new TextField(12));
add(new Label("Password"));
TextField t = new TextField(20);
t.setEchoCharacter('*');
add(t);
...
Metodos utiles:
setEditable(boolean) define si el testo es editable o no
select(int, int) selecciona el texto entre las dos posiciones
(origen = 0)
etc...
9. Como usar TextArea
...
String texto = "Erase una vez un pais en el que vivian tres cerditos
que eran\n" +
"hermanos. Decidieron construirse una casa, y uno el primero de\n" +
"ellos se la hizo de paja, el segundo de madera y el tercero de
ladrillo\n" +
"Un buen dia aparecio por alli el lobo y blablabla...";
// el caracter ‘\n’ es para forzr el retorno de linea
add(new TextArea(texto, 10, 60));
...
Metodos utiles:
insertText(String, int) // inserta texto en la posicion indicada
replaceText(String, int,int) // reepmplaza el texto entre las
posiciones dadas
etc...
10. Como usar Frames y Dialogs
...
// Ejemplo de utilizacion de Frame
Frame ventanaFrame = new Frame("Mi ventana FRAME");
ventanaFrame.setLayout(new FlowLayout()); //por defecto es
BorderLayout
ventanaFrame.add(new Button("Opcion 1"));
ventanaFrame.add(new Button("Opcion 2"));
ventanaFrame.add(new Button("Opcion 3"));
ventanaFrame.resize(100,150); //define el tamaño de la ventana
Point dim = location(); //devuelve la posicion de este componente,
como la esquina sup-izda
//medida respecto al componente padre
ventanaFrame.move(dim.x + 50, dim.y + 50);
ventanaFrame.show(); //cuando se crea la ventana, es invisible. Para
ocultarla, hide()
...
// Ejemplo de utilizacion de Dialog
...
// Ejemplo de utilizacion de FileDialog
...
...
List lista = new List(5, true); // crea una lista que tendra 5 lineas,
y que permitira
// seleccion multiple (valor 'true')
lista.addItem("Afrodita");
lista.addItem("Apolo");
lista.addItem("Ares");
lista.addItem("Hades");
lista.addItem("Zeus"); // si se añade un sexto elemento, se creara
automaticamente
// una barra deslizante
add(lista);
...
Metodos utiles:
getSelectedIndex() // devuelve el indice del item seleccionado,
si no se permite seleccion mult.
getSlectedIndexes() // devuelve un array de indices de los items
seleccionados
getSelectedItem() // devuelve el item seleccionado
getSlectedItems() // idem varios items
select(int) // fuerza a que esté seleccionado el item de la posicion
dada
etc...
12. Como usar Scrollbars
...Scrollbar barraDeslizante = new Scrollbar(Scrollbar.HORIZONTAL);
add(barraDeslizante);
...
// constructor mas general:
// Scrollbar(int orientacion, int valorInicial, int anchura, int
valorMinimo, int valorMaximo);
...
Metodos utiles:
getValue() // Devuelve el valor actual de la barra
setValue() // Asigna un valor a la barra
13. Como usar Canvas
Canvas can = new Canvas();
add(can);
14. Como usar Panels
...
Panel unPanel = new Panel();
unPanel.add(new Label("Arriba"));
unPanel.add(new Label("Abajo"));
add(unPanel);
...
15. Como usar Scroll Panes
NOTA: utilizar ScrollPane es un poco mas complicado que los
componentes anteriores. En este ejemplo se
ha tenido que definir una clase aparte, que hereda de Canvas, e
implementar varios metodos para que la imagen aparezca con un tamaño
adecuado
...
Image foto = getImage(getCodeBase(), "orb.gif");
ScrollableCanvas sCanvas = new ScrollableCanvas(foto);
ScrollPane sPane = new ScrollPane();
sPane.add(sCanvas);
add(sCanvas);
...
// Ahora viene la clase definida por nosotros (se pueden incluir
varias clases en un mismo fichero siempre que solo haya una de ellas
con el atributo ‘public’
class ScrollableCanvas extends Canvas
{
Dimension preferredSize;
Dimension minimumSize;
Image imagen;
// Constructor de la clase ScrollableCanvas (definida por nosotros ¡!)
public ScrollableCanvas(Image imagen)
{
this.imagen = imagen;
preferredSize = new Dimension(600, 320);
minimumSize = new Dimension(10, 10);
}
public Dimension getMinimumSize()
{
return minimumSize;
}
public Dimension getPreferredSize()
{
return preferredSize;
}
public void paint(Graphics g)
{
g.drawImage(imagen, 0, 0, getBackground(), this);
}
}
16. Otros componentes
17. Como aprovechar un applet grafico desde una aplicacion
// Heredar –con extends- de las clases Applet, AWT, etc...
public static void main(String args[])
{
Frame f = new Frame("Mi ventana para el applet"); // Crea una
ventana para mostrar el applet, //a la manera de un navegador
EjemploAWTApplet unApplet = new EjemploAWTApplet(); // El fichero
EjemploAWTApplet es //tambien una clase y por lo tanto se puede
instanciar ¡!
unApplet.init(); // Lanza init(), igual que haria el navegador
unApplet.start(); // idem con start()
f.add("Center", unApplet);
f.resize(300, 300); // Hace las veces de WIDTH y HEIGHT en el HTML!!
f.show();
//ATENCION: esta ‘adaptacion’ para ver applets como aplicaciones
debe tener en cuenta si el applet lee //parametros del fichero HTML.
Habria que pasar los parametros en la linea de comandos, a main(String
//args[])
}
18. LayoutManager
setLayout(new FlowLayout());
setLayout(new FlowLayout(FlowLayout.LEFT), 10, 10); // alineacion izquierda, con distancias de 10 pixeles en horizontal y vertical
...
Panel panelGridLayout = new Panel();
panelGridLayout.setLayout(new GridLayout(3,3)); // Layout de 3 filas y 3
columnas
pa.nelGridLayout.add(etiqueta1);
panelGridLayout.add(boton1);
panelGridLayout.add(boton2);
panelGridLayout.add(boton3);
add(panelGridLayout);
...
Otro constructor:
public GridLayout(int rows, int columns, int horizontalGap, int
verticalGap) // define tambien la separacion entre celdas, en pixels
...
Panel panelBorderLayout = new Panel();
panelBorderLayout.setLayout(new BorderLayout(5,5));
panelBorderLayout.add("Center", etiqueta1);
panelBorderLayout.add("North", boton1);
panelBorderLayout.add("East", boton2);
panelBorderLayout.add("West", boton3);
panelBorderLayout.add("South", boton4);
add(panelBorderLayout);
...
...
Panel panelCardLayout = new Panel();
panelCardLayout.setLayout(new CardLayout());
panelCardLayout.add("primero", new Button("Boton 14"));
panelCardLayout.add("segundo", new Button("Boton 15"));
panelCardLayout.add("tercero", new Button("Boton 16"));
panelCardLayout.add("cuarto", new Button("Boton 17"));
((CardLayout)panelCardLayout.getLayout()).show(panelCardLayout,
"tercero"); // complicadillo...
add(panelCardLayout);
...
Metodos utiles:
public void first(Container parent)
public void next(Container parent)
public void previous(Container parent)
public void last(Container parent)
setLayout(null)
...
public Insets insets()
{
return new Insets(10,10,10,10); // 10 pixels en los 4 lados
}
...
Control de eventos (Event Handling)
action() (Event.ACTION_EVENT) // solo lo producen los componentes
basicos:
// Button, Checkbox, Choice, List, MenuItem, y TextField
mouseEnter() (Event.MOUSE_ENTER)
mouseExit() (Event.MOUSE_EXIT)
mouseMove() (Event.MOUSE_MOVE)
mouseDown() (Event.MOUSE_DOWN)
mouseDrag() (Event.MOUSE_DRAG)
mouseUp() (Event.MOUSE_UP)
keyDown() (Event.KEY_PRESS or Event.KEY_ACTION)
keyUp() (Event.KEY_RELEASE or Event.KEY_ACTION_RELEASE)
gotFocus() (Event.GOT_FOCUS)
lostFocus() (Event.LOST_FOCUS)
handleEvent() (all event types)
Ejemplo de programa que interpreta eventos a la manera de JDK1.0.x;
{ public boolean handleEvent(Event evt)
{ if (evt.target instanceof Button) { case Event.GOT_FOCUS: default: return false; } return true; public void cambiaColor(String nombreColor) {
// BotonesColoresApplet.java
// EVENTOS JDK 1.0.x
import java.awt.*;
public class BotonesColoresApplet extends java.applet.Applet
{
TextArea areaTexto;
Panel panel1;
public void init()
setLayout(new BorderLayout());
panel1 = new Panel();
panel1.add(new Button("Rojo"));
panel1.add(new Button("Azul"));
panel1.add(new Button("Verde"));
panel1.add(new Button("Amarillo"));
areaTexto = new TextArea(15, 10);
areaTexto.setEditable(false);
add("North",panel1);
add("South",areaTexto);
}
{
switch(evt.id)
case Event.ACTION_EVENT :
cambiaColor((String) evt.arg);
}
break;
areaTexto.append("GOT_FOCUS \n");
return true;
case Event.LOST_FOCUS:
areaTexto.append("LOST_FOCUS \n");
return true;
case Event.MOUSE_ENTER:
areaTexto.append("MOUSE_ENTER, x=" + evt.x + " y=" + evt.y +
"\n");
return true;
case Event.MOUSE_EXIT:
areaTexto.append("MOUSE_EXIT, x=" + evt.x + " y=" + evt.y +
"\n");
return true;
}
if (nombreColor.equals("Rojo")) areaTexto.setBackground(Color.red);
else if (nombreColor.equals("Azul"))
areaTexto.setBackground(Color.blue);
else if (nombreColor.equals("Verde"))
areaTexto.setBackground(Color.green);
else if (nombreColor.equals("Amarillo"))
areaTexto.setBackground(Color.yellow);
}
}
{ { { { { { } { { { { else { {
// EjemploDeEventos.java
// EVENTOS JDK 1.1.x
import java.awt.*;
import java.awt.event.*;
class BotonesDeColores implements MouseListener, ActionListener
{
TextArea areaTexto;
Button boton1, boton2, boton3;
MenuBar barraMenu;
Menu menu1;
MenuItem opcionMenu1_1;
Label label1;
Panel panel1;
// Constructor
public BotonesDeColores()
Frame f = new Frame();
f.setLayout(new BorderLayout());
// Creo todos los objetos Componentes
panel1 = new Panel();
label1 = new Label("Normal");
boton1 = new Button("Rojo");
boton2 = new Button("Azul");
boton3 = new Button("Verde");
barraMenu = new MenuBar();
menu1 = new Menu("Archivo");
opcionMenu1_1 = new MenuItem("Salir");
areaTexto = new TextArea(15, 10);
areaTexto.setEditable(false);
// Estructuro todos los componentes
panel1.add(boton1);
panel1.add(boton2);
panel1.add(boton3);
panel1.add(label1);
menu1.add(opcionMenu1_1);
barraMenu.add(menu1);
f.add("North", panel1);
f.add("South", areaTexto);
f.setMenuBar(barraMenu);
f.setSize(300,320);
f.setVisible(true);
// Observador de areaTexto
areaTexto.addMouseListener(this);
// Observador de label1
label1.addMouseListener(this);
// Observador de los botones
boton1.addActionListener(this);
boton2.addActionListener(this);
boton3.addActionListener(this);
// Observador de la opcion de menu
opcionMenu1_1.addActionListener(this);
}
// Metodos del interfaz MouseListener
public void mouseClicked(MouseEvent e)
areaTexto.append("mouseClicked: x=" + e.getX() + ", y=" + e.getY() +
"\n");
}
public void mouseEntered(MouseEvent e)
areaTexto.append("mouseEntered: x=" + e.getX() + ", y=" + e.getY() +
"\n");
if (e.getComponent() == label1)
label1.setText("CURSIVA");
label1.setBackground(Color.red);
areaTexto.setFont(new Font("TimesRoman", Font.ITALIC, 14));
}
}
public void mouseExited(MouseEvent e)
areaTexto.append("mouseExited: x=" + e.getX() + ", y=" + e.getY() +
"\n");
if (e.getComponent() == label1)
label1.setText("Normal");
label1.setBackground(Color.white);
areaTexto.setFont(new Font("TimesRoman", Font.PLAIN, 14));
}
public void mousePressed(MouseEvent e)
areaTexto.append("mousePressed: x=" + e.getX() + ", y=" + e.getY() +
"\n");
}
public void mouseReleased(MouseEvent e)
areaTexto.append("mouseReleased: x=" + e.getX() + ", y=" + e.getY()
+ "\n");
}
// Metodos del interfaz ActionListener
public void actionPerformed(ActionEvent e)
String cadena = e.getActionCommand();
if (cadena.equals("Salir"))
System.exit(0);
}
{
cambiaColor(cadena);
}
}
// Otros metodos
public void cambiaColor(String nombreColor)
if (nombreColor.equals("Rojo")) areaTexto.setBackground(Color.red);
else if (nombreColor.equals("Azul"))
areaTexto.setBackground(Color.blue);
else if (nombreColor.equals("Verde"))
areaTexto.setBackground(Color.green);
else if (nombreColor.equals("Amarillo"))
areaTexto.setBackground(Color.yellow);
}
}
public class EjemploDeEventos
{
public static void main(String args[])
BotonesDeColores bdc = new BotonesDeColores();
}
}
Ilustración de las fases de vida de un applet
//
CicloVidaApplet.java import java.awt.Graphics; import java.applet.Applet; public class CicloVidaApplet extends Applet { int contadorInit = 0; int contadorStart = 0; int contadorPaint = 0; int contadorStop = 0; int contadorDestroy = 0; public void init() {contadorInit++;} public void start() {contadorStart++;} public void paint(Graphics g) {
|
Clases para hacer gráficos sencillos. Colores.
// CajasDeColores.java // Dibuja una serie de rectángulos y los rellena con colores de componentes RGB aleatorias import java.awt.Graphics; import java.awt.Color; public class CajasDeColores extends java.applet.Applet { public void paint(Graphics g) { { { } } } |
Carga un sonido y lo interpreta
// SonidoApplet.java import java.applet.AudioClip; public class SonidoApplet extends java.applet.Applet { AudioClip sonido; public void init() { // El fichero de sonido se llama 'yahoo.au' y esta en el
directorio del fichero html sonido = getAudioClip(getCodeBase(), "yahoo1.au");
{ public void stop() { } |
Cómo tratar los eventos
// EjemploDeEventos.java // EVENTOS JDK 1.1.x // Muestra una ventana con 3 botones que cambian el color al pincharlos import java.awt.*; import java.awt.event.*; class BotonesDeColores implements MouseListener, ActionListener { // Declara los componentes que luego se usaran para crear la interfaz grafica TextArea areaTexto; Button boton1, boton2, boton3; MenuBar barraMenu; Menu menu1; MenuItem opcionMenu1_1; Label label1; Panel panel1; // Constructor public BotonesDeColores() {
{ public void mouseEntered(MouseEvent e) { { } public void mouseExited(MouseEvent e) { { } public void mousePressed(MouseEvent e) { public void mouseReleased(MouseEvent e) { // Metodos del interfaz ActionListener { { else { } // Otros metodos { } { } |
Control de eventos mediante clases internas
//
EjemploDeEventos2.java // EVENTOS JDK 1.1.x mediante clases internas import java.awt.*; import java.awt.event.*; class BotonesDeColores { TextArea areaTexto; Button boton1, boton2, boton3; MenuBar barraMenu; Menu menu1; MenuItem opcionMenu1_1; Label label1; Panel panel1; SymMouse aSymMouse; SymAction aSymAction; // Constructor public BotonesDeColores() { //Clase interna que controla los eventos de raton. Extiende de
MouseAdapter que a su vez implementa el interfaz MouseListener { public void mouseClicked(MouseEvent event) Object object = event.getSource(); { //boton1_MouseClick(event); } else if (object == boton2) { //boton2_MouseClick(event); } else if (object == boton3) { //boton3_MouseClick(event); } } areaTexto.append("mouseEntered: x=" + e.getX() + ", y=" +
e.getY() + "\n"); label1.setText("CURSIVA"); } } areaTexto.append("mouseExited: x=" + e.getX() + ", y=" +
e.getY() + "\n"); label1.setText("Normal"); areaTexto.setFont(new Font("TimesRoman", Font.PLAIN,
14)); } } areaTexto.append("mousePressed: x=" + e.getX() + ", y=" +
e.getY() + "\n"); } areaTexto.append("mouseReleased: x=" + e.getX() + ", y="
+ e.getY() + "\n"); } } //fin de la clase interna SymMouse public void actionPerformed(ActionEvent e) String cadena = e.getActionCommand(); System.exit(0); } cambiaColor(cadena); } } } //fin de la clase interna SymMouse { } //fin de la clase BotonesDeColores public static void main(String args[]) new BotonesDeColores(); } } |
Aplicación de los streams a la lectura y escritura en disco
// EscribeEnDisco.java
import java.io.*; public class EscribeEnDisco { public static void main(String args[]) { { { catch(SecurityException e) { pw = new PrintWriter(fos); { // Escribir realmente en el disco { { } } { { { catch(SecurityException e) { br = new BufferedReader(new InputStreamReader(fis)); { { pw.flush(); } catch (UnknownHostException e) { catch (IOException e) { } } |
Utilización de los sockets para mandar mensajes entre dos máquinas
// Cliente.java import java.io.*; import java.net.*; public class Cliente { public static void main(String args[]) { InputStream is = null; OutputStream os = null; socketCliente = new Socket("",3000); // dirIP y port { { } } catch (UnknownHostException e) { catch (IOException e) { } } {
{ socketServidor = new ServerSocket(numeroDePuerto); { int contador = 0; { { { } } } |
Muestra una página web dentro de un applet
// CargaPaginaWeb.java
import java.net.*; public class CargaPaginaWeb extends java.applet.Applet { public void init() { { { getAppletContext().showDocument(direccionURL); } |
Carga la fuente de una pagina web en formato html y la muestra en pantalla
// CargaOrigenDeURL.java
import java.io.*; import java.net.URL; public class CargaOrigenDeURL { // Constructor public CargaOrigenDeURL() { InputStream conn; { { System.out.println(buferDeTexto.toString()); public static void main(String args[]) { } |
- Aprendiendo JAVA 1.1 en 21 Días. Laura Lemay y Carles L.
Perkins
Ed. Prencice Hall
- Java Unleashed. Varios autores
Ed. Samsnet
- The Java FAQ. Kanerva
Ed. Addison Wesley
- JDBC DB access with JAVA. Hamilton, Cattell y Fisher
Ed. Addison Wesley
- Manual de JAVA. Patrick Naughton
Ed. McGraw-Hill