Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tema 5
Interfaces Gr
aficas de Usuario
Departament dInform`
atica. Universitat de Val`encia
Indice
1. Programaci
on dirigida por eventos 4
2. AWT 9
3. Swing 23
juan.gutierrez@uv.es Pagina: 1
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Ventana
Campo de texto
a na
Etiquetas ent
v
Barra de desplazamiento
de la
n
texto se
nto
e Botones de
lem
se seleccin
e lo
d
n
ic i
pos
D is
rea de texto
Botn
Muchas veces el exito de una aplicaci on depende de su interfaz (de poco sirve que una
aplicacion funcione bien si el usuario encuentra que es muy complicada la interfaz)
juan.gutierrez@uv.es Pagina: 2
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Se deberan tener en cuenta los conocimientos del usuario, sus capacidades y sus requisitos.
Pensad en toda la tecnologa que queda cuidadosamente oculta tras los botones y vnculos que hay tras un navegador
de Internet. Cuanta gente utilizara Internet si tuviese que conocer los protocolos?
Comunicacion visual
Los elementos visuales como iconos est an bien y pueden facilitar la comunicaci
on del usuario con la aplicaci
on pero...
ojo los smbolos pueden tener diferentes interpretaciones en funcion de cultura o regi
on geogr
afica.
En la interface de ejemplo los componentes est an agrupados en categoras esto puede facilitar su utilizaci
on. Por
ejemplo si hay que seleccionar un item de una lista para realizar una consulta a una base de datos y mostrar los datos
en una tabla lo razonable sera poner esa lista al principio y no al final de la ventana.
Ingeniera de uso.
En este tema vamos a ver algunos aspectos de JFC (Java Foundation Classes). JFC es un
conjunto de componentes para trabajo con interfaces gr
aficas de usuario en Java.
Contiene:
Abstract Window Toolkit (AWT)
Java 2D
1
El ordenador invisible. Donald A. Norman. Paid
os.
juan.gutierrez@uv.es Pagina: 3
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Swing
APIs que extienden AWT para proporcionar una biblioteca de componentes para el dise
no de interfaces gr
aficas de
usuario enteramente realizadas en Java.
Accesibilidad
APIs para permitir que las aplicaciones sean accesibles a las personas con discapacidades.
Internacionalizacion
Todas estas APIs incluyen soporte para crear aplicaciones que puedan ser utilizadas independientemente de la loca-
lizaci
on del usuario.
1. Programaci
on dirigida por eventos
Ejemplos:
juan.gutierrez@uv.es Pagina: 4
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Lanza un evento
Lanza un evento del tipo del tipo
MousePressed WindowClosing
La forma en la que hay que actuar es: realiza un metodo que indique que es lo que se
debe realizar cuando se produzca un determinado evento asumiendo que cuando este
evento se produzca el metodo que se ha realizado ser
a llamado.
Puesto que A es un evento (o suceso) y estos metodos especifican lo que hay que realizar
cuando ocurra, estos metodos se conocen como manipuladores (handler) de eventos.
juan.gutierrez@uv.es Pagina: 5
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
juan.gutierrez@uv.es Pagina: 6
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
El productor del evento no necesita conocer que acciones se van a realizar cuando
genere un evento.
Es decir, no hay que definir (mediante una serie de clases) ni crear explcitamente una
cola eventos para realizar una interfaz gr
afica de usuario.
La cola de eventos sirve como intermediario entre el objeto que produce el evento y el
objeto que lo debe manipular. Gr
aficamente:
Cola de eventos
Evento Manipulador
La cola de eventos sirve de almacen de eventos de tal forma que cuando se produce una
acci
on sobre un objeto que puede ser considerada como un evento es almacenada en la cola
de eventos.
Adem as de servir como almacen, la cola de eventos tiene un active instruction-follower
2 que extrae un evento (t
picamente el que m as tiempo lleva en la cola) y notifica a los
manipuladores interesados en el evento.
La parte encargada de extraer el evento y notificar a los interesados se conoce como
despachador de eventos (event dispatcher).
Puesto que hasta que no se finalice con el tratamiento de un evento evento no se
procesara el siguiente (debido a la ejecuci
on secuencial no solapada), es importante
que el manipulador finalice rapidamente.
2
Ejecucion secuencial no solapada. Significa se extrae un evento de la cola y hasta que no se procese no se pasar
a al
siguiente. Es un funcionamiento similar una receta.
juan.gutierrez@uv.es Pagina: 7
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
1. S
olo es posible despachar un evento cada vez
2. Si el evento A se encola antes que el B entonces A ser
a despachado antes que B.
Gr
aficamente:
Evento 1
Cola de eventos
Evento 2
Despacho de eventos
Evento 3
La cola de eventos es un lugar donde el productor (o fuente) del evento puede depositar la
informacion de que a ocurrido un evento.
Un despachador de eventos comprueba la cola y determina a quien debe llamar.
Si el productor y el manipulador son dos objetos diferentes, se necesita un mecanismo
mediante el cual se asocie el evento (y los objetos en los que ocurren) con aquellos
objetos interesados en tratar esos eventos.
A estos objetos interesados se les conoce como auditores u oyentes (listeners).
A un sistema en el cual un objeto escucha eventos que ocurren en otro objeto (un
componente de la GUI) se le denomina delegaci on de eventos..
Java resuelve el problema de a quien notifico que se ha producido un evento? mediante
un registro de oyentes.
juan.gutierrez@uv.es Pagina: 8
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
En las dos secciones siguientes volveremos a tratar de forma especfica los eventos para
AWT y para Swing.
Se puede pensar en esto como si fuese una suscripci on a un servicio de informaci on va
correo electronico (por ejemplo para recibir informaci on sobre Java). Al realizar la suscrip-
ci
on se seleccionan una serie de temas en las que uno est a interesado. Esto sera equivalente
a registrar el interes en la cola de eventos. El servidor mantiene una lista de suscritos junto
con sus temas de interes. Estos son los oyentes registrados. Cuando entra un nuevo artculo,
es a
nadido a la lista de artculos a enviar (lo cual sera equivalente a poner el evento en
la cola de eventos). El servidor enviara a los suscritos (teniendo en cuenta sus temas de
interes) los artculos por orden de llegada (lo cual es equivalente a despachar los eventos a
los manipuladores).
Veremos que los componentes tienen metodos para registrar objetos interesados en tratar
los eventos que se producen en aquellos.
En las dos secciones siguientes volveremos a tratar de forma especfica los eventos para
AWT y para Swing.
2. AWT
juan.gutierrez@uv.es Pagina: 9
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
El tercer grupo son las clases de eventos: java.awt.AWTEvent y sus subclases en el paquete
java.awt.event.
Componentes
FileDialog
4
Contracci
on de Window y gadget. Una representaci on visible de un componente que puede ser manipulada por el
usuario. Botones, campos de texto y barras de desplazamiento son ejemplos de widgets
juan.gutierrez@uv.es Pagina: 10
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Contenedor
alto nivel
Frame
Applet PPP
PPP
} ... AA PPP
AA PPP
}}} AA PPP
} AA PPP
}} A PPP
}} PP
Contenedor Contenedor PPPP
Componentes
intermedio intermedio
... Button
Panel Panel
TextField
ScrollPane ScrollPane
...
... ...
Componentes Componentes
Button ... Button
TextField TextField
... ...
Ejemplo
Graphics
x
(0, 0)
(80, 20)
La clase Graphics tiene metodos del tipo drawLine, fillOval, drawArc, drawPoligon o setColor para
realizar dibujos.
juan.gutierrez@uv.es Pagina: 11
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
g . drawRect ( 2 2 0 , 1 2 0 , 1 0 , 1 0 ) ;
g . d r a w S t r i n g ( Cadena , 1 0 0 , 1 4 5 ) ;
y
Cadena
Una de las cosas que debe realizar un componente que se hace visible en una GUI es
pintarse.
Si un componente queda parcialmente cubierto por otra ventana y esta ventana es movida
de forma que deja al descubierto al componente, este debe mostrarse.
Java determina cuando deben mostrarse los componentes (introduciendo un evento de
pintado en la cola de eventos) y pide al componente que se pinte.
Todos los componentes tienen un metodo paint() que funciona dirigido por eventos. Este
metodo paint() no determina cuando se debe pintar el componente sino c
omo se debe pintar
cuando tenga que hacerlo.
El metodo paint() recibe un objeto del tipo Graphics. Este objeto contiene entre otras cosas,
el sistema de coordenadas dentro del cual se encuentra el componente.
Cada componente especifica en este metodo c
omo se muestra dentro de la GUI.
Si se desea cambiar la forma en la que aparecer a un componente en la pantalla lo que hay
que hacer es sobreescribir este metodo y utilizar el objeto Graphics que recibe para dibujar.
Una de las implicaciones que tiene el hecho de que el metodo paint() sea llamado en un
entorno dirigido por eventos es que no se debe llamar directamente a este metodo.
Entonces... que hay que hacer si quiero que un determinado componente se redibuje?
Este puede ser el caso en el que tiene un programa que muestra objetos en movimiento en
la pantalla, y se desea que estos objetos actualicen su movimiento cada cierto n
umero de
milisegundos.
Esto se puede conseguir realizando una llamada al metodo repaint() que est
a definido en
java.awt.Component y que por tanto heredan todos los componentes.
La llamada a este metodo pone en la cola de eventos un evento de petici
on de repintado.
En resumen:
juan.gutierrez@uv.es Pagina: 12
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Cuando deseemos que un componente se redibuje se enva un mensaje a repaint() que encola
un evento de redibujado.
Eventos
Como vimos en la primera secci
on, el modelo de delegaci
on de eventos se basa en que
los componentes disparan eventos que pueden ser tratados por auditores u oyentes.
Una vez que el escuchador ha sido a nadido al componente, cuando se produzca un even-
to, los metodos apropiados del manipulador (que han sido especificados en la interfaz)
seran llamados.
La clase EventObject del paquete java.util es la clase padre de todos los eventos.
Su constructor recibe una referencia al objeto que genera el evento.
Esta clase tiene dos metodos: getSource() que devuelve el objeto que gener
o el evento y
toString().
Los paquetes relacionados con los eventos en AWT son java.awt.event.
La clase abstracta AWTEvent definida en el paquete java.awt es una subclase de EventObject.
Es la superclase de todos los eventos basados en AWT utilizados por el modelo de delegacion
de eventos.
Hay dos clases de eventos:
Eventos de componente o de bajo nivel ocurren cuando ocurre algo especfico en un
componente. Por ejemplo al moverse, entrar o salir el rat
on sobre un componente, al
ganar o perder la atencion,...
Eventos sem anticos no son tan especficos como los anteriores y no son disparados
necesariamente por una acci
on at
omica tal y como una pulsacion del rat
on. Las acciones
que disparan estos eventos depende del objeto: por ejemplo en una lista se disparan
cuando sus elementos son pulsados dos veces, en un campo de texto se disparan cuando
se pulsa la tecla enter.
Los eventos de componente o de bajo nivel son:
ComponentEvent, ContainerEvent, FocusEvent, InputEvent, KeyEvent, MouseEvent, MouseWheelEvent
y WindowEvent
juan.gutierrez@uv.es Pagina: 13
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
juan.gutierrez@uv.es Pagina: 14
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
EventObject
O
<<abstract>>
l5 AWTEvent
; O aCC hQQQ
l l lll xxxx CC QQQ
ll l x CC QQQ
l x CC QQQ
lllll x xx CC QQQ
ll x CC QQQ
llll xx x
C QQQ
lll x C QQQ
lll xx CC QQQ
lll x x CC QQ
ll x
ActionEvent AdjustmentEvent ComponentEvent ItemEvent TextEvent
5 < O aCChPPP
l llllxxx C PP
CC PPP
l xx
lll CC PPP
l llll xxxx CC PPP
ll x CC PPP
l lll x x C PPP
ll xx C PPP
lllll xxx CC
C PPP
ll x C PPP
l lll xx CC PP
l x <<abstract>>
ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent
aCC
xx
<
x CC
xx CC
x CC
xxx CC
x CC
xxx CC
xx CC
xx CC
xx
KeyEvent MouseEvent
Pasar una instancia de esta clase al componente fuente de los eventos a tratar. Los
componentes definen metodos para registrar auditores seg
un el tipo de evento en el
que estan interesados.
Vamos a ver ahora algunas de las interfaces que se ofrecen en java.awt con el fin de
especificar los metodos que deben poseer los objetos oyentes o auditores para cada uno de
los eventos.
p u b l i c i n t e r f a c e ComponentListener e x t e n d s E v e n t L i s t e n e r
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo ComponentEvent.
El objeto de este tipo debe registrarse en un componente utilizando su metodo addCompo-
nentListener.
Los metodos que define esta interfaz son:
juan.gutierrez@uv.es Pagina: 15
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
AWT maneja estos eventos de forma que la GUI funciona correctamente cuando la ventana
se mueve o se modifica su tama
no.
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo ContainerEvent.
El objeto de este tipo debe registrarse en un componente utilizando su metodo addContai-
nerListener. Los m
etodos que define esta interfaz son:
AWT maneja estos eventos de forma que la GUI funciona correctamente cuando a un
contenedor se a
nade o retira un componente.
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo FocusEvent
El objeto de este tipo debe registrarse en un componente utilizando su metodo addFocus-
Listener. Los m
etodos que define esta interfaz son:
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo KeyEvent
El objeto de esta clase debe registrarse en un componente utilizando su metodo addKeyLis-
tener.
Los metodos que define esta interfaz son:
juan.gutierrez@uv.es Pagina: 16
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
v o i d k e y R e l e a s e d ( KeyEvent e )
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo MouseEvent
El objeto de este tipo debe registrarse en un componente utilizando su metodo addMouse-
Listener.
Los metodos que define esta interfaz son:
// Metodo l l a m a d o cuando s e p u l s a y l i b e r a un b o t o n d e l r a t o n
// s o b r e un componente
v o i d mou seClick ed ( MouseEvent e )
// Metodo l l a m a d o a l p u l s a r un b o t o n d e l r a t o n s o b r e un componente
v o i d mousePressed ( MouseEvent e )
// Metodo l l a m a d o a l l i b e r a r un b o t o n d e l r a t o n s o b r e un componente
v o i d mouseReleased ( MouseEvent e )
p u b l i c i n t e r f a c e WindowListener e x t e n d s E v e n t L i s t e n e r
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo WindowEvent
El objeto de este tipo debe registrarse en un componente utilizando su metodo addWindow-
Listener.
Los metodos que define esta interfaz son:
// Metodo l l a m a d o cuando s e a c t i v a l a v e n t a n a
v o i d windowActivated ( WindowEvent e )
// Metodo l l a m a d o cuando s e ha c e r r a d o l a v e n t a n a
v o i d windowClosed ( WindowEvent e )
// Metodo l l a m a d o cuando e l u s u a r i o c i e r r a l a v e n t a n a
v o i d windowClosing ( WindowEvent e )
// Metodo l l a m a d o cuando l a v e n t a n a d e j a de e s t a r a c t i v a
v o i d windowDeactivated ( WindowEvent e )
// Metodo l l a m a d o cuando s e i c o n i f i c a l a v e n t a n a
v o i d w i n d o w I c o n i f i e d ( WindowEvent e )
juan.gutierrez@uv.es Pagina: 17
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo ActionEvent
El objeto de este tipo debe registrarse en un componente utilizando su metodo addAction-
Listener.
Los metodos que define esta interfaz son:
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo TextEvent
El objeto de este tipo debe registrarse en un componente utilizando su metodo addTextLis-
tener.
Los metodos que define esta interfaz son:
// Metodo l l a m a d o cuando e l t e x t o ha s i d o m o d i f i c a d o
v o i d textValueChanged ( TextEvent e )
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos
del tipo ItemEvent
El objeto de este tipo debe registrarse en un componente utilizando su metodo addItemLis-
tener.
Los metodos que define esta interfaz son:
// Metodo l l a m a d o cuando e l t e x t o ha s i d o m o d i f i c a d o
v o i d itemStateChanged ( ItemEvent e )
Hay ocasiones en las que puede resultar incomodo trabajar con estas interfaces si uno
est
a interesado en implementar un u
nico metodo, ya que hay que escribir el resto de los
metodos dejandolos vacos.
Para algunas de estas interfaces se ofrecen clases que las implementan pero dejando vacos
todos los metodos.
De esta forma, puede resultar m
as c
omodo extender estas clases que implementar las
interfaces.
juan.gutierrez@uv.es Pagina: 18
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
<<interface>>
XXXListener
O
XXXAdapter
<<interface>>
WindowListener
O
WindowAdapter
El c
odigo de la derecha y el de la izquierda son equivalentes:
b . a d d M o u s e L i s t e n e r ( new Oyente ( ) ) ;
juan.gutierrez@uv.es Pagina: 19
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Cuando una clase oyente de eventos se va a utilizar en un punto muy especfico del c odigo
y no se va a reutilizar en otras partes (o en otras clases) existe la posibilidad de realizarla
mediante una clase an onima.
Una clase anonima (como cabe esperar) es aquella a la que no se asigna un nombre.
La creacion del objeto y la especificaci
on de la clase se realiza en el mismo momento, el
este caso en el argumento de un metodo.
Vamos a ver como se puede utilizar una clase an
onima con el ejemplo anterior:
b . a d d M o u s e L i s t e n e r ( new MouseAdapter ( ) {
p u b l i c v o i d mousePressed ( MouseEvent e ) {
System . out . p r i n t l n ( Boton p u l s a d o ) ;
}
}
Organizaci
on
AWT soporta diversos esquemas de organizaci on (layout) que pueden ser utilizados para
organizar los componentes dentro de los contenedores.
Los gestores de organizacion se encargan de reorganizar los componentes en caso de que el
usuario cambie el tamano de la ventana.
Los gestores de organizacion que ofrece Java son:
BorderLayout, FlowLayout, BoxLayout, CardLayout, GridLayout, GridBagLayout
El procedimiento es siempre el mismo, se crea un objeto de alguna de estas clases y se
le indica al contenedor que organice los componentes utilizando el objeto (para ello los
contenedores disponen del metodo setLayout(LayoutManager m).
BorderLayout se puede utilizar para colocar en un contenedor cinco componentes como
maximo ya que proporciona cinco posiciones donde colocar los componentes, estas son:
NORTH (arriba), SOUTH (abajo), WEST (izquierda), EAST (derecha) y CENTER (en
el centro).
import j a v a . awt . ;
c l a s s Ventana e x t e n d s Frame{
p u b l i c Ventana ( ) {
Button b1 = new Button ( A ) ;
Button b2 = new Button ( B ) ;
Button b3 = new Button ( C ) ;
Button b4 = new Button ( D ) ;
Button b5 = new Button ( E ) ;
s e t L a y o u t ( new B o r d e r L a y o u t ( ) ) ;
add ( b1 , B o r d e r L a y o u t .NORTH) ;
add ( b2 , B o r d e r L a y o u t .SOUTH) ;
add ( b3 , B o r d e r L a y o u t .WEST) ;
add ( b4 , B o r d e r L a y o u t . EAST) ;
add ( b5 , B o r d e r L a y o u t .CENTER) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ){
Ventana v = new Ventana ( ) ;
v . setSize (300 ,300) ;
v . show ( ) ;
}
}
juan.gutierrez@uv.es Pagina: 20
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
import j a v a . awt . ;
c l a s s Ventana e x t e n d s Frame{
p u b l i c Ventana ( ) {
Button b1 = new Button ( A ) ;
Button b2 = new Button ( B ) ;
Button b3 = new Button ( Boto n m
as l a r g o ) ;
Button b4 = new Button ( D ) ;
Button b5 = new Button ( E ) ;
s e t L a y o u t ( new FlowLayout ( ) ) ;
add ( b1 ) ;
add ( b2 ) ;
add ( b3 ) ;
add ( b4 ) ;
add ( b5 ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ){
Ventana v = new Ventana ( ) ;
v . setSize (300 ,300) ;
v . show ( ) ;
}
}
GridLayout: coloca los componentes del mismo tamano y los coloca en filas y columnas
en funci
on de los valores pasados al constructor.
import j a v a . awt . ;
c l a s s Ventana e x t e n d s Frame{
p u b l i c Ventana ( ) {
Button b1 = new Button ( A ) ;
Button b2 = new Button ( B ) ;
Button b3 = new Button ( C ) ;
Button b4 = new Button ( D ) ;
Button b5 = new Button ( E ) ;
s e t L a y o u t ( new G r i d L ay o u t ( 2 , 3 ) ) ;
add ( b1 ) ;
add ( b2 ) ;
add ( b3 ) ;
add ( b4 ) ;
add ( b5 ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ){
Ventana v = new Ventana ( ) ;
v . setSize (300 ,300) ;
v . show ( ) ;
}
}
i m p o r t j a v a . awt . e v e n t . ;
i m p o r t j a v a . awt . ;
p u b l i c c l a s s Ventana e x t e n d s Frame{
p r i v a t e CardLayout cardLayout ;
p r i v a t e Panel c a r d P a n e l ;
p r i v a t e Button b1 ;
p r i v a t e Button b2 ;
Ventana ( ) {
// El p a n e l que va a c o n t e n e r t r e s p a n e l e s
// o r g a n i z a d o s como CardLayout
juan.gutierrez@uv.es Pagina: 21
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
c a r d P a n e l = new Panel ( ) ;
// El primero de l o s paneles
Panel b o t o n e s P a n e l = new Panel ( ) ;
b o t o n e s P a n e l . add ( new Button ( Boton 1 ) ) ;
b o t o n e s P a n e l . add ( new Button ( Boton 2 ) ) ;
b o t o n e s P a n e l . add ( new Button ( Boton 3 ) ) ;
// El segundo de l o s p a n e l e s
Panel camposTextoPanel = new Panel ( ) ;
camposTextoPanel . add ( new T e x t F i e l d ( 1 0 ) ) ;
camposTextoPanel . add ( new T e x t F i e l d ( 1 0 ) ) ;
// El p a n e l que s e mostrara a l i n i c i o
Panel i n i c i o P a n e l = new Panel ( ) ;
i n i c i o P a n e l . s e t B a c k g r o u n d ( new C o l o r ( . 8 5 f , . 8 5 f , . 8 5 f ) ) ;
i n i c i o P a n e l . add ( new L a b e l ( Ejemplo de CardLayout ) ) ;
// A n adimos l o s t r e s p a n e l e s a s i g n a n d o l e s un nombre
c a r d P a n e l . add ( i n i c i o P a n e l , i n i c i a l ) ;
c a r d P a n e l . add ( b o t o n e s P a n e l , b o t o n e s ) ;
c a r d P a n e l . add ( camposTextoPanel , t e x t o ) ;
c o n t r o l P a n e l . add ( b1 ) ;
c o n t r o l P a n e l . add ( b2 ) ;
// O r g a n i z a c i o n en l a v e n t a n a
s e t L a y o u t ( new BorderLayout ( ) ) ;
add ( c o n t r o l P a n e l , BorderLayout .NORTH) ;
add ( c a r d P a n e l , BorderLayout .CENTER) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
Ventana v = new Ventana ( ) ;
v . setSize (300 ,300) ;
v . show ( ) ;
}
}
juan.gutierrez@uv.es Pagina: 22
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
3. Swing
3.1. Por qu
e Swing?
AWT utiliza objetos que son dependientes de la plataforma, una aplicaci on ejecutada
en Windows tendra una apariencia similar al resto de las aplicaciones y si se ejecuta
en Unix tendra una apariencia similar a una aplicaci
on XMotif.
El problema es que el conjunto de componentes debe ser com un a todas ellas (puesto
que se basa en codigo nativo, no se puede proporcionar un componente que no este en
alguno de los sistemas ya que se rompera la portabilidad).
Por ejemplo la clase Button de AWT debe tener un equivalente en el sistema de ventanas
local (por ello se les llama componentes heavyweight). Puesto que los componentes
equivalentes son especficos del sistema operativo el comportamiento y el aspecto visual
de estos no se poda modificar.
Las clases Swing soportan Pluggable Look and Feel (PLAF), que permite a los des-
arrolladores de GUIs elegir la apariencia y el comportamiento de los componentes.
Las clases Swing vienen con m as caractersticas y componentes que AWT, por lo que
la eleccion a la hora de realizar una GUI suele ser Swing.
1. La jerarqua de Swing
Swing, al igual que AWT, propone una jerarqua de contenedores de componentes. Cual-
quier aplicacion que utilice Swing debe tener un contenedor de alto nivel y uno o mas
contenedores intermedios y componentes at omicos.
Los contenedores de alto nivel m
as com
unmente utilizados son: JFrame, JApplet y JDialog.
Las ventanas son contenedores de otros componentes tales como barras de men
u, campos
de texto, botones, etc.
De hecho una ventana esta constituida por una serie de capas:
juan.gutierrez@uv.es Pagina: 23
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
JFrame
JRoot
JLayeredPane
Content pane
Glass pane
Para a
nadir componentes a la ventana, primero se debe obtener el contenedor content pane
y a continuacion a
nadir los componentes a este.
Los contenedores intermedios son aquellos que agrupan componentes at omicos, los com
unmen-
te utilizados son: JPanel, JScrollPane, JSplitPane, JTabbedPane y JToolBar.
Los componentes atomicos son componentes que implementan una tarea GUI bien definida,
Estos componentes son la parte utilizable de la GUI. Swing contiene una lista considerable
de componentes atomicos para implementar GUIs. Por citar algunos JButton, JTextField,
JList, JComboBox, JRadioButton, JCheckBox, JColorChooser, JFileChooser, ...
2. Gestores de organizaci
on
Los gestores de organizacion se utilizan para organizar los contenedores y los componentes
at
omicos dentro de los contenedores en los que est an incluidos.
Swing utiliza los gestores de organizaci
on definidos en AWT que en general son apropiados
y a
nade otros (como por ejemplo BoxLayout).
3. Manejo de eventos
4. Pintado
El mecanismo de pintado en Swing se maneja del mismo modo que en AWT: se comienza
por los componentes de mas alto nivel y se termina en los componentes at
omicos.
El pintado es mas eficiente ya que se emplea doble buffer de forma que el pintado de los
componentes se realiza fuera de la pantalla y a continuaci
on es enviado a la pantalla.
5. El patr
on Model-View-Controller
juan.gutierrez@uv.es Pagina: 24
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
El dise
no de los componentes Swing est
a basado en un patr
on de dise
no: el Model-View-
Controller.
La motivacion bajo este patron es la siguiente: no hacer que un u
nico objeto sea responsable
de el contenido, la apariencia y comportamiento.
Este patron de dise
no recomienda realizar 3 clases:
El model que se encarga del contenido o estado.
El patr
on especifica de forma precisa c
omo interaccionan estos objetos.
El model almacena el contenido y no tiene interfaz con el usuario.
El view muestra el contenido.
Pensemos en un campo de texto en el que hemos escrito la frase: En un lugar de la Mancha,
de cuyo nombre no.
El campo de texto puede tener un tamano (en cuanto al n
umero de caracteres que puede
mostrar) menor que la frase y en un momento dado puede mostrar lo siguiente:
juan.gutierrez@uv.es Pagina: 25
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
y simult
aneamente otro view mostrara los datos como una superficie:
El controller trata los eventos relacionados con el usuario tal como pulsaciones del raton o
pulsaciones de teclas.
Tiene que decidir si estos eventos se deben trasladar en cambios en el model o cambios en
el view.
Por ejemplo si el usuario modifica un dato de la tabla, el controller notifica al model y este
notifica el view para que se actualice.
Si por ejemplo ofrecemos la posibilidad de de que pulsando sobre la superficie se realice
un zoom y el usuario pulsa, el controller debe notificar al view pero esta operaci
on no ha
modificado los datos por lo que el model no interviene en ning un momento.
La ventaja de esta separacion es que se consigue mayor independencia entre el contenido
y la apariencia.
Un mismo model puede ser utilizado por diferentes view.
juan.gutierrez@uv.es Pagina: 26
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
Los modelos de tipo GUI no estaran relacionados con datos introducidos por el usuario.
Un ejemplo de este tipo de model sera el de un bot
on que contiene datos sobre el estado.
La siguiente tabla muestra los diferentes componentes Swing y su correspondiente model.
Todos los componentes Swing ofrecen metodos para obtener el modelo o para establecer
uno diferente.
Por ejemplo la clase JButton dispone de los metodos:
p u b l i c ButtonModel getModel ( )
p u b l i c v o i d s e t M o d e l ( ButtonModel model )
p u b l i c Document getDocument ( )
p u b l i c v o i d s e t M o d e l ( Document model )
juan.gutierrez@uv.es Pagina: 27
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
import j a v a x . swing . ;
import j a v a x . swing . e v e n t . ;
import j a v a . awt . ;
import j a v a . awt . e v e n t . ;
import j a v a x . swing . t e x t . ;
import j a v a x . swing . e v e n t . ;
c l a s s EjemploModel e x t e n d s JFrame{
private JTextArea j t a 1 ;
private JTextArea j t a 2 ;
private JTextArea j t a 3 ;
private JTextArea j t a 4 ;
private Document doc ;
EjemploModel ( ) {
C o n t a i n e r c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
j t a 1 = new JTextArea ( 1 0 , 2 0 ) ;
j t a 1 . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 8 ) ) ;
J S c r o l l P a n e j s p 1 = new J S c r o l l P a n e ( j t a 1 ) ;
j t a 2 = new JTextArea ( 1 0 , 2 0 ) ;
j t a 2 . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 8 ) ) ;
J S c r o l l P a n e j s p 2 = new J S c r o l l P a n e ( j t a 2 ) ;
j t a 2 . setDocument ( doc ) ; // A s i g n a c i o n d e l model
j t a 3 = new JTextArea ( 1 0 , 2 0 ) ;
j t a 3 . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 8 ) ) ;
J S c r o l l P a n e j s p 3 = new J S c r o l l P a n e ( j t a 3 ) ;
j t a 3 . setDocument ( doc ) ; // A s i g n a c i o n d e l model
j t a 4 = new JTextArea ( 1 0 , 2 0 ) ;
j t a 4 . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 8 ) ) ;
J S c r o l l P a n e j s p 4 = new J S c r o l l P a n e ( j t a 4 ) ;
j t a 4 . setDocument ( doc ) ; // A s i g n a c i o n d e l model
c . add ( j s p 1 ) ;
c . add ( j s p 2 ) ;
c . add ( j s p 3 ) ;
c . add ( j s p 4 ) ;
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
new EjemploModel ( ) ;
}
}
La siguiente tabla muestra los eventos, interfaces que deben implementar los auditores y
el modelo en que se producen.
juan.gutierrez@uv.es Pagina: 28
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
i m p o r t j a v a x . swing . ;
i m p o r t j a v a x . swing . e v e n t . ;
i m p o r t j a v a . awt . ;
p u b l i c c l a s s LnF e x t e n d s JFrame{
p r i v a t e i n t l n f =0;
p u b l i c LnF ( ) {
C o n t a i n e r c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
f o r ( i n t i = 0 ; i <i n f o . l e n g t h ; i ++)
System . out . p r i n t l n ( i n f o [ i ] ) ;
// A u d i t o r de e v e n t o s para e l ButtonModel
bm . a d d C h a n g e L i s t e n e r ( new C h a n g e L i s t e n e r ( ) {
p u b l i c v o i d s t a t e C h a n g e d ( ChangeEvent e ) {
try {
i f ( bm . i s P r e s s e d ( ) ) {
switch ( lnf ) {
case 0 :
UIManager . setLookAndFeel ( com . sun . j a v a . swing . p l a f . m o t i f .
MotifLookAndFeel ) ;
b . s e t T e x t ( MotifLookAndFeel ) ;
lnf = 1;
break ;
case 1 :
UIManager . setLookAndFeel ( com . sun . j a v a . swing . p l a f . windows .
WindowsLookAndFeel ) ;
b . s e t T e x t ( WindowsLookAndFeel ) ;
lnf = 2;
break ;
case 2 :
UIManager . setLookAndFeel ( j a v a x . swing . p l a f . metal .
MetalLookAndFeel ) ;
b . s e t T e x t ( MetalLookAndFeel ) ;
lnf = 0;
break ;
}
b . updateUI ( ) ;
juan.gutierrez@uv.es Pagina: 29
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
}
} c a t c h ( E x c e p t i o n ev ) {
System . out . p r i n t l n ( E r r o r cambiando e l L&F ) ;
}
}
}) ;
c . add ( b ) ;
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ){
new LnF ( ) ;
}
}
3.3. Un cat
alogo de contenedores y componentes Swing
JFrame
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
JPanel
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
J P a n e l p = new J P a n e l ( ) ;
p . add ( new J L a b e l ( Ejemplo de J P a n e l ) ) ;
c . add ( p ) ;
juan.gutierrez@uv.es Pagina: 30
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
ImageIcon
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
ImageIcon i i = new I m a g e I c o n ( t e l e m a t i c a . j p g ) ;
JTextField
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
J T e x t F i e l d campoTexto = new J T e x t F i e l d ( 2 0 ) ;
JTextArea
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
c . add ( new J L a b e l ( O b s e r v a c i o n e s ) ) ;
c . add ( a r e a ) ;
juan.gutierrez@uv.es Pagina: 31
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
JButton
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
ImageIcon i 1 = new I m a g e I c o n ( o j o 1 . j p g ) ;
ImageIcon i 2 = new I m a g e I c o n ( o j o 2 . j p g ) ;
c . add ( b1 ) ;
c . add ( b2 ) ;
JCheckBox
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
c . add ( cb ) ;
JRadioButton
juan.gutierrez@uv.es Pagina: 32
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
c . add ( r b ) ;
JComboBox
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
cb . addItem ( P i z a r r a ) ;
cb . addItem ( P a n t a l l a ) ;
cb . addItem ( P r o y e c t o r ) ;
c . add ( cb ) ;
JList
juan.gutierrez@uv.es Pagina: 33
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
c . add ( l i s t a ) ;
JTable
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
C o n t a i n e r cp = g e t C o n t e n t P a n e ( ) ;
cp . s e t L a y o u t ( new B o r d e r L a y o u t ( ) ) ;
// Nombres d e l a s c o l u m n a s
f i n a l S t r i n g [ ] nombreCol = { S e s i o n , P r a c t i c a , Aula } ;
// D a t o s
Object [ ] [ ] datos = {
{1 , I n t r o d u c c i o n . E c l i p s e , 9 } ,
{2 , C l a s e s y o b j e t o s , 9 } ,
{3 , Paquetes , 9 } ,
{4 , Herencia , 9 } ,
{5 , Concurrencia , 9 } ,
{ 6 , Entrada / S a l i d a , 9 } ,
{ 7 , GUI , 9 } ,
{8 , Applets , 9 } ,
{ 9 , Red 1 , 9 } ,
{ 10 , Red 2 , 9 } } ;
J T a b l e t a b l a = new J T a b l e ( d a t o s , nombreCol ) ;
JScrollPane j s p = new J S c r o l l P a n e ( t a b l a ) ; // , v e r , h o r ) ;
cp . add ( j s p , B o r d e r L a y o u t .CENTER) ;
juan.gutierrez@uv.es Pagina: 34
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
JTree
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p r i v a t e JTree a r b o l ;
p r i v a t e J T e x t F i e l d campo = new J T e x t F i e l d ( ) ;
p u b l i c Ventana ( ) {
Container c = getContentPane ( ) ;
c . s e t L a y o u t ( new B o r d e r L a y o u t ( ) ) ;
// C o n s t r u c c i o n del arbol
D e f a u l t M u t a b l e T r e e N o d e tema = n u l l ;
DefaultMutableTreeNode s e c c i o n = n u l l ;
s e c c i o n = new D e f a u l t M u t a b l e T r e e N o d e ( S e r i a l i z a c i o n ) ;
tema . add ( s e c c i o n ) ;
s e c c i o n = new D e f a u l t M u t a b l e T r e e N o d e ( AWT ) ;
tema . add ( s e c c i o n ) ;
s e c c i o n = new D e f a u l t M u t a b l e T r e e N o d e ( Swing ) ;
tema . add ( s e c c i o n ) ;
a r b o l = new JTree ( a s i g ) ;
juan.gutierrez@uv.es Pagina: 35
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
// O y e n t e d e e v e n t o s
a r b o l . a d d T r e e S e l e c t i o n L i s t e n e r ( new T r e e S e l e c t i o n L i s t e n e r ( ) {
p u b l i c v o i d v al u eC h an ge d ( T r e e S e l e c t i o n E v e n t e ) {
D e f a u l t M u t a b l e T r e e N o d e nodo = ( D e f a u l t M u t a b l e T r e e N o d e )
a r b o l . getLastSelectedPathComponent ( ) ;
if ( nodo == n u l l ) return ;
O b j e c t n o d e I n f o = nodo . g e t U s e r O b j e c t ( ) ;
i f ( nodo . i s L e a f ( ) )
campo . s e t T e x t ( n o d e I n f o . t o S t r i n g ( ) ) ;
}
}) ;
c . add ( a r b o l , B o r d e r L a y o u t .CENTER) ;
c . add ( campo , B o r d e r L a y o u t .SOUTH) ;
JMenu
import j a v a . awt . ;
import j a v a . awt . e v e n t . ;
import javax . swing . ;
c l a s s Ventana e x t e n d s JFrame{
p r i v a t e JMenuBar mb ;
p r i v a t e J T e x t F i e l d i n f o = new J T e x t F i e l d ( 2 0 ) ;
Ventana ( ) {
juan.gutierrez@uv.es Pagina: 36
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
mb = new JMenuBar ( ) ;
// A n
adimos menus
JMenu a r c h i v o = new JMenu ( A r c h i v o ) ;
// A n
adimos s u b m e n u s
// Le a s o c i a m o s un e s c u c h a d o r d e eventos ActionEvent
nuevo . a d d A c t i o n L i s t e n e r ( oyMenu ) ;
// Lo a n adimos
a r c h i v o . add ( nuevo ) ;
// Le a s o c i a m o s un e s c u c h a d o r d e eventos ActionEvent
a b r i r . a d d A c t i o n L i s t e n e r ( oyMenu ) ;
// Lo a n adimos
a r c h i v o . add ( a b r i r ) ;
// Le a s o c i a m o s un e s c u c h a d o r d e eventos ActionEvent
v e r . a d d A c t i o n L i s t e n e r ( oyMenu ) ;
// Lo a n adimos
a r c h i v o . add ( v e r ) ;
// Creamos e l menu E d i t a r
JMenu e d i t a r = new JMenu ( E d i t a r ) ;
// A n
adimos s u b m e n u s
// Le a s o c i a m o s un e s c u c h a d o r d e e v e n t o s ActionEvent
c o p i a r . a d d A c t i o n L i s t e n e r ( oyMenu ) ;
// Lo a n adimos
e d i t a r . add ( c o p i a r ) ;
// Le a s o c i a m o s un e s c u c h a d o r d e eventos de r a t o n
p e g a r . a d d A c t i o n L i s t e n e r ( oyMenu ) ;
// Lo a n adimos
e d i t a r . add ( p e g a r ) ;
// Lo a n adimos
e d i t a r . add ( c o r t a r ) ;
// A n adimos e d i t a r a l a b a r r a d e menu
mb . add ( e d i t a r ) ;
// Creamos un menu
JMenu ayuda = new JMenu ( Ayuda ) ;
// A n
adimos s u b m e n u s
// Lo a nadimos
ayuda . add ( a b o u t ) ;
// A n adimos a y u d a a l a b a r r a d e menu
mb . add ( ayuda ) ;
setJMenuBar (mb) ;
juan.gutierrez@uv.es Pagina: 37
Interfaces Gr
aficas de Usuario LP (Telematica)
Curso 04/05 Universitat de Val`encia
juan.gutierrez@uv.es Pagina: 38