Componentes principales Componentes principales
Contenedores AWT
/
Swin
g
Contenedores AWT
/
Swin
g
/g /g
Componentes AWT/Swing Componentes AWT/Swing
Gestoresdediseño Gestoresdediseño Gestores
de
diseño Gestores
de
diseño
Gestión de eventos Gestión de eventos
Clases Listener Clases Listener
Clases Adapter Clases Adapter
Separación interfaz y lógica de negocio Separación interfaz y lógica de negocio
5
Introducción Introducción Introducción Introducción
Clil jd ió d f Clil jd ió d f
C
ua
lqu
ier
lengua
je
d
e programac
ió
n mo
d
erno o
f
rece
C
ua
lqu
ier
lengua
je
d
e programac
ió
n mo
d
erno o
f
rece
herramientas herramientaspara la contrucción de interfaces para la contrucción de interfaces
áfi d i (GUI) áfi d i (GUI)
gr
áfi
cas
d
e usuar
io
(GUI)
. gr
áfi
cas
d
e usuar
io
(GUI)
.
Java permite al programador: Java permite al programador:
El diseño
y
p
ro
g
ramación de interfaces
g
ráficas de usuario El diseño
y
p
ro
g
ramación de interfaces
g
ráficas de usuario
yp g g yp g g
de forma rápida y sencilla. de forma rápida y sencilla.
El paquete de clases AWT (Abstract Window Toolkit) El paquete de clases AWT (Abstract Window Toolkit)
El paquete de clases Swing El paquete de clases Swing
Swing es una evolución de AWT, ofreciendo más clases y una mayor Swing es una evolución de AWT, ofreciendo más clases y una mayor fl ibilid d fl ibilid d
6
fl
ex
ibilid
a
d
.
fl
ex
ibilid
a
d
.
Objetivos Objetivos Objetivos Objetivos
E t d ldi ñ d l j í d l E t d ldi ñ d l j í d l
E
n
t
en
d
er e
l di
se
ñ
o
d
e
la
jerarqu
ía
d
e c
lases
E
n
t
en
d
er e
l di
se
ñ
o
d
e
la
jerarqu
ía
d
e c
lases
Java que se utilizan para la construcción Java que se utilizan para la construcción
deGUIs. deGUIs. de
GUIs. de GUIs.
Entendercómoserealizalagestióndeeventos Entendercómoserealizalagestióndeeventos
Evento
Entender
cómo
se
realiza
la
gestión
de
eventos
.
Entender
cómo
se
realiza
la
gestión
de
eventos
.
A
p
render a usar un entorno de
p
ro
g
ramación
(
Ecli
p
se
, A
p
render a usar un entorno de
p
ro
g
ramación
(
Ecli
p
se
,
ppg(p, ppg(p,
JDeveloper...) para construir GUIs JDeveloper...) para construir GUIs
No es un objetivo: No es un objetivo:
-- conocer todos los nombres de clases, interfaces y demás conocer todos los nombres de clases, interfaces y demás
7
componentes gráficos componentes gráficos
AWT:componentesprincipales AWT:componentesprincipales AWT:
componentes
principales AWT:
componentes
principales
JídlAWT JídlAWT J
erarqu
ía
d
e c
lases
AWT
J
erarqu
ía
d
e c
lases
AWT
COMPONENTE COMPONENTE
CONTENEDOR (los contenedores
son componentes)
8
J
erarquía de clases AWT :
J
erarquía de clases AWT : óddiñCOMPOSITE óddiñCOMPOSITE
patr
ó
n
d
e
di
se
ñ
o
COMPOSITE
patr
ó
n
d
e
di
se
ñ
o
COMPOSITE
P i dfiiifii P i dfiiifii P
erm
iten
d
e
fi
n
ir
in
fi
n
itas
P
erm
iten
d
e
fi
n
ir
in
fi
n
itas
ventanas distintas: ventanas distintas:
- -Una ventana con 2 campos Una ventana con 2 campos
de texto, 3 botones y 2 áreas de texto, 3 botones y 2 áreas
detexto ademásdeunpanel detexto ademásdeunpanel de
texto
,
además
de
un
panel
de
texto
,
además
de
un
panel
que contiene 5 casillas de que contiene 5 casillas de
v
erificación
y
una lista
v
erificación
y
una lista
y y
desplegable. desplegable.
--Una ventana con 2 etiquetas, Una ventana con 2 etiquetas,
2 áreas de texto y un botón. 2 áreas de texto y un botón.
- -
... ...
9
J
erarquía de clases AWT :
J
erarquía de clases AWT :
patrón de diseño COMPOSITE patrón de diseño COMPOSITE
10
Jerarquía de clases AWT : Jerarquía de clases AWT :
di ñ l i i t í i t di ñ l i i t í i t
un
di
se
ñ
o como e
l
s
i
gu
i
en
t
e ser
í
a
i
ncorrec
t
o..
.
un
di
se
ñ
o como e
l
s
i
gu
i
en
t
e ser
í
a
i
ncorrec
t
o..
.
Button
C
h
ec
kB
o
x
* *
TextField
CheckBox
*
Frame
E F i í di d l é d ddB E F i í di d l é d ddB
*
...
E
n un
F
rame, neces
itar
íamos
di
sponer
d
e
los m
é
to
d
os a
ddB
utton,
E
n un
F
rame, neces
itar
íamos
di
sponer
d
e
los m
é
to
d
os a
ddB
utton,
addCheckBox, addTextField, addFrame,... . addCheckBox, addTextField, addFrame,... .
Además, el diagrama no está en absoluto completo, dado que Button puede Además, el diagrama no está en absoluto completo, dado que Button puede
ser un componente de Panel, o de Dialog, ... y el diseño anterior no lo ser un componente de Panel, o de Dialog, ... y el diseño anterior no lo
contempla. contempla.
Si se quisiera añadir un nuevo componente XXX, deberíamos cambiar la Si se quisiera añadir un nuevo componente XXX, deberíamos cambiar la
11
clase Frame y añadir el método addXXX (esta solución no sería nada clase Frame y añadir el método addXXX (esta solución no sería nada
extensible) extensible)
J
erarquía de clases AWT:
J
erarquía de clases AWT: óddiñCOMPOSITE óddiñCOMPOSITE
patr
ó
n
d
e
di
se
ñ
o
COMPOSITE
patr
ó
n
d
e
di
se
ñ
o
COMPOSITE
Componente
Comp.Concreto1
CompConcretoN
Contenedor
Contenedo
r
ContConcreto1
ContConcreto2
Un Un contenedor contenedor está formado
p
or está formado
p
or
add (Componente c)
--El método add
p p
componentes componentes, siendo éstos , siendo éstos
componentes concretos o componentes concretos o
contenedores. A su vez
, estos contenedores. A su vez, estos
--añade un componente
--al contenedor
12
,,
contenedores podrían tener distintos contenedores podrían tener distintos
componentes, etc. componentes, etc.
Swing: componentes principales Swing: componentes principales
13
¿
Dónde estudiar el API
J
ava?
¿
Dónde estudiar el API
J
ava?
¿J¿J
14
AWT/Swing:contenedores AWT/Swing:contenedores AWT/Swing:
contenedores AWT/Swing: contenedores
el principal
•
Frame/JFrame
Contenedores Contenedores
el
principal
•
Frame/JFrame
•Panel/JPanel
•Dialo
g
/JDialo
g
Clases Frame/JFrame Clases Frame/JFrame
Una simple ventana que ofrece iconos para maximizar, minimizar y Una simple ventana que ofrece iconos para maximizar, minimizar y
gg
cerrarla. Se le puede añadir un título. cerrarla. Se le puede añadir un título.
Único contenedor al que se le pueden añadir menús. Único contenedor al que se le pueden añadir menús.
ClasesPanel/JPanel ClasesPanel/JPanel
Clases
Panel/JPanel Clases Panel/JPanel
Contenedores genéricos para agrupar componentes. Contenedores genéricos para agrupar componentes.
Clase utilizada
p
ara meter contenedores dentro de otros Clase utilizada
p
ara meter contenedores dentro de otros
p p
contenedores (dentro de un panel, subpaneles) contenedores (dentro de un panel, subpaneles)
En Swing, dentro de la clase JFrame se añade automáticamente un En Swing, dentro de la clase JFrame se añade automáticamente un Panel Panel
. En AWT no. . En AWT no.
15
javax
.
swing
.
*;
public class Marco extends JFrame { public class Marco extends JFrame {
private JPanel jContentPane = ... private JPanel jContentPane = ...
public Marco() { public Marco() {
super(“Ejemplo de ventana con panel"); super(“Ejemplo de ventana con panel");
initialize(); initialize();
}}
private void initialize() { private void initialize() {
this.setSize(300, 200); this.setSize(300, 200);
this.setContentPane(getJContentPane()); this.setContentPane(getJContentPane());
Dentro de la clase JFrame se añade un
} } p
ublic static void main(Strin
g
[] ar
g
s){
p
ublic static void main(Strin
g
[] ar
g
s){
Dentro
de
la
clase
JFrame
se
añade
un
Panel automáticamente
pggpgg
M
arco thisClass = new Marco();
M
arco thisClass = new Marco();
......
thisClass setVisible(true); thisClass setVisible(true);
16
thisClass
.
setVisible(true); thisClass
.
setVisible(true);
} }
}}
Componentes principales Componentes principales
AWT/Swing AWT/Swing
Clases TextField/JTextField Clases TextField/JTextField
Cam
p
o de entrada de texto de una sóla línea. Cam
p
o de entrada de texto de una sóla línea.
p p
ClasesTextArea/JTextArea ClasesTextArea/JTextArea Clases
TextArea/JTextArea
Clases
TextArea/JTextArea
Permiten introducir líneas de texto múltiples Permiten introducir líneas de texto múltiples
Sepuedeusartambiénparamostrarresultados(texto) Sepuedeusartambiénparamostrarresultados(texto)
Se
puede
usar
también
para
mostrar
resultados
(texto) Se
puede
usar
también
para
mostrar
resultados
(texto)
La clase JTextArea no implementa un scroll automático. La clase JTextArea no implementa un scroll automático. EsnecesarioañadirlodentrodeunJScrollPane. EsnecesarioañadirlodentrodeunJScrollPane. Es
necesario
añadirlo
dentro
de
un
JScrollPane.
Es
necesario
añadirlo
dentro
de
un
JScrollPane.
TextArea, sin embargo, sí lo implementa. TextArea, sin embargo, sí lo implementa.
17
JLabelpara JLabel
para
mostrar
if ió JTextFieldy i
n
f
ormac
ió
n
JTextField
y
JTextArea: para
entrada de texto
Componentes principales de Componentes principales de
AWT/Swing AWT/Swing
Cl B /JB Cl B /JB Cl
ases
B
utton
/JB
utton
Cl
ases
B
utton
/JB
utton
Se usa para construir Botones. Se usa para construir Botones.
Al pulsar un botón se generará un evento, que Al pulsar un botón se generará un evento, que
habrá
q
ue tratar. habrá
q
ue tratar.
q q
Cl L b l/JL b l Cl L b l/JL b l Cl
ases
L
a
b
e
l/JL
a
b
e
l
Cl
ases
L
a
b
e
l/JL
a
b
e
l
Utilizado para mostrar información. Utilizado para mostrar información.
Se usan junto a los cuadros de texto. Se usan junto a los cuadros de texto.
19
Se usan JButton
p
ara e
j
ecutar
JFrame
pj alguna acción
Componentes principales Componentes principales
AWT/Swing AWT/Swing
Cl Ch kB /JCh kB /JR di B Cl Ch kB /JCh kB /JR di B Cl
ases
Ch
ec
kB
ox
/JCh
ec
kB
ox
/JR
a
di
o
B
utton
Cl
ases
Ch
ec
kB
ox
/JCh
ec
kB
ox
/JR
a
di
o
B
utton
Casillas de verificación. Ofrecen funcionalidad para Casillas de verificación. Ofrecen funcionalidad para activar y activar y desactivar desactivar
opciones. opciones.
Los componentes JRadioButton los agruparemos en un Los componentes JRadioButton los agruparemos en un ButtonGroup ButtonGroup
paraconseguirseleccionaruna(ysólouna) paraconseguirseleccionaruna(ysólouna)
ButtonGroup ButtonGroup
para
conseguir
seleccionar
una
(y
sólo
una)
para
conseguir
seleccionar
una
(y
sólo
una)
opción del grupo. ButtonGroup no es un componente visual. opción del grupo. ButtonGroup no es un componente visual.
21
JCheckBox /
JR di B tt JR
a
di
o
B
u
tt
on
para activar
opciones
Btt G B
u
tt
on
G
roup
para escoger sólo
una
A
WT/Swing: componentes
A
WT/Swing: componentes
iiliil
pr
i
nc
i
pa
l
es pr
i
nc
i
pa
l
es
ClasesList/JList ClasesList/JList Clases
List/JList
Clases
List/JList
Por medio de las listas desplegables, mostraremos Por medio de las listas desplegables, mostraremos al usuario un grupo de opciones. A menudo se al usuario un grupo de opciones. A menudo se
usan para evitar la saturación de información en usan para evitar la saturación de información en
pantalla. pantalla.
JList no dispone de scroll por defecto. JList no dispone de scroll por defecto.
Para ello, Para ello,
se debe añadir a un JScrollPane. se debe añadir a un JScrollPane.
23
Pero sólo si se hace antes de que se muestre el JFrame
b.elementos.addElement(“C++”);
aquíno funcionaría aquí
no
funcionaría
Con vector no funciona si la lista es “dinámica”
Porejemplo javax Swingofrecelaclase Por
ejemplo
,
javax
.Swing
ofrece
la
clase
DefaultListModel, que proporciona los
mismos métodos que Vector
Para listas “dinámicas” usar un ListModel
Listas con Scroll:
ñ di JLit
a
ñ
a
di
r un
JLi
s
t
a
un JScrollPane
A
WT/Swing: componentes
A
WT/Swing: componentes
iiliil
pr
i
nc
i
pa
l
es pr
i
nc
i
pa
l
es
Cl Ch i /JC b B Cl Ch i /JC b B
Cl
ases
Ch
o
i
ce
/JC
om
b
o
B
ox
Cl
ases
Ch
o
i
ce
/JC
om
b
o
B
ox
Son listas (desplegables) de opciones. Son listas (desplegables) de opciones.
Las ventajas de esto: las listas de opciones no Las ventajas de esto: las listas de opciones no
ocu
p
an demasiado es
p
acio en
p
antalla. ocu
p
an demasiado es
p
acio en
p
antalla.
ppp ppp
27
Listas desplegables, para
escogerunaopción escoger
una
opción
A
WT/Swing: componentes
A
WT/Swing: componentes
iiliil
pr
i
nc
i
pa
l
es pr
i
nc
i
pa
l
es
Creación de Menús Creación de Menús
EnSwing EnSwing
En
Swing En Swing
El único contenedor que puede alojar una barra de menú es El único contenedor que puede alojar una barra de menú es
JFrame JFrame..
La clase JMenuBa
r
La clase JMenuBa
r
crea la barra de menú donde se insertarán crea la barra de menú donde se insertarán
las opciones de dicho menú. las opciones de dicho menú.
La clase JMenu La clase JMenu
es la encargada de crear los menús Estos es la encargada de crear los menús Estos
La
clase
JMenu La
clase
JMenu
es
la
encargada
de
crear
los
menús
.
Estos
es
la
encargada
de
crear
los
menús
.
Estos
menús tienen un nombre asociado y muestran una lista menús tienen un nombre asociado y muestran una lista
desplegable con varios elementos. desplegable con varios elementos.
Ll d úd bj Ll d úd bj
JI JI
L
os e
lementos
d
e un men
ú
pue
d
en ser o
bj
etos
L
os e
lementos
d
e un men
ú
pue
d
en ser o
bj
etos
J
menu
I
tem
J
menu
I
temu u
objetos objetos JMenu JMenu (para crear menús en cascada) (para crear menús en cascada)
29
Menús en Swing Menús en Swing
JMenu JMenu
JMenu
JM B JM
enu
B
ar
JMenuItem
JMenuItem
JMenuItem
A
WT/Swing: componentes
A
WT/Swing: componentes
iiliil
pr
i
nc
i
pa
l
es pr
i
nc
i
pa
l
es
Inserción de imágenes Inserción de imágenes
Meteremos la imagen en un JLabel Meteremos la imagen en un JLabel
public class FrameIrudiekin extends JFrame { public class FrameIrudiekin extends JFrame {
JButton jButton1 = new JButton(); JButton jButton1 = new JButton();
JButton jButton2 = new JButton(); JButton jButton2 = new JButton();
public FrameIrudiekin() { public FrameIrudiekin() {
this.getContentPane().setLayout(null); this.getContentPane().setLayout(null);
this.setSize(new Dimension(400
,
300)); this.setSize(new Dimension(400
,
300));
, ,
this.setTitle("Irudiak nola bistaratu"); this.setTitle("Irudiak nola bistaratu");
JLabel lb1 = new JLabel( JLabel lb1 = new JLabel(new ImageIcon(getClass().getResource("katua.jpg")) new ImageIcon(getClass().getResource("katua.jpg"))); );
this.getContentPane().add(lb1); this.getContentPane().add(lb1);
lb1.setSize(lb1.getPreferredSize()); lb1.setSize(lb1.getPreferredSize()); lb1.setSize(lb1.getPreferredSize()); lb1.setSize(lb1.getPreferredSize()); lb1.setLocation(20,20); lb1.setLocation(20,20);
JLabel lb2 = new JLabel( JLabel lb2 = new JLabel(new ImageIcon(getClass().getResource("armiarma.jpg")) new ImageIcon(getClass().getResource("armiarma.jpg"))); );
this.getContentPane().add(lb2); this.getContentPane().add(lb2);
lb2.setSize(lb2.getPreferredSize()); lb2.setSize(lb2.getPreferredSize());
lb2 setLocation(20 120); lb2 setLocation(20 120); lb2
.
setLocation(20
,
120);
lb2
.
setLocation(20
,
120);
jButton1.setText("Katua erosi"); jButton1.setText("Katua erosi");
jButton1.setBounds(new Rectangle(180, 40, 160, 30)); jButton1.setBounds(new Rectangle(180, 40, 160, 30));
this.getContentPane().add(jButton1, null); this.getContentPane().add(jButton1, null);
j2 (i i) j2 (i i)
32
j
Button
2
.setText
(
"Arm
i
arma eros
i
"
)
;
j
Button
2
.setText
(
"Arm
i
arma eros
i
"
)
;
jButton2.setBounds(new Rectangle(180, 140, 160, 30)); jButton2.setBounds(new Rectangle(180, 140, 160, 30));
this.getContentPane().add(jButton2, null); this.getContentPane().add(jButton2, null);
}}
A
WT/Swing: componentes
A
WT/Swing: componentes
iiliil
pr
i
nc
i
pa
l
es pr
i
nc
i
pa
l
es
Creación dinámica de componentes Creación dinámica de componentes
import java awt *; import java awt *;
int N=7 int N=7
import
java
.
awt
.
*; import
java
.
awt
.
*;
import javax.swing.*; import javax.swing.*;
public class public class CestaCompra CestaCompra
extends JFrame { extends JFrame {
int N=5; int N=5; int
N=5; int
N=5;
JButton[] botones= new JButton[N]; JButton[] botones= new JButton[N];
JTextField[] cajasTexto = new JTextField[N]; JTextField[] cajasTexto = new JTextField[N];
public CestaCompra(){ public CestaCompra(){ public
CestaCompra(){ public
CestaCompra(){
for (int i=0; i<N; ++i){ for (int i=0; i<N; ++i){
botones[i] = new JButton(); botones[i] = new JButton();
ca
j
asTexto
[
i
]
= new
J
TextField
();
ca
j
asTexto
[
i
]
= new
J
TextField
();
j [ ] J (); j [ ] J ();
this.getContentPane().setLayout(null); this.getContentPane().setLayout(null);
this.setSize(new Dimension(200, N*50)); this.setSize(new Dimension(200, N*50));
this.setTitle
(
"Ver cesta"
)
; this.setTitle
(
"Ver cesta"
)
;
() ()
for (int i=0; i<N; ++i){ for (int i=0; i<N; ++i){
botones[i].setBounds(new Rectangle(20, 20+i*40, 80, 30)); botones[i].setBounds(new Rectangle(20, 20+i*40, 80, 30));
botones[i].setText("Botón: "+i); botones[i].setText("Botón: "+i);
33
this.getContentPane().add(botones[i], null); this.getContentPane().add(botones[i], null);
cajasTexto[i].setBounds(new Rectangle(110, 20+i*40, 40, 30)); cajasTexto[i].setBounds(new Rectangle(110, 20+i*40, 40, 30));
this.getContentPane().add(cajasTexto[i], null); }}} this.getContentPane().add(cajasTexto[i], null); }}}
de
Diseño:
Layout
S np r d finirdónd l r n mp n nt S np r d finirdónd l r n mp n nt
S
e usa
n
p
a
r
a
d
e
finir
dónd
e co
loca
r
u
n
co
mp
o
n
e
nt
e
S
e usa
n
p
a
r
a
d
e
finir
dónd
e co
loca
r
u
n
co
mp
o
n
e
nt
e
dentro de un contenedor. dentro de un contenedor.
contenedor.add(componente); contenedor.add(componente); contenedor.add(componente); contenedor.add(componente);
FlowLayout FlowLayout(Gestor predeterminado para Panel) (Gestor predeterminado para Panel)
Loscomponentessevanañadiendoaunalínea Alcompletar Loscomponentessevanañadiendoaunalínea Alcompletar
Los
componentes
se
van
añadiendo
a
una
línea
.
Al
completar
Los
componentes
se
van
añadiendo
a
una
línea
.
Al
completar
la línea, se pasa a la siguiente. la línea, se pasa a la siguiente.
BorderLa
y
out BorderLa
y
out
(
Gestor
p
redeterminado
p
ara Frame
y
(
Gestor
p
redeterminado
p
ara Frame
y
y y
(p p y (p p y
Dialog ) Dialog )
Los componentes se añaden en una de estas 5 zonas: norte, Los componentes se añaden en una de estas 5 zonas: norte, sur, este, oeste y centro. sur, este, oeste y centro.
Se puede cambiar el gestor predeterminado: Se puede cambiar el gestor predeterminado:
34
contenedor.setLayout(new BorderLayout()); contenedor.setLayout(new BorderLayout());
de
Diseño:
Layout
Sisequiereponerelcomponenteenunas Sisequiereponerelcomponenteenunas
Si
se
quiere
poner
el
componente
en
unas
Si
se
quiere
poner
el
componente
en
unas
coordenadas concretas coordenadas concretas
, se debe , se debe eliminar eliminar
el gestor de el gestor de
diseño diseño diseño
.
diseño
.
contenedor setLayout(null); contenedor setLayout(null); contenedor
.
setLayout(null); contenedor
.
setLayout(null);
Sean Sean
this this
un contenedor y un contenedor y
textField1 textField1
uno de sus uno de sus
componentes: componentes:
setLayout(null); setLayout(null); t
extField1.setBounds
(
15
,
20
,
50
,
60
)
;
t
extField1.setBounds
(
15
,
20
,
50
,
60
)
;
35
(,,,) (,,,)
x y ancho alto x y ancho alto
Panel
BdL
Label enBorderLayoutNORTH
con
B
or
d
er
L
ayout
en
BorderLayout
.
NORTH
PanelconGridLayout(43)situadoenBorderLayoutCENTER
Panel con FlowLayout situado en BorderLayout.SOUTH
Panel
con
GridLayout(4
,
3)
situado
en
BorderLayout
.
CENTER
de
Diseño:
Layout
VjddfiiGUI d VjddfiiGUI d
V
enta
jas
d
e
d
e
fi
n
ir un
GUI
con gestor
d
e
V
enta
jas
d
e
d
e
fi
n
ir un
GUI
con gestor
d
e
diseño: diseño:
los componentes se redibujan automáticamente al los componentes se redibujan automáticamente al
a
justar el tamaño de la ventana
(
a
justándose al a
justar el tamaño de la ventana
(
a
justándose al
j(j j(j
tamaño disponible). tamaño disponible).
42
de
Diseño:
Layout
Singestordediseñohayqueproporcionarlas Singestordediseñohayqueproporcionarlas Sin
gestor
de
diseño
hay
que
proporcionar
las
Sin
gestor
de
diseño
hay
que
proporcionar
las
coordenadas de todos los componentes coordenadas de todos los componentes
fá ild h h i t i l fá ild h h i t i l
fá
c
il
d
e
h
acer con
h
erram
ien
t
as v
isua
les.
fá
c
il
d
e
h
acer con
h
erram
ien
t
as v
isua
les.
43
de
Diseño:
Layout
Desventa
jas de no usar un
g
estor de diseño: Desventa
jas de no usar un
g
estor de diseño:
jg jg
Al redimensionar el Frame, los componentes se Al redimensionar el Frame, los componentes se mantienensincambiarsuposición(noseajustanal mantienensincambiarsuposición(noseajustanal mantienen
sin
Otros contenedores Otros contenedores
Clases Dialog/JDialog Clases Dialog/JDialog
Ventana que permite leer datos del usuario Ventana que permite leer datos del usuario
Puede asignársele la característica de ser MODAL, para no permitir Puede asignársele la característica de ser MODAL, para no permitir cambiar a otra ventana mientras esté activa. cambiar a otra ventana mientras esté activa.
Clase FileDialog (Sólo en AWT) Clase FileDialog (Sólo en AWT)
Ventana que permite abrir/guardar ficheros (modos Ventana que permite abrir/guardar ficheros (modos
FileDialog.LOAD y FileDialog.SAVE) FileDialog.LOAD y FileDialog.SAVE)
Se utiliza la misma ventana de diálogo del Sistema Operativo en el Se utiliza la misma ventana de diálogo del Sistema Operativo en el
que se está ejecutando la máquina virtual Java que se está ejecutando la máquina virtual Java
Ofrece ya cierta funcionalidad. No hay que reprogramar el caso en Ofrece ya cierta funcionalidad. No hay que reprogramar el caso en
el que se intenta sobreescribir un fichero (muestra ventana de el que se intenta sobreescribir un fichero (muestra ventana de
alerta) alerta) alerta) alerta)
En Swing es JFileChooser En Swing es JFileChooser
Ventana MODAL: hasta quenosecierrenopuede que
no
se
cierre
no
puede
cambiarse de ventana
modal a true
JFileChooser JFileChooser
GestióndeEventos GestióndeEventos Gestión
de
Eventos Gestión
de
Eventos
Aldiseñarunainterfazgráficadebemostenerencuentaquea Aldiseñarunainterfazgráficadebemostenerencuentaquea
Al
diseñar
una
interfaz
gráfica
debemos
tener
en
cuenta
que
a
Al
diseñar
una
interfaz
gráfica
debemos
tener
en
cuenta
que
a
consecuencia de las acciones del usuario se generarán consecuencia de las acciones del usuario se generarán
distintos distintos eventos eventos..
Se deben programar Se deben programar métodos métodos para responder a estos para responder a estos
eventos eventosprovocados por el usuario. provocados por el usuario.
Un evento: Un evento:
esgenerado por una acción del usuario esgenerado por una acción del usuario
es
generado
por
una
acción
del
usuario
.
es
generado
por
una
acción
del
usuario
.
está ligado a un componente del GUI. está ligado a un componente del GUI.
Ejemplos: Ejemplos:
pulsar una tecla, mover el ratón, cambiar el tamaño de una ventana, pulsar una tecla, mover el ratón, cambiar el tamaño de una ventana,
cerrarla, minimizarla, pulsar un botón, perder u obtener el foco de un cerrarla, minimizarla, pulsar un botón, perder u obtener el foco de un
componente, cambiar el valor de un campo de texto, elegir una opción componente, cambiar el valor de un campo de texto, elegir una opción
de menú de menú
48
de
menú
...
de
menú
...
Gestión de Eventos
import
javax.swing.
*
;
Gestión de Eventos
import
javax.swing. ;
public classGUISimple extendsJFrame { JB tton
btton
JB
u
tton
b
u
tton
;
public voidejecuta(){
button= newJButton
(
“Pulsa"
)
;
(
)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane
().
add(button);
setSize(300,300);
tVi ibl (
t
)
se
tVi
s
ibl
e
(
t
rue
)
;
}
p
ublic static voidmain
(
Strin
g[]
ar
g
s
){
Queremos saber cuándo el
p
(g[]g){
SimpleGUI frame = newGUISimple();
frame.setTitle(“Gestión de Eventos");
frame.ejecuta();
}
Queremos
saber
cuándo
el
usuario pulsa el botón. Al
pulsarlo, se generará un evento
}
}
Gestión de Eventos
Si queremos hacer algo cuando se pulse el botón:
Gestión de Eventos
1) deberemos programar un método, para responder al evento que se genera.
2) tendremos que saber cuándose genera el evento.
50
Los eventos SON OB
J
ETOS Los eventos SON OB
J
ETOS
JJ
Eventos de bajo nivel Eventos de bajo nivel
Rl i d fíi dli f d Rl i d fíi dli f d
R
e
lac
iona
d
os con aspectos
fí
s
icos
d
e
la
inter
f
az
d
e
R
e
lac
iona
d
os con aspectos
fí
s
icos
d
e
la
inter
f
az
d
e
usuario. Ejemplos: pulsación de teclas, movimientos de usuario. Ejemplos: pulsación de teclas, movimientos de
óh lik /d lf óh lik /d lf
rat
ó
n,
h
acer c
li
c
k
, ganar
/
per
d
er e
l f
oco en un rat
ó
n,
h
acer c
li
c
k
, ganar
/
per
d
er e
l f
oco en un
componente, abrir/cerrar ventana.. componente, abrir/cerrar ventana..
Eventos de alto nivel o semánticos Eventos de alto nivel o semánticos
Tienenqueverconlasemánticadeloscomponentes. Tienenqueverconlasemánticadeloscomponentes.
Tienen
que
ver
con
la
semántica
de
los
componentes.
Tienen
que
ver
con
la
semántica
de
los
componentes.
Ejemplos: pulsar un botón, cambiar el texto de un campo, Ejemplos: pulsar un botón, cambiar el texto de un campo,
seleccionarunitemenunmenú/lista/choice seleccionarunitemenunmenú/lista/choice seleccionar
un
item
en
un
menú/lista/choice seleccionar
un
item
en
un
menú/lista/choice
Generalmente combinaciones de eventos de bajo nivel. Generalmente combinaciones de eventos de bajo nivel.
MEJOR TRATAR EVENTOS SEMÁNTICOS
(Por ejemplo:definir actionPerformed)
Interfaces Listener Interfaces Listener
Pa
r
aPa
r
a
gest
io
n
a
r
gest
io
n
a
r
eve
n
tos, eve
n
tos,
Java Java
Paa Paa
gesto a gesto a
eve tos, eve tos,
Java Java
proporciona proporciona unasunas interfaces interfaces “oyentes” “oyentes” (Listeners), (Listeners), donde donde cadacada una una
de de
ellas ellas
contiene contiene
métodos métodos
que que
una una
de de
ellas ellas
contiene contiene
métodos métodos
que que
hay hayquequeimplementar implementar..
La La implementación implementación proporcionada proporcionada para para cada cada método método eses lala respuesta respuesta apropiada apropiada
a a
cada cada
evento evento
apropiada apropiada
a a
cada cada
evento evento
..
ob
j
1.addXXXListener
(
ob
j
2
)
;
j(j)
obj1
contieneunareferenciaaun
obj1
contiene
una
referencia
a
un
OBJETO GRÁFICO (botón,
ventana, lista des
p
le
g
able,
obj2contiene una referencia a un
objeto de una clase que implementa
elinterfaceXXXListener
pg
checkbox, etc) sobre el que se quiere definir un
i EVENTOS
el
interface
XXXListener
.
public interface XXXListener {
....
comportam
i
ento ante
EVENTOS
void accionYYY (AWTEvent e);
}
El objeto oyente ejecutará el métodocorrespondienteala
En tiempo de
e
j
ecución sucede
Se crea un objeto
evento
(AWTEvent)
método
correspondiente
a
la
acción (Ej.:
accionYYY
)
usando el objeto Evento
j
un EVENTO
que afecta al
evento
(AWTEvent)
y se pasa el control al objeto oyente
generado como parámetro
objeto de obj1
(el de obj2)
Tras pulsar elbotón el
botón
OyenteBoton es INNER CLASS (clase definida dentro de otra).
Por eso se puede acceder a los atributos jPanel1, jButton1,…
1) Hacer click derecho en el componente
2) Seleccionar el Evento (
actionPerformed
)
() y hacer click
3) Escribir el código donde
indica Eclipse
JDeveloper genera las clases Oyente como
INNER CLASS sin nombre
Tras pulsar elbotón
Qé ?
el
botón
¿
Q
u
é
es esto
?
Definición de una clase
SIN NOMBRE que
il lif i
mp
l
ementa e
l
i
nter
f
ace
ActionListener
button1.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) { public
void
actionPerformed(ActionEvent
e)
{
button1_actionPerformed(e);
}
}
);
ESTE CÓDIGO SEGENERADE
}
);
SE
GENERA
DE
MANERA
AUTOMÁTICA
LA ACCIÓN HAY QUE PROGRAMARLA
,
CLARO
void button1_actionPerformed(ActionEvent e) {
,
textArea1.setText("Opción: "+checkboxGroup1.getCurrent().getLabel());
}
Se puede usar un único método para tratar los eventos de los dos JRadioButton. El texto se puede
obtener del ob
j
eto EVENTO (ActionEvent e)
j
Para obtener información de contexto del evento(comolaetiquetadelcomponente evento
(como
la
etiqueta
del
componente
gráfico sobre el que se ha producido el evento)
Inicialmente… Cuando entra el ratón en el botón
Punto donde se encuentraelratón
Alh “d ”d d lb ó
Al li l ó d lb ó
encuentra
el
ratón
Al
h
acer
“d
rag
”
d
entro
d
e
l
b
ot
ó
n
Al
sa
li
r e
l
rat
ó
n
d
e
l
b
ot
ó
n
ES POSIBLE DEFINIR
A
CCIONES PARA EVENTOS DE
BAJONIVEL BAJO
NIVEL
jTextField1
Cada vez que se escribe un
carácter en la caja de texto, se
ñd lá dt t b
a
ñ
a
d
e a
l
á
rea
d
e
t
ex
t
o y se
b
orra
de la caja de texto. Cada 25
caracteressesaltadelíneaenel
j
T
e
x
t
Ar
ea
1
caracteres
se
salta
de
línea
en
el
área de texto.
jet ea
Separación entre Nivel de Separación entre Nivel de PresentaciónyLógicadel PresentaciónyLógicadel Presentación
y
Lógica
del
Presentación
y
Lógica
del
Ne
g
ocio Ne
g
ocio
g g
Es conveniente separar el nivel de presentación del de la lógica Es conveniente separar el nivel de presentación del de la lógica
del negocio del negocio
Elniveldepresentaciónestáformadoporlasclasesde Elniveldepresentaciónestáformadoporlasclasesde
El
nivel
de
presentación
está
formado
por
las
clases
de
El
nivel
de
presentación
está
formado
por
las
clases
de
AWT/Swing AWT/Swing
La llamada al nivel ló
g
ica del ne
g
ocio se realizará en al
g
ún La llamada al nivel ló
g
ica del ne
g
ocio se realizará en al
g
ún
gg g gg g
método de respuesta a un evento. método de respuesta a un evento.
Se puede incluir un atributo que contenga el objeto con la lógica Se puede incluir un atributo que contenga el objeto con la lógica d l i (DETIPOi f JAVA) d l i (DETIPOi f JAVA) d
e
l negoc
io
(DE
TIPO
inter
f
ace
JAVA) d
e
l negoc
io
(DE
TIPO
inter
f
ace
JAVA)
Podría conseguirse cambiar la lógica del negocio SIN NECESIDAD DE Podría conseguirse cambiar la lógica del negocio SIN NECESIDAD DE
cambiar el nivel de presentación. Incluso sin RECOMPILAR, e incluso cambiar el nivel de presentación. Incluso sin RECOMPILAR, e incluso
Ó Ó
haciéndolo EN TIEMPO DE EJECUCI
Ó
N (sin relanzar el objeto de haciéndolo EN TIEMPO DE EJECUCI
Ó
N (sin relanzar el objeto de
presentación) presentación)
63
Separación entre Nivel de PresentaciónyLógicadelNegocio
Itf L i N i
Presentación
y
Lógica
del
Negocio
I
n
t
er
f
ace
L
og
i
ca
N
egoc
i
o
hacerX
(
…
)
Clase Presentacion logNe:LogicaNegocio
()
hacerY(… )
usa
logNe:
LogicaNegocio
En alguno de los métodos de la clase
setLogicaNegocio
Presentación (los que responden a eventos)
se usará:
(l: LogicaNegocio)
logNe.hacerX(…)
o bien
64
logNe.hacerY(…)
Interface LogicaNegocio h()h
acerX
(
…
)
hacerY(…)
usa
Clase Presentacion logNe:LogicaNegocio
usa
logNe:
LogicaNegocio
clase LogicaNegocioConcreta
setLogicaNegocio
hacerX(… ) // Implementada
hacerY(… ) // Implementada
(l: LogicaNegocio)
P ti P ti()
PARA CREAR LA INTERFAZ GRÁFICA CON SU LÓGICA DEL NEGOCIO:
65
P
resen
t
ac
i
on p = new
P
resen
t
ac
i
on
()
;
p.setLogicaNegocio(new LogicaNegocioConcreta());
p.setVisible(true);
Clase Presentacion
Interface LogicaNegocio
usa
logNe: LogicaNegocio
hacerX(… )
hacerY(… )
usa
LiN i
set
L
og
i
ca
N
egoc
i
o
(l: LogicaNegocio)
clase LogicaNegocioNueva hacerX(… ) // Implementada hacerY(… ) // Implementada
Si ahora se quisiera cambiar la lógica del negocio, bastaría con h
ace
r
:
p.set
L
og
i
ca
N
egoc
i
o(
n
e
w L
og
i
ca
N
egoc
i
o
N
ue
v
a());
ace :
p.set og ca egoc o( e og ca egoc o ue a());
NO HACE FALTA RECOMPILAR LA CLASE Presentacion,
66
y, si se conoce la referencia del objeto, SE PUEDE CAMBIAR LA LÓGICA DEL NEGOCIO EN TIEMPO DE EJECUCIÓN
67
Sólofaltaproporcionar Sólo
falta
proporcionar
la clase que implemente G Bill G
estor
Bill
etes…
(con o sin nombre)
68