1. Introducción a Java
DÍA 1
Introducción a la programación orientada a objetos
Introducción a Java
Herramientas necesarias para desarrollar en Java
DÍA 2
Gramática de Java
Estructura de componentes AWT
Aplicaciones vs. Applets
Clases, métodos, atributos y objetos en Java
DÍA 3
Creación de applets sencillos
Animaciones simples y multithreading
DÍA 4
Interfaz gráfica de usuario (AWT)
Control de eventos (Event Handling)
DÍA 5
Ejemplo de programas
BIBLIOGRAFÍA RECOMENDADA
DIRECCIONES EN iNTERNET
GRUPOS DE NOTICIAS
DIA 1
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:
2. 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:
Clase: Es un modelo abstracto de un tipo de objeto. Define sus métodos
y atributos.
Objeto: Es una instancia de una clase, es decir, la implementación con
valores de un modelo abstracto.
Las clases no son entidades independientes sino que se agrupan jerárquicamente
heredando características y atributos. Cada instancia o implementación real de
3. 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.
4. 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.
Introducción a Java
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
5. 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
6. 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..
7. 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
Escribir el programa fuente en cualquier editor y guardarlo con extensión
.java
Compilar el fichero fuente mediante: javac miPrograma.java .Esto genera
el fichero .class
Ejecutarlo (interpretar los byte-code) : java miPrograma
- Applets
Escribir el programa fuente en cualquier editor y guardarlo con extensión
.java
Compilar el fichero fuente mediante: javac miProgramaApplet.java
Escribir la pagina web que contendra al applet y guardar el codigo con
extension .html
El codigo minimo será:
<HTML>
<BODY>
<APPLET code="miProgramaApplet.class" width=400 height=400>
</APPLET>
</BODY>
</HTML>
2 posibilidades para ejecutar el applet:
- 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:
8. 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.
DÍA 2
Gramática de Java
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.
9. 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)
10. <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>
Estructura de componentes AWT
Aplicaciones vs. Applets
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.
11. 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)
{
g.setFont(f);
g.setColor(Color.red);
g.drawString("Hola mundo cruel",5,50);
}
}
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:
12. // Moto.java
package java.testJavadoc;
/**
*Este texto es un comentario sobre la clase Moto
* @author CTI
* @version 1
* @see clase UsarMoto
*/
class Moto
{
String fabricante;
private String color;
boolean motorEncendido;
//private int numeroDeSerie;
static int cilindrada = 250; //centimetros cubicos
String nombreDelPropietario;
// Metodo Constructor
/** Metodo constructor
*/
Moto(String nombre)
{
this.nombreDelPropietario = nombre;
}
Moto( )
{
;
}
void encenderMotor( )
{
if (motorEncendido == true)
{
System.out.println("El motor ya esta encendido !");
}
else
{
motorEncendido = true;
System.out.println("Brrummm. El motor se acaba de encender");
}
}
void describeMoto( )
{
System.out.println("Descripcion de La moto;");
System.out.println("- marca: " + fabricante);
System.out.println("- pintada de color: " + color);
System.out.println("- cilindrada: " + cilindrada + " centimetros cubicos");
if (motorEncendido == true)
{
System.out.println("- el motor esta encendido");
13. }
else
{
System.out.println("- el motor esta apagado");
}
}
/* Añadir:
- apagarMotor
- cambiarColor (declarar color private)
- escribir main en la propia clase y como clase independiente
- metodo que devuelve un valor en vez de void -> devolver un objeto propio
- variable estatica: al cambiarla, varian las de todas las instancias
- metodo constructor con parametro Nombre del propietario
Comentarios:
- al no declarar que hereda de nadie, se asume que es de Object
- comentarios !!!!
- aritmetica de Strings, se suman
- println es menos potente que en C
- null y los valores por defecto
- this
- las referencias -> programa de ejemplo
- la recogida de basura -> el programador no gestiona la memoria
*/
public static void main(String args[])
{
Moto miMoto;
miMoto = new Moto( );
miMoto.fabricante = "Kawasaki";
miMoto.color = "verde fosforito";
miMoto.describeMoto( );
System.out.println("-------------------");
System.out.println("Arrancando el motor...");
miMoto.encenderMotor( );
System.out.println("-------------------");
miMoto.describeMoto( );
System.out.println("-------------------");
miMoto.encenderMotor( );
// Otra moto
Moto laMotoDeMiHermano = new Moto( );
laMotoDeMiHermano.fabricante = "Suzuki";
System.out.println("-------------------");
laMotoDeMiHermano.describeMoto( );
// Altera la variable estatica de la clase Moto
Moto.cilindrada = 500;
laMotoDeMiHermano.describeMoto( );
miMoto.describeMoto( );
// NOTA: el color saldra null
14. }
}
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;
15. }
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
16. 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:
17. 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;
18. }
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.
19. 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>
}
20. DÍA 3
Creación de applets sencillos
Se incrustan en las paginas web
Se cargan dinamicamente de la red
Son programas, luego problema de seguridad: restricciones
Un applet no puede cargar librerias o definir metodos nativos (programas
en C por ejemplo)
Como norma general no puede leer ni escribir ficheros en el ordenador
en que se ejecuta. Si es necesario, se pueden escribir en el HD del
ordenador host.
No puede conectarse por red excepto al host del cual se cargo el applet
No puede ejecutar ningun programa en el ordenador local
No pueden lanzar programas en el equipo local
Se supone que hay seguridad total, pero algun listillo podria
desbaratarla... Sun desafió a los hackers!
Un applet puede invocar metodos de otros applets que residan en la
misma pagina
Los applets cargados desde el sistema local (desde un directorio definido
en CLASSPATH) no tienen, por defecto, ninguna de las restricciones de
los applets cargados desde la red
Se pueden leer algunas caracteristicas del sistema local;
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
21. "user.home" User home directory
"user.name" User account name
Cada N crea un objeto de la clase SecurityManager
Se puede definir que restricciones se le aplican al applet. Si se violan, se
produce una excepcion, que el programador puede tratar ("vaya, aqui no
me dejan leer de disco")
Algunos applets paran su ejecucion al salir de la pagina, pero otros
continuan
Subclase de java.applet.Applet: por tanto hereda los metodos y clases para
manipular graficos, sonidos, etc...
PUBLIC class miclase extends java.applet.Applet: solo la clase principal debe
ser publica por fuerza
A diferencia de las aplicaciones main(), applets son algo mas complicados.
Fases en la vida de un applet;
Public void init() {...}:
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.
o Public void start() {...}:
Despues de init o de stop: por ejemplo si vamos a otra
pagina y despues volvemos. Ocurre 1 o mas veces por
tanto
o Public void Stop() {...}:
Contrapartida de start(). Cuando el usuario deja
una pagina, los threads lanzados se siguen
ejecutando(¡!??)
Destroy() {...}
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!
Public void paint(Graphics g)
Applet crea una ventana y pinta en ella: texto, lineas,
imagenes
22. Paint puede ocurrir cientos de veces: cada vez que se
mueve el navegador
Toma argumento g pasado por N automaticamente
Incluir import java.awt.Graphics
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
23. {
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:
No hay init(), start(), destroy() sobreescritos. Demasiado
simple!
36 es el tamaño
posicion (x=5, y=50). El origen (0,0) es la esquina
superior izquierda.
Probar a cortar el texto
No funciona!!! Hay que salir de N y volver
a entrar
Desactivando caché ¿? Tampoco...
En el HTML:
Ejemplo anterior es el mas sencillo posible.
El tag <APPLET>: extension del lenguaje HTML para applets
CODE es un atributo, el nombre del fichero class.
El class debe estar en el mismo directorio. Para directorio
especifico, CODEBASE (mas tarde)
WIDTH, HEIGTH son obligatorios. Dimensiones de la caja de
applet. Si pequña, se recorta.
Cerrar con </APPLET>
Opcionalmente linea siguiente a </APPLET> para N no Java
("Deberia aparecer aqui un applet si tu navegador es compatble
con Java")
Mas sobre el tag <APPLET>. Otros atributos;
24. <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>
* Parametros: en aplicaciones, linea de comandos iba a args[] en
main(). Applets no tiene linea de comandos! Para pasarlos en
applets se necesitan dos cosas;
un tag especial en el HTML
codigo en el applet .java para recoger los parametros
Ej:
<PARAM NAME=fuente
VALUE="TimesRoman">
y
String nombreDeLaFuente
= getParameter("fuente");
Proteccion: se añade a
continuacion;
If(nombreDelaFuente ==
null)
nombreDeLaFuente ==
"Courier";
25. Los parametros son siempre Strings. Si necesario valor
numerico, tendremos que convertir
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);
/
/
O
t
r
o
H
o
l
a
M
u
n
d
o
C
r
u
e
l
A
p
p
l
e
t
.
j
a
v
a
i
m
p
o
r
34. )
;
}
}
Si se sumara "Hola " +
etc... en paint, seria
menos eficiente. En init(),
solo se ejecuta 1 vez!
Usar applets publicos:
O los cargamos localmente (dificultad: hay que bajar
todas las clases, imagenes, sonidos, en misma jerarquia de
directorios)
O llamamos a la clase principal con su URL en CODE
Las restricciones de seguridad:
Son tan severas que los applets no pueden hacer nada
demsiado serio sin autorizacion expresa (escribir, leer de
disco). Base de datos?!?! Procesador de textos?!?!
Imposible!!! Al menos manteniendo la seguridad al
100%.
Graficos, texto y sonido
Graficos: coordenadas, lineas, puntos, circulos,
ovalos, poligonos o imagenes GIF
Texto: fuentes, tamaños
Color: de fondo, de dibujo
Graficos
Lineas: g.drawline(10,10,50,50)
Rectangulos:
Cuadrados
Esquinas redondeadas
Con efecto 3D: borde en relieve
Ej:
g
.
d
r
a
w
R
e
c
t
46. D
e
n
t
r
o
=
p
o
l
i
g
o
n
o
.
c
o
n
t
a
i
n
s
(
x
,
y
)
;
Ovalos: g.drawOval(a,b,c,d)
Arcos: g.drawArc(a,b,c,d,e,f,g)
Copiando areas de la pantalla
g.copyAerea(origen
X,origenY,anchura,
altura,destinoX,des
tinoY)
// Borrar un area.
Se rellena con el
color de fondo
// Para borrar todo
el applet;
g.clearRect(0,0,size
().width,size().heigt
47. h)
// size() devuelve
un objeto
Dimension
Texto y fuentes
Clases Font y FontMetrics
public Font(String nombre, int
estilo, int tamaño)
Estilos; PLAIN, BOLD(negrita),
ITALIC, BOLD+ITALIC
Ej:
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);
public FontMetrics(Font fuente)
Permite centrar un texto. Da
medidas de las letras, anchura,
distancia a la base, etc...
Color
De 24 bits. 3 componentes,
espacio RGB
0,0,0 es negro
255,0,0 es rojo
255,255,255 es blanco
etc...
48. colores predefinidos como
constantes:
Color.white, Color.yellow,
Color.lightGray,etc..
Ej:
Color
miCol
or =
new
Color
(130,
124,3
1);
g.set
Color
(miC
olor);
//
empi
eza a
dibuj
ar
con
el
nuev
o
color
setBa
ckgro
und(
Color
.blue
); //
camb
ia el
color
de
fondo
del
apple
t
setFo
regro
unf(C
olor.b
lack(;
//
camb
ia de
golpe
el
66. }
Sonido (p209 21days)
Java tiene soporte para
reproducir el formato .AU
de Sun.
Solo en applets
En aplicaciones, se puede
recurrir a una clase no
documentada, sun.audio
Las clases que comienzan
por sun.XXX incluyen
funciones que aun no se han
estandarizado, pero que se
prevé lo hagan en un futuro
próximo. Pasará de
sun.audio a java.audio. De
cualquier forma, no es
recomendable utilizarla,
cuestion de asegurar
compatibilidad.
AU esta comprimido, pero
calidad mediocre
metodo play(URL)
Ej:
p
l
a
y
(
g
e
t
C
o
d
e
B
a
s
69. i
n
i
t
(
)
{
p
l
a
y
(
g
e
t
C
o
d
e
B
a
s
e
(
)
,
"
y
a
h
o
o
1
.
a
u
"
)
;
/
/
p
o
n
e
r
y
a
h
70. o
o
1
.
a
u
e
n
d
i
r
j
a
v
a
!
}
}
Comienza en cuanto carga el
sonido
Si no lo encuentra, no da error. No
hará nada.
Para lanzar sonidos que se repitan
constantemente; AudioClip
Ej:
import
java.applet.
AudioClip;
AudioClip
clip =
getAudioClip
(getCodeBas
e(),
"audio/ruido
DeFondo.au"
);
clip.play();
// suena
solo una vez
clip.loop();
// suena
indefinidame
nte
clip.stop();
71. // obliga a
que se pare
AudioClip no para de sonar aunque
cambiemos de pagina. Por tanto, se
suele implementar clip.stop() en el
metodo stop() del applet.
Ej:
//
SonidoApple
t.java
import
java.applet.
AudioClip;
public class
SonidoApple
t extends
java.applet.
Applet
{
AudioClip
sonido;
public void
init()
{
sonid
o=
getA
udioC
lip(ge
tCode
Base(
),
"yaho
o1.au
");
}
public void
start()
{
sonid
o.loo
p();
}
72. public void
stop()
{
sonid
o.sto
p();
}
}
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:
Animacion de tipo ‘dibujos
animados’: presentar una
sucesion rapida de imagenes
precargadas GIF o JPEG
(p205 21days)
Animacion dibujada en
tiempo real; veamos
Un ejemplo que NO
funciona (no aparece
nada en pantalla);
/
/
M
a
l
R
e
l
o
j
D
i
81. }
¿Porqué no funciona?: paint
nunca se ejecuta ya que el
bucle while monopoliza la
ejecucion.
Cómo debe hacerse para
que funcione: usando
Threads
Ej:
/
/
B
i
e
n
R
e
l
o
j
D
i
g
i
t
a
l
A
p
p
l
e
t
.
j
a
v
a
i
m
p
o
r
t
j
a
95. }
}
El problema del parpadeo:
el programa anterior
funciona, pero se aprecia un
parpadeo molesto cada 3 o 4
segundos
Porqué aparece parpadeo:
(las imagenes son
demasiado grandes.
Con pequeños
cuadros es
inapreciable el
parpadeo)
repaint() llama al
metodo update()
update() borra la
pantalla por
completo y la rellena
con el color de
fondo. Despues
llama a paint()
p
u
98. paint() escribe el
nuevo pantallazo
Es la llamada a update() la
que produce el parpadeo.
Soluciones posibles
1. Sobreescribir update() para
que no borre la pantalla o
que solo borre una cierta
area
2. Clipping: re-dibujar
solo aquello que
cambia. Metodo
clipRect() de la clase
Graphics
3. Doble-buffering:
hacer los cambios en
una pantalla ‘virtual’
y volcar el resultado
a la pantalla ‘real’
(p212 21days). Es el
metodo mas
complicado...
Eventos y respuesta al usuario
Los eventos son una parte del
paquete AWT
Un evento es aparece cuando hay
interaccion con el usuario.
Ejemplos de eventos;
99.
Se pulsa el boton del raton
(Java no se distingue entre
boton izquierdo y derecho,
por un problema de
compatibilidad entre
plataformas. En MacIntosh
los ratones son de 1 solo
boton!!!)
Se arrastra con el raton
Se maximiza o minimiza
una ventana
Se pulsa una tecla
etc...
Eventos de raton
Ej:
//
PosicionDeCl
ickApplet.jav
a
import
java.awt.Eve
nt;
import
java.awt.Gra
phics;
public class
PosicionDeCl
ickApplet
extends
java.applet.
Applet
{
int x,y;
//Point
ultimo =
null;
//Point
nuevo =
null;
public void
paint(Graphi
cs g)
{
if (
x*y
!= 0)
101. y
,
0
,
1
0
)
;
g
.
f
i
l
l
O
v
a
l
(
x
,
y
,
1
0
,
1
0
)
;
}
}
public
boolean
mouseDown
(Event evt,
int x,int y)
{
this.x
= x;
this.y
= y;
Syste
m.ou
t.prin
tln("
Has
hech
o
CLIC
102. K en
x="
+x
+" ,
y="
+ y);
repai
nt();
retur
n
true;
}
}
Variacion en el ejemplo anterior:
cambiar mouseDown() por
mouseMove()
Si se picha y arrastra no lo detecta:
habria que usar mouseDrag()
mouseEnter() y mouseExit()
Ej:
public
boolean
mouseEnter(
Event evt,
int x, int y)
{
setBa
ckgro
und(j
ava.a
wt.Co
lor.bl
ue);
repai
nt();
retur
n
true;
}
public
boolean
mouseExit(E
vent evt, int
x, int y)
103. {
setBa
ckgro
und(j
ava,a
wt.Co
lor.re
d);
repai
nt();
retur
n
true;
}
Eventos de teclado
keyDown(Event evt, int
key)
keyUp(Event evt, int key)
Modificadores: la clase
Event tiene 3 metodos para
controlar si se ha pulsado
una tecla modificadora
junto con el propio evento.
Devuelven un booleano
Event.shiftDown()
Event.metaDown() (¿?) (un
metakey parece ser algo
popular en Unix,
tipicamente corresponde a
Alt, pero se desaconseja en
beneficio de Control y
Shift)
Event.controlDown()
Ej:
public
boolean
mouseDown
(Event evt,
int x, int y)
{
if
(evt.
shift
Down
())
{//
tratar
el
event
104. o
shift
+clic
k}
else
{//
tratar
el
event
o
click
simpl
e}
}
El manejador de eventos (‘AWT
Event Handler’)
Hay muchos mas eventos,
relacionados con el AWT
DÍA 4
Interfaz gráfica de usuario (AWT)
AWT = Abstract Windowing
Toolkit
Permite crear entornos
graficos de ventanas, a la manera
de Windows
Aspecto ‘similar’ en varias
plataformas
Se han utilizado elementos
comunes a todas las plataformas:
barras deslizantes, botones, menus
desplegables, etc...
1. Controles basicos
Button
Chekboxes
Choice
List
Menu
Text Field
105. 2. Otros controles
Slider
Scrollbar
Text Area
Canvas
Label
Panel
Scroll Pane
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
Una interfaz grafica lleva asociada
una jerarquia (arbol)
P.ej.: las opciones de un menu son
‘hijas’ del menu, que a su vez es
106. ‘hijo’ de la ventana en la que
aparece, que a su vez es hijo del
applet, etc...
Al [re]dibujar la interfaz, se hace
siguiendo la jerarquia, de arriba a
abajo.
Demasiado rapido para verse a
simple vista ¡!!
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
107. 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...
RadioButton
Son un caso especial de Checkbox: solo 1
puede estar activo en su grupo, como los
botones de una radio, que saltan al
cambiar...
Hay que crear el CheckboxGroup
...
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
108. Un menu Choice es desplegable.
Permite seleccionar un item del 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
Permite al usuario introducir texto
...
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
109. Es un componente similar a TextField.
TextField es mas conveniente para
pequeños textos, idealmente de una sola
linea. No tiene barras de deslizamiento
TextArea en mas conveniente para textos largos,
de mas de una linea.
Por defecto, tiene barras de deslizamiento
...
String texto = "Erase una vez un pais en el que
vivian tres cerditos que erann" +
"hermanos. Decidieron construirse una casa, y
uno el primero den" +
"ellos se la hizo de paja, el segundo de madera
y el tercero de ladrillon" +
"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
La clase Window de AWT permite crear
ventanas independientes del navegador que
contiene al applet. Frame es mas potente
que Dialog
El LayoutManager por defecto para Frame
es BorderLayout
Los Dialog son ventanas emergentes
pensadas para mensajes no permanentes,
como ‘ADVERTENCIA’, peticion de
informacion especifica, etc..., que una vez
presentados al usuario pueden desaparecer
(p.ej.: ‘Se va a proceder a la instalacion de
HyperQuake V. Confirmar?’)
Se puede forzar a que sean no
redimensionables o ‘modales’
Un Dialog ‘modal’ es aquel que impide
usar otra ventana hasta que no se lleve a
cabo la accion de la presente ventana (p.ej.:
110. ‘Es necesario que introduzca la clave de
acceso para continuar la ejecucion’)
A su vez existen dos clases de Dialog:
Dialog (a secas!)
FileDialog:
Presenta los ficheros del
directorio, abrir, cancelar,
etc..
Debido a las restricciones
de los applets, tiene muchas
mas funcionalidades si se
emplea en una aplicacion
Java
...
// 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
...
11. Como usar List
Son menus, pero no desplegables
Es una lista de items en la que se puede
elegir uno o varios
111. Si el numero de items es mayor que la
longitud de la lista, aparecen barras de
deslizamiento
...
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
Los componentes TextArea y TextField
vienen con sus propias barras deslizantes.
Pero tambien se pueden crear barras
deslizantes independientes, tipicamante
para manipular rangos de valores entre un
maximo y un minimo.
Para variar el valor asociado, hay tres
formas:
Pinchar las flechas de los extremos.
Variacion unitaria.
Pinchar en la barra. Variacion en
saltos, 10 por defecto.
Pinchar y arrastar el ‘elevador’.
112. ...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
Un componente Canvas es un objeto que
permite dibujar en él.
No hace nada por si mismo. Esta pensado
para ser extendido por herencia.
Canvas can = new Canvas();
add(can);
14. Como usar Panels
Es un tipo de ‘Container’
Permite definir un area en la cual incluir
otros componentes, incluidos otros Panels
(‘paneles anidados’). De esta forma los
componentes se agrupan, dando un aspecto
ordenado al conjunto de la interfaz grafica.
Para que esta ordenacion sea eficaz, hay
que usar Panel en un componente que
tenga bien definida la disposicion mediante
un LayoutManager (se ve mas adelante).
...
Panel unPanel = new Panel();
unPanel.add(new Label("Arriba"));
113. unPanel.add(new Label("Abajo"));
add(unPanel);
...
15. Como usar Scroll Panes
Define un area para mostrar un solo
componente con barras deslizantes.
La utilizacion tipica es la de visualizar una
imagen dentro del ScrollPane.
Si la imagen es mayor que el area del
ScrollPane, este crea automaticamente las
barras deslizantes necesarias.
Se puede forzar que no haya barras.
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,
114. 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
MenuShortcut: asocia una combinacion de
teclas para activar una opcion de menu
(p.ej.:Control-S para grabar archivo)
PopupMenu: menu flotante
17. Como aprovechar un applet grafico desde una
aplicacion
Se puede lanzar desde una aplicacion un
applet haciendo lo siguiente;
// Heredar –con extends- de las clases
Applet, AWT, etc...
115. 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
La disposicion de componentes en un
panel depende del Layout Manager
establecido y del orden en que se van
añadiendo los componentes con add().
Cada Panel puede tener su propio LM,
incluso si se anidan paneles.
El AWT tiene los siguientes LM:
FlowLayout
GridLayout
GridBagLayout
BorderLayout
CardLayout
Layout hecho ‘a medida’ por el
usuario
Sin Layout: posicionamiento
absoluto de los componentes
No es recomendable usarlo,
porque las coordenadas de
pantalla dependen de la
plataforma, y esto va en
116. contra de la filosofia Java
de hacer programas
portables
En un sistema puede quedar
perfecto y en otro salir
como un churro...
FlowLayout
Es la clase mas sencilla. Simplemente se
van añadiendo los componentes uno detras
de otro, en linea. Si no caben en una linea,
se pasa a la siguiente.
Es el LM por defecto.
setLayout(new FlowLayout());
setLayout(new FlowLayout(FlowLayout.LEFT),
10, 10); // alineacion izquierda, con distancias de
10 pixeles en horizontal y vertical
GridLayout
Dividen la superficie del panel en filas y
columnas.
Al añadir componentes con add(), estos se
distribuyen por las celdas
...
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
GridBagLayout