5.7 EVENTOS MÚLTIPLES OYENTES

 

Bienvenidos a todos, llegamos al último post del bloque de los Eventos espero que no se os haya hecho pesado, sé que los posts algunos son muy largos pero intento explicarlo paso a paso, aunque si tenéis dudas ya sabéis que me lo podéis hacer llegar a través de los comentarios del blog o enviando un correo a amizba@gmail.com, no solo dudas, sino, también podéis enviar vuestros propios códigos si las prácticas del blog lo habéis hecho con un código diferente y así ver las diferentes formas de realizar una aplicación. Pues con todo lo dicho, empezamos este post.

Puede haber aplicaciones en las que haya un objeto fuente y múltiples oyentes. Para verlo más claro lo que vamos a hacer sobre una práctica va a consistir en una ventana con dos botones, uno de los botones va a ser Nuevo, cada vez que pulsemos este botón se creará una ventana nueva, y otro botón Cerrar que al pulsar se cerraran todas las ventanas que se hayan creado.

En esta práctica solo hay un objeto fuente que es el botón de Cerrar y los objetos oyentes son las ventanas que puede haber una, dos, quince… las que hayamos creado con el botón Nuevo. Al pulsar el botón Cerrar se cerraran todas las ventanas que se hayan creado.

Como siempre, para entenderlo mejor es sobre la práctica por lo que creamos una nueva clase con el siguiente código:

package event;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class MultiplesOyentes {

 

       public static void main(String[] args) {

             MarcoPrincipal marco = new MarcoPrincipal();

           

             marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           

             marco.setVisible(true);

 

       }

 

}

class MarcoPrincipal extends JFrame {

     

       public MarcoPrincipal() {

           

             setTitle("Varios oyentes");

            

             setBounds(1300, 100, 300, 200);

           

             LaminaPrincipal lamina =new LaminaPrincipal();

           

             add(lamina);

       }

}

class LaminaPrincipal extends JPanel {

     

       public LaminaPrincipal() {

           

             JButton boton_nuevo =new JButton("Nuevo");

           

             add(boton_nuevo);

           

             boton_cerrar =new JButton("Cerrar");

           

             add(boton_cerrar);

       }

     

JButton boton_cerrar;

     

}

Este código ya hemos trabajado con él por lo que no hace falta explicación, si lo ejecutamos nos muestra una ventana con dos botones que de momento no hacen nada:



Lo primero será crearnos una clase que herede de JFrame que será la creación de las ventanas, es decir, cada vez que haga clic en el botón Nuevo se creará una ventana, en el título de la ventana queremos que aparezca Ventana 1, Ventana 2… declaramos una variable de tipo entero estática que nos sirva de contador y también con el método setBounds le vamos a dar un tamaño de forma que no salga una encima de otra sino, que salgan de forma que aparezcan una encima de otra pero que se visualicen todas:

class MarcoVentanas extends JFrame {

   

    public MarcoVentanas() {

        

          contador++;

        

          setTitle("Ventana "+contador);

        

          setBounds(40*contador, 40*contador, 300, 150);

    }

  

    private static int contador=0;

}

A continuación, creamos una nueva clase pero en esta ocasión va a ser interna ya que pertenece a la clase LaminaPrincipal que va a heredar del método ActionListener(). Crearemos dentro de ella el método actionPerformed donde crearemos una instancia de la clase que acabamos de crear:

       private class OyenteNuevo implements ActionListener{

 

            @Override

            public void actionPerformed(ActionEvent e) {

                  MarcoVentanas mimarco = new MarcoVentanas();

           

            mimarco.setVisible(true);

 

                 

            }

         

         

       }

Dentro del constructor LaminaPrincipal hemos de instanciar la clase OyenteNuevo:

OyenteNuevo oyente=new OyenteNuevo();

boton_nuevo.addActionListener(oyente);

Con esto ya tendríamos la primera parte de la práctica, cada vez que pulsamos el botón Nuevo se crea una nueva ventana:



Nos falta por programar el botón Cerrar. Nos creamos una clase interna que pertenece a la clase MarcoVentana que va a heredar del método ActionListener(), creamos el método ActionPerformed en el cual vamos a utilizar el método disposed() que sirve para liberar todos los recursos de pantalla utilizados, es decir, cerrarlos.

    private class CierraVentana implements ActionListener{

 

            @Override

            public void actionPerformed(ActionEvent e) {

                 

                  dispose();

                 

            }

     

     

    }

Dentro del constructor MarcoVentana hemos de pasarle un parámetro de tipo JButton:

public MarcoVentanas(JButton botoncr)

Dentro de este constructor instanciamos la clase CierraVentanas:

    public MarcoVentanas(JButton botoncr) {

        

          contador++;

        

          setTitle("Ventana "+contador);

        

          setBounds(40*contador, 40*contador, 300, 150);

         

          CierraVentana miventana = new CierraVentana();

         

          botoncr.addActionListener(miventana);

 

    }

Y con esto ya tendríamos finalizada la práctica.

El código completo de la práctica es el siguiente:

package event;

 

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class MultiplesOyentes {

 

       public static void main(String[] args) {

             MarcoPrincipal marco = new MarcoPrincipal();

           

             marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           

             marco.setVisible(true);

 

       }

 

}

class MarcoPrincipal extends JFrame {

     

       public MarcoPrincipal() {

           

             setTitle("Varios oyentes");

           

             setBounds(1300, 100, 300, 200);

           

             LaminaPrincipal lamina =new LaminaPrincipal();

           

             add(lamina);

       }

}

class LaminaPrincipal extends JPanel {

     

       public LaminaPrincipal() {

           

             JButton boton_nuevo =new JButton("Nuevo");

           

             add(boton_nuevo);

            

             boton_cerrar =new JButton("Cerrar");

           

             add(boton_cerrar);

            

             OyenteNuevo oyente=new OyenteNuevo();

             boton_nuevo.addActionListener(oyente);

 

       }

      

       private class OyenteNuevo implements ActionListener{

 

            @Override

            public void actionPerformed(ActionEvent e) {

                  MarcoVentanas mimarco = new MarcoVentanas(boton_cerrar);

           

            mimarco.setVisible(true);

 

                 

            }

         

         

       }

      

JButton boton_cerrar;

     

}

class MarcoVentanas extends JFrame {

   

    public MarcoVentanas(JButton botoncr) {

        

          contador++;

        

          setTitle("Ventana "+contador);

        

          setBounds(40*contador, 40*contador, 300, 150);

         

          CierraVentana miventana = new CierraVentana();

         

          botoncr.addActionListener(miventana);

 

    }

    private class CierraVentana implements ActionListener{

 

            @Override

            public void actionPerformed(ActionEvent e) {

                 

                  dispose();

                 

            }

     

     

    }

    private static int contador=0;

}

 

Os espero en el próximo bloque para ir avanzando en el lenguaje de programación Java. Hasta pronto!

5.6 EVENTOS MÚLTIPLES FUENTES << >> 6.1 FLOW LAYOUT, LAYOUT POR DEFECTO



No hay comentarios:

Publicar un comentario