85
Desarrollo de aplicaciones gráficas 1.- Introducción 2.- Ventanas: la clase Frame 3.- Componentes Básicos 4.- Eventos de teclado y de ratón 5.- Estilos 6.- Dibujando 7.- Applets 8.- Diálogos y mensajes Apéndice A: Un poquito de Swing 1.- Introducción 1.1 AWT y Swing 1.2 Un poco de filosofía 1.3 La jerarquía Component 1.1 AWT y Swing Una de las razones del éxito de Java es la posibilidad desde las primeras versiones, de una gran cantidad de paquetes de clases destinadas al

Desarrollo de Aplicaciones Gráficas

Embed Size (px)

DESCRIPTION

zxzx

Citation preview

Desarrollo de aplicaciones grficas

1.- Introduccin2.- Ventanas: la claseFrame3.- Componentes Bsicos4.- Eventos de teclado y de ratn5.- Estilos6.- Dibujando7.- Applets8.- Dilogos y mensajes

Apndice A: Un poquito deSwing

1.- Introduccin1.1AWTySwing1.2 Un poco de filosofa1.3 La jerarquaComponent1.1AWTySwingUna de las razones del xito de Java es la posibilidad desde las primeras versiones, de una gran cantidad de paquetes de clases destinadas al diseo deinterfaces grficas. En otros lenguajes (C, C++, etc.), las libreras de componentes grficos dependan del fabricante del compilador particular que se decidiera utilizar. Esto favoreca la aparicin de dialectos del lenguaje y la falta de uniformidad en el modelo propuesto.La variedad de clases grficas y sus inmensas posibilidades de diseo hacer que un buen programador en Java no sea slo aquel que conoce los aspectos bsicos del lenguaje y su filosofa; es necesario tambin un conocimiento detallado de las clases del API (application program interface) de Java y sus posibilidades.Se pueden distinguir, principalmente, 2 grupos de clases destinadas al diseo de interfaces grficos en Java:AWTSwingLa primera (AbstractWindowToolkit) es la que vamos a estudiar en este curso. El conjunto de clasesSwingnaci a partir de AWT, simplificando los aspectos ms engorrosos de AWT, dando mayor flexibilidad al programador para disear sus propios componentes grficos (gracias all uso debeans) e incorporando numerosos componentes nuevos.La pregunta que surge al leer esto es:

SiSwinges ms sencillo, ms flexible y ms potente queAWT,por qu no limitarse a estudiar las clases de Swing?

La razn principal es que, a pesar de ser Swing ms fcil de manejar est basado en conceptos ms complejos, difciles de entender si primero no se conoce AWT; Swing contiene demasiado de AWT como para, simplemente, ignorarlo. La mayora de los autores piensa que es mejor seguir al estudiar el lenguaje la evolucin que han seguido sus diseadores. Por eso nos limitaremos aqu al estudio de AWT. Si se comprenden los conceptos de este tema pasar posteriormente a Swing no supondr ningn problema. Otro buena razn es que al ser AWT ms antiguo, losappletsde internet escritos en AWT funcionan en muchos ms exploradores que los escritos con Swing. Por tanto usando AWT nos aseguramos una mayor compatibilidad.

Observacin:Por cada componente en AWT, el correspondiente componente en Swing suele tener el mismo nombre pero precedido de una letraJ. Por ejemplo, los botones se representan en AWT mediante objetos de la claseButtony en Swing mediante objetos de la claseJButton, las ventanas mediante las clasesFrameyJFrame, y as sucesivamente.

1.2 Un poco de filosofaEl concepto bsico de la programacin grfica es elcomponente. Un componente es cualquier cosa que tenga un tamao una posicin, pueda pintarse en pantalla y pueda recibir eventos (es decir, pueda recibir acciones por parte del usuario). Un ejemplo tpico es un botn; el evento ms normal que puede recibir es que el usuario de la aplicacin pulse el botn. Podemos resumir los conceptos bsicos de la programacin grfica con AWT:

Todos los componentes son o bien contenedores (como Frame) o bien componentes bsicos (como Button).Los componentes bsicos siempre deben formar parte de un contenedor para ser visibles.Los contenedores a su vez se pueden insertar en otros contenedores.La posicin de un componente en un contenedor depende del tamao del contenedor y de su estilo (Layout).Todo componente incluye un atributo de tipoGraphicsque se encarga de dibujarlo cuando hace falta. Si queremos dibujar en el componente tendremos que pedirle que nos "deje" su objeto de tipoGraphics.Si queremos que un componente haga algo cuando le ocurra un evento determinado debemos pasarle un objeto tipoListeneral que l avisar llegado el momento.

Las idea clave de esta forma de proceder es la llamadadelegacin de eventos. En una aplicacin grfica La funcinmainse encargar de crear la ventana principal, donde se dispondrn los componentes y se indicar a cada componente a qu clase debe avisar cuando le suceda un evento. A partir de este momento ser el propio lenguaje el que se encargar de avisar a las clases adecuadas de la existencia de un evento como respuesta a las acciones del usuario. Esto significa que se pierde el concepto de ejecucin secuencial que hemos visto en los programas con entrada/salida de texto.1.3 La jerarquaComponentLa claseComponentes una clase abstracta de la que derivan todos los componentes visuales AWT. Tiene ms de 100 mtodos de los que vamos a mencionar slo los ms habituales:

ClaseComponentMtodoDescripcin

String getName()Devuelve el nombre del componente

void setName(String)Para fijar el nombre del componente

Dimension1getSize()Devuelve el tamao del componente

void setSize(int ancho, int alto)Para modificar el tamao del componente

void setSize(Dimension)Anlogo al anterior

Color getBackgroundDevuelve el color de fondo del componente

void setBackground(Color)Fija el color de fondo del componente

Color getForegroundDevuelve el color de primer plano del componente

void setForeground(Color)Fija el color de primer plano del componente

Font2getFont()Devuelve el tipo de letra asociado al componente

void setFont(Font)Fija el tipo de letra del componente

Boolean getVisible()Indica si el componente es visible

void setVisible(Boolean)Muestra/oculta el componente (til para ventanas)

Boolean getEnabled()Indica si el componente est activo

void setEnabled(Boolean)Activa/desactiva el componente (til para botones y opciones de men)

Graphics getGraphics()Devuelve el objeto tipo Graphics que puede dibujar en el componente

repaint()Llamaremos a este mtodo para pedirle al componente que se redibuje

repaint(int x, int y, int width, int height)Llamaremos a este mtodo para pedirle al componente que redibuje el rectngulo indicado

void Paint(Graphics g)Redefiniremos este mtodo (usando herencia) cuando queramos dibujar algo en el componente

void Update(Graphics g)Mtodo que por defecto borra el componente y llama a paint() cuando hay que repintar un componente. Se utiliza sobre todo en animaciones

Point3getLocation()Indica la posicin de la esquina superior izquierda del componente en su contenedor

void setLocation(int x, int y)Mueve el componente a la posicin indicada

void setLocation(Point p)Mueve el componente a la posicin indicada

Container getParent()Indica a qu contenedor pertenece el componente

Algunas observaciones sobre estos mtodos:1. La claseDimensionde AWT sirve para almacenar el ancho y el alto de un componente. Sus mtodos ms importantes sondouble getWidth(),double getHeight()y sus correspondientesset.2. La claseFontde AWT representa los tipos de letra. Es una clase compleja que no vamos a ver en profundidad. La forma ms habitual de uso es como en este ejemplo:

// Arial de 12 pts en negritaFont fuenteNegrita = new Font("Arial",Font.BOLD,12);

Las constantes de formato son:Font.PLAIN,Font.BOLDyFont.ITALIC.3. La clasePointde AWT se utiliza para representar las coordenadas de un punto(x,y). Tiene una constructoraPoint(x,y)y mtodos tales comoint getX(),int getY(),void setX(int x),void setY(int y)yvoid move(int x, int y).

El siguiente diagrama muestra esquemticamente las clases derivadas deComponent:

Aunque no vamos a estudiarlas todas, conviene saber para qu sirve cada una de ellas, y referirnos a la ayuda de Java cuando sea necesario:Componentes Bsicos

ClaseDescripcin

ButtonBotones con un texto (Ej: Aceptar)

CanvasRectngulo para dibujar

ChoiceLista desplegable (ej: lista de pases para elegir)

CheckBoxCasillas cuadradas para marcar (como en un test)

LabelEtiqueta: caracteres que se muestran en un contenedor

ListLista, similar aChoicepero constantemente desplegada

ScrollbarBarra de desplazamiento

TextFieldCampo de edicin que puede utilizar el usuario para introducir datos

TextAreaSimilar aTextFieldpero permite introducir texto que ocupe varias lneas

Contenedores

ClaseDescripcin

PanelContenedor bsico que necesita formar parte de una ventana (o pgina)

AppletPanel preparado para formar parte de una pgina HTML

WindowUna ventana sin ttulo ni casillas para minimizar,cerrar,etc.

FrameUna ventana normal, con ttulo

DialogVentana que se muestra sobre la ventana actual (Ej.: la tpica ventana para preguntar "Est seguro de ...." y dos botones de Aceptar y Cancelar)

FileDialogSimilar al anterior, pero especializado para la seleccin de ficheros (se suele utilizar en las opciones de "Abrir" o "Grabar como" )

2.- Ventanas: la claseFrame2.1 Abriendo las ventanas2.2 Cerrando las ventanas2.3 Ejemplo2.4 Utilizacin de la herencia2.1 Abriendo las ventanasLa claseFramerepresenta enAWTuna ventana tal y como estamos acostumbrados a verlas en un entorno grfico. Dado que el resto de los componentes formarn parte de una ventana, parece lgico que comencemos por ella.

Aviso:No es posible explicar en un espacio limitado todas las caractersticas de un componente visual complejo comoFrame, o como el resto de los estudiados en este tema. Por tanto nos limitaremos a los aspectos bsicos, pero avisando de que en la ayuda de Java se pueden encontrar mtodos, constructoras, etc. no discutidos aqu.

Para crear e inicializar una ventana AWT (Frame) vamos a seguir los siguientes pasos:

Crear la variable tipoFramePara eso utilizaremos alguna de las constructoras de la clase, que son: Frame(): Constructora sin parmetros; crea una ventana sin ttulo Frame(String): Crea una ventana con el ttulo que se le indica Por ejemplo: Frame ventana = new Frame("Ventana de prueba"); Tamao y posicin inicialesEl tamao se fija con el mtodovoid setSize(int, int)y la posicin consetLocation(int,int). Ambos pertenecen a la claseComponent. Ejemplo:

ventana.setSize(300, 100); ventana.setLocation(100,50); Hay que observar que el tamao y la posicin dependen de la configuracin de la pantalla. Para conocer el tamao en pixels de la pantalla podemos utilizar el mtodoToolkit.getDefaultToolkit().getScreenSize();, que devuelve un objeto de tipoDimension. Por ejemplo, para que la ventana aparezca centrada y ocupe un tercio de la pantalla tanto en ancho como en alto podemos escribir: Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); // calculamos el tamao de la ventana a partir del ancho de la pantalla int ancho=d.width/3; int alto=d.height/3; ventana.setSize(ancho, alto); ventana.setLocation(d.width/2-ancho/2,d.height/2-alto/2); Otras inicializaciones(opcional)Tambin podemos fijar los colores, el tipo de letra, el ttulo (convoid setTitle(String)) o el icono que mostrar la ventana al minimizarse (convoid setImage(Image)). Por ejemplo:

ventana.setBackground(new Color(20,140,10)); ventana.setForeground(Color.blue); Font fuente = new Font("Arial", Font.PLAIN, 20); ventana.setFont(fuente); ventana.setTitle("Ejemplo de ventana "); Fijar el estilo(opcional)Hablaremos de los "estilos" ms adelante. De momento baste con decir que el mtodosetLayout(Layout)determina el estilo de la ventana, es decir cmo se distribuyen los componentes en la ventana. Por ejemplo:

FlowLayout estilo = new FlowLayout(); ventana.setLayout(estilo); har que los componentes se siten uno al lado del otro, de izquierda a derecha y de arriba a abajo.

Observacin:Todos los estilos (comoFlowLayout) son subclases de la claseLayouty por eso pueden ser utilizados como argumentos del mtodosetLayout. Es un ejemplo de polimorfismo.

Incorporar los componentesEn este paso se aaden los componentes que se desee incluir en la ventana. Para eso se utiliza el mtodovoid add(Component)heredado de la claseContainer. Por ejemplo:

Label etiq = new Label("Te estoy mirando..."); ventana.add(etiq);

Observacin:Otro ejemplo de polimorfismo:etiqes de tipoLabel, peroLabelhereda deComponenty por esoetiqpuede ser argumento del mtodoadd, cuyo argumento est declarado de tipoComponent.

Aviso:Es importante que no olvidemos incorporar los componentes bsicos a un contenedor; en otro caso no podrn ser visibles.

Mostrar la ventanaEsto se hace con el mtodosetVisibleheredado deComponent.

ventana.setVisible(true);

Aviso:Un error habitual es olvidar este paso con lo que la ventana no se mostrar

Observacin:La utilizacin desetVisiblepermite "cambiar" de una ventana a otra, haciendo visible la que estaba oculta y viceversa.

Poniendo todo el cdigo anterior junto obtenemos la siguiente ventana:

2.2 Cerrando las ventanasUna ventana puede recibir los siguientes tipos de eventos: WINDOW_OPENED WINDOW_CLOSING WINDOW_CLOSED WINDOW_ICONIFIED WINDOW_DEICONIFIED WINDOW_ACTIVATED WINDOW_DEACTIVATED WINDOW_GAINED_FOCUS WINDOW_LOST_FOCUS WINDOW_STATE_CHANGEDPara tener acceso a ellos debemos:

Escribir una clase para atenderlos. Esta clase debe heredar deWindowAdaptero bien implementar el interfazWindowListener

Pasarle a la ventana un objeto de ese tipo a la ventana mediante el mtodoaddWindowListener. La ventana llamar al mtodo adecuado correspondiente a cada evento.

Los mtodos son: void windowActivated(WindowEvent e) void windowClosed(WindowEvent e) void windowClosing(WindowEvent e) void windowDeactivated(WindowEvent e) void windowDeiconified(WindowEvent e) void windowIconified(WindowEvent e) void windowOpened(WindowEvent e)De todos ellos el que nos interesa ahora eswindowClosingque se utiliza cuando el usuario trata de cerrar la ventana. Para que al pulsar se cierre realmente tendremos que incluir una llamada aSystem.exit(0), que fuerza el fin de la aplicacin. La clase puede ser por ejemplo:

class ParaAcabar extends WindowAdapter {

public void windowClosing(WindowEvent e) { System.exit(0); }} Y el cdigo para que la ventana utilice este mtodo:

ParaAcabar acabar = new ParaAcabar(); ventana.addWindowListener(acabar);

Observacin:Si en lugar de heredar deWindowAdapterhubiramos implementado su interfaz correspondiente (WindowListener) habramos tenido que incluir todos los mtodos anteriores en la clase, aunque slo estemos interesados en uno de ellos.

Observacin:Enswingel componente correspondiente se llamaJFrame, y permite indicar que se quiere salir de la aplicacin al cerrar la ventana sin necesidad de escribir un objeto escucha, simplemente con:

JFrame ventana = new .......ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

2.3 EjemploEl siguiente programa rene todos los conceptos anteriores:Principal.javaimport java.awt.*;import java.awt.event.*;

public class Principal { public static void main(String[] args) { // objeto de tipo ventana Frame ventana = new Frame("Ventana de prueba"); // ventana cuadrada centrada en la pantalla y // ocupando un tercio de la pantalla Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); // calculamos el tamao de la ventana a partir del ancho de la pantalla int ancho=d.width/3; int alto=d.height/3; ventana.setSize(ancho, alto); ventana.setLocation(d.width/2-ancho/2,d.height/2-alto/2); // colores, ttulo y fuente ventana.setBackground(new Color(20,140,10)); ventana.setForeground(Color.blue); Font fuente = new Font("Arial", Font.PLAIN, 20); ventana.setFont(fuente); ventana.setTitle("Ejemplo de ventana "); // estilo FlowLayout estilo = new FlowLayout(); ventana.setLayout(estilo); // componentes Label etiq = new Label("Te estoy mirando..."); ventana.add(etiq); // aadimos el "listener" para cerrar la ventana ParaAcabar acabar = new ParaAcabar(); ventana.addWindowListener(acabar);

// hacemos la ventana visible ventana.setVisible(true); }}

// clase escucha que se ejecuta al tratar de cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); // abandonar la aplicacin }} Es interesante observar que la clase para cerrar la ventana se encuentra, por comodidad, en el mismo fichero que la clase principal. Esto es posible porque esta clase no es pblica.

Observacin:En cada fichero .java puede haber una nica clase pblica, pero tambin se permite incluir otras clases -no pblicas- que sirvan de clases auxiliares de la clase pblica.

2.4 Utilizacin de la herenciaEs muy normal separar el cdigo asociado a la ventana delmain, haciendo una clase aparte que se encargue de la gestin de la ventana. Entonces la aplicacin queda compuesta de dos clases: la claseVentana, y la clasePrincipalque se limita a crear la ventana y a hacerla visible. La configuracin de la ventana (colores, tamao, posicin, componentes, escuchas, etc.) se har entonces en la constructora de la claseVentana, que se definir hija de la claseFrame:Ventana.java

import java.awt.*;import java.awt.event.*;

public class Ventana extends Frame { public Ventana() { // ventana cuadrada centrada en la pantalla y // ocupando un tercio de la pantalla Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); // calculamos el tamao de la ventana a partir del ancho de la pantalla int ancho=d.width/3; int alto=d.height/3; setSize(ancho, alto); setLocation(d.width/2-ancho/2,d.height/2-alto/2); // colores, ttulo y fuente setBackground(new Color(20,140,10)); setForeground(Color.blue); Font fuente = new Font("Arial", Font.PLAIN, 20); setFont(fuente); setTitle("Ejemplo de ventana "); // estilo FlowLayout estilo = new FlowLayout(); setLayout(estilo); // componentes Label etiq = new Label("Te estoy mirando..."); add(etiq); // aadimos el "listener" para cerrar la ventana ParaAcabar acabar = new ParaAcabar(); addWindowListener(acabar); } }

// clase escucha que se ejecuta al tratar de cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); // abandonar la aplicacin }} De esta forma la clase ventana tiene todos los mtodos de la claseFramems todos los que nosotros aadamos posteriormente. La clase principal queda simplemente:

Principal.javapublic class Principal { public static void main(String[] args) { // objeto de tipo ventana Ventana ventana = new Ventana(); // hacemos la ventana visible ventana.setVisible(true); }}y en el resto del captulo a menudo la omitiremos para evitar repetir el cdigo, que es independiente de la ventana.

3.- Componentes Bsicos3.1 Etiquetas: la claseLabel3.2 Botones: la claseButton3.3 Entrada de datos: la claseTextField3.4 reas de texto: la claseTextArea3.5 Marcas casillas: la claseCheckbox3.1 Etiquetas: la claseLabelLa claseLabel(etiqueta) se utiliza para mostrarStrings en un componente.

ConstructorasTiene 3 constructoras: Label(): La constructora por defecto, crea una etiqueta con unStringvaco. Label(String etiq):Etiqes elStringa mostrar. Label(String etiq, int alineamiento): Permite indicar si la etiqueta se mostrar en el espacio reservado para ella en el component alineada a la izquierda (constanteLabel.LEFT), a la derecha (Label.RIGHT) o centrada (Label.CENTER).MtodosAparte de los mtodos heredados deObjectyComponent, esta clase tiene dos mtodos importantes: setText(String etiq): Para modificar el contenido de la etiqueta. String getText(): Devuelve el contenido actual de la etiqueta.

3.2 Botones: la claseButtonEste componente es bsico; sobre el suelen recaer las acciones del usuario y a menudo en sus escuchas asociadas se realiza la parte ms complicada del programa. La filosofa que se sigue es vlida para otros componentes que no discutimos aqu, como los mens.ConstructorasTiene 2 constructoras: Button(): Botn con un mensaje vaco. Button(String etiq):Etiqes elStringa mostrar como mensaje.MtodosAlgunos de los mtodos ms importantes, adems de los heredados deComponent, son: void setLabel(String label): Cambia la etiqueta del botn. String getLabel(): Devuelve la etiqueta actual. void setActionCommand(String command): Asocia unStringal botn. EsteStringno se mostrar por pantalla, sino que se utilizar como identificador del botn. void addActionListener(ActionListener l): Para aadir unaescuchaque pueda reaccionar cuando se pulsa el botn. Se explica en el apartado siguiente.Vamos a ver un primer ejemplo. En este ejemplo se separa la aplicacin en dos clases independientes: la clase con elmainy la clase con la ventana:Ventana.java

package ventanas;import java.awt.*;import java.awt.event.*;

public class Ventana extends Frame { Button botn; Label etiq; // constructora public Ventana() { // titulo, estilo, tamao y posicin iniciales setTitle("Ejemplo de ventana con boton (v.1) "); setLayout(new FlowLayout()); setSize(300, 100); setLocation(100,50); // le damos un poco de color a la ventana setBackground(Color.yellow); // una etiqueta etiq = new Label("Un botn:"); add(etiq); // creamos el botn botn = new Button("Plsame"); botn.setBackground(Color.blue); botn.setForeground(Color.white); // lo incorporamos a la ventana // importante: si no se hace esto no sera visible add(botn); // aadimos el "listener" para cerrar la ventana addWindowListener(new ParaAcabar()); }}

// clase para cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); }} En este ejemplo aparece la ventana pero al pulsar el botntodava no hace nada. En el siguiente apartado veremos como hacer que el botn "reaccione" cuando es pulsado.EventosLa idea es que no ser el propio botn sino un objetoescuchael que ser informado por Java para que acte cuando el botn sea pulsado. Para lograr esto hay que:1. Escribir una clase adecuada a la que pertenecer el objetoescucha. Esta clase debe, en el caso de los botones, implementar el interfazjava.awt.event.ActionListener.2. Declarar un objeto del tipo anterior (normalmente en la constructora de la ventana, a la vez que se crea el botn).3. Asociar el objeto de tipo escucha con el botn o, dicho con la terminologa habitual de Java,registrarel objeto como escucha del botn. Esto se hace utilizando el mtodovoid addActionListener(ActionListener l).El interfazActionListenertiene un slo mtodo:void actionPerformed(ActionEvent e), al que se invocar cuando ocurra un evento sobre el botn (normalmente que ha sido pulsado). El objetoActionEventnos servir para saber ms informacin acerca del evento, y normalmente se us cuando el mismo objeto de tipoActionListenerse utiliza de escucha para ms de un botn, ya que nos permite saber cul de los botones ha sido pulsado. En particular contiene 2 mtodos que pueden ser tiles. String getActionCommand(). Object getSource(): Fuente del evento (objeto de tipoButton).El siguiente ejemplo hace que el botn, al ser pulsado escriba por pantalla el mensaje "Gracias".Ventana.java

package ventanas;

import java.awt.*;import java.awt.event.*;

public class Ventana extends Frame { Button botn; Label etiq; // constructora public Ventana() { // titulo, estilo, tamao y posicin iniciales setTitle("Ejemplo de ventana con boton (v.2) "); setLayout(new FlowLayout()); setSize(300, 100); setLocation(100,50); // le damos un poco de color a la ventana setBackground(Color.yellow); // una etiqueta etiq = new Label("Un botn:"); add(etiq); // creamos el botn botn = new Button("Plsame"); botn.setBackground(Color.blue); botn.setForeground(Color.white); // lo incorporamos a la ventana // importante: si no se hace esto no sera visible add(botn); // preparamos la escucha del boton Escucha e = new Escucha(); // la registramos botn.addActionListener(e); // aadimos la escucha para cerrar la ventana addWindowListener(new ParaAcabar()); }}

// clase para cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); }}

// escucha del botonclass Escucha implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Gracias"); }} Ejercicio:Hacer que el botn escriba al hacer click el nmero de veces que ha sido pulsado desde que ha comenzado la aplicacin (solucin en el siguiente apartado).Interaccin con otros componentes grficosSupongamos que pretendemos que el botn cambie de color de fondo cada vez que se le pulse. Para ello podemos utilizar el mtodosetBackgroundy generar un color aleatorio utilizando el mtodoMath.random(). Un primer intento consiste en modificar la claseEscuchade la siguiente forma:

// escucha del botonclass Escucha implements ActionListener { public void actionPerformed(ActionEvent e) { // generamos un color aleatorio Color c = new Color((int)(Math.random()*256),(int)(Math.random()*256), (int)(Math.random()*256)); // cambiamos el color del boton boton.setBackground(c); }} Pero al compilar el cdigo anterior obtenemos un error:

C:\JCreator LE\MyProjects\gracias\ventanas\Ventana.java:67: cannot resolve symbolsymbol : variable boton location: class ventanas.Escucha boton.setBackground(c); ^ La razn es que la variablebotonno es visible dentro de la claseEscucha. Afortunadamente podemos obtener el botn a partir de la variableActionEvent ede la siguiente forma: // escucha del botonclass Escucha implements ActionListener { public void actionPerformed(ActionEvent e) { Button boton = (Button) e.getSource(); // generamos un color aleatorio Color c = new Color((int)(Math.random()*256),(int)(Math.random()*256), (int)(Math.random()*256)); // cambiamos el color del boton boton.setBackground(c); }} Esta solucin no se puede aplicar si queremos interactuar con otro componente distinto del botn.Ejemplo:Supongamos que queremos que al pulsar el botn se muestre en la etiqueta el nmero de veces que se ha pulsado el botn desde que comenz la aplicacin.En este caso no nos vale de nada la variableActionEvent e; la etiqueta est definida en la clase ventana y debemos ''obtenerla'' de otra forma. Vamos a ver dos posibilidades:1. Definir un atributo en la clase escucha que contendr una referencia al componente externo deseado.Este atributo se inicializar mediante la constructora.

2.

En nuestro caso:3. Ventana.java4. 5. package ventanas;6. 7. import java.awt.*;8. 9. import java.awt.*;10. import java.awt.event.*;11. 12. public class Ventana extends Frame {13. 14. // constructora15. public Ventana() {16. 17. // titulo, estilo, tamao y posicin iniciales 18. setTitle("Ejemplo de ventana con boton (v.3) "); 19. setLayout(new FlowLayout()); 20. setSize(300, 100);21. setLocation(100,50); 22. 23. // le damos un poco de color a la ventana24. setBackground(Color.yellow);25. 26. // una etiqueta27. Label etiq = new Label("An no has pulsado");28. add(etiq);29. 30. // creamos el boton31. Button boton = new Button("Plsame");32. boton.setBackground(Color.blue);33. boton.setForeground(Color.white);34. 35. // incorporamos el boton al frame36. // importante: si no se hace esto no sera visible37. add(boton);38. 39. // preparamos la escucha del boton40. Escucha e = new Escucha(etiq);41. // la registramos42. boton.addActionListener(e);43. 44. 45. // aadimos el "listener" para cerrar la ventana46. addWindowListener(new ParaAcabar()); 47. 48. // la mostramos 49. setVisible(true); 50. 51. }52. }53. 54. 55. // clase para cerrar la ventana56. class ParaAcabar extends WindowAdapter {57. public void windowClosing(WindowEvent e) { 58. System.exit(0); 59. }60. }61. 62. 63. // escucha del boton64. class Escucha implements ActionListener {65. int i; // para contar las veces que se ha pulsado66. Label etiqueta; // etiqueta que se modificar67. 68. 69. public Escucha(Label etiqueta) {70. this.etiqueta = etiqueta;71. i=0;72. }73. 74. public void actionPerformed(ActionEvent e) {75. i++;76. etiqueta.setText("Has pulsado "+i+" veces");77. }78. }79. 80. Ahora s que el programa funcionar correctamente:81. 82. 83. Escribir la clase escucha dentro de la clase Ventana.

84. Java permite escribir una clase auxiliar dentro de la clase con la que ''colabora''. As podemos definir la clase escucha como una subclase privada de la clase Ventana, que al ser miembro de la clase tiene acceso a los atributos:85. package ventanas;86. 87. import java.awt.*;88. 89. import java.awt.*;90. import java.awt.event.*;91. 92. public class Ventana extends Frame {93. private int contador;94. private Label etiq; 95. private Button botn;96. 97. // constructora98. public Ventana() {99. contador = 0;100. 101. // titulo, estilo, tamao y posicin iniciales 102. setTitle("Ejemplo de ventana con boton (v.3) "); 103. setLayout(new FlowLayout()); 104. setSize(300, 100); setLocation(100,50); 105. 106. // le damos un poco de color a la ventana107. setBackground(Color.yellow);108. 109. // una etiqueta110. etiq = new Label("An no has pulsado");111. add(etiq);112. 113. // creamos el boton114. botn = new Button("Plsame");115. botn.setBackground(Color.blue);116. botn.setForeground(Color.white);117. 118. // incorporamos el boton al frame119. // importante: si no se hace esto no sera visible120. add(botn);121. 122. // preparamos la escucha del boton123. Escucha e = new Escucha();124. // la registramos125. botn.addActionListener(e);126. 127. // aadimos el "listener" para cerrar la ventana128. addWindowListener(new ParaAcabar()); 129. }130. 131. // escucha del botn132. private class Escucha implements ActionListener {133. public void actionPerformed(ActionEvent e) {134. contador++;135. etiq.setText("Has pulsado "+contador+" veces");136. }137. }138. } // fin de la clase Ventana139. 140. // clase para cerrar la ventana141. class ParaAcabar extends WindowAdapter {142. public void windowClosing(WindowEvent e) {System.exit(0);}143. }Esta solucin es ms sencilla; nos ahorramos la constructora, la copia de la referencia para acceder a los objetos, etc. A cambio es menos elegante y ms limitada; por ejemplo no nos permite definir la clase escucha en un fichero aparte, para poder compartirla por varias aplicaciones.Utilizando la misma escucha para varios botonesSupongamos que queremos tener una etiqueta que haga de contador comenzando en 0. Incluiremos dos botones, uno para incrementar el contador y otro para decrementarlo. A la hora de establecer las escuchas hay dos posibilidades:1. Escribir dos clases escucha, una para el botn de incrementar y otra para el de decrementar.2. Utilizar la misma escucha para ambos.El segundo mtodo es, en este caso, ms cmodo, pero tenemos que ser capaces de distinguir dentro del mtodoactionPerformedcul de los dos botones ha sido pulsado, para as incrementar o decrementar el contador. Para esto podemos utilizar el mtodosetActionCommandde la claseButtonygetActionCommanddeActionEvent, tal y como muestra el programa siguiente:Ventana.java

package ventanas;

import java.awt.*;

import java.awt.*;import java.awt.event.*;

public class Ventana extends Frame { // constructora public Ventana() { // titulo, estilo, tamao y posicin iniciales setTitle("contadores "); setLayout(new FlowLayout()); setSize(200, 100); setLocation(100,50); // le damos un poco de color a la ventana setBackground(Color.yellow); // las etiquetas Font fuente = new Font("Arial", Font.PLAIN, 20); Label etiq = new Label("Contador: "); etiq.setFont(fuente); add(etiq); Label etiq2 = new Label("0"); etiq2.setFont(fuente); add(etiq2);

// preparamos la escucha del boton Escucha e = new Escucha(etiq2); // creamos los botones Button botonInc = new Button("Incremento"); botonInc.setActionCommand("inc"); botonInc.setBackground(Color.blue); botonInc.setForeground(Color.white); add(botonInc); botonInc.addActionListener(e);

Button botonDec = new Button("Decremento"); botonDec.setActionCommand("dec"); botonDec.setBackground(Color.red); botonDec.setForeground(Color.white); add(botonDec); botonDec.addActionListener(e); // aadimos el "listener" para cerrar la ventana addWindowListener(new ParaAcabar()); }}

// clase para cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); }}

// escucha del botonclass Escucha implements ActionListener { int contador; // para contar las veces que se ha pulsado Label etiqueta; // etiqueta que se modificar public Escucha(Label etiqueta) { this.etiqueta = etiqueta; contador=0; } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("inc")) contador++; else contador--; etiqueta.setText(" "+contador+" "); }}

El programa tendr el siguiente aspecto:

3.3 Entrada de datos: la claseTextFieldEste componente se utiliza comnmente para leer datos de teclado.

ConstructorasParaTextField: TextField(): Constructora por defecto conteniendo la cadena vaca y con 0 columnas. TextField(int columnas): Contenido vaco pero longitud prefijada inicial. TextField(String texto)Campo de texto con un valor inicial. TextField(String texto, int columnas): Las dos anteriores combinadas.MtodosLa claseTextFieldcoincide con las clases anteriores en la definicin de los mtodossetText(String cadena)yString getText(). Algunos otros mtodos de inters: setEchoChar(Char c): Indica el carcter que aparece cuando se introduce un valor y se usa para introducir palabras clave.setEchoChar(0)hace que el carcter que aparece sea el carcter pulsado. setEditable(boolean): Si se pone afalseno se podr escribir sobre el campo de edicin. int getSelectionStart(), int getSelectionEnd(): Para saber el trozo de texto que ha sido seleccionado por el usuario. Muy til para las acciones de "Copiar", "Cortar" y "Pegar". void setSelectionStart(int inicio), void setSelectionEnd(int fin): Para marcar una porcin de texto. En realidadsetSelectionEnd(int fin)indica una posicin ms all de la ltima a marcar. Por ejemplo, para marcar los caracteres 2,3 y 4 (tercer, cuarto y quinto carcter) se utilizara: texto.setSelectionStart(2); texto.setSelectionEnd(5); EventosEn cuanto a los eventos, la diferencia principal con la claseButtones que el mtodoActionEventde la claseescuchase utiliza cuando se pulsaEnter. Tambin se puede controlar cual es la tecla pulsada, como veremos al hablar de los eventos de teclado, pero estos eventos no son especficos de la claseTextFieldsino comunes a todos losComponent.Ejemplo:Clase para representar una ventana de entrada a un sistema, con login y password:PalabraClave.java

package claves;

import java.awt.*;import java.awt.event.*;

public class PalabraClave extends Frame { private Label etiq,etiq2,etiq3; private Button aceptar; private TextField login; private TextField pass; public PalabraClave() {

// titulo, estilo, tamao y posicin iniciales setTitle("Entrada al Sistema"); setLayout(new FlowLayout());

// ventana centrada Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); int ancho=300, alto=200; setSize(ancho, alto); setLocation(d.width/2-ancho/2,d.height/2-alto/2); // tipo de letra Font fuente = new Font("Arial", Font.PLAIN, 18); setFont(fuente);

// un poco de color setBackground(Color.cyan); // preparamos la entrada de datos etiq = new Label("Login: "); add(etiq); login = new TextField(8); add(login); etiq2 = new Label("Password:"); etiq2.setFont(fuente); add(etiq2);

pass = new TextField(10); pass.setEchoChar('*'); add(pass);

aceptar = new Button("Aceptar"); add(aceptar); etiq3 = new Label("Pulsa Aceptar para Continuar"); add(etiq3); // preparamos las escuchas EscuchaAceptar e = new EscuchaAceptar(); aceptar.addActionListener(e); pass.addActionListener(e); // esta vale slo para el campo de login EscuchaSiguiente pasaAlSiguiente = new EscuchaSiguiente(); login.addActionListener(pasaAlSiguiente); // aadimos la escucha para cerrar la ventana addWindowListener(new ParaAcabar()); }

// escuchas como subclases privadas ///////////////////////

// escucha del boton Aceptar private class EscuchaAceptar implements ActionListener { public void actionPerformed(ActionEvent e) { if (vlidos(login.getText(), pass.getText())) etiq3.setText("Datos vlidos"); else etiq3.setText("Datos no vlidos"); } private boolean vlidos(String login, String pass) { // aqu se comprueba return login.equals("Bertoldo") && pass.equals("nolose"); } }

// clase escucha para el primer campo de edicin; le pasa el foco // al siguiente private class EscuchaSiguiente implements ActionListener { public void actionPerformed(ActionEvent e) { // componente sobre el que ha ocurrido el evento Component c = (Component) e.getSource(); // indicarle que pase el foco al siguiente elemento c.transferFocus(); } } ////////////////////// fin escuchas ////////////////////////////// } // Ventana

// clase para cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) {System.exit(0);}} La ejecucin del programa tendr el siguiente aspecto:

3.4 reas de texto: la claseTextAreaEs similar aTextFieldcon la diferencia de que al presentarse en pantalla permite introducir cdigo que ocupa ms de una lnea.Constructoras TextArea(): rea de texto con una cadena vaca. Tamao de alrededor de 55 filas por 15 columnas TextArea(int filas, int columnas): Fija el nmero de filas y columnas. Si el nmero excede el tamao del TextArea se incluyen automticamente las barras de desplazamiento. TextArea(String texto): Texto inicial. TextArea(String texto, int filas, int columnas): Texto inicial con filas y columnas prefijadas. TextArea(String texto, int filas, int columnas, int barras): Aade al anterior la posibilidad de controlar la existencia de barras de desplazamiento. Los posibles valores debarrasson: SCROLLBARS_BOTH SCROLLBARS_HORIZONTAL_ONLY SCROLLBARS_NONE SCROLLBARS_VERTICAL_ONLYMtodos y EventosLos mtodos y eventos son como los deTextFieldcon algunos mtodos aadidos, entre los que podemos destacar: void replaceRange(String str, int start, int end): Cambia el texto entre las posicionesstartyendpor el textostr. insert(String str, int pos): Inserta el texto en la posicin indicada. append(String str): Aade el texto indicado al final.3.5 Marcar casillas: la claseCheckboxLa claseCheckboxnos permite mostrar texto acompaado de casillas con dos estados: marcada o no marcada. VariosCheckboxpueden agruparse de forma que nos aseguremos de que slo una casilla est marcada en cada momento. Vamos a ver las dos posibilidades en dos ejemplos separados:Casillas no agrupadasEn este caso basta con declarar y aadir los Checkbox independientemente. La etiqueta asociada a la casilla se puede fijar en la constructora o bien posteriormente con el mtodosetLabel(String). El estado (activada o no) se puede modificar y consultar con los mtodossetState(boolean)ygetState(), respectivamente. El siguiente ejemplo muestra el uso de este componente:Ventana.javaimport java.awt.*;import java.awt.event.*;

public class Ventana extends Frame { // la ventana contiene 4 casillas private Checkbox casilla1,casilla2,casilla3,casilla4; // dos etiquetas Label etiq1, etiq2; // y un botn private Button aceptar; public Ventana() { // objeto de tipo ventana setTitle("Prueba de Checkbox"); setSize(380, 150); setLayout(new FlowLayout()); Font fuenteNegrita = new Font("Arial",Font.BOLD,16); setFont(fuenteNegrita) ; etiq1 = new Label("Marque sus aficiones favoritas y pulse Aceptar"); add(etiq1); // una forma de construir una casilla casilla1 = new Checkbox(); casilla1.setLabel("Deportes"); // otra forma casilla2 = new Checkbox("Lectura"); casilla3 = new Checkbox("Viajes"); casilla4 = new Checkbox("Cine"); // hacemos que la casilla Cine aparezca marcada casilla4.setState(true); add(casilla1); add(casilla2); add(casilla3); add(casilla4); aceptar = new Button("Aceptar"); add(aceptar); // escucha del botn aceptar.addActionListener(new EscuchaBotn()); // etiqueta donde se mostrar el resultado etiq2 = new Label(""); // aadimos la escucha para cerrar la ventana addWindowListener(new ParaAcabar()); } ////////////////////////////////////////////////////// // escucha del boton class EscuchaBotn implements ActionListener { public void actionPerformed(ActionEvent e) { String aficiones = "Ha elegido: "; if (casilla1.getState()) aficiones += casilla1.getLabel()+" "; if (casilla2.getState()) aficiones += casilla2.getLabel()+" "; if (casilla3.getState()) aficiones += casilla3.getLabel()+" "; if (casilla4.getState()) aficiones += casilla4.getLabel()+" "; // aadimos a la ventana un label con los objetos elegidos add(new Label(aficiones)); } }}

// clase escucha que se ejecuta al tratar de cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); // abandonar la aplicacin }} El resultado es:

Casillas agrupadasSimilar al anterior, pero agrupando las casillas por medio de un objeto tipoCheckboxGroup, para lo que se usa una tercera constructora que permite indicar el grupo al que pertenece la casilla, as como si est activa (cada grupo tendr como mximo una casilla marcada). Los mtodos deCheckboxGroupCheckbox getSelectedCheckbox()yvoid setSelectedCheckbox(Checkbox)sirven para obtener y cambiar, respectivamente, elCheckboxseleccionado. Ejemplo:Ventana.javaimport java.awt.*;import java.awt.event.*;

public class Ventana extends Frame { // grupo de 3 casillas private CheckboxGroup grupo; private Checkbox c1,c2,c3; // y una etiqueta Label etiq1; public Ventana() { setTitle("Prueba de CheckboxGroup"); setSize(300, 80); setBackground(Color.yellow); setLayout(new FlowLayout()); Font fuenteNegrita = new Font("Arial",Font.BOLD,16); setFont(fuenteNegrita) ; etiq1 = new Label("Destino:"); add(etiq1); // primero se construye el "agrupador" grupo = new CheckboxGroup(); // ahora se crean las casillas indicando que estn en el grupo c1 = new Checkbox("Madrid",grupo,false); c2 = new Checkbox("Pars",grupo,false); c3 = new Checkbox("Berln",grupo,true); // aadir las casillas a la ventana; el grupo NO se aade add(c1); add(c2); add(c3); // aadimos la escucha para cerrar la ventana addWindowListener(new ParaAcabar()); } }

// clase escucha que se ejecuta al tratar de cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); // abandonar la aplicacin }} El resultado es:

4.- Eventos de teclado y de ratn4.1 Eventos de teclado4.2 Eventos de ratn4.1 Eventos de tecladoLos eventos de teclado detectan la pulsacin de teclas. Cualquier componente puede registrar una escucha de teclado, al igual que una escucha para el ratn. El componente que recibe la entrada de teclado en cada momento es nico; se dice que ese componente "tiene el foco". Un componente puede pedir el foco utilizando el mtodorequestFocus(). Para detectar los eventos de teclado, un componente debe:Escribir una clase que implemente el interfazKeyListener.Declarar un objeto de la clase anterior.Registrarlo conaddKeyListener(KeyListener escucha), un mtodo de la claseComponent.El interfazKeyListenerdispone de los siguientes mtodos: void keyPressed(KeyEvent e): Tecla pulsada. void keyReleased(KeyEvent e): Se dej de pulsar la tecla. void keyTyped(KeyEvent e): La combinacin de las dos anteriores.Por su parte, el parmetro de tipoKeyEventcontiene los siguientes mtodos que nos ayudan a identificar la tecla concreta: char getKeyChar(): Devuelve el carcter asociado a la tecla, si es una tecla normal (imprimible). Las teclas especiales devuelven la constanteCHAR_UNDEFINED. boolean isActionKey(): Devuelvetruesi la tecla es una tecla especial ofalsesi es imprimible. int getKeyCode(): Devuelve una constante identificando a la tecla si es una tecla especial. Algunas de estas constantes son:VK_ACCEPT, VK_ALT, VK_ALT_GRAPH, VK_BACK_QUOTE, VK_BACK_SLASH, VK_BACK_SPACE, VK_CANCEL, VK_CAPS_LOCK, VK_CLEAR, VK_CLOSE_BRACKET, VK_CODE_INPUT, VK_COLON, VK_COMMA, VK_COMPOSE, VK_CONTROL, VK_COPY, VK_CUT, VK_DELETE, VK_DOWN, VK_END, VK_ENTER, VK_ESCAPE, VK_EURO_SIGN, VK_F1, VK_F10, VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16, VK_F17, VK_F18, VK_F19, VK_F2, VK_F20, VK_F21, VK_F22, VK_F23, VK_F24, VK_F3, VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_FINAL, VK_FIND, VK_HELP, VK_HOME, VK_INSERT, VK_LEFT, VK_NUM_LOCK, VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7, VK_NUMPAD8, VK_NUMPAD9, VK_O, VK_PAGE_DOWN, VK_PAGE_UP, VK_PASTE, VK_PAUSE, VK_PRINTSCREEN, VK_RIGHT, VK_SCROLL_LOCK, VK_SHIFT, VK_STOP, VK_TAB, VK_UNDEFINED, VK_UNDO, VK_UP.

Ejemplo: Hacer que la posicin de una etiqueta cambie con las teclas de cursor. El programa tambin avisar si se pulsa la tecla Bloq. Nm.

Teclas.java

import java.awt.*;import java.awt.event.*;

public class Teclas extends Frame { private Label etiq; // nico componente public Teclas() { // titulo, estilo, tamao y posicin iniciales setTitle("Teclas"); setLayout(new FlowLayout());

// ventana centrada Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); int ancho=300, alto=200; setSize(ancho, alto); setLocation(d.width/2-ancho/2,d.height/2-alto/2); // tipo de letra Font fuente = new Font("Arial", Font.PLAIN, 18); setFont(fuente); // un poco de color setBackground(Color.cyan); // preparamos la entrada de datos etiq = new Label("Pulsa 'S' para salir "); add(etiq); // escucha de teclado para la ventana; // le pasamos como parmetro la etiqueta EscuchaTeclas e = new EscuchaTeclas(etiq); addKeyListener(e); // aadimos la escucha para cerrar la ventana addWindowListener(new ParaAcabar()); // si no hacemos esto el foco se lo queda la etiqueta!!! requestFocus(); } }

// clase para cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); }}

// escucha de teclaroclass EscuchaTeclas implements KeyListener { private Label etiq; public EscuchaTeclas(Label etiq) { this.etiq = etiq; } public void keyPressed(KeyEvent e){ if (e.isActionKey()==false && e.getKeyChar() == 'S') { System.exit(0); } else { // guardamos el cdigo de la tecla especial int tecla = e.getKeyCode(); // la posicin actual de la etiqueta Point pos = etiq.getLocation(); switch(tecla) { case KeyEvent.VK_UP: etiq.setLocation(pos.x,pos.y-1); break; case KeyEvent.VK_DOWN: etiq.setLocation(pos.x,pos.y+1); break; case KeyEvent.VK_LEFT: etiq.setLocation(pos.x-1,pos.y); break; case KeyEvent.VK_RIGHT: etiq.setLocation(pos.x+1,pos.y); break; case KeyEvent.VK_NUM_LOCK: etiq.setText("Bloque numrico"); break; default: } } } // hay que incluir estos mtodos aunque no se necesiten public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { }} 4.2 Eventos de ratnExisten dos interfaces para el control del ratn, cada uno correspondiendo a un tipo de evento.MouseListenerSirve para detectar las pulsaciones del ratn y responde a los eventos del tipoMouseEvent. El interfaz consta de 5 mtodos: void mouseClicked(MouseEvent e): Se ha pulsado el ratn. void mouseEntered(MouseEvent e): El ratn se ha situado sobre un componente (aunque no se haya pulsado). void mouseExited(MouseEvent e): El ratn abandona el componente sobre el que estaba situado. void mousePressed(MouseEvent e): Se ha pulsado un botn del ratn. void mouseReleased(MouseEvent e): Se ha soltado un botn del ratn que estaba pulsado.La claseMouseEventtiene entre otros mtodos: int getX(): coordenadaxdel ratn. int getY(): : coordenadaydel ratn. Point getPoint(): posicin del ratn. int getClickCount(): Informa sobre el nmero de pulsaciones, para distinguir el "doble-click". int getButton(): Informa sobre el botn que ha cambiado de estado. Puede devolver las constantes:BUTTON1, BUTTON2, BUTTON3.Ejemplo: Vamos a mover un botn para que el usuario no pueda pulsarlo nunca:

CorreRaton.java

import java.awt.*;import java.awt.event.*;

public class CorreRaton extends Frame { public CorreRaton() { // titulo, estilo, tamao y posicin iniciales setTitle("Botn tmido"); setLayout(new FlowLayout()); setBackground(Color.cyan);

// ventana centrada Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); int ancho=300, alto=150; setSize(ancho, alto); setLocation(d.width/2-ancho/2,d.height/2-alto/2);

// preparamos la entrada de datos Button botn = new Button("Plsame"); add(botn); // escucha de teclado para la ventana EscuchaRatn e = new EscuchaRatn(botn); botn.addMouseListener(e); // aadimos la escucha para cerrar la ventana addWindowListener(new ParaAcabar()); // la mostramos setVisible(true); // si no hacemos esto el foco se lo queda la etiqueta!!! requestFocus(); } }

// clase para cerrar la ventanaclass ParaAcabar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); }}

class EscuchaRatn implements MouseListener { Button botn; // le pasamos el botn y el tamao de la pantalla public EscuchaRatn(Button botn) { this.botn = botn; } public void mouseEntered(MouseEvent e) { Point p = botn.getLocation(); if (p.x