java 333-348 ejercicios interf

16
 Interfaces gráficas de usuario con Swing ----~ Problemas resueltos . I NTERFACES G RÁFICAS D E USUA RIO Ejercicio 1 1: Esc riba una ap licac ión con interfa: gráfica en la que se construya una ventana co n tít ulo y mar co que tenga los controles básicos  iconizar; maximizar; cerrar y que al pulsar sobr e el aspa de la ventana  cerrar se salga completamente de la ap li cació n. La ventana co ntendrá un a etiqueta y el usuario debe poder cambiar su tamañ o . Planteamiento: a) Como hay que cr e ar una ventana con marco lo mas adec u ado e s crear una clase que e x tienda o e specialice la clase J F rame . Esta clase ya tiene marco y los controle s sicos. b) S6 10 hay que configur a r el comport a miento del control d e cierre ( el aspa) d e la ventana. Para hacerla simplemente se fija la propieda d corre s pondiente m edia nte l a instrucción setDefaul t Cl oseOperati on C JF rame . E XIT_ON_ C LO S E ) . e) Hay que cre ar una etiqueta de tipo J L a be l y añadirla a la ventana. d) Se configura n el r esto de propiedades de la ventana, como son su título, que se pueda modificar su tamaño, que su tamaño inicial se ajuste a l tam año preferido de los componentes que contiene y qu e sea visible. Solución: import j a v a x. s wi n s . *; . ., .  ; ------ -- - -- -------- [ S e i mportanlos elementosgráf i co s .] 1 Sete r m i n a l aap l icaci ón a l pulsa r elbotónencruzde l s i stema. public c l a s s E jemploJFra m e C errable extends JFrame public Ej e mploJFrameCerrableC ){ setDefaultCloseOperat i o n C J F r a m e . EXIT _ O N _ CLOSE l;  _ .... . JLa be l e t i qu e ta = new JLa b e l ( V en ta n a r edim e n si o n ab l e y c errab le ) ; a dd C e t i q ue t a ) ; s e tTit l e C P ru e b a J F ra m e ) ; s e tResiza b l e C tr u e ); pa ck O ; s e tV i s i b le C tr u e ); S e cr ea u n o b jetodeltip o venta n a quese hadefinido . public st a tic void ma i n C String ar g s []) { I EjemploJFr a m eCerrable ventana = n e w E jemploJFrame Cerrable O ;  - - - J }  Ejemp oJ Fr ameCerrab e .-.• _ _ . __ __ _ , 0- . ~_ _• . . . _. _ j Prueba JFrame L;]~~ Ve ntana redimensionable y cerrable Figura 1 1 Captu ra de l a ventana gener a da inici almente y una vez redimen siona da por el u suario.

Upload: holger-chamba

Post on 07-Oct-2015

36 views

Category:

Documents


0 download

TRANSCRIPT

----~
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