Eventos

Cuando el usuario realiza una acción en la interfaz gráfica (pulsar el botón del ratón o presionar una tecla), se genera un evento. Los eventos son objetos que describen lo que ha ocurrido. Existen numerosas  clases de eventos diferentes  para describir las distintas categorías de acciones de los usuarios.

En la siguiente imagen se muestra una vista abstracta del modelo de delegación de eventos. Cuando un usuario hace clic en un botón de la interfaz gráfica, JVM crea un objeto  evento  que  se  envía  al  controlador  de  eventos  (también  conocido  como manejador de eventos) correspondiente a ese botón mediante una llamada al método actionPerformed.

La fuente de un evento es aquella que genera el evento. Por ejemplo, pulsar un botón del ratón sobre un componente JButton genera una instancia de ActionEvent que tiene ese  botón  como  fuente.  La  instancia  de  ActionEvent  es  un  objeto  que  contiene información sobre el evento que acaba de producirse.

El  modelo  de  delegación  de  eventos  se  implementó  con  la  versión  1.1  del  kit  de desarrollo  de Java  (JDK).  Con este  modelo,  los eventos  se envían  al componente desde el que se ha originado el evento, pero depende de cada componente su propagación a una o más clases registradas denominadas receptores de eventos (listeners).  Estos  receptores  contienen  controladores  que  reciben  el  evento  y  lo procesan. De esta forma, el controlador de eventos puede estar situado en un objeto independiente   del   componente.   Los   receptores   de   eventos   son   clases   que implementan la interfaz EventListener.

En el siguiente ejemplo se muestra la forma de crear un marco (JFrame) sencillo que sólo contiene un botón (JButton).

La clase ButtonHandler mostrada a continuación es la clase del controlador en el que se delega el evento.

El resultado de la ejecución es el siguiente:

CATEGORÍAS DE EVENTOS

El mecanismo descrito para recibir eventos de los componentes se ha ilustrado en el contexto de un único tipo de evento.

Interfaz Métodos
ActionListener actionPerformed(ActionEvent)
AdjustmentListener adjustmentValueChanged(AdjustmentEvent)
ComponentListener
ComponentAdapter
componentHidden(componentEvent)
componentShown(componentEvent)
componentMoved(componentEvent)
componentResized(componentEvent)
FocusListener
FocusAdapter
focusGained(FocusEvent)
focusLost(FocusEvent)
KeyListener
KeyAdapter
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener
MouseAdapter
mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener
MouseMotionAdapter
mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
WindowListener
WindowAdapter
windowOpened(WindowEvent)
windowClosing(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
ItemListener itemStateChanged(itemEvent)
TextListener textValueChanged(TextEvent)

Por cada categoría de eventos, la clase de los objetos que quiera recibir los eventos debe implementar  una interfaz.  A su vez, esa interfaz  exige la definición  de uno o varios  métodos.   La  llamada   a  estos  métodos   se  realiza  cuando   se  producen determinados eventos.

 

CONTROL DE EVENTOS MEDIANTE CLASES INTERNAS

En el siguiente ejemplo se muestra la forma de crear controladores de eventos como clases internas. El uso de clases internas para manejar eventos permite acceder a los datos privados de la clase externa.

 

Clase que captura el evento

 

Clase interna

Al pulsar y arrastrar el ratón se muestran las coordenadas donde se encuentre el cursor.

Código del ejemplo.

 

CONTROL DE EVENTOS MEDIANTE CLASES ANÓNIMAS

Es posible incluir una definición de clase completa dentro del ámbito de una expresión. Esta fórmula permite definir lo que se denomina una clase interna anónima y crear la instancia al mismo tiempo.

La compilación en Java de una clase anónima genera un archivo del tipo TestAnonymous$1.class.

Veamos el mismo ejemplo realizado anteriormente con clase interna, ahora con clase anónima.

Evento con clase anónima

Descarga código del ejemplo