Manejo de eventos en swing

Posted by in Java, Swing

Se puede definir como evento la acción se un usuario quiere llevar a cabo sobre un componente asociado. Por lo tanto el evento es la acción en si, quedando recogida en objetos de tipo Event, que diferirá con el tipo de acción asociada: MouseEvent, ActionEvent, FocusEvent, WindowEvent, etc…

Cuando se trabaja con interfaces gráficas, existe la necesidad de que el proceso principal que ejecuta la aplicación controle tanto la parte gráfica del sistema (representación de cada uno de los elementos), como de gestionar cuando se produce acciones determinadas para poder actuar ante ellas. Esta gestión se realiza mediante objetos de tipo Listener (del paquete awt), los cuales ponen en “modo escucha” al componente para que en el momento de producirse una acción determinada se ejecute un código. Como es razonable, cada listener tiene sus propios métodos ya que un acción determinada puede tener muchas aplicaciones. Por ejemplo una acción de tipo ratón puede producirse cuando: sea pulsado o  sea solado un botón específico. Los principales listener y sus objetos asociados son:

ActionListener

Producido cuando se realiza click sobre un elemento. Se puede aplicar a los elementos JButton, JList, JMenu, JMenuItem, JTextField, JTextArea, JSlider, etc…. Esta interfaz obliga a sobreescribir el método actionPerformed() cuyo parámetro de entrada es de tipo ActionEvent, pudiendo sacar información sobre quien ha producido el evento por ejemplo

KeyListener

Producido cuando se pulsa una tecla y está seleccionado el elemento que tiene el listener asociadosobre un elemento. Se puede aplicar a los elementos JTextField, JTextArea, JCheckBox,etc… Esta interfaz trae los siguientes métodos:

  • keyTyped: producido al apretar y soltar la tecla
  • keyPressed: producido al pulsar la tecla
  • keyReleased: producido al soltar la tecla

Todos estos métodos tienen como parámetro un objeto de tipo KeyEvent, desde el cual se puede saber si la tecla pulsada es digito, carácter, si es combinación, etc…

FocusListener

Producido cuando se el elemento que tiene asignado el listener entra en foco o selecciona. Cualquier elemento puede tener este tipo de listener. Esta interfaz trae los siguientes métodos:

  • focusGained: producido cuando el elemento pasa a estar seleccioando
  • focusLost: producido cuando el elemento pasa a estar deseleccionado

MouseListener

Producido cuando se realiza un click de ratón sobre el elemento que tiene el listener. No confundir con un ActionListener, siendo la diferencia que cualquier elemento puede ser pinchado por el raton. Los métodos que trae la interfaz son:

  • mouseCliked: producido cuando se pincha y suelta sobre el elemento
  • mouseEntered: producido cuando el puntero se sitúa sobre el elemento
  • nouseExited: producido cuando el puntero sale del elemento
  • mousePressed: producido cuando se pincha en elemento
  • mouseReleased: producido cuando se suelta un botón del ratón

Estos métodos tienen como parámetro un objeto de tipo MouseEvent desde el cual se puede obtener el botón que ha producido el evento, posición actual del raton,etc..

MouseMotionListener

Producido cuando se hace un movimiento con el ratón sobre el elemento que tiene el listener asignado. Esta interfaz trae los siguientes métodos:

  • mouseDragged: producido cuando se pincha y arrastra al mismo tiempo
  • mouseMoved: producido cuando se mueve el puntero

Estos métodos tienen como parámetro un objeto de tipo MouseEvent desde el cual se puede obtener el botón que ha producido el evento, posición actual del raton,etc..

Asignación de listener

Para poder asignar un escuchador a un componente y que este responda ante acciones simplemente es necesario ejecutar el método .addTipodeListener(new TipodeListener()). Esta implementación obligará a sobreescribir todos los métodos que sean necesarios según la interfaz.

Asignación por implementación de clase

En muchos casos es necesario asignar un mismo tipo de listener a diferentes objetos (los cuales pueden ser componentes necesarios). En estos casos lo recomendable es implementar la interfaz en la clase y pasar un objeto de tipo this al método que asocia listener con componente. Dentro del método o métodos implementados se puede objetener la fuente del evento de diversas formas:

  1. getSource(): devolverá el objeto completo que ha realizado la acción. Hay que tener cuidado con esta forma de trabajar ya que si se realiza una GUI dinámica es posible que los objetos se implementen nuevamente y por lo tanto se apunte a un objeto diferente
  2. getActionComand(): devuelve el TAG asignado al componente. Hay que tener en cuenta que para que esta forma de evaluación funcione se debe haber implementado en los componentes el método setActionCommand(). Una buena práctica sería crear una interfaz con variables estáticas para identificar las acciones que se pueden llevar a cabo

 

Asignación de adapters

Los adaptadores representan una especialización de una interfaz listener que tenga más de un método pendiente de implementar, creando una clase abstracta tan solo con el método que se quiera implementar. Esto ahorra en código ya que no es necesario escribir todos los métodos de una interfaz aunque no se quieran utilizar. Para poder utilizar los adaptadores utiliza la extensión

Asignación por objetos

En el caso de java, al no existir la herencia multiple es imposible extender dos clases, por lo que no se puede utilizar dos adapter directamente sobre la misma clase. Para ello lo que se puede hacer es crear una clase interna y que ella extienda del adaptador correpondiente. Este proceso se repetirá tantas veces como adapter se quieran utilizar, asignando la implementación de la clase al objeto mediante el método .addTipodeListener()