Introducción

Anuncio
Interacción con el Usuario
Gestión de Eventos
2.
3.
4.
Presentación basada en:
1.
Como Programar en Java. Deitel y Deitel. Ed. Prentice-Hall. 1988
Java 2., Curso de programación. Fco. Javier Ceballos. Ed. Alfoomega&RA-MA, 2003.
Apuntes del Curso Programación Orientado a Objetos. Pablo Castells. Escuela Politécnica Superior,
Universidad Autonoma de Madrid.
Apuntes del Curso de java. Luis Hernández y Carlos Cervigón. Facultad de Informática. Universidad
Católica de Madrid.
Introducción
„
Al interactuar con la aplicación, el usuario:
„
„
„
„
„
„
„
„
Acciona componentes (ActionEvent).
El usuario pulsa un botón.
El usuario termina de introducir un texto en un campo y
presiona Enter.
El usuario selecciona un elemento de una lista pulsando el
preferido (o de un menú).
Pulsa o suelta botones del ratón (MouseEvent).
Minimiza, cierra o manipula una ventana (WindowEvent).
Escribe con el teclado (KeyEvent).
Descubre porciones de ventanas (PaintEvent).
1
Introducción
„
„
Cuando el usuario de un programa o applet mueve el
ratón, presiona un pulsador o pulsa una tecla, genera
un evento (actionEvent).
Los eventos son objetos de ciertas clases.
Normalmente un objeto de alguna subclase de
EventObject que indica:
„
„
„
„
El elemento que accionó el usuario.
La identificación del evento que indica la naturaleza del
evento.
La posición del ratón en el momento de la interacción.
Teclas adicionales pulsadas por el usuario, como la tecla
Control, la tecla de Cambio a mayúsculas, etcétera.
Acciones del Usuario
Acción
Pulsar un botón
Objeto origen
JButton
Tipo de evento
ActionEvent
Cambio del texto
JTextComponent
TextEvent
Pulsar Intro en un campo de
texto
JTextField
ActionEvent
Selección de un nuevo elemento
JCombobox
ItemEvent, ActionEvent
Selección de elemento(s)
JList
ListSelection-Event
Pulsar una casilla de verificación
JCheckBox
ItemEvent, ActionEvent
Pulsar un botón de radio
JRadioButton
ItemEvent, ActionEvent
Selección de una opción de
menú
JMenuItem
ActionEvent
Mover la barra de
desplazamiento
JScrollBar
AdjustmentEvent
Abrir, cerrar, minimizar,
maximizar o cerrar la ventana
JWindow
WindowEvent
...
...
...
2
Responder a Eventos
„
Para que un componente (applet, ventana, ...) responda a los
eventos generados por el usuario sobre ese componente:
„
„
„
Se convierte el componente en un oyente (listener) de ciertos
eventos generados por él o por otros componentes.
Convertir un componente en oyente de un tipo de eventos consiste
en implementar la interfaz correspondiente, codificando sus
métodos, y agregar el componente a la lista de oyentes de ese
tipo de eventos.
Ejemplo: Se quiere que la GUI responda a las pulsaciones
sobre un botón colocado en la ventana:
1. La ventana (oyente) ha de implementar la interfaz ActionListener
2. El método actionPerformed() de dicha interfaz estará preparado
para responder a un evento e.
3. El oyente se añade a la lista de eventos de acción de botón.
Responder a Eventos
„
Codigo Ejemplo
public class MiGui extends JFrame implements ActionListener {
public void MiGui() {
(1)
...
boton.addActionListener(this);
(3)
}
public void actionPerformed(ActionEvent e) {
(2)
// Código a ejecutar como respuesta al evento ...
}
}
„
„
„
(1) La ventana (oyente) indica que implementa la interfaz
ActionListener (hay otras para diferentes eventos).
(2) Se implementa el método ActionPerformed() de la interfaz
para responder a un evento e.
(3) Se agrega la ventana (oyente) a la lista de oyentes de
eventos ActionEvent desde el botón.
3
Ejemplo
„
Al pulsar el botón Copiar, se debe copiar el
valor del cuadro "valor“ en el cuadro "Copia".
Origen del Evento:
Botón Copiar
Objeto Evento:
ActionEvent e
Objeto Oyente:
La ventana
Responder a eventos
class MiGui extends JFrame implements ActionListener {
...
public void MiGui(){
// Registro los componentes interesados
// en responder a eventos ...
componente.addActionListener(this);
Este método añade el
}
oyente especificado
(frame) a la lista de
...
oyentes para recibir
eventos
de acción
public actionPerformed(ActionEvent e) {
(ActionEvent) desde este
... // Aquí se responde el evento
componente.
}
}
4
Responder a eventos
„
En el constructor del frame (oyente), registro el botón y añado el
oyente (frame) para recibir eventos de acción desde el botón.
botonCopiar.
AddActionListerner (this);
El usuario pulsa el botón
„
„
La Ventana ( oyente)
El botón crea el objeto ActionEvent()
El botón envía el mensaje actionPerfformed() al frame con el
argumento ActionEvent.
Cada vez que el componente produzca el evento se invocará
automáticamente el método actionPerfformed().
El código de este método se ejecutara cada vez que se pulse el
botón
Otro modelo para responder a eventos
Se puede crear un manejador de eventos
en dos pasos:
„
1.
Se define una clase específica que haga de
oyente de eventos y que implemente el método
actionPerfformed()
class Mioyente implements ActionListerner {
Public void actionPerformed() {
código....
2.
Registramos un ejemplar como oyente de
componentes:
Componente.addActionListerner (ejemplar_de_MiOyente);
5
Otro modelo para responder a eventos
class MiGui extends Jframes{
...
public void MiGui{
//Registro los componentes interesados
//en responder a eventos...
componente.addActionListerner(new MiOyente());
}
...
Class Mioyente implements ActionListerner(){
public actionPerformed(ActionEvent e){
.. // Aquí se responde al evento
}
}
Se añade el oyente especificado (ejemplar de MiOyente) a la lista de oyentes para
recibir eventos de acción (ActionEvent) desde ese componente.
Ejemplo boton con pitido (modelo 1)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gui08 extends JFrame implements
ActionListerner(){
Jbutton boton;
Container panel;
public Gui08(){
super (Ëjemplo de eventos “);
panel = this.getContentPanel();
boton = new JButton (“Pulsar”);
panel.add(boton);
Boton.addActionListerner(this);
setSize(100, 100);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
Toolkit.getDefaultTolkit().beep();
}
....
6
Ejemplo Reproducir un valor
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gui10 extends JFrame {
Container panel;
JButton botonCopiar;
JTextField campoValor, resultado;
public Gui10() {
panel = getContentPane();
panel.setLayout(new FlowLayout());
panel.add(new JLabel("Valor "));
campoValor = new JTextField(5);
panel.add(campoValor);
botonCopiar = new JButton("Copiar");
panel.add(botonCopiar);
botonCopiar.addActionListener(new
OyenteBoton());
panel.add(new JLabel(" Copia "));
resultado = new JTextField(6);
Ejemplo Reproducir un valor
setSize(400, 100);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String args[]) {
Gui10 ventana = new Gui10();
}
class OyenteBoton implements ActionListener {
public void actionPerformed(ActionEvent e){
String valor = campoValor.getText();
resultado.setText(valor);
}
}
}
7
Ejemplo: contador de pulsaciones
„
Una aplicación que muestre el número de
pulsaciones que se
realizan sobre su botón.
public class Gui11 extends JFrame {
...
public Gui11() {
boton1 = new JButton("PULSA");
label1 = new JLabel("Pulsaciones: 0");
panel = getContentPane();
panel.add(boton1);
panel.add(label1);
panel.setLayout(new FlowLayout());
boton1.addActionListener(new
OyenteBotonPulsaciones());
...
}
...
class OyenteBotonPulsaciones implements
ActionListener {
public void actionPerformed(ActionEvent e){
contador++;
label1.setText("Pulsaciones: " + contador);
} ...
Ejemplo cambio de color
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gui12 extends JFrame {
JButton red = new JButton("Rojo");
JButton blue = new JButton("Azul");
Container panel;
public Gui12() {
super("Color de fondo");
panel = getContentPane();
panel.setLayout(new FlowLayout());
panel.add(red);
panel.add(blue);
red.addActionListener(new
ColorActionListener(Color.red));
blue.addActionListener(new
ColorActionListener(Color.blue));
setSize(200, 200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE)
;
}
...
8
Ejemplo cambio de color
public static void main(String args[]) {
Gui12 ventana = new Gui12();
}
class ColorActionListener implements
ActionListener {
Color fondo;
public ColorActionListener(Color unColor)
{
fondo = unColor;
}
public void actionPerformed(ActionEvent
evento) {
panel.setBackground(fondo);
}
}
}
ActionEvent
„
El objeto ActionEvent ofrece un método getActionCommand()
que devuelve un objeto con la información sobre el origen
del evento (el botón en nuestro caso).
Con un botón, devuelve la etiqueta del botón.
„
Para identificar botones individuales:
public void actionPerformed(ActionEvent e) {
String s = (String)e.getActionCommand();
if(s.equals("Aceptar")) {
// Tratamiento del botón Aceptar
}
...
9
ActionEvent
„
El método getSource() indica el objeto en el que se ha
originado el evento:
public void actionPerformed(ActionEvent e) {
if(e.getSource() == lista) {
campo1.setText("En la lista.");
}
else if(e.getSource() == texto) {
campo2.setText("En el campo de texto.");
}
else if(e.getSource() == boton) {
campo3.setText("En el botón.");
}
}
Un conversor Euros-pesetas
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gui13 extends JFrame {
Container panel;
TextField cantidad;
JButton boton1, boton2;
public Gui13(){
super("Conversor Euros-Pesetas");
boton1 = new JButton("A euros");
boton2 = new JButton("A pesetas");
cantidad = new TextField(10);
panel = this.getContentPane();
panel.add(cantidad);
panel.add(boton1);
panel.add(boton2);
panel.setLayout(new FlowLayout());
boton1.addActionListener(new OyenteBoton());
boton2.addActionListener(new OyenteBoton());
setSize(300, 250);
10
Un conversor Euros-pesetas
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String args[]) {
Gui13 ventana = new Gui13();
}
class OyenteBoton implements ActionListener {
public void actionPerformed(ActionEvent ae) {
Float f = new Float(cantidad.getText());
float valor = f.floatValue();
String s = ( String)ae.getActionCommand();
if(s.equals("A euros")) {
valor = (float) ( valor / 166.321);
panel.setBackground(Color.green);
}
else if (s.equals("A pesetas")) {
valor = (float) (valor * 166.321);
panel.setBackground(Color.blue);
}
cantidad.setText(Float.toString(valor));
}
}
}
Interfaces para procesar eventos
„
Para facilitar la tarea del programador se han creado una serie de
interfaces que deben implementarse cuando se quieren procesar
algunos de estos eventos. Algunas interfaces y sus métodos son:
ActionListener
Escucha eventos de tipo ActionEvent
actionPerformed(ActionEvent)
KeyListener
Escucha eventos de teclado
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener
Escucha eventos de acción del ratón
(botones)
mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener
Escucha eventos de movimiento del
ratón
mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
11
Ejercicio
„
Escribe un swing que presente la GUI
de un teléfono:
„
„
„
Botones con los números del 0 al 9.
Un campo de texto para mostrar el
número marcado.
Un botón para colgar el teléfono.
12
Descargar