Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3 - Gestión de Eventos PDF
3 - Gestión de Eventos PDF
CAPITULO 10
La gestin de eventos
Objetivos:
Explicar la manera como Java maneja los eventos
Identificar los diferentes tipos de eventos y sus clase manejadoras.
Desarrollar programas que manejen diversos tipos de eventos.
Utilizar algunos componentes Swing para manejo de sus eventos
Presentacin
La mayora de programas actuales se relacionan con los usuarios a travs de lo
que se denomina como Interfaz Grfica de Usuario (Graphical User Interface
GUI por su sigla en Ingls), la cual se puede componer de ventanas, botones,
mens, barras de desplazamiento, areas de texto, conos e imgenes, y otros
componentes grficos visualizados en la pantalla, y que fundamentalmente
intermedian entre el ususario y el sistema (hardware y software), para llevar a
cabo procesos de interaccin de entrada y salida de informacin. Se entiende
por componente grfico un objeto que tiene una representacin grfica
deplegable en la pantalla y que dentro de sus mtodos se encuentra la
posibilidad de interactuar con el usuario (que puede ser otro objeto).
Eventos
Un evento se genera como respuesta a lo que el usuario realice como
interaccin con un programa durante el ciclo de vida de este, sea una aplicacin
o applet. Como todo en Java, los eventos son representados como objetos,
habiendo diferentes tipos de eventos, representado cada uno por una clase
diferente.
Clics del raton: ratn abajo cuando se presiona el boton, raton arriba cuando
se libera el boton y clic del raton cuando se oprime y suelta en el mismo
lugar.
Una clase que desee responder a eventos del objeto dado debe implementar, por
consiguiente, la interfaz ActionListener. Este es el caso del manejo del
objeto JTextField.
Debe recordarse que, al ser una interfaz una clase donde los mtodos estn
declarados pero no implementados, la clase que requiera ese escucha para
alguno de sus componentes, deber implementar todos los mtodos declarados.
En el caso de ActionListener, solo hay que implementar el mtodo
actionPerformed().
La lista de objetos receptores as como los tipos de eventos a los que estn
suscritos, es creada en el objeto fuente mediante llamadas a los mtodos cuya
forma general es,
add<TipoEvento>Listener()
por ejemplo addMouseListener(), para agregar un escucha de las
operaciones del mouse.
....
miBoton.addMouseListener(this);
Hay algunas clases de eventos que involucran a mas de un evento, tal es el caso
del ratn. Por tanto, la clase que implementa la interfaz del ratn debe
sobreescribir todos los mtodos declarados en la interfaz, tales como
mousePressed, mouseReleased, mouseClcked, mouseMoved y otros. Esto
hace un codigo innecesariamente extendido, si solo se requiere controlar un tipo
de evento, port ejemplo, mousePressed.
A este punto tenemos dos caminos para acceder a los escuchas de los eventos
para un componente especfico:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
objeto miBoton.
if(evento.getSource()==miBoton) ...
Un evento se lo representa mediante un objeto tipo evento que tiene tanto los
atributos y los mtodos para trabajar con el. Los datos de un objeto evento se
pueden acceder y establecer por medio de los mtodos.
La clase AWEvent
Los mtodos de una interfaz escucha de eventos del AWT tienen un solo
argumento, que es una instancia de una clase que desciende de la clase
java.awt.AWTEvent. Esta clase hereda un mtodo muy til de la clase
java.util.EventObject,
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
}
public void paint(Graphics g){
g.drawString(msg,6,100);
}
}
favor. Por ejemplo un jugador las coloca de color rojo y el otro de color azul. La
figura muestra la interfaz para este juego.
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.applet.*;
public class Triqui01 extends JApplet implements
ActionListener {
int turno = -1;
JButton jButton11;
JButton jButton12;
JButton jButton13;
JButton jButton14;
JButton jButton15;
JButton jButton16;
JButton jButton17;
JButton jButton18;
JButton jButton19;
public Triqui01() {
jButton11 = new JButton();
jButton12 = new JButton();
jButton13 = new JButton();
jButton14 = new JButton();
jButton15 = new JButton();
jButton16 = new JButton();
jButton17 = new JButton();
jButton18 = new JButton();
jButton19 = new JButton();
GridLayout miLayout= new GridLayout(3,3);
getContentPane().setLayout(miLayout);
jButton11.setText("jButton11");
jButton11.addActionListener(this);
getContentPane().add(jButton11);
jButton12.setText("jButton12");
jButton12.addActionListener(this);
getContentPane().add(jButton12);
jButton13.setText("jButton13");
jButton13.addActionListener(this);
getContentPane().add(jButton13);
jButton14.setText("jButton14");
jButton14.addActionListener(this);
getContentPane().add(jButton14);
La gestin de eventos : La clase AWEvent 10 - 12
jButton15.setText("jButton15");
jButton15.addActionListener(this);
getContentPane().add(jButton15);
jButton16.setText("jButton16");
jButton16.addActionListener(this);
getContentPane().add(jButton16);
jButton17.setText("jButton17");
jButton17.addActionListener(this);
getContentPane().add(jButton17);
jButton18.setText("jButton18");
jButton18.addActionListener(this);
getContentPane().add(jButton18);
jButton19.setText("jButton19");
jButton19.addActionListener(this);
getContentPane().add(jButton19);
}
public void actionPerformed(ActionEvent evt) {
if(evt.getSource()==jButton19){
if (turno == -1){ jButton19.setBackground(Color.red);
turno=-turno;}
else{ jButton19.setBackground(Color.blue);
turno=-turno;} // Add your handling code here:
jButton19.setEnabled(false);
showStatus("presiono jButton19");}
if(evt.getSource()==jButton18){
if (turno == -1){ jButton18.setBackground
(Color.red);
turno=-turno;}
else{ jButton18.setBackground(Color.blue);
turno=-turno;}
jButton18.setEnabled(false);
showStatus("presiono jButton18");}
if(evt.getSource()==jButton17){
if (turno == -1){ jButton17.setBackground
(Color.red);
turno=-turno;}
else{ jButton17.setBackground(Color.blue);
turno=-turno;}
jButton17.setEnabled(false);
showStatus("presiono jButton17");}
if(evt.getSource()==jButton16){
if (turno == -1){ jButton16.setBackground
(Color.red);
turno=-turno;}
else{ jButton16.setBackground(Color.blue);
La gestin de eventos : La clase AWEvent 10 - 13
turno=-turno;}
jButton16.setEnabled(false);
showStatus("presiono jButton16");}
if(evt.getSource()==jButton15){
if (turno == -1){ jButton15.setBackground
(Color.red);
turno=-turno;}
else{ jButton15.setBackground(Color.blue);
turno=-turno;}
jButton15.setEnabled(false);
showStatus("presiono jButton15");}
if(evt.getSource()==jButton14){
if (turno == -1){ jButton14.setBackground
(Color.red);
turno=-turno;}
else{ jButton14.setBackground(Color.blue);
turno=-turno;}
jButton14.setEnabled(false);
showStatus("presiono jButton14");}
if(evt.getSource()==jButton13){
if (turno == -1){ jButton13.setBackground
(Color.red);
turno=-turno;}
else{ jButton13.setBackground(Color.blue);
turno=-turno;}
jButton13.setEnabled(false);
showStatus("presiono jButton13");}
if(evt.getSource()==jButton12){
if (turno == -1){ jButton12.setBackground
(Color.red);
turno=-turno;}
else{ jButton12.setBackground(Color.blue);
turno=-turno;}
jButton12.setEnabled(false);
showStatus("presiono jButton12"); }
if(evt.getSource()==jButton11){
if (turno == -1){ jButton11.setBackground
(Color.red);
turno=-turno;}
else{ jButton11.setBackground(Color.blue);
turno=-turno;}
jButton11.setEnabled(false);
showStatus("presiono jButton11");
}
}
}
java.lang.Object
java.util.EventObject
AWTEvent
KeyEvent MouseEvent
Tipos de eventos
Los eventos se dividen en dos clases: de bajo nivel o de componente, y de alto
nivel o semnticos.
MouseEvent: Evento que indica que ha sucedido una accion con el ratn
sobre algn componente. Estas acciones pueden ser:
Escuchadores de eventos
El control de eventos en un programa, aplicacin o applet, se lleva a cabo
mediante el establecimiento de objetos escuchas (listeners) y registrarlos con
sus orgenes (sources). Los mtodos de escucha se registran con
addXyzListener (para agregarlo) y removeXyzListener (para
removerlo). En donde Xyz es el nombre de la interfaz usada.
De bajo nivel
Las interfaces de bajo nivel para escuchas son las siguientes:
De alto nivel
Las interfaces de alto nivel o semntico para escuchas son las siguientes:
escucha de evento
java.awt.ComponetAdapter
java.awt.FocusAdapter
java.awt.KeyAdapter
java.awt.MouseAdapter
java.awt.MouseMotionAdapter
java.awt.WindowAdapter
Manejo de eventos
Para detectar los eventos de un componente determinado se debe tener claro
cmo se usa el componente y cuales son mecanismos de implementacin de su
manejador de eventos.
Como ya se indic antes, las applets tienen problemas con el uso de los
adaptadores y deben utilizar la implementacin de la interfaz. Se pueden
manejar eventos con los siguiente sesquemas:
Indica que la clase MiClase manejar eventos del tipo ActionEvent, por tal
razn implementar el mtodo asociado con el escucha.
algunComponente.addActionListener(instanciaDeMiClase);
ActionEvent
button actionListener
La gestin de eventos : Manejo de eventos 10 - 21
Cuando el usuario pulsa un botn, los oyentes de action del botn son
notificados.Los manejadores de eventos pueden ser ejemplares de cualquier
clase. Frecuentemente, se implementan usando clases internas annimas, lo que
puede hacer el cdio algo ms confuso -- hasta que hayas usado las clases
internas. El siguiente es un ejemplo de un applet bajo Swing:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Applet02 extends JApplet implements ActionListener
{
int numClicks=0;
JLabel label2 = new JLabel();
public void init() {
JButton boton1 = new JButton("Soy un boton");
boton1.addActionListener(this);
getContentPane().setLayout(new GridLayout(0,1));
getContentPane().add(boton1);
label2.setLabelFor(boton1);
getContentPane().add(label2);
}
public void actionPerformed(ActionEvent e){
numClicks = numClicks+1;
label2.setText("numero de clicks = "+numClicks);}
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
if(evento.getSource()==botonOtro)
msg = "ha pulsado boton otro";
repaint();
}
public void paint(Graphics g){
g.drawString(msg,6,100);
}
}
En este caso se ha colocado un escucha del tipo ActionListener a cada uno
de los botones. En esta version se tiene un sloi mtodo actionPerformed
(ActionEvent e), dentro del cual se selecciona cual fu el boton que gener
el evento. El mtodo getSource(), del evento generado, contiene el nombre
del objeto o componente que gener ese evento. Dependiendo del boton
presionado, se tomar la accion indicada en el mtodo actionPerformed().
Otra forma de escribir los oyentes para un componente, en este caso para
eventos tipo ActionEvent, es mediante clases internas annimas asignadas a
cada componente, como en la siguiente version de la clase Botones01b:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
public class Botones01b extends JApplet {
JButton botonSi,botonNo,botonOtro;
FlowLayout miFlow = new FlowLayout();
JLabel miEtiqueta = new JLabel("Soy una etiqueta");
Container contentPane = getContentPane();
}
});
contentPane.add(botonSi);
contentPane.add(botonNo);
contentPane.add(botonOtro);
contentPane.add(miEtiqueta);
}
botonNo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
miEtiqueta.setText("Ha presionado boton No");
}
});
botonOtro.addActionListener(new MiManejador());
contentPane.add(botonSi);
contentPane.add(botonNo);
contentPane.add(botonOtro);
contentPane.add(miEtiqueta);
}
class MiManejador implements ActionListener{
public void actionPerformed(ActionEvent evento){
if(evento.getSource()== botonSi)
msg = ("ha pulsado el boton si");
else if(evento.getSource()==botonNo)
msg = "ha pulsado el boton no";
else
if(evento.getSource()==botonOtro)
msg = "ha pulsado boton otro";
miEtiqueta.setText(msg);}}
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
contentPane.add(boton1);
contentPane.add(boton2);
contentPane.add(boton3);
contentPane.add(boton4);contentPane.add(scrollPane);}
}
}
Otro ejemplo de uso de ActionListener con clases internas para el manejo de los
eventos.
import java.awt.*;
import java.awt.event.*;
La gestin de eventos : Manejo de eventos 10 - 28
import javax.swing.*;
public TextFieldTest()
{
super( "Uso de JTextField y JPasswordField" );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
label1 = new JLabel("Campo texto 1");
c.add(label1);
// se construye un textfield de tamao 10
text1 = new JTextField( 10 );
c.add( text1 );
show();
}
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
if ( e.getSource() == text1 )
s = "text1: " + e.getActionCommand();
else if ( e.getSource() == text2 )
s = "text2: " + e.getActionCommand();
else if ( e.getSource() == text3 )
s = "text3: " + e.getActionCommand();
else if ( e.getSource() == password ) {
JPasswordField pwd =
(JPasswordField) e.getSource();
s = "password: " +
new String( pwd.getPassword() );
}
JOptionPane.showMessageDialog( null, s );
}
}
}
Manejo de ItemListener
Es la interfaz escucha del tipo de eventos item. La clase interesada en procesar
este tipo de eventos debe implementar esta interface. El objeto creado para
escuchar debe usar el mtodo addItemListener. Cuando un evento resultante de
la seleccion del item sucede se invoca el mtodo itemStateChanged().
La gestin de eventos : Manejo de ItemListener 10 - 30
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public CheckBoxTest()
{
super( "Prueba de JCheckBox" );
Container c = getContentPane();
c.setLayout(new FlowLayout());
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
if ( e.getSource() == italic )
if ( e.getStateChange() == ItemEvent.SELECTED )
valItalic = Font.ITALIC;
else
valItalic = Font.PLAIN;
t.setFont(
new Font( "TimesRoman", valBold + valItalic, 14 ) );
if(e.getSource()==tipo){
if( e.getStateChange() == ItemEvent.SELECTED )
t.setFont(new Font( "Arial", Font.BOLD, 15 ));}
if(e.getSource()==color){
if( e.getStateChange() == ItemEvent.SELECTED )
La gestin de eventos : Manejo de ItemListener 10 - 32
t.setForeground(java.awt.Color.red);
else
t.setForeground(java.awt.Color.black);
}
t.repaint();
}
}
}
Obsrvese el uso de una clase interna para el manejo de los eventos del
JcheckBox.
italicFont, boldItalicFont;
private JRadioButton plain, bold, italic, boldItalic;
private ButtonGroup radioGroup;
public RadioButtonTest()
{
super( "Ejemplo botones " );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
// Crea botones
plain = new JRadioButton( "Plain", true );
c.add( plain );
bold = new JRadioButton( "Bold", false);
c.add( bold );
italic = new JRadioButton( "Italic", false );
c.add( italic );
boldItalic = new JRadioButton( "Bold/Italic", false );
c.add( boldItalic );
// registra eventos
RadioButtonHandler handler = new RadioButtonHandler();
plain.addItemListener( handler );
bold.addItemListener( handler );
italic.addItemListener( handler );
boldItalic.addItemListener( handler );
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
t.repaint();
}
}
}
Manejo de ComboBox
Un lista desplegable hacia abajo (drop-down-list) permite seleccionar un
elemento de esta. Se implementan con la clase JcomboBox, el cual genera
eventos del tipo ItemEvent, as como los componentes JcheckBox y
JradioButtons.
// una etiqueta
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public ComboBoxTest()
{
super( "Chequeo de JComboBox" );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
images.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
label.setIcon(
icons[ images.getSelectedIndex() ] );
}
}
);
c.add( images );
app.addWindowListener(
La gestin de eventos : Manejo de ComboBox 10 - 36
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
Los eventos del mouse se han agrupado bajo dos interfaces: MouseListener y
MouseMotionListener. Estas interfaces pueden ser implementadas por el
programa que las requiera, con la condicin de tener que implementar todos los
mtodos, para lo cual se dejarn vacios los no requeridos.
Metodos de MouseListener
void mouseClicked(MouseEvent e)
Invocado cuando el mouse se ha dado un click sobre algn
componente.
void mouseEntered(MouseEvent e)
Invocado cuando el mouse entra a algn componente.
void mouseExited(MouseEvent e)
Invocado cuando el mouse sale de un componente.
void mousePressed(MouseEvent e)
Invocado cuando el mouse es presionado sobre un componente.
void mouseReleased(MouseEvent e)
Invocado cuando el mouse se ha liberado sobre un componente.
La gestin de eventos : Manejo de oyentes del mouse 10 - 37
Metodos de MouseAdapter
void mouseClicked(MouseEvent e)
Invocado cuando el mouse se ha dado un click sobre
algn componente.
void mouseEntered(MouseEvent e)
Invocado cuando el mouse entra a algn componente.
void mouseExited(MouseEvent e)
Invocado cuando el mouse sale de un componente.
void mousePressed(MouseEvent e)
Invocado cuando el mouse es presionado sobre un
componente.
void mouseReleased(MouseEvent e)
Invocado cuando el mouse se ha liberado sobre un
componente.
Metodos de MouseMotionListener
void mouseDragged(MouseEvent e)
Invocado cuando el botn del mouse se presiona y se
arrastra sobre un componente.
void mouseMoved(MouseEvent e)
Invocado cuando el mouse se ha movido sobre un
componente.
Metodos de MouseMotionAdapter
La gestin de eventos : Manejo de oyentes del mouse 10 - 38
void mouseDragged(MouseEvent e)
Invocado cuando el botn del mouse se presiona y se
arrastra sobre un componente.
void mouseMoved(MouseEvent e)
Invocado cuando el mouse se ha movido sobre un
componente.
La clase MouseEvent
Como se puede observar, todos los mtodos de los escuchas del mouse tienen
como argumento un objeto MouseEvent.
Ejemplo de MouseListener
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
public class Botones01d extends JApplet implements MouseListener
{
String msg = " ";
JButton botonSi,botonNo,botonOtro;
FlowLayout miFlow = new FlowLayout();
public void init (){
Container contenedor = getContentPane();
contenedor.setLayout(miFlow);
botonSi = new JButton("si");
botonSi.addMouseListener(this);
botonNo = new JButton("no");
botonNo.addMouseListener(this);
botonOtro = new JButton("otro");
botonOtro.addMouseListener(this);
contenedor.add(botonSi);
contenedor.add(botonNo);
contenedor.add(botonOtro);}
public void mouseEntered(MouseEvent evt){
if(evt.getSource()== botonSi)
msg = ("ha entrado a si");
else if(evt.getSource()==botonNo)
msg = "ha entrado a boton no";
La gestin de eventos : Manejo de oyentes del mouse 10 - 40
else
if(evt.getSource()==botonOtro)
msg = "ha entrado a boton otro";
showStatus(msg);}
public void mouseClicked(MouseEvent evt){
if(evt.getSource()== botonSi)
msg = ("ha dado click en si");
else if(evt.getSource()==botonNo)
msg = "ha dado click en no";
else
if(evt.getSource()==botonOtro)
msg = "ha dado click en otro";
showStatus(msg);}
public void mouseReleased(MouseEvent evt){
if(evt.getSource()== botonSi)
msg = ("ha soltado mouse en si");
else if(evt.getSource()==botonNo)
msg = "ha soltado mouse en no";
else
if(evt.getSource()==botonOtro)
msg = "ha soltado mouse en otro";
showStatus(msg);
}
public void mousePressed(MouseEvent evt){
if(evt.getSource()== botonSi)
msg = ("ha presionado mouse en si");
else if(evt.getSource()==botonNo)
msg = "ha presionado mouse en no";
else
if(evt.getSource()==botonOtro)
msg = "ha presionado mouse en otro";
showStatus(msg);
}
public void mouseExited(MouseEvent evt){
if(evt.getSource()== botonSi)
msg = ("ha salido de si");
else if(evt.getSource()==botonNo)
msg = "ha salido de no";
else
if(evt.getSource()==botonOtro)
msg = "ha salido de otro";
showStatus(msg);
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public LabelTest()
{
super( "Chequeo de JLabel" );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
label3.addMouseListener(this);
label3.setHorizontalTextPosition(
SwingConstants.CENTER );
label3.setVerticalTextPosition(
SwingConstants.BOTTOM );
label3.setToolTipText( "Etiqueta 3" );
c.add( label3 );