Interfases Graficas v4-1 Java Swing3.pdf

JosFredyJaramillo 4 views 65 slides Sep 21, 2025
Slide 1
Slide 1 of 65
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65

About This Presentation

Diseño de Interfases gráficas de Usuario con Java Swing/AWT


Slide Content

4.1: 4.1:
Interfacesde Interfacesde
usuario usuario
4.1:
 
4.1:
 Interfaces
 de
 
Interfaces
 de
 usuario usuario
g
ráficas 
g
ráficas enenJava: Swin
g
/AWT Java: Swin
g
/AWT
gg
gg
A. Goñi, J. Ibáñez, José Freddy Jaramillo
OCW
2013

Índice Índice Índice Índice

Introducción Introducción

Introducción Introducción

Objetivos Objetivos
 
Jerarquiadeclases:patróndediseñoCOMPOSITE Jerarquiadeclases:patróndediseñoCOMPOSITE
 
Jerarquia
de

clases:
patrón

de

diseño

COMPOSITE

Jerarquia
de

clases:
patrón

de

diseño

COMPOSITE

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

n mo
d
erno o
f
rece
C
ua
lqu
ier
lengua
je
d
e programac

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

ContenedoresAWT/Swing ContenedoresAWT/Swing Contenedores
AWT/Swing Contenedores AWT/Swing
import javax swing *; import javax swing *; import

javax
.
swing
.
*; import

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

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); }}}

GestoresdeDiseño:Layout GestoresdeDiseño:Layout Gestores

de
Diseño:
Layout Gestores

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());

GestoresdeDiseño:Layout GestoresdeDiseño:Layout Gestores

de
Diseño:
Layout Gestores

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

jPanel1
jPanel2
jPanel4
jPanel2

jPanel1
jPanel2
jPanel4

jPanel1
jPanel2
jPanel4

jPanel1
jPanel2
jPanel4

jPanel1
jPanel2
jPanel4

GestoresdeDiseño:Layout GestoresdeDiseño:Layout Gestores

de
Diseño:
Layout Gestores

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

GestoresdeDiseño:Layout GestoresdeDiseño:Layout Gestores

de
Diseño:
Layout Gestores

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

c
il
d
e
h
acer con
h
erram
ien
t
as v
isua
les.

c
il
d
e
h
acer con
h
erram
ien
t
as v
isua
les.
43

GestoresdeDiseño:Layout GestoresdeDiseño:Layout Gestores

de
Diseño:
Layout Gestores

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

cambiar
su

posición
(no
se
ajustan
al

mantienen
sin

cambiar
su

posición
(no
se
ajustan
al

tamaño disponible). tamaño disponible).
Ampliar Reducir
44

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

s
icos
d
e
la
inter
f
az
d
e
R
e
lac
iona
d
os con aspectos

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