----~
Ejercicio 1 1:
Escriba una aplicación con interfa: gráfica en la que se construya
una ventana con título y marco que tenga
los controles básicos iconizar; maximizar; cerrar y que al
pulsar sobre el aspa de la ventana cerrar se
salga completamente de la aplicación. La ventana contendrá una
etiqueta y el usuario debe poder cambiar su
tamaño.
Planteamiento:
a) Como hay que crear una ventana con marco lo mas adecuado es
crear una clase que extienda o especialice
la clase JF rame. Esta clase ya tiene marco y los controles
básicos.
b) S610 hay que configurar el comportamiento del control de cierre
(el aspa) de la ventana. Para hacerla
simplemente se fija la propiedad correspondiente mediante la
instrucción
setDefaultC l oseOperati on
CJF rame.EXIT_ON_CLO SE).
e) Hay que crear una etiqueta de tipo JLabe l y añadirla a la
ventana.
d) Se configuran el resto de propiedades de la ventana, como son su
título, que se pueda modificar su
tamaño, que su tamaño inicial se ajuste al tamaño preferido de los
componentes que contiene y que sea
visible.
Solución:
impo r t j a vax. sw i ns. *; ..,. ;-------------------[ Se
impo r tan los e lemen tosg rá fico s.]1
S e t erm ina la aplicación a l pu lsa r
e l b o tó n e n c ru z d el s is t ema .
pub lic class E jemp loJF rameC errab le extends JF rame
pub lic E jemp loJF rameCer rab leC ){
_.....
JLabe l e tiqu e ta = new JLabe l( Ven ta na redim ensi o nab le y
cerrab le );
a dd C e t i que ta ) ;
se tTit leC Pru eba JF ra m e );
se tRes iza b leC tr ue );
p ackO ;
se tV is ib le C tr ue);
Se crea un ob je tode l t i po ven tana
que se hade f in id o.
pub lic s ta tic vo id m ainCS tring a rgs []) { I
=
}
j Prueba JFrame L;]~~
Ventana redimensionable y cerrable
•
Programación en Java 2
Comentario: El comportamiento de cierre de la aplicación se podría
haber proporcionado mediante un gestor
de eventos de ventana (un oyente WindowLi s tener ) que implemente
el método wi ndowClos i ng() en el cual se
ejecutaría la operación de salida de la aplicación (S ystem . exi t
(O ».
Aviso: En versiones de lava anteriores a la 1.4 los componentes
gráficos no se podían añadir directamente la
etiqueta a la entana mediante add (e tique ta). Había que hacerlo
expresamente a su panel de contenido me-
diante getCon te n tP ane() . dd(e ti queta).
Ejercicio 10.2:
Escriba una aplicación gráfica con una ventana que tenga una
etiqueta y dos botones de operación. El
comportamiento de la aplicación debe reflejar en el texto de la
etiqueta cuál es el último botón en el que el
usuario ha hecho dic.
Planteamiento: Primero se construye la ventana principal de la
aplicación que contiene al resto de los compo-
nentes gráficos es decir, la etiqueta y los dos botones. Por
simplicidad se agrupa la etiqueta y los botones en un
panel que es el que finalmente se añade a la ventana.
En este caso hay que proporcionar un comportamiento a la interfaz
gráfica que dé respuesta a las interacciones
de los usuarios, en concreto a los botones, y por tanto hay que
incluir un manejador o gestor de eventos. Con el
gestor se va a escuchar y responder al evento de alto nivel de
acción que se genera al hacer clic sobre cada
botón.
Este oyente se lleva a cabo como una clase interna que implementa
la interfaz Act i onL i s tene r y propor-
ciona el método act i onPe rf o rm ed ( ). Este es el método que se
ejecuta cuando se produce el evento (se hace
clic en el botón) y en él se determina el origen del evento y, en
función de cuál se haya pulsado, se modifica
la etiqueta.
Solución:
i mp o r t j a v a x . s w i n g . * :
i mp o r t j a v a . a wt . e v e n t . * ;
----------------
p u b l i c c l a s s B o t o n e s E t i q u e t a O y e n t e e x
t e n d s J F r ame {
p r i v a t e J L a b e l e t i q u e t a ;
p r i v a t e J B u t t o n b o t o n U n o ;
p r i v a t e J B u t t o n b o t o n Do s ;
p r i v a t e J P a n e l p a n e l ;
p u b l i c B o t o n e s E t i q u e t a O y e n t e ( ) {
e t i q u e t a = n e w J L a b e l ( N o s e h a p u l s a
d o n i n g ú n
b o t o n U n o =n e w J B u t t o n ( B o t o n U n o ) ;
bo tonDos = new JBu t ton ( Boton
D o s ;
p a n e l = n ew J P a n e l ( ) ;
p a n e l . a d d ( e t i q u e t a ) ;
p a n e l . a d d ( b o t o n U n o ) ;
p a n e l . a d d ( b o t o n Do s ) ;
a d d ( p a n e l ) ;
Oy e n t e A c c i o n o y e n t e B o t o n = n ew Oy e n t e Ac c
i o n ( ) ; . . .¡ . J .. - -II
b o t o n U n o . a d d A c t i o n L i s t e n e r ( o y e n t e B
o t o n ) ;
b o t o n Do s . a d d Ac t i o n L i s t e n e r ( o y e n t e B o
t o n ) ; +-----,\
b o t ó n ) ;
S e a ña de n lo s o bje to s gráfico s al
panel y el panel a la ven tana.
S e cr ea u n o bje to o ye nte
de acciones.
s e t D e f a u l t C l o s e Op e r a t i o n ( J F r a me . E X I
T _ O N _ C L OS E ) ;
s e t T i t l e ( V e n t a n a c o n i n t e r a c c i ó n
) ;
p a c k ( ) ;
Se as ig na e l m ism o oyent e a
•
}
p u b l i c s t a t i c v o i d ma i n C S t r i n g [ ] a r g s )
{
=
~
}
c l a s s O y e n t e A c c i o n i mp l e me n t s A c t i o n L i
s t e n e r {
p u b l i c v o i d a c t i o n P e r f o r me d C A c t i o n E v
e n t e v e n t o ) {
J B u t t o n b o t o n = C J B u t t o n ) e v e n t a . g e t S o
u r c e ( ) :
+
b o t a n . g e t T e x t O ) :
S e cre a u na cla se o ye nte de
}
} O y e n t e A c c i o n
} B o t o n e s E t i q u e t a O y e n t e
Comentario: En este caso el tratamiento de los eventos de acción
generados por el clic del usuario sobre los
botones se trata mediante un único objeto de una clase oyente
interna a la clase principal de la aplicación.
La ventaja de las clases internas es que pueden acceder
directamente a todos los atributos de la clase
contenedora y además, como son lo ales a ellas, se evita la
proliferación de clases. Otras opciones posibles
serían que la propia clase principal pudiera actuar como oyente de
acciones, es decir, que implemente la
interfaz Acti onL i sten er y proporcione el método actio nPerf
ormed ) .o implementar la clase oyente como
una clase externa normal.
Aviso: Un componente gráfico sólo puede estar contenido en un único
elemento gráfico contenedor. En este
caso los botones y la etiqueta están contenidos en el panel y el
panel está contenido en la ventana. Es decir, la
jerarquía de composición de objetos gráficos es simple y, por
tanto, si se trata de añadir un componente a un
segundo contenedor, dejaría de estar contenido en el primer
contenedor.
..• . ~
ª Ventana con interacción
Figura 1 2 Ventana inicial de la aplicación y resultado después de
hacer clic sobre el botón uno.
Ejercicio 1 3:
Escriba una aplicación gráfica con una ventana que tenga do
etiquetas y dos boton s de operación. El
comportamiento de la aplicación debe reflejar en el texto de las
etiqueta el número de veces que el usuario ha
hecho clic en cada uno de los botones.
Planteamiento: Primero se construye la ventana pr ncipal de a
aplicación que contiene al resto de los compo-
nentes gráficos, es decir, l s dos etiquetas y los dos botones. Por
simplicidad se agrupan estos elementos
gráficos en un panel que es el que fmalmente se añade a la
ventana.
Para proporcionar un comportamiento a la interfaz gráfica que dé
respuesta a las interacciones de los
usuarios, en concreto a los botones, hay que incluir un gestor de
eventos que responda al evento de la acción
que se genera al hacer clic sobre cada botón.
•
Solución:
i mp o r t j a v a x . s w i n g . * ;
i m p o r t j a v a . a w t . e v e n t . * :
p u b l i c O c l a s s B o t o n e s E t i q u e t a s Oy e n t e
E x t e r n o e x t e n d s J F r a me {
p r i v a t e J L a b e l e t i q u e t a U n o ;
p r i v a t e J L a b e l e t i q u e t a Do s ;
p r i v a t e J B u t t o n b o t o nU n o ;
p r i v a t e J B u t t o n b o t o nDo s ;
p r i v a t e J P a n e l p a n e l ;
p u b l i c o t o ne s E t i q u e t a s O y e n t e E x t e r n o
( ) {
e t i q u e t a U n o = n e w J L a b e l ( B o t o n U n o : O v e
c e s ) ;
=
n e w J L a b e l ( B o t o n Do s : O v e c e s ) ;
b o t o n U n o = n e w J B u t t o n ( B o t o n U n o )
;
b o t o n Do s = n e w J B u t t o n ( B o t o n Do s
) ;
p a n e l = n e w J P a n e l ( ) ;
p a n e l . a d d ( e t i q u e t a U n o ) ;
p a n e l . a d d ( b o t o n U n o ) ;
p a n e l . a d d ( e t i q u e t a Do s ) ;
p a n e l . a d d ( b o t o n D o s ) ;
a d d ( p a n e l ) ;
Oy en t e E x t e r n o Ac c i o n o y e n t e Bo t o n U n o = n e
w Oy e n t e E x t e r n o A c c i o n( e t i q u e t a U n o ) ;
~
Oy e n t e E x t e r n o A c c i o n o y e n t e B o t o n Do s = n
e w Oy e n t e E x t e r n o Ac c i o n ( e t i q u e t a Do s )
;
b o t o n U n o . a d d A c t i o n L i s t e n e r ( o y e n t e B
o t o n U n o ) ;
b o t o n Do s . a d d A c t i o n L i s t e n e r ( o y e n t e B
o t o n Do s ) ;
s e t D e f a u l t C l o s e Op e r a t i o n ( J F r a me . E X I
T _ O N_ C L O SE ) ;
s e t T i t ; l e ( V e n t a n a c o n i n t e r a c c i ó n
) ;
s e t S i z e ( 3 0 0 , l O ) ;
s e t V i s i b l e ( t r u e ) ;
L o s c o mp o ne n t e s s e p r e s e n t a n
e n e l p a n e l e n e l o r d e n e n e l
q u e s e a ñ a d e n .
E n e s t e c a s o s e c r e a n d os o b j e t o s
o y e n t e s y s e l e sp a s a c o mo p a r á me t r o
}
p u b l i c s t a t i c v o i d ma i n ( S t r i n g [ ] a r g s )
{
}
} BotonesEtiquetasOyenteExterno L a c l a s eo y e n t e e s u n a
c l a s ep ú b l i c a
, r---------------------il
e x t e r n aa l a c l a s ee n l a q ue s e
. • . g e n e r a n l o s e v e n t o s .
p u b l i c c l a s s O y e n t e E x t e r n o A c c i o n i mp l
e me n t s A c t i o nL i s t e n e r {
<= ,===========d
p r i v a t e i n t n u m V e c e s ;
p r i v a t e J L a b e l e t i q u e t a ;
E l o y e n t e t i e n e u n c o n s t r u c t o ru e
r e c i b ec o mo p a r á me t r o l ae t i q u e t a
a mo d i f i c a r .
p u b l i c Oy e n t e E x t e r n o A c c i o n ( J L a b e l e t
i q u e t a ) {
-----------11
n u m V e c e s = O;
=
e t i q u e t a ;
p u b l i c v o i d a c t i o n P e r f o r m e d ( A c t i o n E v
e n t e v e n t o ) {
n u mV e c e s + +;
J B u t t o n b o t o n = ( J B u t t o n ) e v e n t o . g e t S o
u r c e ( ) ;
}
•
Comentario: Aunque las etiquetas son atributos privados de la
ventana principal y el oyente de eventos es una
clase externa a dicha ventana, no es necesario hacer un método de
acceso ya que el constructor del oyente
recibe como parámetro la etiqueta que ti ne que modificar.
__~~•• _~ .~~_ - - _ v ._ ••_- • _~_ •• _ ~ _
Boton Uno: Oveces I ~~' I~
Boton Dos: Oveces
I
Boton.Dos
Figura 10.3. Ventana inicial de la aplicación y después de hacer
clic dos veces sobre el botón uno
y 4 veces sobre el botón dos.
Ejercicio 10.4:
Escriba una ap ic ción gráfica con una ventana que tenga una
etiqueta y un área de texto. La aplicación
debe reflejar en el área de texto todos los eventos de ventana que
se produzcan por la creación de la ventana
o por las interacciones del usuario.
Planteamiento: Primero se construye la ventana principal de la
aplicación que conti ne un panel en el que se
incluyen la etiqueta y el área de texto. Para poder reflejar todos
los eventos de la ventana se hace que la propia
ventana implemente la interfaz de oyente de ventana y se
proporcionan los siete métodos correspondientes de
esta interfaz que añaden al área de texto una línea de texto
indicando el evento producido.
Solución:
impor t java .aw t.event.WindowLis tener;
impor t java .awt .event.WindowEven t;
pub lic class VentanaOye n te ext ends JF ram e imp lemen ts W indo
wL is tene r { - - - I I
p riv a te JTextArea are aTexto ;
p rivate JL abe l e tique ta ;
p riva te JPane l pane l;
p r iva te fina l S~r in g F IN ~ \n ;
L a p rop ia ventana gráf ica es oy en tede
eve nt os de vent a na ya que implementa
la in te rfa z WindowLi s t ene r.
p ub lic V en ta na Oye nte () {
e tique ta ~ n ew JL abel ( Eventos ) ;
a reaTexto ~ new J T ex tA re a(lO , 30): •....-----------11
a reaTexto .setText( T e xto in icia l de l a r ea de text o
);
pane l ~ new JPane l() ;
S e crea un á re a de t ex to c on 10 f il as
y 3 0 co lu m na s y s e le asoc ia una
cade na de t e x to i nicia l.
pane l.add (e tiqueta):
pane l.add (a reaTexto );
add (pane l) ;
a ddW i ndowL i s te ne r(thi s ); •....-----------------11
se tD e faultClose O era tion (WindowCons tants.D O _NOTHING_O
N_CLOSE );
se tT itl e ( Ven tana oye te );
setVisible (tr ue );
Con thi s es la prop iaventana la
qu e se r eg is tr a a s í m is m a co m o
oyen te de even t osde ventana .
p u b l i c v o i d wi n do wOp en ed C Wi n d o wE v e n t e )
{
a r e a T e x t o . a p p e n d C F I N + V e n t a n a a b
i e r t a ) ; . • •
----------11
}
p u b l i c v o i d wi n d o wC l o s i n g C Wi n d o wE v e n t e
) {
}
p u b l i c v o i d wi n d o wC l o s e d C Wi n d o wE v e n t e )
{
}
p u b l i c v o i d wi n d owl c o n i f i e d C Wi n d o wE v e n
t e ) {
}
p u b l i c v o i d wi n d o wDe i c o n i f i e d CWi n d o wE v e
n t e ) {
}
}
p u b l i c v o i d wi n do wDe a c t i v a t e d C Wi n d o wE v e
n t e ) {
}
p ub l i c s t at i c v o i d ma i n C S t r i n g [ ] a r g s )
{
•
}
Pro gram ac ió n e n J a va
S e p r o p o r c o n a n o s mé t o d o s
c o r r e s p o n d i e n t e s l a i n t e r i a z
Wi n d o wL i s t e n e r .
E n l o s mé t o d o s d e l a i n t e r i a z
Wi n do wL i s t e n e r s e a ña de u n a l í n e a
a l c o n t e n i d od e l á r e a d e t e x t oc o n l a
i n d i c a c i ó ne l e v e n t o p r o d u c i d o .
Comentario: En este caso se están tratando los eventos de ventana
que reflejan cualquier cambio de estado.
Estos eventos son de bajo nivel. Siempre que sea posible, es
preferible hacer el tratamiento de eventos de alto
nivelo semánticos que hacerlo de sus eventos equivalentes de bajo
nivel.
Aviso: Como se ha modificado el comportamiento del control de
cierre de la ventana para que no haga nada y
se pueda comprobar ese evento mediante su escritura en el área de
texto, no se podrá cerrar la ventana de forma
normal. Habrá que hacerlo cerrando la ventana de la consola Java o
desde el administrador de tareas.
¡ Ventana oyente ¡;]@[g)
Texto in icia l de l are a de tex to
Ve n tana ac tíva da
Ventana abierta
/fex to in icia l de l area de texto
Ve n tana activada
Ve n tana lea n Iz ada
Even t o s ve ntana desactlvada
Ven tan a de s ccm zad a
Ve ntan a activ ada
Figura 1 4 Ventana inicial de la aplicación
y
y
Ejercicio 1 5:
Escriba una aplicación gráfica con una ventana que tenga un botón y
un área de texto. La aplicación debe
eflejar en el área de texto los principales eventos de ratón que se
pr duzcan sobre dicha área por las
•
Planteamiento:
Primero se construye la ventana principal de la aplicación que
contiene un panel en el que se
incluyen el botón y el rea de texto.
Para poder reflejar algunos de los eventos del ratón se crea una
clase oyente de ratón que implemente la
interfaz MouseInputL i tener . Esta interfaz incluye siete métodos
y para no tener que implementarlos todos se
hace que la clase oyente extienda de la clase adaptadora Mouse lnpu
tAdapter. Esta clase adaptadora proporcio-
na defmiciones vacías de los siete métodos de modo que sólo se
necesita implementar los métodos que resulten
interesantes.
Solución:
i m p o r t j a v a x . s wi n g . * ;
i m p o r t j a v a . a wt . e v e n . * ;
i m p o r t j a v a x . s w i n g . e v e n t . * ; +- - - - - - -
- - - - - - - - - i l
p u b l i c c l a s s V e n t a n a O y e n t e A d a p t a d o r e
x t e n d s J F r a me (
p r i v a t e J T e x t A r e a a r e a T e x t o ;
p u b l i c V e n t a n a Oy e n t e A d a p t a d o r ( ) (
J B u t t o n b o t o n = n e w J B u t t o n ( L i mp i a r
) ;
a r e a T e x t o = n e w J T e x t A r e a ( 1 2 . 3 0 ) ;
J P a n e l p a n e l = n e w J P a n e l ( ) ;
p a n e l . a d d ( b o t o n ) ;
p a n e l . a d d ( a r e a T e x t o ) ;
a d d ( p a n e 1);
A c t i o n L i s t e n e r o y e n t e B o t o n = n ew Oy e n t e
Ac c i o n ( ) ;
b o t o n . a d d A c t i o n L i s t e n e r ( o y e n t e B o t o
n ) ;
Mo u s e L i s t e n e r o y e n t e R a t o n = n e w Oy e n t e R
a t o n ( ) ; -----;1
}
c l a s s O y e n t e R a t o n e x t e n d s Mo u s e l n p u t A
d a p t e r
--------------,I
p u b l i c v o i d mo us e C l i c k e d ( Mo u s e E v e n t e )
(
a r e a T e x t o . a p p e n d ( S e h a h e c h o c l i c
\ n ) ;
a r e a T e x t o . a p p e n d P o s i c i o n X :
+e . g e t X ( ) ) ;
}
p u b l i c v o i d mo u s e P r e s s ed ( Mo u s e E v e n t e )
(
i f « e . g e t M od i f i e r s ( ) I n p u t E v e n t . B
U T T ON 3 _ MA S K ) = O)
a r e a T e x t o . a p p e n d ( E l b o t ó n p u l s a d o e s e
l d e l a d e r e c h a \ n ) ;
a r e a T e x t o . a p p e n d ( S e h a p u l s a d o e l
b o t ó n d e l r a t ón \ n ) ;
T a m b i é n h ay q u e i mp o r t a r o se v e n t o s
d e s wi n g y a q ue e s a qu í d o nd e s e
d e f i n eMo u s e 1n p u t A d a p t e r .
S e c r e a un o y e n t e d e r a t ó nq u e s e
a s o c i aa l á r e a d e t e x t o .
E l o y e n t e d e r a t ó ns e c r e a e x t e n d i e n d o
a
}
p u b l i c v o i d mo us e Re l e a s e d ( Mo u s e E v e n t e )
(
}
p u b l i c v o i d mo u s e E n t e r e d ( Mo u s e E v e n t e )
(
}
p u b l i c v o i d mo us e E x i t e d ( Mo u s e E v e n t e )
(
a r e a T e x t o . a p p e n d ( E l r a t ó n h a s a l i
d o d e l c o mp o n e n t e \ n ) ;
Oy e n t e d e a c c i o n e sq u e l i mp i a
e l c o n t e n i d od e l á r e a d e t e x t o .
l a s s Oy e n t e A c c i o n i mp l e me n t s A c t i o n L i s
t e n e r { ---------11
p u b l i c v o i d a c t i o n P e r f o r me d ( A c t i o n E v
e n t e v e n t o ) {
Pro gram ac ió n e n J a v a
p u b l í C s t a t í c v o í d ma í n ( S t r í n g [ ] a r g s )
(
=
n e w V e n t a n a Oy e n t e A d a p t a d o r ( ) :
v e n t a n a . s e t T í t 1 E v e n t o s d e r a t ó n )
: + - - - - - - - - - - - 1 1
v e n t a n a . p a c k ( ) :
v e n t a n a . s e t V í s í b l e ( t r u e ) :
E n e s te c a s o la s p ro p ie d a d e s d e la
v e n ta n a d e la a p lic a c ió n s e
}
} V e n t a n a O y e n t e A d a p t a d o r
Comentario: En este caso se están tratando los eventos de ratón a
bajo nivel. El uso de la clase adaptadora ha
evitado tener que proporcionar también la implementación de los
métodos mouse O ra gged() y mouseMoved() ya
que en este caso no se deseaba tener su funcionalidad.
El ra tón ha en trado en el componen te
Se ha puts ado el bot ón de l ra tón
El ra tón ha sa lido de l com pon ent e
Se ha onado el bot ón d el r at ón
E l ra tó n h a e ntr ad o en el com po ne nte
E l ra tón ha sa lido de l componente
E l ra tón h a e ntrado en e l com pon en te
¡
r- ;:um .;¡=im =p=¡3rl= r-¡e h a s oltado e l bo tón de l ra
tón
. Se ha hecho cllc
I L im p ia r
Figura 10.5. A la izquierda la ventana de la aplicación después de
haber entrado, s lido y vuelto a entrar en el área
de texto donde se ha hecho clic con el botón derecho. A la derecha
el ratón ha entrado en el área de texto, se ha
pulsado l ratón y antes de soltarse se ha salido del componente de
modo que no se ha producido el clic.
Ejercicio 10.6:
Escriba una aplicación gráfica que permita calcular el índice de
masa corporal. Este índice se obtiene
dividiendo el peso en kilos de una persona por el cuadrado de su
altura en metros.
Planteamiento: Primero se construye la ventana principal de la
aplicación que contiene un panel en el que se
incluyen dos campos de texto con sus etiquetas identificativas para
la obtención del peso y de la altura, u n
botón para realizar el cálculo y el campo de texto donde se muestra
el resultad (este último campo no debe ser
editable por el usuario). Los campos e texto que se necesitan para
tomar datos o mostrar resultados, es decir,
que serán posteriorm nte accedidos, se declaran como atributos d la
clase. El resto de componentes gráficos
se declaran como variables locales, o incluso anónimas.
Solución:
í mp o r t j a v a x . s w í n g . * :
í mp o r t j a v a . a wt . e v e n t . * :
p u b l í c c l a s s I n d i c e Ma s a C o r p o r a l e x t e n
d s J F r a me {
p r í v a t e J T e x t F i e l d c a mp o A l t u r a :
p r í v a t e J T e x t F i e l d c a mp o P e s o :
•
p ub l i c I n d i c e Ma s aC o r p o r a l C ) (
J L a b e l e t i q u e t a A l t u r a = n e w J L a be l ( A l t
u r a C m e t r o s ) ) ;
=
n ew J L a be l ( P e s o C k g ) ) ;
J L a b e l e t i q ue t a I MC = n ew J L a be l ( I n d i
c e Ma s a C o r p o r a l ) ;
J B u t t o n c a l c u l a r = n e w J B ut t o n C C a l c u l a
r I MC ) ;
c a mp o A l t u r a = n e w J T e x t F i e l d ( 6 ) ;
------------11
c a mp o P e s o
=
n e w J T e x t F i e l d ( 6 ) ;
c a mp o I MC
=
n e w J T e x t F i e l d ( 6 ) ;
c a mp o I MC . s e t E d i t a b l e C f a l s e ) ;
=
n e w J P a ne l C ) ;
S e c r e a n l o s c a mp os d e a l t u r a p e s o
d on de e l u s u a r i o n t r o d u c i r áo s d a t o s .
p a n e l . a d d C e t i q u e t a A t u r a ) ;
p a n e l . a d d C c a mp o A l t u r a ) ;
p a n e l . a d d C e t i q u e t a P e s o ) ;
p a n e l . a d d C c a m p o P e s o ) ;
p a n e l . a d d C c a l c u l a r ) ;
p a n e l . a d d C e t i q u e t a I MC ) ;
p a n e l . a d d C c a mp o I MC ) ;
a d d C p a n e l ) ;
c a 1 c u 1 a r . a dd Ac t i o n L i s t e ne r C +- - - - - - - -
- - - - - - - l l
n ew A c t i o n L i s t e n er ) (
p u b l i c v o i d a c t i o nP e r f o r me d C Ac t l o n E v en
t e v e n t o ) {
D o u b l e p e s o = Do u b l e . p a r s e D o u b l e C c a m p
o P e s o . g e t T e x t C » ;
D o u b l e a l t u r a = Do u b l e . p a r s e D o u bl e C c a m
p o A l t u r a . g e t T e x t C » ;
D o u b l e i mc = p e s o / C a l t u r a * a l t u r a ) ;
S t r i n g c a d e n a = S t r i n g . f o r m a t C %6 . 2
f . t mc ) :
c a mp o I MC . s e t T e x t C c a d e n a ) ;
1 1
~----I
A l b o t ó n d e c a l c u l a r e l ea s o c i a
u n o y e n t e d e a c c i o n e sme d i a n t e
}
} l cons tructor
p u b l i c s t a t i c v o i d ma i n C S t r i n g e ] a r g s )
(
I n d i c e M a s a C o r p o r a l v e n t a n a = n e w I n d i c
e Ma s a C o r p o r a l C ) ;
v e n t a n a . s e t T i t l e C I n d i c e d e Ma s a C o
p o r a l ) ;
v e n t a n a . s e t D e f a u l t C l o s e O p e r a t i o n C J
F r a me . E X I T _ ON _ C L OS E )
v e n t a n a . s e t S i z e C 4 0 0 . 1 0 0 ) ;
v e n t a n a . s e t V i s i b l e C t r u e ) ;
A l r e s u l t a d o e l ed a f o r ma t oc o n d o s
d e c i ma l e sy s e mu e s t r a e n e l c a m p o I MC .
Comentario: Normalmente en las aplicaciones gráficas sólo se
declaran como atributos aquellos elementos gráfi-
cos a los que hay que acceder posteriormente (aunque en este caso
no sería necesario). Respecto a la funcionalidad
de la aplicación, en este caso se proporciona mediante un oyente de
acciones asociado al botón de operación que se
implementa como una clase anónima. Hay que tener cuidado con esta
práctica ya que, aunque es cómodo debido
a que no hay que crear nuevas clases, puede dificultar la lectura
del código. Por tanto sólo se debe usar cuando el
código del oyente sea suficientemente sencillo como para no
interferir con la legibilidad del programa.
Aviso: No se ha introducido control de errores en la entrada
proporcionada por el usuario, de modo que si el
formato numérico no fuera correcto, se produciría una excepción y
la correspondiente terminación anómala
del programa. Si se introduce cero e la altura en el índice de masa
corporal se muestra Infinity (infinito) ya
que se ha realizado una d visión por cero.
- -
Altura (metros) 11 .91 I Peso (kg) 110 2 I
I ~alcular IMg ¡Indice Masa Corporal i _ i 7 9 6 ~ ~
Figura 10.6. Captura de la ventana de la aplicación-después de
haber introducido datos y haber hecho clic
en el botón Calcular MC.
Ejercicio 10.7:
Escriba una aplicación gráfica que permita de forma sencilla
realizar el cambio de pesetas a euros y vicever-
sa. La tasa de cambio que se aplica es 1 euro igual a 166,386
pesetas. En todo momento el usuario debe estar
informado de la conversión que se está realizando.
Planteamiento: En este caso se hace que la clase especialice a un
panel (JPanel) en el que se incluyen los dos
campos de texto con sus correspondientes etiquetas para obtener la
cantidad a cambiar y mostrar el resultado.
También se incluye un botón de operación para realizar el cambio y
un botón conmutador que determinará la
conversión que se está realizando en ese momento. Cuando se pulse
el botón conmutador se cambiará la
conversión a realizar y su texto identificativo para que el usuario
conozca el sentido de dicha conversión,
pesetas a euros o euros a pesetas.
En el programa principal se construye y se fijan las
características de la ventana principal de la aplicación
a la que se añade un objeto de la clase que especializa el
panel.
public CalculadoraEurosPesetas() {
add(campoCantidad):
campoResultado.setEditable(false):
add(campoResultado):
add(moneda) :
add(cambiar):
prívate double cambioEfectivo = TASACAMBIO:
inicialmente no estéseleccionado.
asocia unoyente deacciones.
Oyentede acciones queobtienela
resultado (formateadocon dosdecimales).
p u b l i c s t a t i c v o i d ma i nC S t r i ng [ ] a r g s )
{
J F r ame v e n t an a = n e w J F r a me C C a l c u l a d o r a c
a mb i o mo n e d a ) ; - -..J
C a l c u l a do r a E r o s Pe s et a s c a l c u l a d o r a = n
ew C al c u l a d o r a E u r o s P e s e t a s C ) ;
v e n t a n a . a d d C c a l c u l a d o r a ) ;
v e n t a n a . s e t De f a u l t C l o s e Op e r a t i o n C J F
r a me . E X I T _ O N _ C L O S E ) ;
v e n t a n a . s e t S i z e C 4 0 0 . 1 0 0 ) ;
v e n t a n a . s e t V i s i b l e C t r u e ) ;
Interfaces grá icas de usuario con Swing
p u b l i c v o i d a c t i o nP e r f o r me d C A c t i o nE v e
n t e v en t o ) {
d o u b l e d i n e r o = Do u b l e . p a r s e D o u bl e C c a m
p o C a n t i d a d . g e t T e x t C ) ) ;
d i n e r o = d i n e r o * c a mb i o E f e c t i v o ;
S t r i n g c a d e n a = S t r i n g . f o r m a t C %6 . 2
f . d i n e r o ) ;
}
} O y e n t e C a m b i o
e l a s s Oy e n t e B o t o n C o nmu t a d o r i mp 1 e me n t s
A c t i o n L i s t e n e r { ---------11
p u b l i c v o i d a c t i o n P e r f o r me d C A c t i o n E v
e n t e v e n t o ) {
J T o g g l e B u t t o n b o t o n = C J T o g g l e B ut t o n )
e v e n t o . g e t S o u r c eC ) ;
f C b o t o n . i s S e l e c t e d C ) ) { i
b o t o n . s e t T e x t C P e s e t a s a E u r o s
) ;
c a mb i o E f e c t i v o = 1 / T A S ACAMB I O;
--------11
e l s e {
b o t o n . s e t T e x t C E u r o s a P e s e t a s
) ;
}
Oy e n t e d e l b o t ó n c o n mu t a d o r
q u e c a mb i a s u e t i q u e t ay
e s t a b l e c ee l c a mb i o e f e c t i v o .
E s n ec e s a r i oo b t e n er e l o r i g e n
d e l e ve nt o y a q ue n o e s t á
d i r e c t a me n t ea c c e s i b l e .
S e c r e a l av en t a n a p r i n c i p a l e
l a a p l i c a c i ó n s e l e p r o p o r c i o n a
}
} C a c u a d o r a E u r o s P e s e t a s
- - - - - 1 1 S e c r e a u n o b j e t od e t i p oc a l c u l a d
o r a 1 1
y s e a ñ a de l a v en t a na p r i n c i p a l .
,,==========1)
Cantidad a convertir 156.89
I Euros a Pesetas
Cantidad a convertir 156.89
II~I
Figura 10.7. Captura de la ventana e la aplicación primero en la
conversión de euros a pesetas y luego en la de
pesetas a euros. Obsérvese que el botón conmutador que muestra la
conversión que se realiza cambia no sólo en su
texto sino también su aspecto, ya que pasa a estar
seleccionado.
Comentario: Como en este caso la clase principal no hereda de J F r
a me si no de J P a n e 1 , no produce una
ventana principal en la que se muestra directamente la aplicación.
Esta ventana se crea en el programa princi-
•
Pro gr am ac ió n e n J a v a
Aviso: No se ha introducido control de errores en la entrada
proporcionada por el usuario de modo que si el
formato numérico no fuera correcto se produciría una excepción y la
correspondiente terminación anómala del
programa.
Ejercicio 10.8:
Mejore la aplicación gráfica que realiza el cambio de pesetas a
euros y viceversa presentado en el
ejercicio anterior. Además de las funcionalidades anterior s se
debe permitir operar con los botones
desde el teclado y hay que añadir un botón que permita borrar los
campos de atos y resultado. También
para darle mayor robustez se debe incluir un control de errores que
avise mediante una ventana emer-
gente si se ha introducido un número en formato erróneo evitando
que la aplicación se detenga de forma
anómala.
Planteamiento: En este caso se hace que la clase especiali e a un
panel ( J P a n e 1 en el que se incluyen los dos
campos de texto con sus correspondientes etiquetas para obtener la
cantidad a cambiar y mostrar el resultado.
También se incluye un botón de operación para realizar el cambio y
un botón conmutador que determinará la
conversión que se está realizando en ese momento. Cuando se pulse
el botón conmutador se cambiará la
conversión a realizar y su texto identificativo para que el usuario
conozca el sentido de dicha conversión
(pesetas a euros o euros a pesetas). Para que se pueda operar con
los botones desde el teclado se utilizan los
rnnemónicos. Si la letra indic da en el rnnemónico aparece en el
texto del botón, su primera ocurrencia
aparecerá subrayada
En el programa principal se construye y se fijan las
características de la ventana principal de la aplicación
a la que se añade un objeto de la clase que especializa el
panel.
Solución:
i mp o r t j a v a x . s wi n g . * :
i mp o r t j a v a . a wt . e v e n t . * ;
i mp o r t j a v a 0 . s wi n g . e v e n t . * ;
p u b l i c c l a s s C a l c u l a d o r a E u r o Me j o r a d a
e x t e n d s J P a n e l
=
1 6 6 . 3 8 6 :
p r i v a t e d o u b l e c a m b i E f e c t i v o T A S A
C A MB I O ;
p r í v a t e J T e x t F i e l d c a mp o C a n t i d a d ;
p r i v a t e J T e x t F i e l d c a mp o R e s u l t a d o
;
p ub l i c C a l c u l a do r a E ur o Me j o r a daC ) {
a d d C n e w J L a b e l ( C a n t i d a d a c on v e r t i r
) ) ;
c a m p o C a n t i d a d = n e w J T e x t F i e l d C O. O
, 6 ) ;
a d d C c a mp o C a nt i d a d ) ;
a d d C n e w J L a b e l ( Re s u l t a d o ) )
;
=
n e w J T e x t F i e l d C O. O , 6 ) ;
c a m p o R e s u l t a d o . s e t E d i t a b l e C f a l s e )
;
a d d C c a m p o R e s u l t a d o ) ;
=
n ew J T o gg l e Bu t t o n C E u r o s a P e s e t a s , f a l s
e ) ;
mo n e d a . s e t Mn e mo n i c C K e y E v e n t . V K _ E )
;
a d d Cmo n e da ) ;
mo n e d a . a d d C ha n g e L i s t e n e r C n e w Oy e n
t
B u t t o n c a mb i a r = n e w J B u t t o n C C a m
c a mb i a r . s e t Mn e mo n i c C K e y E v e n t . V K _ C
)
a d d C c a mb i a r ) ;
c a mb i a r . a d d Ac t i o n L i s t e n e r C n e w Oy e
n
I ma g e l c o n i c o n o = n e w I ma g e l c o n C c
I
P u l s a n d o A L T t e s e a c t i v ae s t e
e B o t o n C o n mu t a d o r C ) ;
b o t ó n , S i l a l e t r a a pa r e c e e n e l
b i a r ) ;
t e x t od e l b o t ó n s u p r i me r a
o c u r r e n c i a p a r e c e r á s u b r a y a d a .
t e C a mb i o C ) ) ;
S e c r e a u n i c o n oa p a r t i r e u na
I
i ma g en g r á f i c a n f o r ma t og i f ,
r o s s . g i f ) ;
c l a s s O y e n t e C a mb i o i mp l e me n t s A c t i o n L i
s t e n e r {
p u b l i c v o i d a c t i o nP e r f o r me d C A c t i o n E v e
n t e v e n t o ) {
d o u b l e d i n e r o = 0 . 0 ;
t r y { - - - - - - - - - - - - - - - - - - - ~ I
d i n e r o = Do u b l e . p a r s e Do u b l e C c a mp o C a n t
i d a d . g e t T e x t C ) ) ;
c a t c h C N u m b e r F o r ma t E x c e p t i o n e x c e p c i
o n ) {
J O p t i o n P a n e . s h o w M e s s a g e Di a l o g C C a 1 c
u 1 a d o r a E u r o Me j o r a d a . t h i s . . 1
S o l o s e p u e d e n i n t r o d u c i r d í g i t o s y e l p u
n t o d e c i ma l .
E r r o r e n e l f o r ma t o n u mé r i c o .
J Op t i o n P a ne . E R R O R _ M E S S A GE ) ;
}
d i n e r o = d i n e r o * c a mb i o E f e c t i v o ;
S t r i n g c a d e n a = S t r i n g . f o r m a t C %6 . 2 f . d
i n e r o ) ;
c a mp o R e s u l t a d o . s e t T e x t C c a d e n a ) ;
Interfaces gráficas de usuar io con Swing
J B u t t o n b o r r a r = n ew J B u t t o n C B o r r a r
. i c o n o ) ; -__ -
b o r r a r . s e t Mn e mo n i c C K e y E v e n t . V K _ B ) ;
I
a d d C b o r r a r ) ;
b o r r a r . a d d Ac t i o n L i s t e n e r
C ------...,
n e w A c t i o n L i s t e n e r C ) {
p u b l i c v o i d a c t i o n P e r f o r m e d C A c t i o n E v
e n t e v )
;
}
p r i v a t e v o i d b o r r a r Da t o s C l {
---------------11
c a mp o C a n t i d a d . s e t T e x t C O. O ) ;
}
} O y e n t e C a m b i o
c l a s s O y e n t e B o t o n C o n m u t a d o r i mp l e me n t
s C h a n g eL i s t e n e r {
p u b l i c v o i d s t a t e C h an ge dC C h a n g e E v e n t e
v en t o ) {
J T og g l e Bu t t o n b o t o n = C J T o g g l e B u t t o n ) e
v e n t o . g e t S o u r c e C ) ;
i f C b o t o n . i s S e l e c t e d C ) ) {
b o t o n . s e t T e x t C P e s e t a s a E u r o s ) ;
c a mb i o E f e c t i v o =
1/
} e l s e (
b o t o n . s e t T e x t C E u r o s a P e s e t a s
) ;
}
} O y e n t e B o t o n C o n mu t a d o r
p u b l i c s t a t i c v o i d ma i n C S t r i n g [ ] a r g s )
(
J F r a me v e n t a n a = n ew J F r a me C C a l c u l a d o r a
c mb i o mo n e d a ) ;
---- •
S e cre a u n b otón qu e a de más
de un te xto tie ne u n icono.
S e a ña de u n o ye nte a nónimo que invoca
a l m é todo privado de bo rrado de datos .
Mé to do p riva do de la cla se qu e p erm ite
mejorar la e st ru ct ur ac ión de cód igo.
S e p ro te ge la le ctu ra de datos pa ra
e vita r qu e u n e rr or e n e l fo rm ato
numérico provo qu e la terminación
a nóma la de la e jecución .
Se crea una ventana emergente
con el mensa je de e rror y u n
icono que m uestra dicho error.
• --
Programación en Java 2
v e n t a n a . a d d C c a l c u l a d o r a ) ;
v e n t a n a . s e t D e f a u l t C l o s e Op e r a t i o n C J
F r a me . E X I T _ ON _ C L O S E ) ;
v e n t a n a . s e t S i z e C 4 0 0 . 1 3 0 ) ;
}
} C a c u a d o r a E u r o H e j o r a d a
Comentario: La imagen gráfica cross. gif es 'la que se incluye en
las distribuciones estándar de JDK de
lava. Norma mente se puede encontrar en la ruta de mo/ ap p1e ts/ T
icTacToe/im ages a partir del directorio de
instalación del JDK.
En este caso se ha modificado el oyente del botón conmutador a un
oyente de cambios. Su comportamiento
es similar y también es un evento semántico o de alto nivel.
Cuando se crea el cuadro de diálogo emergente como primer argumento
se debe proporcionar el compo-
nente gráfico, normalmente una ventana, del que depende dicho
cuadro emergente. Como el oyente es una
clase interna al panel se podría haber tratado de utilizar th i s
pero en ese caso representa la instancia del
oyente, que no es un componente gráfico, y por tanto hay que usar
la expresión Ca1 cu 1 a doraEuroM ejorada . th is
mediante la cual se accede a la instancia actual de la clase conte
edora del oyente. Tambi n podría haberse
utilizado nu11 como argumento, pero en este aso no se tiene
referencia sobre dónde posicionar el cuadro de
diálogo emergente.
Cantidad a convertir 1 3 4 I ResuHado 15657,12
.
---_ . . . . . . . .• - - -_ .~-
I Eurosa Pesetas 1 1 ~ 1 1 )( Ilorrar 1
Solo se pueden introducir digitos y el punto decimal
Figura 10.8. Captura de la ventana de la aplicación que ya
incorpora el botón Borrar con el incono de la cruz roja
y donde en el texto de los botones aparecen subrayadas las letras
elegidas como mnemónicos, en el botón
de selección del tipo de cambio se sigue subrayando la primera
letra e incluso cuando se cambia de etiqueta.
En la segunda captura se muestra el cuadro de diálogo emergente
donde se indica que se ha producido un error
en el formato numérico.
Ejercicio 10.9:
Escriba una aplicación gráfica que cree un tablero de tamaño de
ocho por ocho con cuadros blancos y negros
similar al utilizado en el juego d las damas o del ajedrez. La
aplicación debe detectar la pulsación sobre el
tablero e informar sobre el color del cuadro pulsado.
Planteamiento: En este caso se h ace que la clase especia lice a un
panel J pane 1) en el que se incluy e un array
de bo tones que rep resentarán los cuad ros . Para que todos lo s
cuadros teng an el m ism o tam año se elige que su
tam año p referido sea cuad rado , m ed an te se tP re ferredSi
zeO. Para rep resentar lo s cuadros neg ros se e stable-
ce su colo r de fondo a d icho colo r se tBackground C olo
r.BLACK»). P or d efe cto, e l gestor de disposi ci ón o
adminis trador de diseño , e n in glés Layou tManage r, del panel
es el F lowLayou t que organiza los com ponent es
en filas según el orden en el que se han añadido al panel. C omo in
teresa organizar los cu adros en form a de
tablero se camb ia el gestor de disposic ión p or defecto p r el
gesto r G ri dLay ou t fi 1 as, co 1 umnas ) que organiza
lo s com ponentes en u na m atriz de tam año dado por las filas y
la s c olu m nas.
E n el p rog ram a principal se constru y e y se fijan las
características de la v en tana p rincip al de l a apl
icación
a la q e se añade un obje to de la clase que especializa el p
anel.
S e c re a u n o y en te d e a cc io ne s y se
l e p a s a e l p a n e l c omo a r gumen to .
Solución:
public class T ab ler o ex tends JP anel
p ublic T ableroC in t tam año)
JBut ton[ ][ ] botones:
botones = ne w JBut ton[ tamaño][ tama ño ]:
Oyen t eAcc iones oy en te = n ew Oyen teAc c io n e sC this):
-----. 1
fo r C int i = O : i< botone s.le ng th : i+ +)
fo r C in t j = O : j<bo to nes [ i] .leng th : j++){
botones[ i] [ j]= n ew JB ut to nC ):
botones[ i ] [ j ].setPreferredSize C new O im ensionC 50.
50»:
if CCCi +j + 1) 2 ) == O) L I F ' = - - = - - = - - =
- - = - - = - - = - - = - - = - - = = i I
botones [ i ] [ j] . se tBackground CC o1or . BLACK) S e c re an lo
s b o to ne s y s e e st ab le ce s u
}
ad dC botones[ i ] [ j ] ):
}
se tLayoutC new G ridL ay ou tC t amaño. tam año»:
---------11
Se e s ta b le c e e l g e s to r d e d i sp o s ic ión
G r i d L ay ou t p a ra e l p a n e l.
class OyenteAccione s implements A ct ionListener{
pr iva te JPanel panel:
p ub lic O y en te A cc io ne sC JPanel panel){
this .p an el = panel:
}
p ub lic v oid a ctio nP erfo rm ed CActionEven t ev ento){
JBu tton bo ton = C JBut ton)evento .getSource ) :
-------11
String color = bl anco :
colo r = n eg ro :
J O p t i o nP a ne . s howMe ss ag eO i a l o g Cp an e 1 .
-------11S e mu e st ra u n c u a d ro d e d iá lo g
oinformat iv o .
Se h a pu lsado un cu adro de color + color.
C ua dr o pu lsad o .
JOpt ionPan e. INFORMATION_MESSAGE ): ------. 1
Se ob ti en e e l c o lo r d el bo tón pulsado. 1 1
E l i c on oqu e s e u t il iz a ráe n el cuadro
}
r>>
Pro gram ac ió n e n J a v a
p u b l i c s t a t i c v o i d ma i n C S t r i n g [ ] a r g s )
{
=
n ew J F r a me C T a b 1 e r o ) ;
T a b l e r o t a b l e r o = n e w T ab l e r o ( 8 ) ;
v e n t a n a . a d d C t a b l e r o ) ;
v e n t a n a . p a c k C ) ;
v e n t a n a . s e t V i s i b l e C t r u e ) ;
Comentario: El oyente de acciones tiene un constructor
parametrizado que recibe como parámetro el panel en
el que está incluido el botón al que se escucha.
En e cálculo del tamaño de la ventana mediante p a c k ( ) se tiene
en cuenta el tamaño preferido de cada uno
de los componentes que contiene
Si hubiera interesado además del color cuáles son las coordenadas
del cuadro pulsado se podría haber
creado una clase que especializara un J B u t t o n y tuviera dos
atributos privados c o o r d e n a d a X y c o o r d e n a d a Y
.
Figura 10.9. Captura de la ventana de la aplicación con el tablero
inicial y con el cuadro informativo que emerge
después de haber pulsado un cuadro de color negro.
Figura 10.10. Si no se hubiera asignado expresamente el gestor de
disposición por defecto en un panel, es el