Академический Документы
Профессиональный Документы
Культура Документы
Objetivo
Desarrollar de un programa que habilite una calculadora en el que se incluye la
programacin de eventos.
Objetivos especficos:
Introduccin
La primera unidad de la materia, aborda el tema de programacin de eventos,
en donde el objetivo es que estudiante logre que la estructura y ejecucin del
programa dependan de los sucesos (eventos) que ocurran en el sistema o que
ellos mismos provoquen. El estudiante debe desarrollar la habilidad de definir
los eventos a los cuales el programa reaccionar y las acciones que seguir al
presentarse cada uno.
Cuando sobre algn componente ocurre un evento, se espera que suceda algo.
Para ello, el componente delega la tarea de manipular cada tipo particular de
evento a un objeto (instancia de una clase) especfico, denominado manejador o
escuchador de eventos (Listener).
Cada escuchador es capaz de detectar, cuando un evento que le corresponde, ha
ocurrido. Lo controla y responde ejecutando el mtodo adecuado que el
programador le ha asociado.
En el desarrollo de esta prctica se har uso de varios componentes comunes
como son las cajas de texto y los botones. Se les definirn Listeners o
escuchadores para aquellos eventos que son de inters controlar. Esta definicin
se har en este programa con cdigo, para ilustrar el mecanismo en el que
subyacen muchas de las facilidades que otorga la Interfaz de Desarrollo Grfico
(IDE). Esto tiene la intencin de permitir al alumno experimentar la construccin de
una aplicacin que involucra formularios, componentes tales como botones, cajas
Dr.
Hernn
de
la
Garza
Prctica 1 - 1
de texto, todo a partir de cdigo escrito por l mismo. Las ambientes de desarrollo
actuales, tales como el NetBeans, ocultan por as decirlo, buscando facilitar el
desarrollo de aplicaciones, mucho del cdigo necesario para que los componentes
y en general el programa realice las tareas que nos interesan.
Para apoyar al entendimiento del cdigo aqu presentado para el diseo de la
calculadora, se ha incluido una prctica preparatoria sobre diferentes formas de
declarar y habilitar los Listeners para los eventos que sean de inters controlar.
El alumno conocer diferentes maneras de programar Listeners desde cero, ya
que normalmente los programadores al usar la interfaz grfica de desarrollo no se
percatan de lo que se incorpor de cdigo y lo que es ms sorprendente, aunque
lo vean, no lo entienden.
Computadora.
Software recomendado: Netbeans 7.2.1 en adelante
Metodologa
Tal como se mencion anteriormente, se presenta primero una prctica
preparatoria sobre la programacin de Liteners o escuchadores. Se propone ver
diferentes maneras de activar un escuchador (Listener) usando solamente cdigo
y la cuarta forma apoyndose en las facilidades que brinda la interfaz de
desarrollo.
Dr.
Hernn
de
la
Garza
Prctica 1 - 2
Prctica 1 - 3
Prctica 1 - 4
enter con el teclado o bien haciendo clic con el mouse sobre el componente. El
nico mtodo de esta interface que hay que implementar es el de
actionPerformed. Teclear este cdigo arriba del mtodo main del formulario,
dentro de la clase principal. Esto crea una clase definida como inner class o clase
interna.
class
Escuchador1
implements
ActionListener
{
public
void
actionPerformed(ActionEvent
evt)
{
jlbResultado.setText("Resultado:
Seleccionado
Mtodo
UNO");
}
}
Prctica 1 - 5
Prctica 1 - 6
Prctica 1 - 7
import
java.awt.event.ActionEvent;
import
java.awt.event.ActionListener;
Prctica 1 - 8
initComponents();
setSize(500,
350);
setLocationRelativeTo(null);
ActionListener
al
=
new
Escuchador1();
jbtMetodoUno.addActionListener(al);
jlbResultado.setBounds(50,
70,
300,
24);
//
Cdigo
para
mostrar
la
Segunda
Manera
de
activar
un
escuchador
ActionListener
al2
=
new
ActionListener()
{
public
void
actionPerformed(ActionEvent
e)
{
jlbResultado.setText("Resultado:
Seleccionado
Mtodo
DOS");
}
};
jbtMetodoDos.addActionListener(al2);
}
public
static
void
main(String
args[])
{
java.awt.EventQueue.invokeLater(new
Runnable()
{
public
void
run()
{
new
Ventana().setVisible(true);
}
});
}
//
Variables
declaration
-
do
not
modify
Prctica 1 - 9
Prctica 1 - 10
Prctica 1 - 11
Prctica 1 - 12
Prctica 1 - 13
Prctica 1 - 14
}
}
pblica
llamada
Prctica 1 - 15
Prctica 1 - 16
Vamos a inicializar las variables que sern utilizadas por los mtodos de los
eventos en actionPerformed. Las siguientes instrucciones pueden ir despus de
las lneas de cdigo escritas arriba.
puntoDecimal
=
false;
ultimaEntrada
=
Entrada.NINGUNA;
operador
=
0;
numOperandos
=
0;
Dr.
Hernn
de
la
Garza
Prctica 1 - 17
operador1
=
0;
operador2
=
0;
Paso 7. Se especifican las caractersticas del formulario: su diseo interior (null),
no modificable de tamao y se activa el evento de cerrado de la ventana
(windowClosing) con su escuchador (WindowListener). El mtodo que se le llama
cuando la ventana se cierra exitForm(evt), lo vamos a definir ms adelante, fuera
de este mtodo.
//
capturar
este
cdigo
dentro
del
InitComponents()
al
final
de
la
creacin
de
los
componentes
getContentPane().setLayout(null);
setResizable(false);
addWindowListener(new
java.awt.event.WindowAdapter()
{
public
void
windowClosing(java.awt.event.WindowEvent
evt)
{
exitForm(evt);
//
se
definir
ms
adelante
}
});
Prctica 1 - 18
Prctica 1 - 19
getContentPane().add(jbtDigito6);
jbtDigito6.setBounds(88,
85,
28,
28);
jbtDigito7.setText("7");
jbtDigito7.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtDigito7);
jbtDigito7.setBounds(8,
44,
28,
28);
jbtDigito8.setText("8");
jbtDigito8.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtDigito8);
jbtDigito8.setBounds(48,
44,
28,
28);
jbtDigito9.setText("9");
jbtDigito9.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtDigito9);
jbtDigito9.setBounds(88,
44,
28,
28);
jbtPuntoDec.setText(".");
jbtPuntoDec.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtPuntoDec);
jbtPuntoDec.setBounds
(88,
164,
28,
28);
jbtMas.setText("+");
jbtMas.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtMas);
jbtMas.setBounds
(180,
125,
28,
28);
jbtMenos.setText("-");
jbtMenos.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtMenos);
jbtMenos.setBounds
(180,
85,
28,
28);
Prctica 1 - 20
jbtPor.setText("x");
jbtPor.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtPor);
jbtPor.setBounds
(145,
125,
28,
28);
jbtDividir.setText("/");
jbtDividir.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtDividir);
jbtDividir.setBounds
(145,
85,
28,
28);
jbtIgual.setText("=");
jbtIgual.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtIgual);
jbtIgual.setBounds
(145,
164,
28,
28);
jbtTantoPorciento.setText("%");
jbtTantoPorciento.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtTantoPorciento);
jbtTantoPorciento.setBounds
(180,
164,
28,
28);
jbtIniciar.setText("C");
jbtIniciar.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtIniciar);
jbtIniciar.setBounds
(145,
44,
28,
28);
jbtBorrarEntrada.setText("CE");
jbtBorrarEntrada.setMargin(new
java.awt.Insets(2,
2,
2,
2));
getContentPane().add(jbtBorrarEntrada);
jbtBorrarEntrada.setBounds
(180,
44,
28,
28);
Nota: Tanto para especificar el tipo de letra como para establecer un color de fondo, fue
necesario crear una nueva instancia de cada una de las clases Font y Color. Esto sucede
con la instruccin en el parntesis (new java.awt.Font(..)) y (new java.awt.Color(.)).
Prctica 1 - 21
Paso 9. La parte siguiente debe hacerse con cuidado y tratar de entender que se
hace en cada instruccin. Se definirn los Listeners (Escuchadores) para los
eventos que nos interesa controlar, que de hecho actan cada vez que se pulsa
(clic) alguna de las teclas (botones) de la calculadora. Deber detectar cundo la
operacin o evento solicitado es vlido y cundo no lo es.
Se tienen diez botones para los dgitos, que responden de manera semejante, es
decir escribir su valor en la pantalla. Por ello se definir un ActionListener con
nombre aldigi que controle el evento actionPerformed. Y a cada botn se le
asociar con ese ActionListener.
Paso 10. Se procede a definir un solo Listener para los operadores ya que tienen
comportamiento parecido.
java.awt.event.ActionListener
alop=
new
java.awt.event.ActionListener()
{
Dr.
Hernn
de
la
Garza
Prctica 1 - 22
Paso 11. El resto de los botones como son el punto decimal, tanto por ciento, el
botn de inicio (C), el botn de borrar entrada (CE), se manejan de manera
independiente y se define un escuchador especfico para cada uno. Observe esta
manera de activar un Listener sin tener que definir o asignar un nombre primero
como en el caso de los dgitos y de los operadores (igual al usado en el
windowClosing de arriba).
jbtPuntoDec.addActionListener(new
java.awt.event.ActionListener(){
public
void
actionPerformed(java.awt.event.ActionEvent
evt){
jbtPuntoDecActionPerformed(evt);
//pendiente
definirlo
}
});
jbtTantoPorciento.addActionListener(new
java.awt.event.ActionListener(){
public
void
actionPerformed(java.awt.event.ActionEvent
evt){
jbtTantoPorcientoActionPerformed(evt);
//pendiente
definirlo
}
});
jbtIniciar.addActionListener(new
java.awt.event.ActionListener(){
public
void
actionPerformed(java.awt.event.ActionEvent
evt){
jbtIniciarActionPerformed(evt);
//pendiente
definirlo
}
});
Dr.
Hernn
de
la
Garza
Prctica 1 - 23
jbtBorrarEntrada.addActionListener(new
java.awt.event.ActionListener(){
public
void
actionPerformed(java.awt.event.ActionEvent
evt){
jbtBorrarEntradaActionPerformed(evt);
//pendiente
definirlo
}
});
}
//
fin
del
InitComponents()
Paso 12. Es el momento de especificar el cdigo que llevarn cada uno de los
mtodos que usan los Listeners cuando son activados por un evento.
Cuando se hace clic en cualquier botn del 0 al 9 hace que ese botn genere un
mensaje de accin (actionPerformed). Como respuesta al mensaje se ejecutar el
mtodo jbtDigitoActionPerformed. Este mtodo tiene que asignar el ttulo de la
tecla pulsada (0,1,2) a la caja de texto que representa la pantalla.
private
void
jbtDigitoActionPerformed(java.awt.event.ActionEvent
evt)
{
//
se
obtiene
el
id
del
botn
que
gener
el
evento
y
se
guarda
en
un
JButton
javax.swing.JButton
objJBT
=
(javax.swing.JButton)evt.getSource();
String
textoBoton
=
objJBT.getText();
//
se
guarda
su
texto
para
ser
usado
if(ultimaEntrada
!=
Entrada.DIGITO)
//
determinar
qu
fue
lo
ltimo
que
se
tecle
{
if(textoBoton.compareTo("0")==0)return;
//
ignorar
ceros
al
principio
jtfPantalla.setText("");
//
poner
pantalla
en
blanco
ultimaEntrada=
Entrada.DIGITO;
//
especificar
que
se
tecle
un
dgito
}
jtfPantalla.setText(jtfPantalla.getText()
+
textoBoton);
//
aadir
texto
al
final
}
Paso
13.
Continuamos
con
los
mtodos
para
cuando
se
pulsa
un
operador,
el
botn
del
tanto
por
ciento,
el
botn
de
iniciar
y
el
botn
de
borrar
entrada.
private
void
jbtOperacionActionPerformed(java.awt.event.ActionEvent
evt){
javax.swing.JButton
objJBT
=(javax.swing.JButton)evt.getSource();
String
textoBoton
=
objJBT.getText();
Dr.
Hernn
de
la
Garza
Prctica 1 - 24
Prctica 1 - 25
}
}
private
void
jbtIniciarActionPerformed(java.awt.event.ActionEvent
evt){
jtfPantalla.setText("0.");
ultimaEntrada=Entrada.NINGUNA;
puntoDecimal=false;
operador=0;
numOperandos=0;
operador1=0;
operador2=0;
}
private
void
jbtBorrarEntradaActionPerformed(java.awt.event.ActionEvent
evt){
jtfPantalla.setText("0.");
ultimaEntrada
=
Entrada.CE;
puntoDecimal
=
false;
}
private
void
jbtPuntoDecActionPerformed(java.awt.event.ActionEvent
evt){
if(ultimaEntrada
!=
Entrada.DIGITO){
jtfPantalla.setText("0.");
ultimaEntrada
=
Entrada.DIGITO;
}
else
if
(puntoDecimal==false)
jtfPantalla.setText(jtfPantalla.getText()+
".");
puntoDecimal
=
true;
}
Paso 14. Tenemos pendiente definir el mtodo exitForm.
private
void
exitForm(java.awt.event.WindowEvent
evt){
System.exit(0);
}
Dr.
Hernn
de
la
Garza
Prctica 1 - 26
package
Calculadora;
import
java.awt.*;
import
java.awt.event.ActionEvent;
/**
*
*
@author
*/
public
class
Practica1_Calculadora
extends
javax.swing.JFrame
{
private
javax.swing.JTextField
jtfPantalla;
private
javax.swing.JButton
jbtDigito0;
private
javax.swing.JButton
jbtDigito1;
private
javax.swing.JButton
jbtDigito2;
private
javax.swing.JButton
jbtDigito3;
private
javax.swing.JButton
jbtDigito4;
Dr.
Hernn
de
la
Garza
Prctica 1 - 27
Prctica 1 - 28
Prctica 1 - 29
Prctica 1 - 30
Prctica 1 - 31
Prctica 1 - 32
Prctica 1 - 33
jbtTantoPorcientoActionPerformed(evt);
}
});
jbtIniciar.addActionListener(new
java.awt.event.ActionListener(){
public
void
actionPerformed(java.awt.event.ActionEvent
evt){
jbtIniciarActionPerformed(evt);
}
});
jbtBorrarEntrada.addActionListener(new
java.awt.event.ActionListener(){
public
void
actionPerformed(java.awt.event.ActionEvent
evt){
jbtBorrarEntradaActionPerformed(evt);
}
});
}
private
void
jbtOperacionActionPerformed(java.awt.event.ActionEvent
evt){
javax.swing.JButton
objJBT
=(javax.swing.JButton)evt.getSource();
String
textoBoton
=
objJBT.getText();
if
(
(
numOperandos
==
0)
&&
(textoBoton
==
"-"))
ultimaEntrada
=
Entrada.DIGITO;
if(ultimaEntrada==Entrada.DIGITO)
numOperandos++;
if(numOperandos
==1)
operador1=
Double.parseDouble(jtfPantalla.getText());
else
if
(numOperandos
==
2){
operador2=Double.parseDouble(jtfPantalla.getText());
switch(operador){
case'+':operador1
+=
operador2;
break;
case'-':operador1
-=
operador2;
break;
case'x':operador1
*=
operador2;
break;
Prctica 1 - 34
case'/':operador1
/=
operador2;
break;
case'=':operador1
=
operador2;
break;
}
jtfPantalla.setText(Double.toString(operador1));
numOperandos
=1;
}
operador
=
textoBoton.charAt(0);
ultimaEntrada
=
Entrada.OPERADOR;
}
private
void
jbtTantoPorcientoActionPerformed(java.awt.event.ActionEvent
evt){
double
resultado;
if(ultimaEntrada
==
Entrada.DIGITO){
resultado=operador1*Double.parseDouble(jtfPantalla.getText())/100;
jtfPantalla.setText(Double.toString(resultado));
jbtIgual.doClick();
jbtTantoPorciento.requestFocus();
}
}
private
void
jbtIniciarActionPerformed(java.awt.event.ActionEvent
evt){
jtfPantalla.setText("0.");
ultimaEntrada=Entrada.NINGUNA;
puntoDecimal=false;
operador=0;
numOperandos=0;
operador1=0;
operador2=0;
}
private
void
jbtBorrarEntradaActionPerformed(java.awt.event.ActionEvent
evt){
jtfPantalla.setText("0.");
ultimaEntrada
=
Entrada.CE;
puntoDecimal
=
false;
Prctica 1 - 35
}
private
void
jbtPuntoDecActionPerformed(java.awt.event.ActionEvent
evt){
if(ultimaEntrada
!=
Entrada.DIGITO){
jtfPantalla.setText("0.");
ultimaEntrada
=
Entrada.DIGITO;
}
else
if
(puntoDecimal==false)
jtfPantalla.setText(jtfPantalla.getText()+
".");
puntoDecimal
=
true;
}
private
void
jbtDigitoActionPerformed(java.awt.event.ActionEvent
evt){
javax.swing.JButton
objJBT
=
(javax.swing.JButton)evt.getSource();
String
textoBoton
=
objJBT.getText();
if(ultimaEntrada
!=
Entrada.DIGITO){
if(textoBoton.compareTo("0")==0)return;
jtfPantalla.setText("");
ultimaEntrada=
Entrada.DIGITO;
puntoDecimal
=
false;
}
jtfPantalla.setText(jtfPantalla.getText()
+
textoBoton);
}
private
void
exitForm(java.awt.event.WindowEvent
evt){
System.exit(0);
}
public
static
void
main(String[]
args)
{
try{
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getCrossPlatfo
rmLookAndFeelClassName());
}
catch
(Exception
e){
System.out.println("No
se
puedo
hacer
el
aspecto
deseado:"+
e);
Prctica 1 - 36
}
new
Calculadora().setVisible(true);
}
}
Sugerencias Didcticas
Esta prctica contiene instrucciones que no son fciles de entender a la primera,
as como tambin el hecho de que hace uso de conceptos que deben de revisarse
primero.
Se sugiere hacer un repaso de cmo activar un escuchador tanto por medio de
cdigo como haciendo uso de la interfaz grfica.
Se recomienda revisar el tipo de datos ENUM que aparece en el cdigo para
identificar el tipo de entrada que hubo, o sea la tecla que se puls.
Hay validacin de los datos en la entrada ya que no permite el poner dos puntos
decimales, dos operadores seguidos, solo el ltimo se conserva. Se recomienda
practicar validacin de datos en cajas de texto.
Prctica 1 - 37
Bibliografa preliminar
1. Java The Complete Reference Eighth Edition
Herbert Schildt
Oracle Press 2011
2. Java 2 Interfaces Grficas y Aplicaciones para Internet
Francisco Javier Ceballos
Alfaomega- RAMA 2. Edicin 2007
3. En la pgina oficial de Java:
docs.oracle.com/javase/tutorial/java/
Prctica 1 - 38