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