1.3 metodos de control

35
1.3. Métodos de control de eventos. Ejemplos de componentes que pueden generar eventos: Button. Genera eventos de acción (ActionEvent) cuando se presiona el botón. Checkbox. Genera eventos de elementos (ItemEvent) cuando se selecciona o deselecciona un checkbox. Choice. Genera eventos de elementos cuando se cambia de opción choice. List. Genera eventos de acción cuando se hace doble clic sobre un elemento, genera eventos de elemento cuando se selecciona o deselecciona un elemento. Menu Item. Genera eventos de acción 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 TÓPICOS AVANZADOS DE PROGRMACIÓN http://www.tesoem.edu.mx/alumnos/cuadernillos/2013.001.pdf

Upload: vrs-serrano

Post on 12-Dec-2015

232 views

Category:

Documents


3 download

DESCRIPTION

xcsc

TRANSCRIPT

Page 1: 1.3 Metodos de Control

1.3. Métodos de control de eventos.

Ejemplos de componentes que pueden generar eventos:

Button.

Genera eventos de acción (ActionEvent) cuando se presiona el botón.

Checkbox.

Genera eventos de elementos (ItemEvent) cuando se selecciona o deselecciona un checkbox.

Choice.Genera eventos de elementos cuando se cambia de opción choice.

List.

Genera eventos de acción cuando se hace doble clic sobre un elemento, genera eventos de elemento cuando se selecciona o deselecciona un elemento.

Menu Item.

Genera eventos de acción 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

TÓPICOS AVANZADOS DE PROGRMACIÓN

http://www.tesoem.edu.mx/alumnos/cuadernillos/2013.001.pdf

LA CLASE Event

Un contenedor soltado en un entorno gráfico se convierte en rápido receptor de eventos de todo tipo, singularmente de los relacionados con el movimiento del ratón, pulsaciones de teclas, creación/movimiento/destrucción de partes gráficas y, por último, los referidos a acciones del usuario respecto de componentes (elección de un menú, pulsación de un botón, etc.).

La clase Event es el jugador principal en el juego de los eventos. Intenta capturar las características fundamentales de todos los eventos que genera el usuario. Los datos miembro de la clase Event son los que se indican a continuación:

Page 2: 1.3 Metodos de Control

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 carácter 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 combinación aritmética del estado en que se encuentran las teclas modificadoras Mays, Alt, Ctrl.

clickCount - El número de clicks de ratón consecutivos. Sólo 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 botón

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 envíe eventos a los Componentes a través de su método postEvent().

LA CLASE Eventhttp://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

Page 3: 1.3 Metodos de Control

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 Ratón

Son los eventos generados por acciones sobre el ratón dentro de los límites 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 manipulación 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 función de diversas acciones. ACTION_EVENT LOAD_FILE SAVE_FILE GOT_FOCUS LOST_FOCUS

El applet EventosPrnt.java está diseñado 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 línea de comandos desde donde se ha lanzado el applet.

Page 4: 1.3 Metodos de Control

Una vez que se haya compilado el código 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 ratón, picar y arrastrar, teclear algo, cambiar el tamaño de la ventana y taparla y destaparla con otra. Las acciones anteriores harán 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 debería utilizarse, e incluso puede llegar a no funcionar en algunos sistemas, pero tenía la ventaja de ser la forma más fácil de ver los eventos. No obstante, vamos a reescribir el código del applet utilizando una Lista.

Una Lista es una lista de cadenas o Strings definidas en java.awt.List. Crearemos una lista de 25 líneas y no permitiremos selección múltiple, que son los dos parámetros que necesita el constructor del objeto List. El código EventosList.java que se muestra a continuación 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+")" );

Page 5: 1.3 Metodos de Control

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,carácter "+(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 EVENTOShttp://proton.ucting.udg.mx/tutorial/java/Cap4/tipoev.html#EventoVentana

Page 6: 1.3 Metodos de Control

COMPONENTESComponent es una clase abstracta que representa todo lo que tiene una posición, un tamaño, 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 continuación:

Button Canvas Checkbox Choice Container

Panel Window o Dialog o Frame

Label List Scrollbar TextComponent

TextArea TextField

Vamos a ver un poco más en detalle los Componentes que nos proporciona el AWT para incorporar a la creación de la interface con el usuario.

METODOS DE CONTROL DE EVENTOS

El método handleEvent() es un lugar para que el programador pueda insertar código para controlar los eventos. A veces, sin embargo, un Componente solamente estará interesado en eventos de un cierto tipo (por ejemplo, eventos del ratón). En estos casos, el programador puede colocar el código en un método de ayuda, en lugar de colocarlo en el método handleEvent().

No hay métodos de ayuda para ciertos tipos de eventos, aquí está la lista de los que están 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 )

Page 7: 1.3 Metodos de Control

false indicará que el método de ayuda no maneja el evento.

La implementación del método handleEvent() proporcionada por la clase Component invoca a cada método de ayuda. Por esta razón, es importante que las implementaciones redefinidas del método handleEvent() en clases derivadas, siempre finalicen con la sentencia:

return( super.handleEvent( evt ) );El siguiente trozo de código 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 métodos de ayuda. El applet EventosRaton.java, que controla los eventos de ratón exclusivamente a través de código insertado en sus métodos de ayuda; va dibujando una línea (rubber band) entre el último punto donde se ha producido un click de ratón y la posición actual del cursor.

METODOS DE CONTROL DE EVENTOShttp://proton.ucting.udg.mx/tutorial/java/Cap4/metodev.html

ACTION_EVENT

Algunos de los eventos que más frecuentemente tendremos que controlar son los siguientes:

ACTION_EVENT MOUSE_DOWN KEY_PRESS WINDOW_DESTROY

En la documentación de la clase Event se encuentra toda la lista de eventos que cualquier aplicación puede necesitar manejar y su documentación; 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 botón, seleccionar un menú, etc. Para su control podemos manejarlo en el método handleEvent() o en el método action().

Los dos métodos anteriores pertenecen a la clase Component por lo que todas las clases derivadas de ésta contendrán estos dos métodos y se pueden sobrecargar para que se ajuste su funcionamiento a lo que requiere nuestra aplicación.

Page 8: 1.3 Metodos de Control

Veamos el siguiente ejemplo, en que se controla este evento a través del método handleEvent(), que es el método general de manejo de eventos:

public boolean handleEvent( Event evt ) { switch( evt.id ) { case Event.ACTION_EVENT: // evt.arg contiene la etiqueta del botón 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 método action(), que sería:

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 botón 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_EVENThttp://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 están embebidas dentro de una instancia de la clase Applet.

Cuando un usuario interactúa con el applet, el sistema Java crea una instancia de la clase Event y rellena sus datos miembro con la información necesaria para describir la acción. 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 botón que ha sido pulsado) y se desplaza hacia arriba en el árbol de Componentes, componente a componente, hasta que alcanza al Contenedor de la raíz del árbol. Durante este camino, cada Componente tiene oportunidad de ignorar el evento o reaccionar ante él en una (o más) de las formas siguientes:

Page 9: 1.3 Metodos de Control

Modificar los datos miembros de la instancia de Event

Entrar en acción y realizar cálculos basados en la información contenida en el eventoIndicar al sistema Java que el evento no debería propagarse más arriba en el árbolEl sistema Java pasa información del evento a un Componente a través del método handleEvent() del Componente. Todos los métodos handleEvent() deben ser de la forma:

public boolean handleEvent( Event evt )

Un controlador de eventos solamente necesita una información: una referencia a la instancia de la clase Event que contiene la información del evento que se ha producido.

El valor devuelto por el método 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 propagación 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 propagación hacia arriba en el árbol de Componentes.

Veamos la descripción de una acción con el applet de la figura anterior. El usuario pulsa el botón "Uno". El sistema run-time del lenguaje Java capturará la información sobre el evento (el número de clicks, la localización del click, la hora en que se ha producido la pulsación 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 botón "Uno") y, a través de una llamada al método 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 continúa 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 algún Componente lo controle.

Cada Componente del applet añade una línea al objeto TextArea indicando que ha recibido un evento. Luego permite que el evento se propague al siguiente Componente.

El código del controlador de eventos usado en el ejemplo es el que muestran las siguientes líneas:

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 ); }

Page 10: 1.3 Metodos de Control

GENERACION Y PROPAGACION DE EVENTOShttp://proton.ucting.udg.mx/tutorial/java/Cap4/genev.html

Control de Eventos La clase Event Tipos de Eventos

1. Eventos de Ventana2. Eventos de Teclado3. Eventos de Ratón4. Eventos de Barras5. Eventos de Lista6. Eventos Varios

Generación y Propagación de Eventos Métodos de Control de Eventos ACTION_EVENT

BOTONES

Veremos ejemplos de cómo se añaden botones a un panel para la interacción del usuario con la aplicación, pero antes vamos a ver la creación de botones como objetos.

Page 11: 1.3 Metodos de Control

Se pueden crear objetos Button con el operador new: Button boton; boton = new Button( "Botón");

La cadena utilizada en la creación del botón aparecerá en el botón cuando se visualice en pantalla. Esta cadena también se devolverá para utilizarla como identificación del botón cuando ocurra un evento.

Eventos Button

Cada vez que el usuario pulsa un botón, se produce un evento, de la misma forma que se produce un evento cuando se aprieta el botón del ratón. Los eventos de pulsación de un botón se pueden capturar sobrecargando el método 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 distinción entre todos los botones existentes se puede hacer utilizando el objeto destino pasado por el objeto Event y comparándolo con los objetos botón 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( "Botón B1" ); b2 = new Button( "Botón B2" ); b3 = new Button( "Botón 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;

Page 12: 1.3 Metodos de Control

} }En el applet anterior, Botones.java, observamos que se imprime el texto asociado al botón que hayamos pulsado.

Botones de Pulsación

Los botones presentados en el applet son los botones de pulsación estándar; no obstante, para variar la representación en pantalla y para conseguir una interfaz más limpia, AWT ofrece a los programadores otros tipos de botones.

Botones de Lista

Los botones de selección en una lista (Choice) permiten el rápido acceso a una lista de elementos. Por ejemplo, podríamos implementar una selección de colores y mantenerla en un botón Choice:

Botón 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 método addItem() será devuelta en el argumento Object de un evento Choice, por ello en el manejador del

Page 13: 1.3 Metodos de Control

botón de selección, comprobamos en primer lugar que se trate efectivamente de un evento generado en un botón de tipo Choice.

Botones de Marcación

Los botones de comprobación (Checkbox) se utilizan frecuentemente como botones de estado. Proporcionan información del tipo Sí o No (true o false). El estado del botón 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 través de los métodos getLabel() y getState() del objeto Checkbox.

Botón Marcación

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 botón cuando la caja está o no seleccionada.

Botones de Selección

Los botones de comprobación se pueden agrupar para formar una interfaz de botón de radio (CheckboxGroup), que son agrupaciones de botones Checkbox en las que siempre hay un único botón activo.

Boton Radio

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

public class BotonRadio extends Applet {

Page 14: 1.3 Metodos de Control

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 botón activo entre los que conforman el interfaz de comprobación 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 botón, se construye el manejador de eventos dentro de la propia clase extendida de botón. Se pueden añadir estos botones a la aplicación, sin tener que preocuparse de los eventos que pudieran generar.

En el ejemplo siguiente, BotonAuto.java, creamos el botón que muestra la figura, un botón que genera el texto "Boton Aceptar" por la salida estándar:

Boton Autocontenidoimport 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 método action() en la clase applet BotonAuto, la clase BotonAceptar manejará sus eventos. Si se hubiesen colocado otros objetos en el

Page 15: 1.3 Metodos de Control

applet, se podría haber usado un método action() para tratar los eventos de esos objetos.

BOTONEShttp://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 manipulación de muchos elementos. Se crean utilizando métodos similares a los de los botones Choice. La lista es visible todo el tiempo, utilizándose 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 líneas a la vez y no permite selección múltiple.

Lista seleccion simpleimport 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 métodos getSelectedItem() o getSelectedItems(). Para listas de selección simple, cualquier selección con doble-click en la lista disparará el método action() de la misma forma que con los eventos de selección en menús.

Page 16: 1.3 Metodos de Control

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 selección múltiple en este applet.

Lista seleccion multipleimport 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 selección múltiple en una lista, utilizamos un evento externo para disparar las acciones asociadas a la lista. En el ejemplo, hemos incluido un botón para generar el evento que hace que el applet recoja los elementos que hay seleccionados en la lista.

Page 17: 1.3 Metodos de Control

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 automáticamente.

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 más complejos que los demás, reflejándose esta complejidad en sus constructores. Al crearlos hay que indicar su orientación, su valor inicial, los valores mínimo y máximo que puede alcanzar y el porcentaje de rango que estará visible.

También podríamos utilizar una barra de desplazamiento para un rango de valores de color, tal como se muestra en el ejemplo Ranger.java.

Barras de rangoimport 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 );

Page 18: 1.3 Metodos de Control

add( rango ); } }Como se puede ver, el ancho de la barra es mayor, en relación al Scrollbar. En este caso, maxValue representa el valor máximo para el lado izquierdo de la barra. Si se quieren representar 64 colores simultáneamente, es decir [0-63] a [192-255], maxValue debería ser 192.

Igual que otros Componentes, las barras de desplazamiento generan eventos; pero al contrario que en el resto, se tiene que utilizar el método handleEvent() directamente, en lugar del método action(). El destino del evento será un objeto de la clase Scrollbar, a partir de éste se obtiene la posición 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 añadir explícitamente una caja de texto, tal como se muestra en el ejemplo RangoRojo.java.

Rango de Colorimport 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 );

Page 19: 1.3 Metodos de Control

} }Ese era el código del applet que construye la ventana de la figura y actualiza el campo de texto asociado. No implementa ninguna otra acción o evento.

BARRAS DE DESPLAZAMIENTOhttp://proton.ucting.udg.mx/tutorial/java/Cap4/barra.html

DIALOGOS Y VENTANAS

Una Ventana genérica, Window, puede utilizarse simplemente para que sea la clase padre de otras clases y se puede intercambiar por un Diálogo, Dialog, sin pérdida de funcionalidad. No se puede decir lo mismo de un Frame.

Se podría crear un menú pop-up con una Ventana, pero lo cierto es que en esta versión del JDK hay un montón de bugs y no merece la pena el enfrascarse en el intento. No obstante, hay ciertos métodos que están en la clase Window y que no están presentes en otras clases que pueden resultar interesantes y necesitar una Ventana si queremos emplearlos.

Son: getToolkit() getWarningString() pack() toBack() toFront()

Un Diálogo 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 diálogo. Esto es lo que se usa en las cajas de diálogo "Acerca de...", en la selección en listas, cuando se pide una entrada numérica, etc.

El código Java que se expone a continuación, implementa el diálogo Acerca de para la aplicación. Esta clase se crea oculta y necesitaremos llamar al método 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 );

Page 20: 1.3 Metodos de Control

resize( HOR_TAMANO,VER_TAMANO ); }

public void paint( Graphics g ) { g.setColor( Color.white ); g.drawString( "Aplicación Java con AWT", HOR_TAMANO/4,VER_TAMANO/3 ); g.drawString( "Versión 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 deberían heredar tomando como padre la ventana principal de esa aplicación. Así pueden implementar la interface MenuContainer y proporcionar menús.

No hay razón aparente para que sea una subclase de la clase Frame, pero si se quiere proporcionar funcionalidad extra, sí debería 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 menús y cambiar el cursor, el icono de la aplicación, etc.

Un ejemplo más complicado de aplicación gráfica basada en el AWT es el convertidor de decimal a binario/octal/hexadecimal/base36, Convertidor.java, cuya presentación en pantalla es la que muestra la figura siguiente.

DIALOGOS Y VENTANAShttp://proton.ucting.udg.mx/tutorial/java/Cap4/dialogo.html

PANELES

La clase Panel es el más simple de los Contenedores de Componentes gráficos. En realidad, se trataba de crear una clase no-abstracta (Container sí lo es) que sirviera de base a los applet y a otras pequeñas aplicaciones. La clase Panel consta de dos métodos propios: el constructor, cuyo fin es crear un nuevo Panel con un

Page 21: 1.3 Metodos de Control

LayoutManager de tipo FlowLayout (el de defecto), y el método addNotify() que, sobrecargando la función del mismo nombre en la clase Container, llama al método 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 arquitectónico del AWT; se trata del bien conocido esquema de separación interface/implementación que establece por un lado una clase de interface y por otro distintas clases de implementación para cada una de las plataformas elegidas.

El uso de Paneles permite que las aplicaciones puedan utilizar múltiples layouts, es decir, que la disposición de los componentes sobre la ventana de visualización pueda modificarse con mucha flexibilidad. Permite que cada Contenedor pueda tener su propio esquema de fuentes de caracteres, color de fondo, zona de diálogo, etc.

Podemos, por ejemplo, crear una barra de herramientas para la zona superior de la ventana de la aplicación o incorporarle una zona de estado en la zona inferior de la ventana para mostrar información ú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( "Información adicional" ) ); }

public void verEstado( String informacion ) { texto.setText( informacion ); } }

Page 22: 1.3 Metodos de Control

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() );También vamos a incorporar un nuevo evento a nuestro controlador, para que maneje los eventos de tipo ACTION_EVENT que le llegarán cuando se pulsen los botones de la barra de herramientas o se realice alguna selección, etc.

case Event.ACTION_EVENT: { be.verEstado( evt.arg.toString() ); return true; }Cuando la aplicación reciba este tipo de evento, alterará el contenido de la barra de estado para mostrar la información de la selección realizada o el botón pulsado.

PANELEShttp://proton.ucting.udg.mx/tutorial/java/Cap4/panel.html

AREAS DE TEXTO

Java, a través del AWT, permite incorporar texto multilínea dentro de zonas de texto (TextArea). Los objetos TextArea se utilizan para elementos de texto que ocupan más de una línea, como puede ser la presentación tanto de texto editable como de sólo lectura.

Para crear una área de texto se pueden utilizar cuatro formas análogas a las que se han descrito en la creación de Campos de Texto. Pero además, para las áreas de texto hay que especificar el número de columnas.

Se puede permitir que el usuario edite el texto con el método setEditable() de la misma forma que se hacía en el TextField. En la figura aparece la representación del applet AreaTexto.java, que presenta dos áreas de texto, una vacía y editable y otra con un texto predefinido y no editable.

Areas de textoimport 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 );

Page 23: 1.3 Metodos de Control

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 método getText(), tal como muestra el código 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 información contenida en el TextArea. En este caso hemos utilizado un botón 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 TEXTOhttp://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 pequeñas cajas que permiten al usuario la entrada por teclado.

Los campos de texto (TextField) se pueden crear vacíos, vacíos 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 características anteriores. La imagen muestra los distintos tipos de campos.

Campos de textoimport java.awt.*;import java.applet.Applet;

public class CampoTexto extends Applet { TextField tf1,tf2,tf3,tf4;

Page 24: 1.3 Metodos de Control

public void init() { // Campo de texto vacío tf1 = new TextField(); // Campo de texto vacío 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 método action(), tal como se demuestra en el ejemplo.

CAMPOS DE TEXTOhttp://proton.ucting.udg.mx/tutorial/java/Cap4/ctexto.html

CREAR MENUS Y BARRAS DE MENUS

En la actual versión del AWT que se proporciona con el JDK, sólo se permite crear menús a través de código, ya que Java todavía no dispone de un formato de recursos y tampoco hay un diseñador como pueden ser AppStudio, Delphi o X-Designer; aunque terminará habiendo uno, con seguridad.

Page 25: 1.3 Metodos de Control

No hay ningún método para diseñar una buena interface, todo depende del programador. Los menús son el centro de la aplicación. La diferencia entre una aplicación útil y otra que es totalmente frustrante radica en la organización de los menús, pero eso, las reglas del diseño de un buen árbol de menús, no están claras. Hay un montón de libros acerca de la ergonomía y de cómo se debe implementar la interacción con el usuario. Lo cierto es que por cada uno que defienda una idea, seguro que hay otro que defiende la contraria. Todavía no hay un acuerdo para crear un estándar, con cada Window Manager se publica una guía de estilo diferente. Así que, vamos a explicar lo básico, 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 código de la función que vamos a ver, crea una barra de menús y se llama desde el constructor del Frame. La función 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 función tendrá la apariencia que muestra la figura siguiente:

Menu de la aplicacionLos eventos generados por las opciones de un menú se manejan del mismo modo que los Botones, Listas, etc. En el caso de menús, es el evento ACTION_EVENT de la clase java.awt.MenuItem el que se genera y en evt.target se nos indica la opción seleccionada.

case Event.ACTION_EVENT: { if( evt.target instanceof MenuItem )

Page 26: 1.3 Metodos de Control

{ 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 código anterior hemos tratado los eventos del menú. Para más 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 menús; y después comprobamos la opción que se ha seleccionado.

Como todo, también se puede rizar el rizo y conseguir reproducir los sistemas de menús que estamos acostumbrados a ver en las aplicaciones que manejamos habitualmente. Un ejemplo de ello son los menús en cascada, semejantes al que muestra la figura y que ha sido generado mediante la aplicación Cascada.java.

Menu en cascadaBásicamente se utiliza la técnica 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 diseño de interfaces, no debe abusarse de este tipo de menús, porque pueden crear mucha más confusión al usuario. Siempre se debe tener en mente que los usuarios tienen que navegar habitualmente por una gran cantidad de menús en las más diversas aplicaciones, por lo que no debemos esconderles demasiado las opciones que les pueden interesar.CREAR MENUS Y BARRAS DE MENUShttp://proton.ucting.udg.mx/tutorial/java/Cap4/menus.html

1. Introducción al AWT2. Interface de Usuario3. Estructura del AWT4. Componentes y Contenedores

o Tipos de Componentes5. Componentes

Page 27: 1.3 Metodos de Control

o Botones1. Eventos Button2. De pulsación (Push)3. De lista (Choice)4. De marcación (CheckBox)5. De selección (Radio)6. Autocontenidos

o Etiquetaso Listaso Campos de Textoo Areas de Textoo Canvaso Barras de Desplazamientoo Diseño de Componentes propios

6. Creación de Aplicaciones con AWTo Crear el Marco de la Aplicacióno Inicializar Fuentes, Colores y Recursoso Crear Menús y Barras de Menúso Diálogos y Ventanas

7. Paneles8. Layouts

o FlowLayouto BorderLayouto GridLayouto GridBagLayouto CardLayouto Crear un Layout propio

9. Control de Eventoso La clase Evento Tipos de Eventos

1. Eventos de Ventana2. Eventos de Teclado3. Eventos de Ratón4. Eventos de Barras5. Eventos de Lista6. Eventos Varios

o Generación y Propagación de Eventoso Métodos de Control de Eventoso ACTION_EVENT

10.Mejorar el Diseño de Interfaceso Cambio de Font de Caractereso Colores de Fondo y Textoo Fijar el Tamaño Preferidoo Uso de Insetso Habilitar y Deshabilitar Componenteso Botón Gráfico

http://proton.ucting.udg.mx/tutorial/java/Cap4/awt.html