Anda di halaman 1dari 6

Introducción a la Programación Orientada a Objetos

PROGRAMACIÓN BASADA EN
EVENTOS
INTRODUCCIÓN A LA
• La construcción de una GUI utiliza un modelo de
PROGRAMACIÓN ORIENTADA programación basado en eventos (PBE).
A OBJETOS • En la PBE el orden en el cual se ejecutan las
instrucciones de un programa queda determinado por
01100 eventos. 01100
GUI 10011
• Es decir, el programador no controla el flujo 1de
10011
10110 0110
Programación Basada en Eventos 01110 ejecución. 01110
01100 01100
10011 • Un evento es una señal de que algo ha ocurrido. 10011
10110 10110
Dr. Luciano H. Tamargo 01110
• En esta materia consideraremos únicamente eventos 01110
http://cs.uns.edu.ar/~lt 1001 generados por acciones del usuario al interactuar con1la
001
Depto. de Ciencias e Ingeniería de la Computación 1 11 GUI. 1 11
Universidad Nacional del Sur, Bahía Blanca 0 0 0 0
2018 1 1
2

El objeto oyente, registrado al objeto


fuente de evento, es instancia de una OBJETOS Y EVENTOS
clase que implementa una interface y
redefine un método manejador del
La clase a la que pertenece el objeto fuente de evento
evento
contiene el código que:
Evento Evento
Externo Interno • Percibe el evento externo.
• Dispara el evento interno, es decir, crea el objeto
percibe dispara 01100
evento. 10011
OBJETO OBJETO OBJETO • Invoca al manejador de evento definido en la clase del
10110
01110
FUENTE EVENTO Oyente objeto oyente. 01100
Component crea EventObject recibe ActionListener 10011
registrado a 10110
01110
1001
El objeto evento es un parámetro 1 11
0 0
para el método manejador del 1
evento
3 4

PROGRAMACIÓN BASADA EN PROGRAMACIÓN BASADA EN


EVENTOS EVENTOS

• Diferentes clases de componentes requieren • El programador define (o redefine) el método


implementar diferentes interfaces para manejar los actionPerformed(ActionEvent e) que él mismo NUNCA
eventos internos que los objetos disparan. VA A INVOCAR al menos explícitamente.
• Un botón dispara eventos llamados eventos de acción • El método recibe como argumento un objeto evento de
que son manejados por oyentes de acción. 01100 clase ActionEvent que tampoco fue creado 01100
10011 10011
• Es decir, un objeto de clase JButton genera un objeto1 0 1 1 0 explícitamente por el programador, sino que fue 10110
de la clase ActionEvent que es enviado como 01110 generado implícitamente en el momento que el objeto
01110
01100 fuente de evento detectó el evento externo. 01100
parámetro al objeto oyente de una clase que implementa
10011 10011
a la interface ActionListener. 10110 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
5 6

Profesor Luciano H. Tamargo 1


Introducción a la Programación Orientada a Objetos

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA
• Implemente una GUI que brinde botones para efectuar un
depósito o extracción en una cuenta bancaria o para
consultar el saldo.
• Los dos primeros botones se insertan en un panel y el
tercero en otro.
01100 01100
• Si el usuario elige depositar o extraer, la interfaz muestra un
10011 10011
campo de texto para tipear el monto. 10110 10110
• La acción de extraer requiere verificar que el monto sea 0 1 1 1 0 01110
menor al saldo de la cuenta. 01100 01100
• Si no es posible concretar la extracción, aparece un mensaje 10011 10011
10110 10110
indicándolo. 01110 01110
• Tanto el depósito, como la extracción realizada y la consulta 1001 1001
de saldo, concluyen con un panel de diálogo ofreciendo 1 1 1 1 11
información. 0 0 0 0
1 1
7 8

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA

01100 01100
10011 10011
10110 10110
01110 01110
01100 01100
10011 10011
10110 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
9 10

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA
CuentaBancaria GUI_Cajero
<<atributos de clase>> cuenta: CuentaBancaria
max_descubierto = 1000; contenedor: Container
<<atributos de instancia>> panelAcciones, panelSaldo: JPanel
codigo: entero
01100
bConsultar, bExtraer, bDepositar:
01100
saldo: real
10011 <<constructores>> JButton 10011
10110 CuentaBancaria(c: entero) 10110
01110 01110
CuentaBancaria(c:entero, s: float, t:
01100 01100
10011
String) <<Constructor>> 10011
10110 <<comandos>> GUI_Cajero(c: CuentaBancaria)
10110
01110 establecerTitular(tit: String) 01110
1001 depositar(mto: real) 1001
1 11 extraer(mto: real) 1 11
0 0 <<consultas>> 0 0
1 puedeExtraer(mto: real): boolean 1
11 Requiere código > 0 12

Profesor Luciano H. Tamargo 2


Introducción a la Programación Orientada a Objetos

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA

class TestCuentaBancaria {
public static void main(String[] args) {

CuentaBancaria c = new CuentaBancaria(112);


01100 GUI_Cajero unaCuenta = new GUI_Cajero(c);0 1 1 0 0
10011 } 10011
10110 10110
01110 } 01110
01100 01100
10011 10011
10110 10110
01110 01110
• Las clases asociadas CuentaBancaria y la GUI se1 0 0 1 1001
diseñan e implementan en forma independiente. 1 11 1 11
0 0 0 0
• Cada una encapsula sus atributos, de modo que 1 1
puede ser modificada sin afectar a la otra. 13 14

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA
import java.awt.*; import java.awt.*;
import javax.swing.border.*; import java.awt.event.*;
import javax.swing.*;
class BotonCuentaBancaria extends JButton{
import javax.swing.border.*;
public BotonCuentaBancaria (String b){ import javax.swing.*;
setText(b); 01100 public class GUI_Cajero extends JFrame { 01100
setPreferredSize(new Dimension(124, 50)); 10011 //Atributo de la aplicación 10011
setSize(150, 50); 10110 10110
01110 private CuentaBancaria cuenta; 01110
setBorder(BorderFactory.createCompoundBorder(
01100
new LineBorder(new java.awt.Color(0,0,0),
//Atributos de la GUI 01100
10011 private Container contenedor; 10011
1, false), null)); 10110 10110
} 01110 private JPanel panelAcciones, panelSaldo;0 1 1 1 0
} 1001 private BotonCuentaBancaria bConsultar, 1 0 0 1
1 11 bExtraer, bDepositar; 1 11
• La clase BotonCuentaBancaria especializa a la 0 0 0 0
clase JButton, estableciendo valores específicos para
1 1
los atributos. 15 16

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA
private void armarGUI() {
public GUI_Cajero(CuentaBancaria cb) { //Crea y registra los oyentes de los botones
cuenta = cb; OyenteDepositar oDepositar = new OyenteDepositar();
contenedor = getContentPane(); bDepositar.addActionListener(oDepositar);
setSize(210, 240); OyenteExtraer oExtraer = new OyenteExtraer();
setDefaultCloseOperation(EXIT_ON_CLOSE); bExtraer.addActionListener(oExtraer);
01100 01100
10011 OyenteConsultar oConsultar = new OyenteConsultar();
10011
//Crea los objetos gráficos 10110 bConsultar.addActionListener(oConsultar); 10110
panelAcciones = new JPanel(); 01110 01110
// Establece el layout del contenedor y los paneles
panelSaldo = new JPanel(); 01100 contenedor.setLayout(new BorderLayout()); 01100
10011 10011
bDepositar = new BotonCuentaBancaria("Depositar");
10110
panelAcciones.setBorder( 10110
bExtraer = new BotonCuentaBancaria("Extraer"); 0 1 1 1 0 BorderFactory.createEtchedBorder( 01110
bConsultar = new BotonCuentaBancaria("Consultar");
1001 BevelBorder.LOWERED)); 1001
1 11 panelAcciones.setPreferredSize( 1 11
0 0 0 0
armarGUI(); new Dimension(160, 130));
1 1
} insertarPaneles();
17 18
}

Profesor Luciano H. Tamargo 3


Introducción a la Programación Orientada a Objetos

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA

private void insertaPaneles() { private class OyenteDepositar


/*Inserta los botones en los paneles y los paneles en implements ActionListener {
el panel de contenido*/ public void actionPerformed(ActionEvent event){
panelAcciones.add(bDepositar); float dep; String deposito;
panelAcciones.add(bExtraer); JOptionPane dialogo = new JOptionPane();
01100 01100
panelSaldo.add(bConsultar); 10011 deposito = dialogo.showInputDialog 10011
10110 ( "Ingrese la cantidad a depositar" 1);
0110
01110
contenedor.add(panelAcciones,BorderLayout.NORTH); 01110
if ((deposito != null) && (deposito.length()> 0)){
01100
contenedor.add(panelSaldo, BorderLayout.SOUTH); dep = Float.parseFloat(deposito); 01100
10011 10011
10110
dialogo.showMessageDialog(null,"Usted 10110
} 01110 depositó " + dep + " pesos","Depósito", 01110
1001 JOptionPane.PLAIN_MESSAGE ); 1001
1 11 cuenta.depositar(dep); } 1 11
0 0 0 0
} }
1 1
19 20

CASO DE ESTUDIO: CUENTA private class OyenteExtraer


implements ActionListener{
BANCARIA public void actionPerformed(ActionEvent event){
float ext; String extraccion;
JOptionPane dialogo = new JOptionPane();
extraccion = dialogo.showInputDialog
("Ingrese la cantidad a extraer" );
if ((extraccion!=null)&& extraccion.length() > 0)){
01100 ext = Float.parseFloat(extraccion);
10011 if (cuenta.puedeExtraer(ext)){
10110 dialogo.showMessageDialog( null,
01110
01100
"Usted extrajo " + ext + " pesos",
10011 " Extracción", JOptionPane.PLAIN_MESSAGE );
10110 cuenta.extraer(ext);}
01110 else
1001
dialogo.showMessageDialog( null,
1 11
0 0 "Usted NO puede extraer esa cantidad",
1 "Advertencia", JOptionPane.WARNING_MESSAGE);
21
}}} 22

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA
private class OyenteConsultar
implements ActionListener {
public void actionPerformed(ActionEvent event){
JOptionPane dialogo = new JOptionPane();
if (cuenta.obtenerSaldo()>=0)
01100 dialogo.showMessageDialog(null, 01100
10011 10011
10110 "Usted tiene un saldo de " + 10110
01110 cuenta.obtenerSaldo() + 01110
01100 " pesos","SALDO",dialogo.INFORMATION_MESSAGE);
01100
10011 else 10011
10110 10110
01110
dialogo.showMessageDialog(null, 01110
1001 "Usted está en descubierto en " + 1001
1 11 (-1) * cuenta.obtenerSaldo() + " pesos", 1 1 1
0 0 "SALDO", JOptionPane.ERROR_MESSAGE ); 0 0
1 } 1
23 } 24

Profesor Luciano H. Tamargo 4


Introducción a la Programación Orientada a Objetos

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA
ActionEvent e BotonCuentaBancaria bDepositar • El objeto fuente de evento bDepositar es una
DISPARA DETECTA instancia de JButton, detecta el evento externo
el evento interno Objeto el evento externo
Objeto Fuente de provocado por la acción del usuario sobre el botón.
Evento Evento • Para que se produzca una reacción el programador
REGISTRA
01100 debe registrar el objeto fuente de evento bDepositar0 1 1 0 0
10011 10011
El objeto oyente 10110 con un objeto oyente oDepositar. 10110
al objeto fuentes
de evento
01110 • La clase OyenteDepositar se define implementando 01110
01100 01100
10011 la interface ActionListener provista por Java. 10011
Objeto 10110
• La implementación requiere definir el método 10110
Oyente 01110 01110
El objeto oyente 1001 actionPerformed. 1001
recibe un 1 11 1 11
mensaje con el OyenteDepositar oDepositar 0 0 0 0
objeto evento 1 1
como parámetro
25 26

CASO DE ESTUDIO: CUENTA CASO DE ESTUDIO: CUENTA


BANCARIA BANCARIA

• La clase GUI_Cajero tiene un atributo de la clase


bDepositar.addActionListener(oDepositar);
CuentaBancaria, usa sus servicios sin conocer la
bExtraer.addActionListener(oExtraer);
representación de los datos ni la implementación de las
bConsultar.addActionListener(oConsultar);
operaciones.
01100 • En tanto se mantenga la signatura de los servicios y el0 1 1 0 0
10011 10011
10110 contrato, cualquiera de las dos clases puede modificarse
10110
• Los tres objetos de clase JButton reciben el mensaje0 1 1 1 0 sin afectar a la otra. 01110
addActionListener con parámetros de distintas 0 1 1 0 0 • La clase GUI_Cajero también tiene un atributo de 01 10 10 01 01
10011
clases. 10110 instancia de clase BotonCuentaBancaria. 10110
• El método es polimórfico. 01110 01110
• Ambas clases pueden modificarse sin afectar a la otra,1 0 0 1
1001
• Las tres clases implementan una misma interface. 1 11 siempre que no cambie la signatura del constructor. 1 1 1
0 0 0 0
1 1
27 28

CASO DE ESTUDIO: CUENTA


CASO DE ESTUDIO: CAJERO
BANCARIA

• Debemos verificar la aplicación integrando las clases • Implemente una GUI que permita seleccionar una
GUI_Cajero y CuentaBancaria. cuenta bancaria en un combo box. Cuando la cuenta
• Cada uno de los servicios provistos por está seleccionada el panel del combo box deja de estar
CuentaBancaria debería haberse verificado visible y se activa la visibilidad de una etiqueta y un
previamente. 01100 panel de botones. 01100
10011 10011
• Aunque no podemos garantizar que la aplicación es 1 0 1 1 0 • La etiqueta se inicializa 10110
correcta, hemos verificado que el saldo se computa y 0 1 1 1 0 con el código y el saldo 01110
01100 de la cuenta 01100
almacena correctamente para un conjunto de casos de1 0 0 1 1 10011
prueba. 10110 seleccionada. El saldo 10110
01110 se muestra o se 01110
• Por ejemplo, depositar 1000, extraer 200, extraer 3500,
1001 1001
modifica de acuerdo a
consultar saldo, depositar 3000, extraer 3500. 1 11 1 11
0 0 las acciones del usuario 0 0
1 sobre la GUI. 1
29 30

Profesor Luciano H. Tamargo 5


Introducción a la Programación Orientada a Objetos

CASO DE ESTUDIO: CAJERO CORRECTITUD Y GUI

• La verificación de una aplicación no garantiza que es


correcta pero permite asegurar que funciona de acuerdo
a los requerimientos para un conjunto de casos de
prueba.
01100 • Cuando la interacción con el usuario se realiza a través01100
10011 10011
10110 de una GUI es muy difícil o incluso imposible, anticipar1 0 1 1 0
01110 todos los flujos de ejecución posibles. 01110
01100 01100
10011 • En la verificación debemos validar el comportamiento de 10011
10110 cada componente y además prever diferentes 10110
01110 recorridos. 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
31 32

ENCAPSULAMIENTO Y GUI LEGIBILIDAD Y GUI

• La clase FrameBanco usa los servicios provistos por • La legibilidad del código siempre es una cualidad
las clases CarteraCuentas y CuentaBancaria, sin importante y en una GUI está particularmente vinculada
conocer la representación de los datos ni la a la estructura y modularización.
implementación de las operaciones. • Aunque el orden de las instrucciones con frecuencia no
• En tanto se mantenga el contrato, cualquiera de las 0 1 1 0 0 afecta a la apariencia de la GUI, es importante 01100
10011 10011
clases puede modificarse sin afectar a las otras. 10110 organizarlas con algún criterio lógico e incluir 10110
01110 comentarios que pongan en evidencia esa organización.01110
01100 01100
10011 • También es importante utilizar métodos internos para 1 0 0 1 1
10110 modular el código. 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
33 34

ESTRUCTURA DE UNA GUI

• Una alternativa para modular una GUI es:


 Establecer los valores de los atributos del frame.
 Crear objetos ligados a componentes gráficas.
01100
 Establecer los valores de los atributos de las
10011
componentes. 10110
01110
 Crear objetos oyente. 01100
10011
 Registrar los objetos oyentes a los objetos fuente de
10110
evento. 01110
1001
 Establecer el diagramado de los contenedores. 1 11
0 0
 Insertar las componentes en los contenedores. 1
35

Profesor Luciano H. Tamargo 6