Você está na página 1de 28

1.3. Mtodos de control de eventos.

Ejemplos de componentes que pueden generar eventos:


Button.
Genera eventos de accin (ActionEvent) cuando se presiona el botn.
Checkbox.
Genera eventos de elementos (ItemEvent) cuando se selecciona o deselecciona un
checkbox.
Choice.
Genera eventos de elementos cuando se cambia de opcin choice.
List.
Genera eventos de accin cuando se hace doble clic sobre un elemento, genera
eventos de elemento cuando se selecciona o deselecciona un elemento.
Menu Item.
Genera eventos de accin cuando se selecciona un elemento de men; genera eventos
del elemento cuando se selecciona o se deselecciona un elemento de un men de
opciones.
Scrollbar.
Genera eventos de ajuste (AdjustmentEvent) cuando se manipula el scrollbar.
FUENTE
TPICOS AVANZADOS DE PROGRMACIN
http://www.tesoem.edu.mx/alumnos/cuadernillos/2013.001.pdf
LA CLASE Event
Un contenedor soltado en un entorno grfico se convierte en rpido receptor de eventos
de todo tipo, singularmente de los relacionados con el movimiento del ratn,
pulsaciones de teclas, creacin/movimiento/destruccin de partes grficas y, por ltimo,
los referidos a acciones del usuario respecto de componentes (eleccin de un men,
pulsacin de un botn, etc.).
La clase Event es el jugador principal en el juego de los eventos. Intenta capturar las
caractersticas fundamentales de todos los eventos que genera el usuario. Los datos
miembro de la clase Event son los que se indican a continuacin:

id - El tipo de evento que se ha producido


target - Componente sobre el que se ha producido el evento
x, y - Las coordenadas en donde se ha producido el evento relativas al Componente
que actualmente est procesando ese evento. El origen se toma en la esquina superior
izquierda del Componente
key - Para eventos de teclado, es la tecla que se ha pulsado. Su valor ser el valor
Unicode del carcter que representa la tecla. Otros valores que puede tomas son los de
las teclas especiales como INICIO, FIN, F1, F2, etc.
when - Instante en que se ha producido el evento
modifiers - La combinacin aritmtica del estado en que se encuentran las teclas
modificadoras Mays, Alt, Ctrl.
clickCount - El nmero de clicks de ratn consecutivos. Slo tiene importancia en los
eventos MOUSE_DOWN
arg - Es un argumento dependiente del evento. Para objetos Button, este objeto arg es
un objeto String que contiene la etiqueta de texto del botn
evt - El siguiente evento en una lista encadenada de eventos
Una instancia de la clase Event ser creada por el sistema Java cada vez que se
genere un evento. Es posible, sin embargo, que un programa cree y enve eventos a los
Componentes a travs de su mtodo postEvent().
LA CLASE Event
http://proton.ucting.udg.mx/tutorial/java/Cap4/clasev.html
TIPOS DE EVENTOS
Los eventos se catalogan por su naturaleza, que se indicar en el miembro id de su
estructura.
Los grandes grupos de eventos son:
Eventos de Ventana
Son los que se generan en respuesta a los cambios de una ventana un frame o un
dialogo.

WINDOW_DESTROY
WINDOW_EXPOSE
WINDOW_ICONIFY

WINDOW_DEICONIFY
WINDOW_MOVED

Eventos de Teclado
Son generados en respuesta a cuando el usuario pulsa y suelta una tecla mientras un
Componente tiene el foco de entrada.
KEY_PRESS
KEY_RELEASE
KEY_ACTION
KEY_ACTION_RELEASE
Eventos de Ratn
Son los eventos generados por acciones sobre el ratn dentro de los lmites de un
Componente.
MOUSE_DOWN
MOUSE_UP
MOUSE_MOVE
MOUSE_ENTER
MOUSE_EXIT
MOUSE_DRAG
Eventos de Barras
Son los eventos generados como respuesta a la manipulacin de barras de
desplazamiento (scrollbars).
SCROLL_LINE_UP
SCROLL_LINE_DOWN
SCROLL_PAGE_UP
SCROLL_PAGE_DOWN
SCROLL_ABSOLUTE
Eventos de Lista
Son los eventos generados al seleccionar elementos de una lista.
LIST_SELECT
LIST_DESELECT
Eventos Varios
Son los eventos generados en funcin de diversas acciones.
ACTION_EVENT
LOAD_FILE
SAVE_FILE
GOT_FOCUS

LOST_FOCUS

El applet EventosPrnt.java est diseado para observar los eventos que se producen
sobre l. Cada vez que se genera un evento, el applet responde imprimiendo el evento
que ha capturado en la lnea de comandos desde donde se ha lanzado el applet.
Una vez que se haya compilado el cdigo y cargado el applet en el appletviewer o en
un navegador con soporte Java, jugar un poco con el applet. Mover el cursor dentro del
applet, picar con el ratn, picar y arrastrar, teclear algo, cambiar el tamao de la
ventana y taparla y destaparla con otra. Las acciones anteriores harn que en la
ventana en donde se haya lanzado el appletviewer, o en la consola Java en caso de
Netscape, vayan apareciendo los textos que indican los eventos que est recibiendo el
applet.
Lo cierto es que el uso de System.out.println() en un applet es algo que no debera
utilizarse, e incluso puede llegar a no funcionar en algunos sistemas, pero tena la
ventaja de ser la forma ms fcil de ver los eventos. No obstante, vamos a reescribir el
cdigo del applet utilizando una Lista.
Una Lista es una lista de cadenas o Strings definidas en java.awt.List. Crearemos una
lista de 25 lneas y no permitiremos seleccin mltiple, que son los dos parmetros que
necesita el constructor del objeto List. El cdigo EventosList.java que se muestra a
continuacin corresponde al anterior ejemplo un poco modificado.
import java.awt.*;
import java.applet.Applet;
public class EventosList extends Applet {
List lista;
public void init() {
lista = new List( 25,false );
add( lista );
lista.addItem( "Evento init" );
}
public void start() {
lista.addItem( "Evento start" );
}
public void destroy() {
lista.addItem( "Evento destroy" );
}
public void paint( Graphics g ) {
lista.addItem( "Evento paint" );
}
public void update( Graphics g ) {

lista.addItem( "Evento update" );


}
public boolean mouseUp( Event evt,int x, int y ) {
lista.addItem( "Evento mouseUp en ("+x+","+y+")" );
return false;
}
public boolean mouseDown( Event evt,int x, int y ) {
lista.addItem( "Evento mouseDown en ("+x+","+y+")" );
return false;
}
public boolean mouseDrag( Event evt,int x, int y ) {
lista.addItem( "Evento mouseDrag en ("+x+","+y+")" );
return false;
}
public boolean mouseMove( Event evt,int x, int y ) {
lista.addItem( "Evento mouseMove en ("+x+","+y+")" );
return false;
}
public boolean mouseEnter( Event evt,int x, int y ) {
lista.addItem( "Evento mouseEnter en ("+x+","+y+")" );
return false;
}
public boolean mouseExit( Event evt,int x, int y ) {
lista.addItem( "Evento mouseExit" );
return false;
}
public boolean keyDown( Event evt,int x ) {
lista.addItem( "Evento keyDown,carcter "+(char)x );
return true;
}
public void getFocus() {
lista.addItem( "Evento getFocus" );
}
public void gotFocus() {
lista.addItem( "Evento gotFocus" );
}
public void lostFocus() {
lista.addItem( "Evento lostFocus" );
}

}
TIPOS DE EVENTOS
http://proton.ucting.udg.mx/tutorial/java/Cap4/tipoev.html#EventoVentana
COMPONENTES
Component es una clase abstracta que representa todo lo que tiene una posicin, un
tamao, puede ser pintado en pantalla y puede recibir eventos.
Los Objetos derivados de la clase Component que se incluyen en el Abstract Window
Toolkit son los que aparecen a continuacin:
Button
Canvas
Checkbox
Choice
Container
Panel
Window
o Dialog
o Frame
Label
List
Scrollbar
TextComponent
TextArea
TextField
Vamos a ver un poco ms en detalle los Componentes que nos proporciona el AWT
para incorporar a la creacin de la interface con el usuario.
METODOS DE CONTROL DE EVENTOS
El mtodo handleEvent() es un lugar para que el programador pueda insertar cdigo
para controlar los eventos. A veces, sin embargo, un Componente solamente estar
interesado en eventos de un cierto tipo (por ejemplo, eventos del ratn). En estos
casos, el programador puede colocar el cdigo en un mtodo de ayuda, en lugar de
colocarlo en el mtodo handleEvent().
No hay mtodos de ayuda para ciertos tipos de eventos, aqu est la lista de los que
estn disponibles para los programadores:
action( Event evt,Object obj )
gotFocus( Event evt,Object obj )
lostFocus( Event evt,Object obj )
mouseEnter( Event evt,int x,int y )
mouseExit( Event evt,int x,int y )
mouseMove( Event evt,int x,int y )

mouseUp( Event evt,int x,int y )


mouseDown( Event evt,int x,int y )
mouseDrag( Event evt,int x,int y )
keyDown( Event evt,int key )
keyUp( Event evt,int key )
false indicar que el mtodo de ayuda no maneja el evento.
La implementacin del mtodo handleEvent() proporcionada por la clase Component
invoca a cada mtodo de ayuda. Por esta razn, es importante que las
implementaciones redefinidas del mtodo handleEvent() en clases derivadas, siempre
finalicen con la sentencia:
return( super.handleEvent( evt ) );
El siguiente trozo de cdigo ilustra esta regla.
public boolean handleEvent( Event evt ) {
if( evt.target instanceof MiBoton )
{
// Hace algo...
return true;
}
return( super.handleEvent( evt ) );
}
No seguir esta regla tan simple har que no se invoquen adecuadamente los mtodos
de ayuda. El applet EventosRaton.java, que controla los eventos de ratn
exclusivamente a travs de cdigo insertado en sus mtodos de ayuda; va dibujando
una lnea (rubber band) entre el ltimo punto donde se ha producido un click de ratn y
la posicin actual del cursor.
METODOS DE CONTROL DE EVENTOS
http://proton.ucting.udg.mx/tutorial/java/Cap4/metodev.html
ACTION_EVENT
Algunos de los eventos que ms frecuentemente tendremos que controlar son los
siguientes:
ACTION_EVENT
MOUSE_DOWN
KEY_PRESS
WINDOW_DESTROY
En la documentacin de la clase Event se encuentra toda la lista de eventos que
cualquier aplicacin puede necesitar manejar y su documentacin; como ejemplo de
uso vamos a detenernos en el primero de ellos, ACTION_EVENT.

Como ejemplo del manejo de eventos vamos a ver este evento que se provoca al pulsar
un botn, seleccionar un men, etc. Para su control podemos manejarlo en el mtodo
handleEvent() o en el mtodo action().
Los dos mtodos anteriores pertenecen a la clase Component por lo que todas las
clases derivadas de sta contendrn estos dos mtodos y se pueden sobrecargar para
que se ajuste su funcionamiento a lo que requiere nuestra aplicacin.
Veamos el siguiente ejemplo, en que se controla este evento a travs del mtodo
handleEvent(), que es el mtodo general de manejo de eventos:
public boolean handleEvent( Event evt ) {
switch( evt.id ) {
case Event.ACTION_EVENT:
// evt.arg contiene la etiqueta del botn pulsado
// o el item del men que se ha seleccionado
if( ( "Pulsado "+n+" veces" ).equals( evt.arg ) )
return( true );
default:
return( false );
}
}
Pero en este caso, cuando se produce este evento se llama al mtodo action(), que
sera:
public boolean action( Event evt,Object arg ) {
if( ( "Pulsado "+n+" veces" ).equals( arg ) )
return( true );
return( false );
}
Como se puede comprobar, incluso si las etiquetas cambian se puede recibir el evento.
Los ejemplos anteriores corresponden al control de un evento producido por un botn
que cambia su etiqueta cada vez que se pulsa. Aunque esta no es la nica forma de
manejar eventos; de hecho se puede hacer:
if( evt.target == miBoton )
en donde se comparan objetos en lugar de etiquetas.
ACTION_EVENT
http://proton.ucting.udg.mx/tutorial/java/Cap4/awt.html
GENERACION Y PROPAGACION DE EVENTOS
Tomemos el applet, EventosPro.java, que aparece en la figura siguiente. Consta de dos
instancias de la clase Button, embebidas dentro de una instancia de la clase Panel.
Esta instancia est a su vez embebida dentro de otra instancia de la clase Panel. Esta
ltima instancia de la clase Panel est situada junto a una instancia de la clase
TextArea, y ambas estn embebidas dentro de una instancia de la clase Applet.

Cuando un usuario interacta con el applet, el sistema Java crea una instancia de la
clase Event y rellena sus datos miembro con la informacin necesaria para describir la
accin. Es en ese momento cuando el sistema Java permite al applet controlar el
evento. Este control comienza por el Componente que recibe inicialmente el evento (por
ejemplo, el botn que ha sido pulsado) y se desplaza hacia arriba en el rbol de
Componentes, componente a componente, hasta que alcanza al Contenedor de la raz
del rbol. Durante este camino, cada Componente tiene oportunidad de ignorar el
evento o reaccionar ante l en una (o ms) de las formas siguientes:
Modificar los datos miembros de la instancia de Event
Entrar en accin y realizar clculos basados en la informacin contenida en el evento
Indicar al sistema Java que el evento no debera propagarse ms arriba en el rbol
El sistema Java pasa informacin del evento a un Componente a travs del mtodo
handleEvent() del Componente. Todos los mtodos handleEvent() deben ser de la
forma:
public boolean handleEvent( Event evt )
Un controlador de eventos solamente necesita una informacin: una referencia a la
instancia de la clase Event que contiene la informacin del evento que se ha producido.
El valor devuelto por el mtodo handleEvent() es importante. Indica al sistema Java si el
evento ha sido o no completamente controlado por el controlador. Un valor true indica
que el evento ha sido controlado y que su propagacin debe detenerse. Un valor false
indica que el evento ha sido ignorado, o que no ha sido controlado en su totalidad y
debe continuar su propagacin hacia arriba en el rbol de Componentes.
Veamos la descripcin de una accin con el applet de la figura anterior. El usuario pulsa
el botn "Uno". El sistema run-time del lenguaje Java capturar la informacin sobre el
evento (el nmero de clicks, la localizacin del click, la hora en que se ha producido la
pulsacin y el Componente que ha recibido el click) y empaqueta todos esos datos en
una instancia de la clase Event. El sistema Java comienza entonces por el Componente
que ha sido pulsado (en este caso, el botn "Uno") y, a travs de una llamada al mtodo
handleEvent() del Componente, ofrece a ste la posibilidad de reaccionar ante el
evento. Si el Componente no controla el evento, o no lo hace completamente (indicado
por un valor de retorno false), el sistema Java presentar la instancia de Event al
siguiente Componente por encima en el rbol (en este caso, una instancia de la clase
Panel). El sistema Java contina de este mismo modo hasta que el evento es
controlado en su totalidad o ya no hay Componentes a los que informar. En la figura
siguiente mostramos el camino recorrido por el evento en su intento de que algn
Componente lo controle.
Cada Componente del applet aade una lnea al objeto TextArea indicando que ha
recibido un evento. Luego permite que el evento se propague al siguiente Componente.
El cdigo del controlador de eventos usado en el ejemplo es el que muestran las
siguientes lneas:

public boolean handleEvent( Event evt) {


if( evt.id == Event.ACTION_EVENT )
ta.appendText( "Panel " + str + " recibe action...\n" );
else if( evt.id == Event.MOUSE_DOWN )
ta.appendText( "Panel " + str + " recibe mouse_down...\n" );
return super.handleEvent( evt );
}
GENERACION Y PROPAGACION DE EVENTOS
http://proton.ucting.udg.mx/tutorial/java/Cap4/genev.html
Control de Eventos
La clase Event
Tipos de Eventos
1. Eventos de Ventana
2. Eventos de Teclado
3. Eventos de Ratn
4. Eventos de Barras
5. Eventos de Lista
6. Eventos Varios
Generacin y Propagacin de Eventos
Mtodos de Control de Eventos
ACTION_EVENT

BOTONES
Veremos ejemplos de cmo se aaden botones a un panel para la interaccin del
usuario con la aplicacin, pero antes vamos a ver la creacin de botones como objetos.
Se pueden crear objetos Button con el operador new:
Button boton;
boton = new Button( "Botn");
La cadena utilizada en la creacin del botn aparecer en el botn cuando se visualice
en pantalla. Esta cadena tambin se devolver para utilizarla como identificacin del
botn cuando ocurra un evento.
Eventos Button
Cada vez que el usuario pulsa un botn, se produce un evento, de la misma forma que
se produce un evento cuando se aprieta el botn del ratn. Los eventos de pulsacin de
un botn se pueden capturar sobrecargando el mtodo action():
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof Button )
System.out.println( (String)obj );
else
System.out.println( "Evento No-Button" );
}
La distincin entre todos los botones existentes se puede hacer utilizando el objeto
destino pasado por el objeto Event y comparndolo con los objetos botn que hemos
dispuestos en nuestro interface:
import java.awt.*;
import java.applet.Applet;
public class Botones extends Applet {
Button b1,b2,b3;
public void init() {
b1 = new Button( "Botn B1" );
b2 = new Button( "Botn B2" );
b3 = new Button( "Botn B3" );
this.add( b1 );
this.add( b2 );
this.add( b3 );
}

public boolean action( Event evt,Object obj ) {


if( evt.target.equals( b1 ) )
System.out.println( "Se ha pulsado el boton B1" );
if( evt.target.equals( b2 ) )
System.out.println( "Se ha pulsado el boton B2" );
if( evt.target.equals( b3 ) )
System.out.println( "Se ha pulsado el boton B3" );
return true;
}
}
En el applet anterior, Botones.java, observamos que se imprime el texto asociado al
botn que hayamos pulsado.
Botones de Pulsacin
Los botones presentados en el applet son los botones de pulsacin estndar; no
obstante, para variar la representacin en pantalla y para conseguir una interfaz ms
limpia, AWT ofrece a los programadores otros tipos de botones.
Botones de Lista
Los botones de seleccin en una lista (Choice) permiten el rpido acceso a una lista de
elementos. Por ejemplo, podramos implementar una seleccin de colores y mantenerla
en un botn Choice:
Botn de Lista
import java.awt.*;
import java.applet.Applet;
public class BotonSeleccion extends Applet {
Choice Selector;
public void init() {
Selector = new Choice();
Selector.addItem( "Rojo" );
Selector.addItem( "Verde" );
Selector.addItem( "Azul" );
add( Selector );
}
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof Choice )
{
String color = (String)obj;

System.out.println( "El color elegido es el " + color );


}
return true;
}
}
En este ejemplo, BotonSeleccion.java, la cadena proporcionada al mtodo addItem()
ser devuelta en el argumento Object de un evento Choice, por ello en el manejador del
botn de seleccin, comprobamos en primer lugar que se trate efectivamente de un
evento generado en un botn de tipo Choice.
Botones de Marcacin
Los botones de comprobacin (Checkbox) se utilizan frecuentemente como botones de
estado. Proporcionan informacin del tipo S o No (true o false). El estado del botn se
devuelve en el argumento Object de los eventos Checkbox; el argumento es de tipo
booleano: verdadero (true) si la caja se ha seleccionado y falso (false) en otro caso.
Tanto el nombre como el estado se devuelven en el argumento del evento, aunque se
pueden obtener a travs de los mtodos getLabel() y getState() del objeto Checkbox.
Botn Marcacin
import java.awt.*;
import java.applet.Applet;
public class BotonComprobacion extends Applet {
Checkbox Relleno;
public void init() {
Relleno = new Checkbox( "Relleno");
add( Relleno );
}
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof Checkbox )
System.out.println( "CheckBox: " + evt.arg.toString() );
return true;
}
}
El sencillo ejemplo anterior, BotonComprobacion.java, muestra los cambios que se
producen en el estado del botn cuando la caja est o no seleccionada.
Botones de Seleccin

Los botones de comprobacin se pueden agrupar para formar una interfaz de botn de
radio (CheckboxGroup), que son agrupaciones de botones Checkbox en las que
siempre hay un nico botn activo.
Boton Radio
import java.awt.*;
import java.applet.Applet;
public class BotonRadio extends Applet {
CheckboxGroup Radio;
public void init() {
Radio = new CheckboxGroup();
add( new Checkbox( "Primero",Radio,true) );
add( new Checkbox( "Segundo",Radio,false) );
add( new Checkbox( "Tercero",Radio,false) );
}
}
En el ejemplo anterior, BotonRadio.java, observamos que siempre hay un botn activo
entre los que conforman el interfaz de comprobacin que se ha implementado.
Botones Autocontenidos
La naturaleza orientada a objetos de Java nos da la posibilidad de crear botones
completamente autocontenidos. En este tipo de botn, se construye el manejador de
eventos dentro de la propia clase extendida de botn. Se pueden aadir estos botones
a la aplicacin, sin tener que preocuparse de los eventos que pudieran generar.
En el ejemplo siguiente, BotonAuto.java, creamos el botn que muestra la figura, un
botn que genera el texto "Boton Aceptar" por la salida estndar:
Boton Autocontenido
import java.awt.*;
import java.applet.Applet;
class BotonAceptar extends Button {
public BotonAceptar() {
setLabel( "Aceptar" );
}
public boolean action( Event evt,Object obj ) {
System.out.println( "Boton Aceptar" );
return true;
}
}

public class BotonAuto extends Applet {


BotonAceptar boton;
public void init() {
boton = new BotonAceptar();
add( boton );
}
}
Es de hacer notar que no hay un mtodo action() en la clase applet BotonAuto, la clase
BotonAceptar manejar sus eventos. Si se hubiesen colocado otros objetos en el
applet, se podra haber usado un mtodo action() para tratar los eventos de esos
objetos.
BOTONES
http://proton.ucting.udg.mx/tutorial/java/Cap4/boton.html
LISTAS
Las listas (List) aparecen en los interfaces de usuario para facilitar a los operadores la
manipulacin de muchos elementos. Se crean utilizando mtodos similares a los de los
botones Choice. La lista es visible todo el tiempo, utilizndose una barra de
desplazamiento para visualizar los elementos que no caben en el rea que aparece en
la pantalla.
El ejemplo siguiente, Lista.java, crea una lista que muestra cuatro lneas a la vez y no
permite seleccin mltiple.
Lista seleccion simple
import java.awt.*;
import java.applet.Applet;
public class Lista extends Applet {
public void init() {
List l = new List( 4,false );
l.addItem( "Mercurio" );
l.addItem( "Venus" );
l.addItem( "Tierra" );
l.addItem( "Marte" );
l.addItem( "Jupiter" );
l.addItem( "Saturno" );
l.addItem( "Neptuno" );
l.addItem( "Urano" );
l.addItem( "Pluton" );
add( l );
}
public boolean action( Event evt,Object obj ) {

if( evt.target instanceof List )


System.out.println( "Entrada de la Lista: " + obj );
return true;
}
}
Para acceder a los elementos seleccionados se utilizan los mtodos getSelectedItem()
o getSelectedItems(). Para listas de seleccin simple, cualquier seleccin con dobleclick en la lista disparar el mtodo action() de la misma forma que con los eventos de
seleccin en mens.
En el applet siguiente, ListaMult.java, se permite al usuario seleccionar varios
elementos de los que constituyen la lista. En la figura se muestra la apariencia de una
seleccin mltiple en este applet.
Lista seleccion multiple
import java.awt.*;
import java.applet.Applet;
public class ListaMult extends Applet {
List lm = new List( 6,true );
public void init() {
Button boton = new Button( "Aceptar" );
lm.addItem( "Mercurio" );
lm.addItem( "Venus" );
lm.addItem( "Tierra" );
lm.addItem( "Marte" );
lm.addItem( "Jupiter" );
lm.addItem( "Saturno" );
lm.addItem( "Neptuno" );
lm.addItem( "Urano" );
lm.addItem( "Pluton" );
add( lm );
add( boton );
}
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof Button )
{
if( "Aceptar".equals( obj ) )
{
String seleccion[];
seleccion = lm.getSelectedItems();
for( int i=0; i < seleccion.length; i++ )
System.out.println( seleccion[i] );
}

}
return true;
}
}
En este caso de la seleccin mltiple en una lista, utilizamos un evento externo para
disparar las acciones asociadas a la lista. En el ejemplo, hemos incluido un botn para
generar el evento que hace que el applet recoja los elementos que hay seleccionados
en la lista.
BARRAS DE DESPLAZAMIENTO
En determinados applets que necesiten realizar el ajuste de valores lineales en pantalla,
resulta til el uso de barras de desplazamiento (Scrollbar). Las barras de
desplazamiento proporcionan una forma de trabajar con rangos de valores o de reas
como el Componente TextArea, que proporciona dos barras de desplazamiento
automticamente.
Si queremos implementar un selector de color, como en el applet Slider.java, podemos
utilizar una barra de desplazamiento para cada uno de los colores primarios.
Barras de desplazamiento
import java.awt.*;
import java.applet.Applet;
public class Slider extends Applet {
Scrollbar rojo,verde,azul;
public void init() {
rojo = new Scrollbar( Scrollbar.VERTICAL,0,1,0,255 );
verde = new Scrollbar( Scrollbar.VERTICAL,0,1,0,255 );
azul = new Scrollbar( Scrollbar.VERTICAL,0,1,0,255 );
add( rojo );
add( verde );
add( azul );
}
}
Este tipo de interfaz proporciona al usuario un punto de referencia visual de un rango y
al mismo tiempo la forma de cambiar los valores. Por ello, las barras de desplazamiento
son Componentes un poco ms complejos que los dems, reflejndose esta
complejidad en sus constructores. Al crearlos hay que indicar su orientacin, su valor
inicial, los valores mnimo y mximo que puede alcanzar y el porcentaje de rango que
estar visible.
Tambin podramos utilizar una barra de desplazamiento para un rango de valores de
color, tal como se muestra en el ejemplo Ranger.java.

Barras de rango
import java.awt.*;
import java.applet.Applet;
public class Ranger extends Applet {
Scrollbar rango;
public void init() {
rango = new Scrollbar( Scrollbar.HORIZONTAL,0,64,0,255 );
add( rango );
}
}
Como se puede ver, el ancho de la barra es mayor, en relacin al Scrollbar. En este
caso, maxValue representa el valor mximo para el lado izquierdo de la barra. Si se
quieren representar 64 colores simultneamente, es decir [0-63] a [192-255], maxValue
debera ser 192.
Igual que otros Componentes, las barras de desplazamiento generan eventos; pero al
contrario que en el resto, se tiene que utilizar el mtodo handleEvent() directamente, en
lugar del mtodo action(). El destino del evento ser un objeto de la clase Scrollbar, a
partir de ste se obtiene la posicin de la barra de desplazamiento.
Como se habr podido observar en los applets anteriores, las barras de desplazamiento
no disponen de un display o zona donde se muestren directamente los valores
asociados a los desplazamientos. Al contrario, si se desea eso, es necesario aadir
explcitamente una caja de texto, tal como se muestra en el ejemplo RangoRojo.java.
Rango de Color
import java.awt.*;
import java.applet.Applet;
public class RangoRojo extends Applet {
Scrollbar rango;
TextField valor;
Label etiqueta;
public void init() {
rango = new Scrollbar( Scrollbar.HORIZONTAL,0,1,0,255 );
valor = new TextField( "0",5 );
etiqueta = new Label( "Rojo (0-255)" );
setLayout( new GridLayout( 1,3 ) );
valor.setEditable( false );
add( etiqueta );
add( rango );
add( valor );
}

public boolean handleEvent( Event evt ) {


if( evt.target instanceof Scrollbar )
{
valor.setText(
Integer.toString( ((Scrollbar)evt.target).getValue() ) );
return true;
}
return super.handleEvent( evt );
}
}
Ese era el cdigo del applet que construye la ventana de la figura y actualiza el campo
de texto asociado. No implementa ninguna otra accin o evento.
BARRAS DE DESPLAZAMIENTO
http://proton.ucting.udg.mx/tutorial/java/Cap4/barra.html
DIALOGOS Y VENTANAS
Una Ventana genrica, Window, puede utilizarse simplemente para que sea la clase
padre de otras clases y se puede intercambiar por un Dilogo, Dialog, sin prdida de
funcionalidad. No se puede decir lo mismo de un Frame.
Se podra crear un men pop-up con una Ventana, pero lo cierto es que en esta versin
del JDK hay un montn de bugs y no merece la pena el enfrascarse en el intento. No
obstante, hay ciertos mtodos que estn en la clase Window y que no estn presentes
en otras clases que pueden resultar interesantes y necesitar una Ventana si queremos
emplearlos.
Son:

getToolkit()
getWarningString()
pack()
toBack()
toFront()

Un Dilogo es una subclase de Window, que puede tener un borde y ser modal, es
decir, no permite hacer nada al usuario hasta que responda al dilogo. Esto es lo que
se usa en las cajas de dilogo "Acerca de...", en la seleccin en listas, cuando se pide
una entrada numrica, etc.
El cdigo Java que se expone a continuacin, implementa el dilogo Acerca de para la
aplicacin. Esta clase se crea oculta y necesitaremos llamar al mtodo show() de la
propia clase para hacerla visible.
class AboutDialog extends Dialog {
static int HOR_TAMANO = 300;

static int VER_TAMANO = 150;


public AboutDialog( Frame parent ) {
super( parent,"Acerca de...",true );
this.setResizable( false );
setBackground( Color.gray );
setLayout( new BorderLayout() );
Panel p = new Panel();
p.add( new Button( "Aceptar" ) );
add( "South",p );
resize( HOR_TAMANO,VER_TAMANO );
}
public void paint( Graphics g ) {
g.setColor( Color.white );
g.drawString( "Aplicacin Java con AWT",
HOR_TAMANO/4,VER_TAMANO/3 );
g.drawString( "Versin 1.00",
HOR_TAMANO/3+15,VER_TAMANO/3+20 );
}
public boolean handleEvent( Event evt ) {
switch( evt.id ) {
case Event.ACTION_EVENT:
{
if( "Aceptar".equals( evt.arg ) )
{
hide();
return true;
}
}
default:
return false;
}
}
}
Las aplicaciones independientes deberan heredar tomando como padre la ventana
principal de esa aplicacin. As pueden implementar la interface MenuContainer y
proporcionar mens.
No hay razn aparente para que sea una subclase de la clase Frame, pero si se quiere
proporcionar funcionalidad extra, s debera serlo, en vez de serlo de su padre: Window.
Esto es as porque Frame implementa la interface MenuContainer, con lo cual tiene la
posibilidad de proporcionar mens y cambiar el cursor, el icono de la aplicacin, etc.

Un ejemplo ms complicado de aplicacin grfica basada en el AWT es el convertidor


de decimal a binario/octal/hexadecimal/base36, Convertidor.java, cuya presentacin en
pantalla es la que muestra la figura siguiente.
DIALOGOS Y VENTANAS
http://proton.ucting.udg.mx/tutorial/java/Cap4/dialogo.html
PANELES
La clase Panel es el ms simple de los Contenedores de Componentes grficos. En
realidad, se trataba de crear una clase no-abstracta (Container s lo es) que sirviera de
base a los applet y a otras pequeas aplicaciones. La clase Panel consta de dos
mtodos propios: el constructor, cuyo fin es crear un nuevo Panel con un
LayoutManager de tipo FlowLayout (el de defecto), y el mtodo addNotify() que,
sobrecargando la funcin del mismo nombre en la clase Container, llama al mtodo
createPanel() del Toolkit adecuado, creando as un PanelPeer. El AWT enviar as al
Panel (y por tanto al applet) todos los eventos que sobre l ocurran. Esto que puede
parecer un poco rebuscado, obedece al esquema arquitectnico del AWT; se trata del
bien conocido esquema de separacin interface/implementacin que establece por un
lado una clase de interface y por otro distintas clases de implementacin para cada una
de las plataformas elegidas.
El uso de Paneles permite que las aplicaciones puedan utilizar mltiples layouts, es
decir, que la disposicin de los componentes sobre la ventana de visualizacin pueda
modificarse con mucha flexibilidad. Permite que cada Contenedor pueda tener su propio
esquema de fuentes de caracteres, color de fondo, zona de dilogo, etc.
Podemos, por ejemplo, crear una barra de herramientas para la zona superior de la
ventana de la aplicacin o incorporarle una zona de estado en la zona inferior de la
ventana para mostrar informacin til al usuario. Para ello vamos a implementar dos
Paneles:
class BarraHerram extends Panel {
public BarraHerram() {
setLayout( new FlowLayout() );
add( new Button( "Abrir" ) );
add( new Button( "Guardar" ) );
add( new Button( "Cerrar" ) );
Choice c = new Choice();
c.addItem( "Times Roman" );
c.addItem( "Helvetica" );
c.addItem( "System" );
add( c );
add( new Button( "Ayuda" ) );
}
}
class BarraEstado extends Panel {

Label texto;
Label mas_texto;
public BarraEstado() {
setLayout( new FlowLayout() );
add( texto = new Label( "Creada la barra de estado" ) );
add( mas_texto = new Label( "Informacin adicional" ) );
}
public void verEstado( String informacion ) {
texto.setText( informacion );
}
}
Ahora, para dar funcionalidad, debemos crear los objetos correspondientes a la barra
de herramientas y a la barra de estado con new; al contrario que en C++, en Java todos
los objetos deben ser creados con el operador new:
add( "North",tb = new ToolBar() );
add( "South",sb = new StatusBar() );
Tambin vamos a incorporar un nuevo evento a nuestro controlador, para que maneje
los eventos de tipo ACTION_EVENT que le llegarn cuando se pulsen los botones de la
barra de herramientas o se realice alguna seleccin, etc.
case Event.ACTION_EVENT:
{
be.verEstado( evt.arg.toString() );
return true;
}
Cuando la aplicacin reciba este tipo de evento, alterar el contenido de la barra de
estado para mostrar la informacin de la seleccin realizada o el botn pulsado.
PANELES
http://proton.ucting.udg.mx/tutorial/java/Cap4/panel.html
AREAS DE TEXTO
Java, a travs del AWT, permite incorporar texto multilnea dentro de zonas de texto
(TextArea). Los objetos TextArea se utilizan para elementos de texto que ocupan ms
de una lnea, como puede ser la presentacin tanto de texto editable como de slo
lectura.
Para crear una rea de texto se pueden utilizar cuatro formas anlogas a las que se
han descrito en la creacin de Campos de Texto. Pero adems, para las reas de texto
hay que especificar el nmero de columnas.
Se puede permitir que el usuario edite el texto con el mtodo setEditable() de la misma
forma que se haca en el TextField. En la figura aparece la representacin del applet
AreaTexto.java, que presenta dos reas de texto, una vaca y editable y otra con un
texto predefinido y no editable.

Areas de texto
import java.awt.*;
import java.applet.Applet;
public class AreaTexto extends Applet {
TextArea t1,t2;
public void init() {
Button boton = new Button( "Aceptar" );
t1 = new TextArea();
t2 = new TextArea( "Tutorial de Java",5,40 );
t2.setEditable( false );
add( t1 );
add( t2 );
add( boton );
}
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof Button )
{
if( "Aceptar".equals( obj ) )
{
String texto = t1.getText();
System.out.println( texto );
}
}
return true;
}
}
Para acceder al texto actual de una zona de texto se utiliza el mtodo getText(), tal
como muestra el cdigo anterior. Las reas de texto no generan eventos por s solas,
por lo que hay que utilizar eventos externos, para saber cuando tenemos que acceder a
la informacin contenida en el TextArea. En este caso hemos utilizado un botn que
generar un evento al pulsarlo que har que se recoja el texto que haya escrito en el
rea de texto que constituye el applet.
AREAS DE TEXTO
http://proton.ucting.udg.mx/tutorial/java/Cap4/atexto.html
CAMPOS DE TEXTO
Para la entrada directa de datos se suelen utilizar los campos de texto, que aparecen
en pantalla como pequeas cajas que permiten al usuario la entrada por teclado.

Los campos de texto (TextField) se pueden crear vacos, vacos con una longitud
determinada, rellenos con texto predefinido y rellenos con texto predefinido y una
longitud determinada. El applet siguiente, CampoTexto.java, genera cuatro campos de
texto con cada una de las caractersticas anteriores. La imagen muestra los distintos
tipos de campos.
Campos de texto
import java.awt.*;
import java.applet.Applet;
public class CampoTexto extends Applet {
TextField tf1,tf2,tf3,tf4;
public void init() {
// Campo de texto vaco
tf1 = new TextField();
// Campo de texto vaco con 20 columnas
tf2 = new TextField( 20 );
// Texto predefinido
tf3 = new TextField( "Hola" );
// Texto predefinido en 30 columnas
tf4 = new TextField( "Hola",30 );
add( tf1 );
add( tf2 );
add( tf3 );
add( tf4 );
}
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof TextField )
{
if( evt.target.equals( tf1 ) )
System.out.println( "Campo de Texto 1: " +
evt.arg.toString() );
if( evt.target.equals( tf1 ) )
System.out.println( "Campo de Texto 2: " +
evt.arg.toString() );
if( evt.target.equals( tf1 ) )
System.out.println( "Campo de Texto 3: " +
evt.arg.toString() );
if( evt.target.equals( tf1 ) )
System.out.println( "Campo de Texto 4: " +
evt.arg.toString() );
}
return true;
}
}

Cuando el usuario teclea un retorno de carro en un campo de texto, se genera un


evento TextField, que al igual que con los otros Componentes del AWT podemos
capturar con el mtodo action(), tal como se demuestra en el ejemplo.
CAMPOS DE TEXTO
http://proton.ucting.udg.mx/tutorial/java/Cap4/ctexto.html

CREAR MENUS Y BARRAS DE MENUS


En la actual versin del AWT que se proporciona con el JDK, slo se permite crear
mens a travs de cdigo, ya que Java todava no dispone de un formato de recursos y
tampoco hay un diseador como pueden ser AppStudio, Delphi o X-Designer; aunque
terminar habiendo uno, con seguridad.
No hay ningn mtodo para disear una buena interface, todo depende del
programador. Los mens son el centro de la aplicacin. La diferencia entre una
aplicacin til y otra que es totalmente frustrante radica en la organizacin de los
mens, pero eso, las reglas del diseo de un buen rbol de mens, no estn claras.
Hay un montn de libros acerca de la ergonoma y de cmo se debe implementar la
interaccin con el usuario. Lo cierto es que por cada uno que defienda una idea, seguro
que hay otro que defiende la contraria. Todava no hay un acuerdo para crear un
estndar, con cada Window Manager se publica una gua de estilo diferente. As que,
vamos a explicar lo bsico, sin que se deba tomar como dogma de fe, para que luego
cada uno haga lo que mejor le parezca.
La interface MenuContainer solamente se puede implementar sobre un Frame. Un
applet que desee tener un men, debe crear un Frame en primer lugar. El cdigo de la
funcin que vamos a ver, crea una barra de mens y se llama desde el constructor del
Frame. La funcin es private porque no queremos que se pueda llamar desde ninguna
otra clase.
private void InicializaMenus() {
mbarra = new MenuBar();
Menu m = new Menu( "Archivo" );
m.add( new MenuItem( "Nuevo") );
m.add( new MenuItem( "Abrir") );
m.add( new MenuItem( "Guardar") );
m.add( new MenuItem( "Guardar como") );
m.add( new MenuItem( "Imprimir") );
m.addSeparator();
m.add( new MenuItem( "Salir") );
mbarra.add( m );
m = new Menu( "Ayuda" );
m.add( new MenuItem( "Ayuda!" ) );
m.addSeparator();
m.add( new MenuItem( "Acerca de..." ) );

mbarra.add( m );
setMenuBar( mbarra );
}
El men que crea esta funcin tendr la apariencia que muestra la figura siguiente:
Menu de la aplicacion
Los eventos generados por las opciones de un men se manejan del mismo modo que
los Botones, Listas, etc. En el caso de mens, es el evento ACTION_EVENT de la clase
java.awt.MenuItem el que se genera y en evt.target se nos indica la opcin
seleccionada.
case Event.ACTION_EVENT:
{
if( evt.target instanceof MenuItem )
{
if( "Nuevo".equals( evt.arg ) )
AplicacionAWT aAwt = new AplicacionAWT();;
if( "Abrir".equals( evt.arg ) )
System.out.println( "Opcion -Abrir-" );
if( "Guardar".equals( evt.arg ) )
System.out.println( "Opcion -Guardar-" );
if( "Guardar como".equals( evt.arg ) )
System.out.println( "Opcion -Guardar como-" );
if( "Imprimir".equals( evt.arg ) )
System.out.println( "Opcion -Imprimir-" );
if( "Salir".equals( evt.arg ) )
System.exit( 0 );
if( "Ayuda!".equals( evt.arg ) )
System.out.println( "No hay ayuda" );
if( "Acerca de".equals( evt.arg ) )
System.out.println( "Opcion -Acerca de-" );
}
}
En el cdigo anterior hemos tratado los eventos del men. Para ms seguridad, aunque
no sea estrictamente necesario, lo primero que hacemos es asegurarnos de que el
objeto evt.target es realmente un objeto MenuItem, es decir, procede de la barra de
mens; y despus comprobamos la opcin que se ha seleccionado.
Como todo, tambin se puede rizar el rizo y conseguir reproducir los sistemas de
mens que estamos acostumbrados a ver en las aplicaciones que manejamos
habitualmente. Un ejemplo de ello son los mens en cascada, semejantes al que
muestra la figura y que ha sido generado mediante la aplicacin Cascada.java.
Menu en cascada
Bsicamente se utiliza la tcnica ya descrita, pero en vez de crear un nuevo MenuItem
se crea un nuevo Menu, lo que origina el men en cascada.

No obstante, y volviendo al diseo de interfaces, no debe abusarse de este tipo de


mens, porque pueden crear mucha ms confusin al usuario. Siempre se debe tener
en mente que los usuarios tienen que navegar habitualmente por una gran cantidad de
mens en las ms diversas aplicaciones, por lo que no debemos esconderles
demasiado las opciones que les pueden interesar.
CREAR MENUS Y BARRAS DE MENUS
http://proton.ucting.udg.mx/tutorial/java/Cap4/menus.html

1.
2.
3.
4.
5.

6.

7.
8.

9.

Introduccin al AWT
Interface de Usuario
Estructura del AWT
Componentes y Contenedores
o Tipos de Componentes
Componentes
o Botones
1. Eventos Button
2. De pulsacin (Push)
3. De lista (Choice)
4. De marcacin (CheckBox)
5. De seleccin (Radio)
6. Autocontenidos
o Etiquetas
o Listas
o Campos de Texto
o Areas de Texto
o Canvas
o Barras de Desplazamiento
o Diseo de Componentes propios
Creacin de Aplicaciones con AWT
o Crear el Marco de la Aplicacin
o Inicializar Fuentes, Colores y Recursos
o Crear Mens y Barras de Mens
o Dilogos y Ventanas
Paneles
Layouts
o FlowLayout
o BorderLayout
o GridLayout
o GridBagLayout
o CardLayout
o Crear un Layout propio
Control de Eventos
o La clase Event
o Tipos de Eventos
1. Eventos de Ventana
2. Eventos de Teclado

3. Eventos de Ratn
4. Eventos de Barras
5. Eventos de Lista
6. Eventos Varios
o Generacin y Propagacin de Eventos
o Mtodos de Control de Eventos
o ACTION_EVENT
10. Mejorar el Diseo de Interfaces
o Cambio de Font de Caracteres
o Colores de Fondo y Texto
o Fijar el Tamao Preferido
o Uso de Insets
o Habilitar y Deshabilitar Componentes
o Botn Grfico
http://proton.ucting.udg.mx/tutorial/java/Cap4/awt.html