Professional Documents
Culture Documents
CAPITULO 10
La gestión 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
Presentación
La mayoría de programas actuales se relacionan con los usuarios a través de lo
que se denomina como Interfaz Gráfica de Usuario (Graphical User Interface –
GUI por su sigla en Inglés), la cual se puede componer de ventanas, botones,
menús, barras de desplazamiento, areas de texto, íconos e imágenes, y otros
componentes gráficos visualizados en la pantalla, y que fundamentalmente
intermedian entre el ususario y el sistema (hardware y software), para llevar a
cabo procesos de interacción de entrada y salida de información. Se entiende
por componente gráfico un objeto que tiene una representación gráfica
deplegable en la pantalla y que dentro de sus métodos 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
interacción con un programa durante el ciclo de vida de este, sea una aplicación
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: ratón 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 métodos están
declarados pero no implementados, la clase que requiera ese escucha para
alguno de sus componentes, deberá implementar todos los métodos declarados.
En el caso de ActionListener, solo hay que implementar el método
actionPerformed().
La lista de objetos receptores así como los tipos de eventos a los que están
suscritos, es creada en el objeto fuente mediante llamadas a los métodos 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 ratón. Por tanto, la clase que implementa la interfaz del ratón debe
sobreescribir todos los métodos 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 específico:
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 métodos para trabajar con el. Los datos de un objeto evento se
pueden acceder y establecer por medio de los métodos.
La clase AWEvent
Los métodos 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 método 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 gestión 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 gestión 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 semánticos.
• MouseEvent: Evento que indica que ha sucedido una accion con el ratón
sobre algún componente. Estas acciones pueden ser:
Escuchadores de eventos
El control de eventos en un programa, aplicación o applet, se lleva a cabo
mediante el establecimiento de objetos escuchas (listeners) y registrarlos con
sus orígenes (sources). Los métodos 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 semántico 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
cómo se usa el componente y cuales son mecanismos de implementación de su
manejador de eventos.
Como ya se indicó antes, las applets tienen problemas con el uso de los
adaptadores y deben utilizar la implementación de la interfaz. Se pueden
manejar eventos con los siguiente sesquemas:
Indica que la clase MiClase manejará eventos del tipo ActionEvent, por tal
razón implementará el método asociado con el escucha.
algunComponente.addActionListener(instanciaDeMiClase);
ActionEvent
button actionListener
La gestión de eventos : Manejo de eventos 10 - 21
Cuando el usuario pulsa un botón, los oyentes de action del botón son
notificados.Los manejadores de eventos pueden ser ejemplares de cualquier
clase. Frecuentemente, se implementan usando clases internas anónimas, lo que
puede hacer el códio algo más 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 sóloi método actionPerformed
(ActionEvent e), dentro del cual se selecciona cual fué el boton que generó
el evento. El método 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 método actionPerformed().
Otra forma de escribir los oyentes para un componente, en este caso para
eventos tipo ActionEvent, es mediante clases internas anónimas 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 gestión 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 tamaño 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 método addItemListener. Cuando un evento resultante de
la seleccion del item sucede se invoca el método itemStateChanged().
La gestión 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 gestión de eventos : Manejo de ItemListener 10 - 32
t.setForeground(java.awt.Color.red);
else
t.setForeground(java.awt.Color.black);
}
t.repaint();
}
}
}
Obsérvese 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 gestión 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 condición de tener que implementar todos los
métodos, para lo cual se dejarán vacios los no requeridos.
Metodos de MouseListener
void mouseClicked(MouseEvent e)
Invocado cuando el mouse se ha dado un click sobre algún
componente.
void mouseEntered(MouseEvent e)
Invocado cuando el mouse entra a algún 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 gestión 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
algún componente.
void mouseEntered(MouseEvent e)
Invocado cuando el mouse entra a algún 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 botón 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 gestión de eventos : Manejo de oyentes del mouse 10 - 38
void mouseDragged(MouseEvent e)
Invocado cuando el botón 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 métodos 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 gestión 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 );