37. Los eventos

Los eventos, para que nos entendamos, son conjuntos de acciones, donde podremos escribir sus metodos abastractos para que estos hagan alguna accion.

En nuestro cursillo, solo utilizaremos uno de estos eventos y que es referente a los botones, este se llama "ActionListener" y es como decir, haz una escucha de esta accion. Este evento se encuentra dentro del paquete "java.awt.event" el cual tendremos que importar.

Para ver esto mas claro, vamos a verlo por medio de ejercicios, en este caso vamos a utilizar el ejercicio del tema 35 de "Mi primera ventana" y lo escribimos:

 

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JTextField;

import javax.swing.JButton;

public class Ventana extends JFrame{

 

    public Ventana(){

        this("Mi primera ventana",10,10,300,200);

    }

 

    public Ventana(String titulo, int x, int y, int w, int h){

        super(titulo);

        this.getContentPane().setLayout(null);        

        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

        this.setBounds(x,y,w,h);

        this.setVisible(true);

 

        JLabel lblTexto = new JLabel("Esto es una etiqueta de texto");

            lblTexto.setBounds(10,25,120,20);    

            this.getContentPane().add(lblTexto);

 

        JTextField cmpNombre = new JTextField();

            cmpNombre.setBounds(10,50,100,20);

            this.getContentPane().add(cmpNombre);

 

        JButton btnCopiar = new JButton("Copiar");

            btnCopiar.setBounds(25,80,100,20);

            this.getContentPane().add(btnCopiar);

    }

    public static void main(String[]args){

 

    }

}

 

Ahora, hacemos una llamada a la escucha del boton y vamos a añadir lo siguiente en el codigo:

 

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JTextField;

import javax.swing.JButton;

public class Ventana extends JFrame{

 

    public Ventana(){

        this("Mi primera ventana",10,10,300,200);

    }

 

    public Ventana(String titulo, int x, int y, int w, int h){

        super(titulo);

        this.getContentPane().setLayout(null);        

        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

        this.setBounds(x,y,w,h);

        this.setVisible(true);

 

        JLabel lblTexto = new JLabel("Esto es una etiqueta de texto");

            lblTexto.setBounds(10,25,120,20);    

            this.getContentPane().add(lblTexto);

 

        JTextField cmpNombre = new JTextField();

            cmpNombre.setBounds(10,50,100,20);

            this.getContentPane().add(cmpNombre);

 

        JButton btnCopiar = new JButton("Copiar");

            btnCopiar.setBounds(25,80,100,20);

            this.getContentPane().add(btnCopiar);

 

            btnCopiar.addActionListener(this);

    }

    public static void main(String[]args){

 

    }

}

 

¿Que quiere decir esto que hemos añadido? ( btnCopiar.addActionListener(this) ).

Quiere decir que añadimos al boton "btnCopiar" la escucha a la accion del boton que se encuentra en esta misma clase, por eso lo del "this".

A continuacion, veras que el codigo te da error, y es porque esta esperando a que importemos los paquetes e implementemos sus metodos del evento "ActionListener", para ello lo hacemos:

 

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JTextField;

import javax.swing.JButton;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Ventana extends JFrame implements ActionListener{

 

    public Ventana(){

        this("Mi primera ventana",10,10,300,200);

    }

 

    public Ventana(String titulo, int x, int y, int w, int h){

        super(titulo);

        this.getContentPane().setLayout(null);        

        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

        this.setBounds(x,y,w,h);

        this.setVisible(true);

 

        JLabel lblTexto = new JLabel("Esto es una etiqueta de texto");

            lblTexto.setBounds(10,25,120,20);    

            this.getContentPane().add(lblTexto);

 

        JTextField cmpNombre = new JTextField();

            cmpNombre.setBounds(10,50,100,20);

            this.getContentPane().add(cmpNombre);

 

        JButton btnCopiar = new JButton("Copiar");

            btnCopiar.setBounds(25,80,100,20);

            this.getContentPane().add(btnCopiar);

 

            btnCopiar.addActionListener(this);

    }

    public static void main(String[]args){

 

    }

}

 

Es ahora cuando debemos sobreescribir los metodos abstractos. En este caso para el metodo "ActionListener", solo nos pide un metodo abstracto que es el siguiente:                                                                                                                                                                                                               

 

public void actionPerformed(ActionEvent e){

 

}

 

Ahora vamos a ver la utilidad de este evento. Una vez sobreescrito en el codigo, vamos a rellenarlo de codigo de accion. 

Vamos a hacer, que cuando escribamos algun texto dentro del campo de texto "JTextField", y hagamos click en el boton que hemos creado, este texto se copie en la etiqueta de texto "JLabel". O sea, cuando escribamos algo en el campo de texto, este se copiara en la etiqueta.

Pero para que el metodo tenga acceso a estos controles, estos los tenemos que instanciar fuera del constructor, quedaria asi:

 

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JTextField;

import javax.swing.JButton;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Ventana extends JFrame implements ActionListener{

 

    JLabel lblTexto;

    JTextField cmpNombre;

    JButton btnCopiar;

 

    public Ventana(){

        this("Mi primera ventana",10,10,300,200);

    }

 

    public Ventana(String titulo, int x, int y, int w, int h){

        super(titulo);

        this.getContentPane().setLayout(null);        

        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

        this.setBounds(x,y,w,h);

        this.setVisible(true);

 

        lblTexto = new JLabel("Esto es una etiqueta de texto");

            lblTexto.setBounds(10,25,120,20);    

            this.getContentPane().add(lblTexto);

 

        JTextField cmpNombre = new JTextField();

            cmpNombre.setBounds(10,50,100,20);

            this.getContentPane().add(cmpNombre);

 

        btnCopiar = new JButton("Copiar");

            btnCopiar.setBounds(25,80,100,20);

            this.getContentPane().add(btnCopiar);

 

            btnCopiar.addActionListener(this);

    }

 

    public void actionPerformed(ActionEvent e){

        lblTexto.setText(cmpNombre.getText());

    }

 

    public static void main(String[]args){

 

    }

}

 

Fijate, con el metodo "setText()" le decimos que escriba lo que hay en el contenido de los parentesis, en este caso lo que hay en el campo de texto mediante el metodo "getText()".

Literalmente hablando, "escribe en lblTexto lo que recogas de cmpNombre".

Prueba a hacer el ejercicio.

 

Ahora, imagina que tenemos dos botones en la misma clase, ¿como podemos crear dos acciones diferentes, creando dos metodos abstractos?, no, lo que tenemos que hacer es escribir el codigo dentro del mismo metodo abstracto pero haciendolo de esta manera:

Ahora creamos otro boton que sera para salir de la aplicacion y lo declaramos y creamos sus acciones:

 

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JTextField;

import javax.swing.JButton;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Ventana extends JFrame implements ActionListener{

 

    JLabel lblTexto;

    JTextField cmpNombre;

    JButton btnCopiar, btnSalir;

 

    public Ventana(){

        this("Mi primera ventana",10,10,300,200);

    }

 

    public Ventana(String titulo, int x, int y, int w, int h){

        super(titulo);

        this.getContentPane().setLayout(null);        

        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

        this.setBounds(x,y,w,h);

        this.setVisible(true);

 

        lblTexto = new JLabel("Esto es una etiqueta de texto");

            lblTexto.setBounds(10,25,120,20);    

            this.getContentPane().add(lblTexto);

 

        JTextField cmpNombre = new JTextField();

            cmpNombre.setBounds(10,50,100,20);

            this.getContentPane().add(cmpNombre);

 

        btnCopiar = new JButton("Copiar");

            btnCopiar.setBounds(25,80,100,20);

            this.getContentPane().add(btnCopiar);

        

        btnSalir = new JButton("Salir");

            btnSalir.setBounds(140,80,80,20);

            this.getContentPane().add(btnSalir);

 

            btnCopiar.addActionListener(this);

            btnSalir.addActionListener(this);

    }

 

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==btnCopiar){

            lblTexto.setText(cmpNombre.getText());

        }

        if(e.getSource()==btnSalir){

            this.dispose();

        }

    }

 

    public static void main(String[]args){

 

    }

}

 

Con esto conseguimos accion en dos botones con diferentes resultados y podemos añadir los botones que deseamos.

Con el metodo "getSource()" es como si dijeramos, ¿quien produce el evento?, en este caso el boton.

El metodo "dispose()" lo que consigue es que salgamos de la aplicacion.