Eventos y Listeners en Java

Hola a todos, hoy os explicare como usar los eventos y Listeners en Java, esto es muy importante en las aplicaciones gráficas.

Los eventos son las acciones que puede realizar el usuario, al realizar un evento se produce una serie de acciones. Por ejemplo, si el usuario pulsa un botón llamado “Salir” cerrara la aplicación. Otro ejemplo muy usado es para validar texto que introduzcamos en un campo de texto.

Los Listeners (oyentes o escuchadores en español) se encargan de controlar los eventos, esperan a que el evento se produzca y realiza una serie de acciones. Según el evento, necesitaremos un Listener que lo controle.

Cada Listener tiene una serie de métodos que debemos implementar obligatoriamente, aunque solo queramos usar uno solo de ellos.

Los Listeners que usaremos estarán en el paquete java.awt.event.

Vamos a ver los distintos Listeners que existen, la definición de sus métodos y los eventos que controlan:

Nombre ListenerDescripciónMétodosEventos
ActionListenerSe produce al hacer click en un componente, también si se pulsa Enter teniendo el foco en el componente.

public void actionPerformed(ActionEvent e)


  • JButton: click o pulsar Enter con el foco activado en él.

  • JList: doble click en un elemento de la lista.

  • JMenuItem: selecciona una opción del menú.

  • JTextField: al pulsar Enter con el foco activado.
KeyListenerSe produce al pulsar una tecla. según el método cambiara la forma de pulsar la tecla.

public void keyTyped(KeyEvent e)

public void keyPressed(KeyEvent e)

public void keyReleased(KeyEvent e)

Cuando pulsamos una tecla, segun el Listener:

  • keyTyped:al pulsar y soltar la tecla.

  • keyPressed: al pulsar la tecla.

  • keyReleased: al soltar la tecla.

FocusListenerSe produce cuando un componente gana o pierde el foco, es decir, que esta seleccionado.

public void focusGained(FocusEvent e)

public void focusLost(FocusEvent e)

Recibir o perder el foco.
MouseListenerSe produce cuando realizamos una acción con el ratón.

public void mouseClicked(MouseEvent e)



public void mouseEntered(MouseEvent e)



public void mouseExited(MouseEvent e)



public void mousePressed(MouseEvent e)



public void mouseReleased(MouseEvent e)

Según el Listener:

  • mouseCliked: pinchar y soltar.

  • mouseEntered: entrar en un componente con el puntero.

  • mouseExited: salir de un componente con el puntero

  • mousePressed: presionar el botón.

  • mouseReleased: soltar el botón.

MouseMotionListenerSe produce con el movimiento del mouse.

public void mouseDragged(MouseEvent e)

public void mouseMoved(MouseEvent e)

Según el Listener:

  • mouseDragged: click y arrastrar un componente.

  • mouseMoved: al mover el puntero sobre un elemento

Estos son los más comunes, otros eventos los veremos con más profundidad en posteriores posts

Para añadir un evento, seguiremos la siguiente sintaxis:

componente.add"tipo evento"(new "tipo evento"(){
   metodos del evento
});

Otra forma es:

"Tipo evento" "nombre"= new "tipo evento"{
   metodos del evento
};
componente.add"Tipo evento"("nombre");

Por ejemplo:

boton1.addActionListener(new ActionListener(){
   public void actionPerformed (){
      //Acciones
   }
});

De la segunda manera seria así:

ActionListener al=new ActionListener(){
   public void actionPerformed (){
      //Acciones
   }
};
boton1.addActionListener(al);

Es posible que algún que otro componente nos convenga que sea un atributo.

Os dejo un ejemplo completo con distintos tipos de eventos:

import java.awt.EventQueue;
import javax.swing.*;
import java.awt.event.*;

public class EjemploEvento extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTextField textField_1;
	private JTextField textField_2;
	private JComboBox<String> comboBox;
	private JRadioButton rdbtnOpcion;
	private JRadioButton rdbtnOpcion_1;
	private JRadioButton rdbtnOpcion_2;
	private JLabel lblEstasSobreLa;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EjemploEvento frame = new EjemploEvento();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public EjemploEvento() {

		//Añade un titulo, no es estrictamente necesario
		setTitle("Titulo de la ventana");

		/*
		 * Coordenadas x y de la aplicacion y su altura y longitud,
		 * si no lo indicamos aparecera una ventana muy pequeña
		 */
		setBounds(400, 200, 655, 520);

		/*
		 * Indica que cuando se cierre la ventana se acaba la aplicacion,
		 * si no lo indicamos cuando cerremos la ventana la aplicacion seguira funcionando
		 */
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		//Hace visible la ventana, si no lo hacemos no veremos la aplicacion
		setVisible(true);

		//Creamos el panel
		contentPane =new JPanel();

		//Indicamos su diseño
		contentPane.setLayout(null);

		//asigno el pannel a la ventana
		setContentPane(contentPane);

		//Componentes

		//Etiquetas

		JLabel lblEscribeElNombre = new JLabel("Escribe el nombre el nombre de una persona sin digitos");
		lblEscribeElNombre.setBounds(369, 32, 229, 25);
		contentPane.add(lblEscribeElNombre);

		JLabel lblEligeUnaOpcin = new JLabel("Elige una opci\u00F3n:");
		lblEligeUnaOpcin.setBounds(176, 32, 109, 14);
		contentPane.add(lblEligeUnaOpcin);

		JLabel lblPulsaElBoton = new JLabel("Pulsa el boton");
		lblPulsaElBoton.setBounds(47, 32, 85, 14);
		contentPane.add(lblPulsaElBoton);

		lblEstasSobreLa = new JLabel("Estas sobre la ");
		lblEstasSobreLa.setBounds(158, 224, 192, 14);
		contentPane.add(lblEstasSobreLa);

		JLabel lblSoloSePuede = new JLabel("Solo se puede escribir digitos");
		lblSoloSePuede.setBounds(371, 208, 193, 14);
		contentPane.add(lblSoloSePuede);

		JLabel lblNombreElegido = new JLabel("Nombre Elegido");
		lblNombreElegido.setBounds(175, 124, 110, 14);
		contentPane.add(lblNombreElegido);

		//Campo de texto

		textField = new JTextField();
		textField.setBounds(371, 68, 193, 26);
		contentPane.add(textField);

		textField_1 = new JTextField();
		textField_1.setEditable(false);
		textField_1.setBounds(175, 150, 141, 20);
		contentPane.add(textField_1);

		textField_2 = new JTextField();
		textField_2.setBounds(371, 247, 126, 20);
		contentPane.add(textField_2);

		//Botones

		JButton btnPulsame = new JButton("Pulsame");
		btnPulsame.setBounds(43, 70, 89, 23);
		contentPane.add(btnPulsame);

		JButton btnAnadir= new JButton("A\u00F1adir");
		btnAnadir.setBounds(371, 124, 89, 23);
		contentPane.add(btnAnadir);

		//Botones de radio

		rdbtnOpcion= new JRadioButton("Opcion 1");
		rdbtnOpcion.setBounds(43, 194, 109, 23);
		contentPane.add(rdbtnOpcion);

		rdbtnOpcion_1 = new JRadioButton("Opcion 2");
		rdbtnOpcion_1.setBounds(43, 220, 109, 23);
		contentPane.add(rdbtnOpcion_1);

		rdbtnOpcion_2 = new JRadioButton("Opcion 3");
		rdbtnOpcion_2.setBounds(43, 246, 109, 23);
		contentPane.add(rdbtnOpcion_2);

		//Agrupamos los botnones de radio
		ButtonGroup bgroup = new ButtonGroup();
		bgroup.add(rdbtnOpcion);
		bgroup.add(rdbtnOpcion_1);
		bgroup.add(rdbtnOpcion_2);

		//Menu de opciones
		comboBox = new JComboBox<>();
		comboBox.setBounds(175, 70, 141, 22);
		contentPane.add(comboBox);

		//Añadimos opciones
		comboBox.addItem("Fernando");
		comboBox.addItem("Alberto");
		comboBox.addItem("Arturo");

		//Eventos

		btnPulsame.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent e){
				JOptionPane.showMessageDialog(contentPane, "¡Me has pulsado!");
			}
		});

		//En este caso hemos debido de converir el componente en un atributo
		comboBox.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent e){
				textField_1.setText(comboBox.getItemAt(comboBox.getSelectedIndex()));
			}
		});

		textField.addKeyListener(new KeyListener(){
			public void keyTyped (KeyEvent e){
				//Si el caracter introducido es un digito...
				if (Character.isDigit(e.getKeyChar())){
					//... no lo escribe
					e.consume();
				}
			}
			public void keyReleased(KeyEvent e){

			}
			public void keyPressed(KeyEvent e){

			}
		});

		btnAnadir.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent e){
				comboBox.addItem(textField.getText());
				textField.setText("");
				JOptionPane.showMessageDialog(contentPane, "Nombre Añadido");
			}
		});

		rdbtnOpcion.addMouseListener(new MouseListener(){
			public void mouseClicked(MouseEvent e){

			}
			public void mouseEntered(MouseEvent e){
				lblEstasSobreLa.setText(lblEstasSobreLa.getText()+rdbtnOpcion.getText());
			}
			public void mouseExited(MouseEvent e){
				lblEstasSobreLa.setText("Estas sobre la ");
			}
			public void mousePressed(MouseEvent e){

			}
			public void mouseReleased(MouseEvent e){

			}
		});

		rdbtnOpcion_1.addMouseListener(new MouseListener(){
			public void mouseClicked(MouseEvent e){

			}
			public void mouseEntered(MouseEvent e){
				lblEstasSobreLa.setText(lblEstasSobreLa.getText()+rdbtnOpcion_1.getText());
			}
			public void mouseExited(MouseEvent e){
				lblEstasSobreLa.setText("Estas sobre la ");
			}
			public void mousePressed(MouseEvent e){

			}
			public void mouseReleased(MouseEvent e){

			}
		});

		rdbtnOpcion_2.addMouseListener(new MouseListener(){
			public void mouseClicked(MouseEvent e){

			}
			public void mouseEntered(MouseEvent e){
				lblEstasSobreLa.setText(lblEstasSobreLa.getText()+rdbtnOpcion_2.getText());
			}
			public void mouseExited(MouseEvent e){
				lblEstasSobreLa.setText("Estas sobre la ");
			}
			public void mousePressed(MouseEvent e){

			}
			public void mouseReleased(MouseEvent e){

			}
		});

		textField_2.addKeyListener(new KeyListener(){
			public void keyTyped (KeyEvent e){
				//Si el caracter introducido no es un digito...
				if (!Character.isDigit(e.getKeyChar())){
					//... no lo escribe
					e.consume();
				}
			}
			public void keyReleased(KeyEvent e){

			}
			public void keyPressed(KeyEvent e){

			}
		});

	}
}

Con netBeans, simplemente hacemos click derecho en un elemento (en la parte de diseño) y elegimos en el menú Eventos, el evento queremos programar y nos aparecera por separado en el código.
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

¿Te ha gustado y quieres apoyarme? ¡Sé mi patrón!
Etiquetas

3 comments

  1. ¡Gran post! ¡Enhorabuena!

  2. Saludos… Gracias por compartir la publicación,…..
    te escribo por una consulta… tengo un jinternal frame facturar que llama un jframe llamado pagar. Al hacer clic en este ultimo formulario en un boton finalizar, necesito retornar al de facturar y limpiar todo para que puedan hacer otra factura nueva.
    Mi pregunta es la siguiente, debería usar un listener para poder activar y limpiar el formulario de facturar, y si es así, en donde podría llamar ese evento.. Este tema de los listener no he logrado comprender mucho como se usa y si necesito usarlo quisiera algo de orientación..

    Si te es posible responder, agradeceré mucho.
    Saludos.

  3. pero si tengo que usar un addTableModel del abstarttablemodel como le hago
    ????

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *