Clase 19-04-24 - 2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
vale, pues nada
00:00:00
pues la primera parte, o sea, ya tenemos
00:00:02
hecho el marco, pero claro
00:00:04
Anis, un compañero
00:00:05
silencio
00:00:08
bueno, entonces, ahora
00:00:09
nuestra aplicación
00:00:11
de partida, es una aplicación en la que
00:00:16
le metes un año y te dice si es bisiesto, ya está
00:00:18
la tengo aquí en mi
00:00:20
reloj, meto el año y me dice, ah, pues era bisiesto
00:00:21
pues yo que sé, porque me están preguntando todo el rato
00:00:24
y así lo contesto rápido
00:00:26
bueno, pues entonces, la primera parte
00:00:27
que nos planteamos es, venga, pues vamos a
00:00:30
decidir el diseño. ¿Qué componentes
00:00:32
necesito?
00:00:34
El contenedor raíz ya lo tenemos.
00:00:36
Que es este. Ya tenemos el
00:00:38
contenedor raíz. Pero hay que
00:00:40
decidir qué componentes queremos que estén.
00:00:42
Bueno, pues entonces
00:00:45
lo ideal sería que hubiera
00:00:46
una etiqueta que pusiera
00:00:47
introduzca el año.
00:00:50
Un área de texto
00:00:53
para meter
00:00:54
yo el año.
00:00:56
Y luego un botoncito, pues para
00:00:57
ver si es bisiesto, por ejemplo
00:01:00
eso sería la idea, luego tres componentes
00:01:01
me han salido, tres componentes
00:01:04
una etiqueta
00:01:06
para mostrar simplemente un mensajito
00:01:07
para mostrar un área de texto
00:01:09
para introducir
00:01:12
y un botoncito
00:01:13
para calcular si es bisiesto
00:01:16
tres, vale
00:01:18
pues ahora se trata de que yo averigüe
00:01:19
esos componentes como se llaman en swing
00:01:21
y los incorpore
00:01:23
a este marco básico
00:01:26
vale, pues
00:01:27
¿en qué momento, en qué punto del programa
00:01:29
que yo he hecho aquí se incorporan?
00:01:31
Bueno, pues este frame mío
00:01:32
aparece, se instancia
00:01:34
en el código, aquí, cuando yo llamo
00:01:38
al constructor.
00:01:39
Ahí es donde se instancia.
00:01:41
Luego, en el constructor
00:01:43
es donde yo tendré que pegarle las cosas.
00:01:45
¿No?
00:01:49
Cuando este objeto aparece y se construye
00:01:49
es cuando se llama al constructor,
00:01:52
obviamente. Entonces yo aquí
00:01:54
no he hecho ningún constructor, luego está usando
00:01:55
el constructor por defecto, que no hace nada
00:01:57
salvo
00:01:59
llamar al de super, porque el constructor
00:02:01
por defecto, si yo no lo indico
00:02:04
llama al de super
00:02:05
y el super por defecto del frame, ¿qué hará?
00:02:06
pues el super por defecto del frame
00:02:09
hace esto
00:02:11
construir esto
00:02:12
entonces mi constructor por defecto ahora mismo
00:02:14
está haciendo super
00:02:17
que es esto de aquí, nada más
00:02:18
entonces vamos a
00:02:21
sobrescribir ese constructor, vamos a
00:02:23
sobrescribirlo para que
00:02:25
añada las cosas que hacen falta
00:02:27
vale
00:02:29
pues entonces
00:02:31
sobreescribimos
00:02:32
el constructor, porque repito
00:02:35
a través
00:02:37
de él es como se construye
00:02:40
ese objeto, a través de él, y yo quiero
00:02:41
añadirle cosas
00:02:43
pues vamos a sobreescribir ese constructor
00:02:45
vale, pues entonces
00:02:47
tendría que seleccionar que componentes
00:02:59
son los que me interesan
00:03:01
y añadírselos a ese frame
00:03:02
bueno, pues
00:03:05
primero, ¿qué componentes son?
00:03:07
si uno busca, pues encuentra rápidamente
00:03:08
que son estos tres componentes
00:03:11
básicos
00:03:13
el JLabel que es la etiqueta para mostrar
00:03:13
texto
00:03:17
para mostrar un texto, para mostrar
00:03:17
imágenes, incluso lo que sea
00:03:20
para introducir datos
00:03:22
el área de texto para introducir datos
00:03:26
esa si uno se pone a buscar
00:03:28
en la documentación de Swin
00:03:30
pues ve rápidamente
00:03:32
que es el componente
00:03:34
JTextField
00:03:36
y de nuevo
00:03:37
si queremos un botoncito para decir
00:03:43
ahora, coge ahora el texto, calcula
00:03:46
lo que sea, calcula
00:03:48
pues rápidamente encontraríamos esto
00:03:49
entonces estos tres componentes son básicos
00:03:51
en cualquier interfaz gráfica
00:03:56
una etiqueta que muestra contenido
00:03:58
un área de texto para meter
00:04:00
un campo de texto para meter
00:04:02
texto y un botoncito, son básicos
00:04:04
entonces estos unos ya, pues los clientes lo saben de memoria
00:04:06
vale, pues ahora se trataría
00:04:08
de instanciarlos
00:04:10
y añadirlos a ese frame básico
00:04:11
añadirlos a ese frame
00:04:15
pero
00:04:16
lo siguiente que tenemos que entender
00:04:17
el frame básico
00:04:20
este de aquí, este frame básico
00:04:22
como veis de hecho aquí esto me aparece en gris
00:04:25
normalmente cuando
00:04:27
vosotros abrís una aplicación en Java
00:04:29
es muy raro que el fondo sea gris
00:04:31
o sea eso ya nos da indicaciones
00:04:33
de que el frame básico en realidad
00:04:35
es un contenedor raíz que no vale
00:04:36
directamente para ponerle componentes
00:04:38
hay que poner un contenedor intermedio
00:04:40
que es el que se llama panel
00:04:43
¿vale? entonces
00:04:44
tenemos el marco raíz básico
00:04:46
el frame, uno o más
00:04:49
paneles
00:04:51
que se pegan al frame y ahora ya
00:04:52
a los paneles van los componentes
00:04:55
¿vale? entonces
00:04:57
los componentes
00:04:59
recopilo
00:05:02
no se pegan directamente
00:05:05
al frame, no se añaden
00:05:07
sino que se añaden a
00:05:09
Una cosa que se llama paneles
00:05:19
Sino que se añaden a paneles
00:05:21
A paneles que están asociados a ese frame
00:05:23
¿Vale? Entonces
00:05:33
Pues
00:05:40
Uno diría, hombre, pues tendré que hacer
00:05:42
Un panel y asociarlo al frame
00:05:44
Vale, pues podemos hacer eso, un panel y asociarlo
00:05:45
Al frame, y ahora ya a ese panel
00:05:48
Pero cualquier frame
00:05:50
Viene ya con un panel por defecto
00:05:52
Si yo quiero usarlo
00:05:54
Que puedo activar, que puedo recoger
00:05:55
Que puedo coger, viene con un panel por defecto
00:05:58
Y ese panel por defecto se saca de aquí.
00:06:00
Es decir, el objeto panel sería este.
00:06:04
Asociados al frame.
00:06:08
A ese frame.
00:06:10
Vale.
00:06:11
Entonces, el objeto panel es el JPanel.
00:06:12
Ese es un panel, el JPanel.
00:06:15
Preguntaréis, que os vea ansiosos por preguntar mil cosas.
00:06:17
Y como todas las clases tienen una J delante.
00:06:20
No podría ser Label, TextField, Button, Panel.
00:06:24
Tiene más sentido.
00:06:26
Todas una J.
00:06:27
Claro, porque Swin en realidad es un paquete
00:06:28
desarrollado a partir de la versión antigua
00:06:30
de esta que se llamaba AWT
00:06:33
entonces, AWT
00:06:35
tenía sus componentes
00:06:37
Label, TextField, Button, Patatín
00:06:39
entonces cuando se incorporó ya Swim
00:06:41
que es la versión moderna
00:06:43
de AWT
00:06:45
para que no tuvieran el mismo nombre
00:06:46
porque no se podía desaparecer el otro
00:06:49
el otro tiene que seguir existiendo
00:06:51
porque si no las aplicaciones que estaban hechas para AWT
00:06:52
si quitamos de las máquinas virtuales
00:06:54
AWT, dejarían de funcionar
00:06:57
todas las aplicaciones de golpe
00:06:58
entonces AWT no se puede quitar de las máquinas
00:06:59
virtuales, AWT sigue
00:07:02
estando y sigue estando, label, textfield,
00:07:04
button, entonces las clases
00:07:06
del nuevo paquete que es JavaX
00:07:08
el antiguo era este
00:07:10
¿veis? este de aquí que sigue existiendo
00:07:11
este era el antiguo y aquí está
00:07:16
button, panel, todas
00:07:21
pues las clases del nuestro
00:07:23
del nuevo, para que se
00:07:25
distinguieran se les puso una J delante
00:07:28
y ya está, nada más, de ahí viene la J
00:07:29
¿vale?
00:07:31
vale, pues entonces el panel
00:07:32
podemos construir nosotros uno
00:07:36
pegarlo al frame
00:07:39
pero es que
00:07:40
hemos dicho que el frame ya tiene un panel
00:07:42
por defecto que yo puedo recoger
00:07:45
entonces mi frame
00:07:47
es este, es mi objeto this, ¿verdad?
00:07:49
ahora mismo recordad que
00:07:51
estamos en el constructor de la clase
00:07:53
ventanaVis y esto es mi frame
00:07:55
es mi frame particularizado, pues es this
00:07:56
pues this por heredar de
00:07:59
JFrame tiene un método
00:08:01
que se llama
00:08:03
getContentPanel
00:08:05
¿veis? habréis podido acceder a este método
00:08:09
getContentPanel
00:08:14
y este método
00:08:15
me devuelve el panel
00:08:17
que por defecto tiene asociado
00:08:19
un frame, puedo yo pasar
00:08:21
de ese panel, crearme otros paneles
00:08:23
y asociarlos al frame
00:08:25
o me puedo
00:08:27
quedar con el panel por defecto
00:08:30
que si lo recojo es un panel
00:08:32
que se extiende en todo el
00:08:33
tamaño del frame, todo el tamaño
00:08:36
porque yo puedo hacer paneles de diferentes tamaños
00:08:37
pues el panel por defecto se estira
00:08:39
a todo el
00:08:42
el tamaño del frame
00:08:43
vale, pues ahora ya tengo un panel
00:08:45
vale, lo que pasa es que
00:08:52
getContentPan este
00:08:56
te
00:08:58
te obliga a que
00:08:59
lo guardes en container que es un
00:09:02
sobre, una super clase de jPanel
00:09:04
vale
00:09:07
lo que pasa es que normalmente, ahora lo vamos
00:09:07
a abreviar para que veáis como se escribe normalmente
00:09:10
entonces, vale, bueno
00:09:12
pues entonces, a este panel
00:09:14
que es lo que me devuelve el get
00:09:15
content panel, que es el panel por defecto
00:09:18
a este ya sí se pueden
00:09:20
añadir componentes
00:09:22
entonces
00:09:23
¿y cómo se añaden componentes al panel?
00:09:25
bueno, aparte de añadir componentes, el panel
00:09:28
pues tiene métodos para
00:09:30
hacer
00:09:32
sí, he puesto la clase jPanel porque es una
00:09:33
subclase
00:09:39
de container
00:09:41
y es la clase que tienen los paneles
00:09:43
en general. Lo que pasa es que este método
00:09:45
es el paquete
00:09:47
de AWT.
00:09:51
Container, dices. Sí, porque
00:09:52
usan clases de varios, o sea, mezclan.
00:09:54
De hecho, los eventos se usan
00:09:56
las clases de AWT. Hay cosas
00:09:58
que no se han reescrito.
00:10:00
¿Vale? Entonces, getContentPanel
00:10:02
es un método que está
00:10:05
programado de tal manera
00:10:06
que te devuelve un objeto container
00:10:10
pero a lo mejor lo que nos importa es que es un objeto
00:10:12
panel y a este panel ya le podemos añadir cosas
00:10:16
no solo añadir cosas
00:10:19
podemos cambiarle el color, podemos hacer mil historias
00:10:22
a través de los métodos que tiene, cada clase tiene mil métodos
00:10:25
pero a nosotros ahora en particular lo que queremos es añadirle
00:10:29
ahora ya componentes y para eso tiene el método add
00:10:31
pues venga, vamos a añadirle
00:10:34
¿qué queremos añadir al panel?
00:10:36
pues queremos añadirle
00:10:39
los tres componentes que hemos dicho
00:10:41
queremos añadirle
00:10:43
una etiqueta
00:10:45
un área de texto
00:10:46
y queremos añadirle
00:10:54
un botón
00:10:58
son las tres cosas que queremos
00:10:59
eso es lo que queremos añadirle
00:11:01
al panel
00:11:04
una etiqueta, un área de texto
00:11:05
y un botón, que todavía no tenemos creados
00:11:09
¿vale?
00:11:11
queremos añadirlo
00:11:12
entonces, normalmente
00:11:13
cuando uno trabaja con el panel por defecto
00:11:15
no se hace a través
00:11:18
de esta variable intermediate añadiendo, sino que se pone
00:11:20
directamente aquí esto
00:11:22
el dis get content panel
00:11:24
¿vale? se pone directamente aquí
00:11:25
entonces yo ahora como estoy en
00:11:28
la parte primera en la que lo estoy explicando
00:11:30
todo más o menos al nivel de detalle
00:11:32
que se puede entender
00:11:34
pues he dicho, esto me devuelve panel
00:11:35
y ahora ya al panel lo añado, pero esto
00:11:38
como normalmente lo vais a encontrar
00:11:40
es directamente así, que es
00:11:41
getContentPanel.add
00:11:44
el componente que sea
00:11:50
así es como lo vais a encontrar, ¿por qué?
00:11:51
primero
00:11:57
porque el dis no hace falta, es opcional
00:11:58
recordad que si aparece una llamada
00:11:59
a un método por las buenas
00:12:01
en realidad es porque es dis quien lo está
00:12:03
llamando
00:12:06
el dis es opcional
00:12:06
me da igual poner dis getContentPanel
00:12:08
que poner esto
00:12:11
vale, pues este es el panel
00:12:13
por defecto
00:12:15
el que yo he guardado antes aquí
00:12:17
para que se viera más claro
00:12:19
y ahora al panel por defecto le añado
00:12:21
lo que me dé la gana
00:12:23
esta es la manera en la que lo vais a encontrar
00:12:24
y aquí es transparente
00:12:27
esto de container, ni se ve
00:12:29
y así no hay que importar
00:12:31
la clase ni nada
00:12:33
ay, perdonad, dime
00:12:34
un segundo
00:12:39
o sea, puedo pero si es muy rápido
00:12:42
porque estoy en clase
00:12:44
pues ahora sí que seguimos
00:12:44
bueno, pues entonces
00:12:47
repito, como os lo vais a encontrar
00:12:50
es así, es mucho más
00:12:51
que no con esta línea intermedia
00:12:53
ahora añadir al panel
00:12:56
vale, con lo cual este import
00:12:57
ahora ya sí que no haría falta
00:13:02
vale, entonces esta línea, nadie la extraña
00:13:04
¿no? de mi objeto frame
00:13:11
saco mi panel por defecto
00:13:13
de mi disk saco mi panel por defecto
00:13:15
y a ese panel por defecto le añado
00:13:17
los componentes que necesito
00:13:19
¿qué componentes hemos dicho que queremos?
00:13:20
esto después de haber hecho nuestro estudio
00:13:23
pues para explicaroslo
00:13:25
de dónde venía, y luego ya lo he dejado comentado
00:13:30
porque digo que lo vais a encontrar así, para explicaroslo
00:13:32
de dónde venía, ¿vale?
00:13:34
para no poner esta línea sin más, para explicaros
00:13:41
que esto viene de que esto es un objeto panel
00:13:43
y a ese objeto panel
00:13:45
hay que añadirle los componentes
00:13:47
y ese objeto panel
00:13:49
se saca de este
00:13:51
del frame en el que estoy
00:13:53
vale, pues entonces
00:13:54
a este objeto panel que hemos sacado
00:13:57
del frame en el que estamos, que es el panel
00:13:59
por defecto, pero podríamos haber instanciado
00:14:01
otros, podríamos haber hecho esto
00:14:03
podríamos haber instanciado otro panel
00:14:05
un panel mío que a mí me da
00:14:09
la gana y ya está
00:14:11
podría haber yo instanciado un panel
00:14:12
mío porque a mí me ha dado la gana, un jPanel
00:14:19
y pegarle a este los componentes
00:14:21
y luego pegar este al frame
00:14:23
¿vale?
00:14:24
pero vamos a trabajar, como estamos ahora al principio
00:14:27
vamos a trabajar con el panel por defecto
00:14:29
este, en lugar de con este, que podría
00:14:31
trabajar con este, que es uno que he instanciado de nuevas
00:14:33
pues vamos a trabajar con el panel por defecto
00:14:35
que se ha dado con este método, ya está
00:14:39
bueno, pues entonces
00:14:40
nosotros hemos decidido que vamos a usar
00:14:42
a ver, silencio
00:14:44
que vamos a usar una etiqueta
00:14:49
un área de texto y un botón, entonces
00:14:52
esto normalmente, Andoni, ¿te das
00:14:54
la vuelta y te callas de una puñetera vez para el resto
00:14:56
de tu vida hasta las dos y media de hoy?
00:14:58
Bueno, pues entonces, esto cuando uno decide, está en la parte de decidir la vista, lo suele decidir con herramientas que sirven solamente para construir vistas para que el cliente de tu aplicación lo vea.
00:15:01
Entre ellas hay una, que es la más usada, que es una que se llama Pencil, pero habrá muchas, claro, que son herramientas que te permiten a ti construir interfaces que no valen para nada, es solo para ver qué aspecto quedan, a ver si quedan bonitas o no.
00:15:14
y tú te haces ahí tu prototipo
00:15:31
y dices, oye, te vas al cliente
00:15:34
las ventanitas que tú quieres son estas
00:15:36
no, esta no me gusta
00:15:38
en esta me hace falta un botón
00:15:40
porque quiero además decirle no sé qué, pues en esta no sé cuánto
00:15:42
vale, te construyes un prototipo
00:15:44
entonces esta primera parte
00:15:46
que es la del diseño de la vista
00:15:47
si es muy compleja, pues eso se hace con herramientas
00:15:49
específicas para tú tener
00:15:52
unas vistas y se las vas enseñando
00:15:54
entonces nosotros después de haber hecho ese proceso
00:15:56
podríamos haber llegado a la conclusión
00:15:58
de que, ah, vale
00:16:00
el cliente nuestro lo que quiere es
00:16:01
un texto en el que ponga
00:16:03
introduzca año
00:16:06
un text fill
00:16:07
un área de texto en el que yo ponga el año
00:16:09
y un botoncito calcular
00:16:11
o resultado
00:16:14
o lo que uno quiera
00:16:16
vale
00:16:17
bueno pues esta es
00:16:18
nuestro prototipo
00:16:21
en eso estamos, pues ahora tenemos que seleccionar
00:16:23
estos componentes cuáles son, que ya los hemos dicho
00:16:25
jlabel es este
00:16:27
JTextFile es este y JButton es este
00:16:29
Y ahora vamos a añadirlos
00:16:32
Al panel
00:16:33
Pues para añadirlos tengo que construirlos antes
00:16:34
Si no, ¿cómo los voy a añadir?
00:16:37
¿Cómo los voy a añadir al panel si no los he construido antes?
00:16:38
Pues venga, vamos a construir la etiqueta
00:16:42
La etiqueta
00:16:43
Vale, esto es una etiqueta básica
00:16:46
Que no tiene texto ni tiene nada
00:16:54
¿Qué texto quiero yo que muestre?
00:16:57
Introduzca el año
00:17:00
Bueno, pues el texto de la etiqueta
00:17:01
se lo puedo poner en el constructor
00:17:04
ala, ese es el texto de la etiqueta
00:17:05
introduzca al año, ya tengo la etiqueta
00:17:15
y ahora ya se la puedo añadir
00:17:17
al panel, ala venga
00:17:19
etiqueta, ya tengo
00:17:21
mi etiqueta añadida al panel
00:17:23
que a su vez está en el frame
00:17:26
¿qué más quiero? quiero un text fill
00:17:27
porque necesito meter el año
00:17:29
y el componente para
00:17:33
meter texto, para meter datos es el
00:17:35
text fill porque ya lo he averiguado
00:17:37
pues venga
00:17:38
uno lo llama como le dé la gana
00:17:40
ala, ya tenemos el jtexfil
00:17:50
ya lo tenemos
00:17:58
vamos a añadirlo al panel también
00:18:03
claro, claro, porque en el constructor
00:18:04
es donde se construye la
00:18:16
interfaz, ala, ya tengo
00:18:17
añadido la etiqueta
00:18:21
al panel por defecto y el jtexfil
00:18:23
al panel por defecto, y me falta un botoncito
00:18:26
pues lo instanciamos
00:18:28
lo importamos
00:18:41
y de nuevo lo añadimos al
00:18:42
en el botón
00:18:50
lo normal es que estos componentes
00:19:00
no queramos su aspecto básico
00:19:03
sino que los queramos personalizar
00:19:05
por tamaño, por color
00:19:07
por texto que tiene encima, lo que sea
00:19:09
aquí la etiqueta de hecho la hemos personalizado
00:19:11
la hemos personalizado poniéndole un texto
00:19:13
pero podríamos seguirla
00:19:15
personalizando
00:19:17
a través de los métodos que me ofrece
00:19:18
cambiándole el color
00:19:21
cambiándole el tipo de letra
00:19:23
cambiándole, como veis tiene tropecientos mil
00:19:25
métodos que permiten
00:19:27
personalizar ese componente
00:19:29
yo no la he
00:19:31
personalizado, simplemente la he
00:19:34
dado el texto que quiero que tenga
00:19:36
el text field igual, me he cogido
00:19:37
el text field básico, también podría
00:19:40
ir a los métodos de datos y
00:19:42
personalizar lo que pudiera y me dejara
00:19:44
que son millones de cosas
00:19:45
¿vale? con swing
00:19:47
si yo no personalizo, la interfaz
00:19:49
básica de swing pues tiene un aspecto el de toda la
00:19:51
vida, pues el de toda la vida
00:19:54
de las aplicaciones java de siempre
00:19:56
pero si uno ya lo personaliza
00:19:57
con tamaños de letra
00:19:59
con bordes, con fondos
00:20:02
puede simular
00:20:04
absolutamente cualquier aspecto
00:20:06
cualquiera
00:20:08
vale, el botón tampoco lo he personalizado
00:20:08
pero hombre, este sí que necesita
00:20:12
por lo menos un texto encima
00:20:13
cuando uno le da un botón suele tener ok
00:20:15
o calcular o lo que sea
00:20:17
pues ese texto se puede particularizar
00:20:19
directamente en el constructor
00:20:21
no hace falta que lo hagamos luego a través de un método
00:20:23
pues vamos a ponerle que tenga el botoncito
00:20:25
tenga el método, el texto encima
00:20:29
es bisiesto, por ejemplo
00:20:31
para que al darse el botón me diga si o no
00:20:32
entonces ahora vamos a ver
00:20:34
esta interfaz teóricamente tendría que tener estos tres
00:20:39
componentes porque los he añadido al panel
00:20:41
del frame
00:20:43
los he creado y los he añadido
00:20:45
entonces ahora ya mi main
00:20:47
¿qué hace? instancia este objeto
00:20:49
y al instanciarlo
00:20:51
hace ya todo esto, porque llama al constructor
00:20:53
hace ya todo esto
00:20:55
instancias
00:20:56
y luego lo hago visible
00:20:57
bueno, le doy un tamaño
00:21:00
y lo hago visible
00:21:01
entonces
00:21:03
si ejecutamos esto
00:21:05
pues hombre
00:21:08
desde luego algo tiene
00:21:11
lo que tiene es un pedazo botón
00:21:13
tremendo
00:21:15
gigante, claro
00:21:16
yo no lo he personalizado
00:21:19
el botón por defecto se estira hasta el infinito
00:21:20
se estira hasta el infinito
00:21:24
esto
00:21:26
y ¿dónde está lo otro?
00:21:27
lo otro está debajo, no lo puedo ver
00:21:30
o sea, primero ha metido la etiqueta
00:21:32
como yo no he personalizado
00:21:34
ni dónde colocarlo
00:21:36
ni nada, no he personalizado nada
00:21:38
por defecto
00:21:40
la colocación es, pa, JLabel
00:21:41
ahí en medio planta
00:21:44
ahora el text fill
00:21:45
encima del JLabel tapándolo, ahí en medio planta
00:21:48
ahora, añade JButton
00:21:50
encima de lo anterior
00:21:52
o sea, los tres objetos están
00:21:54
pero es que están uno encima del otro y encima del botón
00:21:56
se ha estirado ahí hasta, con lo cual esto no me vale
00:21:58
para nada, claro
00:22:00
entonces un mínimo de colocación de componentes
00:22:01
tendremos que darle, un mínimo
00:22:04
vale, bueno, pues esto
00:22:05
hay herramientas y plugins
00:22:09
para poder hacerlo con
00:22:12
la forma de los vagos
00:22:13
que es el arrastro y pego, arrastro y pego, arrastro y pego
00:22:15
que nosotros usaremos
00:22:18
porque claro, no podemos hacerlo todo a mano, aunque
00:22:19
una de las empresas
00:22:21
con la que trabajamos
00:22:23
que hace aplicaciones para el BBVA y no sé qué
00:22:24
en Java
00:22:27
a todos sus trabajadores, a todos, a todos
00:22:28
los hace hacerlo a mano, o sea, y contar los
00:22:31
píxeles y todo, nada de usar esas herramientas
00:22:33
lo digo porque vais a encontrar de todo
00:22:36
de todo y tenéis que ser capaces de hacerlo
00:22:37
todo, todo
00:22:39
tenéis que ser capaces de hacer lo que habéis
00:22:40
hecho aquí, que será algo, y todo lo que no habéis
00:22:43
hecho aquí, porque sabéis de que
00:22:45
va ahí
00:22:47
bueno, pues entonces
00:22:48
esta aplicación no nos
00:22:51
vale, es que yo aquí ni tengo el área
00:22:53
de texto para meter cosas, ni tengo nada
00:22:55
entonces un poquito más tendremos que hacer
00:22:57
es que yo aquí he hecho
00:22:59
he racaneado, he hecho lo más básico
00:23:01
he hecho los tres componentes, los he pegado al panel
00:23:03
y ya está, no he podido racanear más
00:23:05
vale, pues algo más
00:23:07
sí que hay que hacer para colocarlos
00:23:09
entonces, ¿cómo se puede gestionar
00:23:11
la colocación de los
00:23:14
componentes? gestionar
00:23:15
pues mediante lo que se llaman
00:23:17
gestores de ubicación
00:23:19
¿vale?
00:23:21
entonces vamos a ponerlo aquí
00:23:23
si no usamos, que es lo que yo he hecho aquí
00:23:24
no usar, si no usamos una cosa
00:23:29
que se llama gestores de ubicación
00:23:31
los componentes
00:23:34
se ponen unos encima de otros
00:23:38
y encima con el tamaño máximo
00:23:40
entonces esto no nos vale
00:23:49
vale, pues entonces
00:23:56
¿cómo se usan los gestores
00:24:00
de ubicación? los gestores de ubicación
00:24:02
son objetos que hay que crear
00:24:04
estamos en la operación
00:24:05
de datos objetos, cualquier cosa
00:24:08
que haga algo y que forme parte de nuestra
00:24:09
aplicación es un objeto, no hay otra.
00:24:12
Entonces, un gestor de ubicación es un objeto
00:24:14
que hay que crear. Y ese gestor de
00:24:16
ubicación, ¿a quién hay que asociarlo?
00:24:18
Al panel, que es el que tiene los
00:24:20
componentes. Entonces, mi panel,
00:24:22
en mi caso es el getContentPane
00:24:24
que saco por defecto, mi panel,
00:24:26
que es el que tiene los componentes, tiene que tener
00:24:28
un gestor de ubicación que le manda. Ahora mismo
00:24:30
nadie le manda. No hay ningún gestor
00:24:32
de ubicación creado. Pues entonces,
00:24:34
por defecto, es unos encima de otros.
00:24:36
Pues entonces, antes de
00:24:39
hacer todo esto de aquí.
00:24:40
Vamos a crear un objeto gestor
00:24:44
de ubicación y le vamos a hacer jefe del panel.
00:24:46
Y ahora ya sí, el panel
00:24:49
seguirá las órdenes de su jefe,
00:24:50
que es el gestor de ubicación.
00:24:52
Que ahora no tenía ningún jefe, gestor de ubicación,
00:24:54
uno encima del otro.
00:24:55
Bueno, pues entonces, vamos a crear
00:24:57
un gestor de ubicación.
00:25:00
¿Gestores de ubicación cuántos hay?
00:25:07
Hay muchos tipos distintos.
00:25:09
Cada gestor de ubicación se corresponde
00:25:11
con un tipo diferente de ubicación
00:25:13
ubicación dándole yo coordenadas
00:25:15
ubicación uno detrás de otro
00:25:18
ubicación en celdilla
00:25:20
hay un montón de gestores de ubicación
00:25:22
como nosotros no nos vamos a perder
00:25:24
ni a volver locos
00:25:26
haciendo ubicaciones manuales
00:25:27
porque no tiene sentido
00:25:29
que perdamos el tiempo en eso
00:25:31
vamos a ver simplemente
00:25:32
cómo usar un gestor de ubicación
00:25:33
el más sencillo
00:25:35
que es el gestor de ubicación
00:25:36
que coloca los componentes
00:25:37
uno tras otro
00:25:38
y ya está
00:25:40
al menos con uno tras otro ya veremos algo
00:25:42
ya veremos, porque están uno tras otro
00:25:44
¿vale? si queremos hacer
00:25:46
ubicaciones ya más personalizadas
00:25:48
tendríamos que usar gestores de ubicación
00:25:50
a los que hay que darles
00:25:52
además luego la coordenada en la que tú quieres
00:25:54
etcétera, que es muy fácil de usar también
00:25:56
pero no nos vamos a perder en eso
00:25:58
venga, vamos a crear un gestor de ubicación ¿de qué tipo?
00:25:59
del tipo
00:26:03
uno detrás de otro
00:26:04
entonces vamos a ponerlo aquí
00:26:06
como lo vamos a subir esto
00:26:08
cada gestor de ubicación
00:26:09
está asociada a un tipo de
00:26:12
a una forma de ubicar diferente
00:26:16
los componentes
00:26:18
bueno, pues repito, hay muchos gestores de ubicación
00:26:19
cada uno de ellos está asociado a una forma
00:26:34
uno de los gestores
00:26:36
de ubicación es este
00:26:38
el flow layout, este es uno
00:26:39
y es el más sencillo, porque este
00:26:44
está asociado a los componentes uno detrás
00:26:46
de otro
00:26:48
pues vamos a instanciarlo
00:26:49
vamos a instanciarlo
00:26:53
llamadlo como
00:26:55
venga, pues este
00:26:58
como es muy sencillo, no hay que darle ni parámetros
00:27:04
ni nada, porque este es uno detrás de otro
00:27:07
no hay que
00:27:08
pues ala, instanciado
00:27:09
ahí está
00:27:12
flow layout
00:27:14
lo importamos de su librería, que los gestores
00:27:15
de ubicación no se han reescrito, porque no ha hecho
00:27:20
falta, están aquí
00:27:22
vale, ahora el gestor de ubicación
00:27:24
ya está, este es el que
00:27:28
es capaz de mandar uno detrás de otro
00:27:29
pero claro, hay que decírselo al panel
00:27:32
hay que decirle, oye panel, que tu jefe
00:27:34
es ese gestor que yo he dado
00:27:36
tu jefe es ese
00:27:37
vale, pues vamos a darle un jefe al panel
00:27:39
darle un jefe
00:27:42
al panel, pues ese panel tendrá un método
00:27:44
para fijarle un jefe
00:27:46
de ubicación
00:27:48
pues sí que lo tiene, ese método setLayout
00:27:49
el método setLayout dice
00:27:52
tú, tu gestor de ubicación
00:27:56
jefe es el que yo te paso
00:27:58
por parámetro, es este que yo
00:28:00
te paso
00:28:02
¿vale?
00:28:03
entonces vamos a ponerlo aquí
00:28:06
flow layout
00:28:07
gestiona
00:28:12
pone uno detrás de otro
00:28:14
y ahora con set layout
00:28:18
con esto que estamos
00:28:25
haciendo aquí, asociamos
00:28:27
el gestor
00:28:29
al panel
00:28:30
porque no me sirve de nada crear el gestor
00:28:32
Si luego al panel no le digo
00:28:35
Oye, hazle caso a este gestor
00:28:37
No me vale de nada
00:28:39
Pues con este método
00:28:40
Ya hemos hecho caso
00:28:42
Ya el panel le va a hacer caso a este gestor
00:28:43
Ahora ya volvemos a ejecutar esto
00:28:46
Y bueno, hombre
00:28:49
Ya vemos los tres componentes
00:28:52
Los tres
00:28:55
Lo que pasa es que el text field
00:28:57
Es una racané de text field
00:28:59
Meter ahí un número
00:29:01
Pinchar ahí es prácticamente complicado
00:29:03
claro, porque yo es que el text field
00:29:05
lo he creado sin personalizar
00:29:08
y el text field por defecto es enano
00:29:09
bueno, pues tendríamos que personalizar
00:29:11
el tamaño que queremos que tenga
00:29:13
eso lo podemos hacer con un método aparte o el propio
00:29:14
constructor, si yo al constructor
00:29:17
le digo, oye, ¿qué vas a meter? un año
00:29:19
pues con cuatro posiciones tengo suficiente
00:29:21
lo que yo le pongo al
00:29:23
constructor es el número
00:29:25
de caracteres que le caben
00:29:26
venga, vamos a ponerle cuatro
00:29:29
a ver si así
00:29:31
nos gusta más
00:29:33
bueno
00:29:35
pues bueno, vale
00:29:37
ya es una interfaz con la que podemos hacer algo
00:29:39
vale
00:29:42
no es bonita
00:29:44
porque es un pedazo bicho
00:29:45
¿eh?
00:29:46
no, posiciones, caracteres
00:29:49
yo pongo
00:29:52
sí, sí, sí
00:29:52
porque se estira, me refiero a que son visibles
00:29:55
que se ven, o sea, el tamaño que se ve
00:29:58
pero si tú escribes, va a estar ahí
00:29:59
aunque no se vea, vale, o sea, es el tamaño
00:30:01
visible
00:30:03
o sea, caber ahora mismo
00:30:04
1, 2, 3 y 4
00:30:07
bueno, hace visibles 5
00:30:08
ah, bueno, de la 0 hasta 4
00:30:10
claro, si yo pongo 4, será de la 0 hasta 4
00:30:12
te hace visibles 5, ya más no te los hace
00:30:15
visibles, pero caber, caben, o sea, yo ahora mismo estoy metiendo
00:30:17
tropecientas L's, vale
00:30:19
vale, bueno, entonces cada
00:30:21
componente de estos luego tiene su mundo
00:30:25
que uno puede investigar y personalizar y probar
00:30:27
y todo eso, nosotros vamos a ver
00:30:29
el funcionamiento un poquito
00:30:31
para arrancar. Vale, pues
00:30:32
ala, esta aplicación está, pero es que
00:30:35
no me hace absolutamente nada.
00:30:37
Claro, porque no le
00:30:40
he asociado ningún evento. No me hace
00:30:41
nada. De hecho,
00:30:43
le faltaría un componente incluso.
00:30:47
Porque cuando esta aplicación
00:30:49
funcione y yo le dé al botón
00:30:51
es bisiesto, en algún
00:30:53
sitio me tendrá que aparecer
00:30:55
si no.
00:30:56
Si no es un texto que tiene que estar en algún sitio.
00:30:58
¿Dónde coloco yo ese texto? Podría
00:31:01
a colocarlo en una etiqueta.
00:31:03
Vale, una etiqueta. Pues entonces aquí me falta una etiqueta
00:31:05
que ahora mismo no tendrá nada. Pero que
00:31:07
cuando yo le dé a SBC esto, ya me dirá
00:31:09
sí, no, sí, no.
00:31:11
Pero ese texto que me
00:31:13
aparece tiene que estar en algún sitio. Todo lo
00:31:15
que está en la interfaz tiene que
00:31:17
estar en algún componente.
00:31:19
Vale, pues entonces por lo
00:31:21
menos una label en algún sitio, aunque
00:31:23
ahora mismo esté vacía, me
00:31:25
falta. Pues vamos a ponerle
00:31:27
un JLabel. Para verla
00:31:29
donde está, vamos a ponerle que ponga resultado
00:31:31
y luego ese resultado que se vaya cambiando, así no
00:31:32
pues vamos a
00:31:34
ponerle además aquí otra JLabel
00:31:37
con el resultado
00:31:39
de la
00:31:45
vale, yo puedo dejarla así
00:31:45
puedo dejarla así
00:31:55
bueno, tendría que añadirla al panel, claro que no se la he añadido
00:31:57
.app
00:32:00
result
00:32:11
vale
00:32:12
vale, la etiqueta
00:32:13
pensada para mostrar el resultado está
00:32:16
no olvidéis
00:32:18
ir parando los procesos
00:32:21
o andándola a este, porque si no
00:32:24
podéis tener ahí ciento y la madre
00:32:26
entonces ahora mismo
00:32:28
la etiqueta yo no la estoy viendo, pero está
00:32:30
no la estoy viendo porque no tiene un texto
00:32:32
si le hubiera cambiado el color, si le hubiera puesto otro color
00:32:33
le hubiera puesto un borde, la vería
00:32:36
imagino que esto tendrá
00:32:38
el label, tendrá algún método para ponerle
00:32:39
borde o algo
00:32:42
lo digo de cara a verla
00:32:43
set border
00:32:45
set background
00:32:48
me cambiará el color
00:32:50
Para ponerle fronteras
00:32:51
Le pongo un border
00:32:56
Pero el border hay que dárselo instanciado
00:32:59
Yo no sé si el borde básico sin instanciar
00:33:01
Se ve ya o no se ve
00:33:04
Vamos a probar a ver poniéndole un borde
00:33:06
A ver, aquí da igual
00:33:08
Que lo ponga antes o después
00:33:13
Porque
00:33:15
Vale
00:33:15
Vamos a importar
00:33:19
Vale, es que el constructor de border
00:33:30
Necesitará algo
00:33:33
Para decir cómo es el borde
00:33:34
Habría que ver cómo es
00:33:35
Pero es que no, que no perdamos el tiempo
00:33:37
A borde hay que pasarle
00:33:40
Ah, vale, hay que pintarlo
00:33:44
Con este método, hay que pintarlo con la clase
00:33:48
Graphics
00:33:50
Bueno, pues nada
00:33:51
Y background, no sé si lo va a poner un background
00:33:52
Es solamente para ver la etiqueta
00:33:55
Vamos a
00:33:57
Le ponemos un texto, le ponemos un texto y la vemos
00:33:58
Pero por
00:34:01
New color
00:34:03
No sé si me deja instanciarlo así
00:34:08
A ver si me la ponen azul
00:34:18
Pero me da a mí que no
00:34:27
Nada, el background ese no me la ponen
00:34:28
Vale, bueno, da igual
00:34:45
Ya la veremos cuando aparezca el texto
00:34:46
O si no, para ver que está, siempre podemos poner aquí
00:34:48
Resultado
00:34:51
Ahí está la etiqueta
00:34:54
el resultado lo pondré ahí
00:35:00
en mi caso
00:35:03
porque he añadido la etiqueta
00:35:05
después del text field y antes del botón
00:35:07
bueno, en cualquier caso
00:35:08
la aplicación ya está construida y está hecha
00:35:11
pero esto no vale para nada
00:35:13
ahora ya sí que una vez le hemos enseñado
00:35:14
al cliente, dice sí, vale, justo
00:35:16
esta es la interfaz que yo quiero, así es como quiero
00:35:18
pues ahora ya
00:35:20
nos ha aceptado el diseño
00:35:22
tenemos que hacer la captura de eventos
00:35:24
bueno, pues a ver
00:35:27
para hacer una captura de eventos
00:35:30
de nuevo
00:35:34
necesitamos que en la aplicación haya
00:35:35
un objeto
00:35:37
que sea capaz de ponerse
00:35:39
a la escucha de eventos
00:35:41
esa es la idea
00:35:43
esto de aquí
00:35:45
cada vez que yo hago esto
00:35:46
cada vez que yo doy aquí
00:35:48
cada vez que pulso
00:35:51
está ocurriendo un evento del cual
00:35:52
el proceso se está enterando
00:35:55
porque el JFrame
00:35:57
El JFrame tiene un montón de cosas dentro
00:35:59
Y el JFrame está hecho de tal manera
00:36:02
Que cada vez que yo le doy aquí
00:36:04
El programa se puede enterar
00:36:07
Entonces necesitamos un objeto
00:36:10
Necesitamos un objeto
00:36:13
Que se entere
00:36:15
Que se especialice en esto
00:36:17
Que se especialice en esto
00:36:21
Y meter dentro de él
00:36:22
El código que yo quiero
00:36:24
Que se haga como resultado de esto
00:36:26
Entonces, el proceso de captura de eventos es
00:36:29
hay que crear un objeto
00:36:32
que sea capaz de capturar el evento
00:36:34
y crear un objeto que sea capaz de capturar el evento
00:36:39
como declaramos una clase
00:36:42
que sea capaz de capturar un evento.
00:36:43
Nosotros no sabemos hacerla.
00:36:46
Afortunadamente ya hay clases
00:36:47
que son capaces de capturar eventos.
00:36:49
Entonces lo que tenemos es que instanciar
00:36:51
un objeto de esa clase
00:36:53
y esa clase personalizarla
00:36:54
para que el código que tenga dentro
00:36:57
haga lo que nosotros queremos.
00:36:59
A ver, escrito se va a entender mejor.
00:37:01
A ver, aquí el tema es,
00:37:04
necesitamos instanciar un objeto
00:37:06
que tenga dentro el código de respuesta a ese evento.
00:37:07
¿Ese objeto de qué clase será?
00:37:12
De una clase que habrá que hacer.
00:37:14
De una clase que habrá que hacer.
00:37:16
Entonces, aquí,
00:37:18
pues yo haré una clase, por ejemplo,
00:37:21
que la llamo como me dé la gana,
00:37:23
porque es una clase mía.
00:37:24
captura
00:37:25
pulsar botón
00:37:27
¿vale?
00:37:30
bueno, a ver, en todo caso
00:37:43
implementarla, heredar no, pero no puede ser heredar de dos
00:37:45
de JFrame tienes que heredar sí o sí
00:37:47
porque es un frame
00:37:49
lo que me estás diciendo es darle doble personalidad
00:37:49
que además de heredar, implemente de la otra
00:37:52
pero
00:37:54
vamos, espera
00:37:55
vamos por partes, hilos, sin liarnos
00:37:58
la clase ventana
00:38:01
tiene una única función, que es
00:38:02
es mi ventana, esa es mi ventana y se construye
00:38:04
ahora tendré otro objeto
00:38:08
otro objeto que tendrá otra función
00:38:10
que es capturar el evento, entonces voy a tener
00:38:13
en mi main, yo aquí tengo mi objeto ventana
00:38:16
cuya función es ser una ventana que aparece
00:38:19
y luego tendré otro objeto cuya función es otra
00:38:22
que es enterarse de que el evento ha ocurrido
00:38:25
y ejecutar el código
00:38:28
de respuesta, entonces me falta
00:38:31
hacer esa otra clase, la clase que es capaz
00:38:33
de enterarse de que el evento ha ocurrido
00:38:36
y ejecutar el código de respuesta
00:38:38
entonces esta es esa clase, esta clase tiene otra función
00:38:39
diferente a la ventana, la ventana es
00:38:41
una ventanita con sus cosas
00:38:43
y ahora tengo mi otra clase, esta otra
00:38:45
clase es la clase que es
00:38:47
capaz de enterarse de que yo he pulsado
00:38:49
y dentro de ella
00:38:51
aquí dentro
00:38:53
habrá que meter el código de respuesta
00:38:54
vale, meter el código de respuesta
00:38:57
es muy fácil, me pongo yo ahí lo que quiero
00:39:00
que pase como respuesta a pulsar
00:39:02
meter el código de respuesta es escribir las líneas
00:39:03
pero ¿cómo la hago capaz
00:39:06
de enterarse de que he pulsado un botón?
00:39:08
eso es complicadísimo, ¿cómo programo
00:39:10
yo que esta pille
00:39:12
lo que se ha activado dentro en el
00:39:13
hardware que yo he pulsado el botón
00:39:16
en el ratón?
00:39:18
yo no puedo programar eso
00:39:19
claro, es que afortunadamente ya está hecho
00:39:21
en una clase que se llama
00:39:23
ActionListener, la clase ActionListener
00:39:25
tiene todo eso
00:39:28
capaz de enterarse de que yo he dado al ratón
00:39:29
que me ha llegado la señal por los buses
00:39:32
de señalización de la placa
00:39:34
esa clase ya existe
00:39:36
entonces lo único que tengo que hacer yo
00:39:37
es una interfaz, perdón
00:39:39
lo único que tengo que hacer yo es implementar
00:39:40
de ActionListener
00:39:43
entonces si yo implemento de ActionListener
00:39:45
implemento de ella
00:39:51
esta clase mía, toda esa parte
00:39:52
de ser capaz de enterarse
00:39:55
de que han pasado cosas
00:39:57
vía teclado, vía ratón, ya la tiene
00:39:58
ya la tiene, no tiene que hacer nada
00:40:00
ya es capaz de enterarse
00:40:03
por el simple hecho de implementar ActionListener
00:40:04
ya ha cogido esa personalidad
00:40:07
ser clase capturadora
00:40:08
tendremos que importar ActionListener
00:40:11
claro que como veis
00:40:13
también está en
00:40:14
JavaWT
00:40:16
en concreto en el paquete de eventos
00:40:18
ala, esta clase ya está
00:40:22
¿qué ocurre cuando implementamos una interfaz?
00:40:24
que estamos obligados
00:40:28
a sobreescribir todos los métodos
00:40:29
vacíos
00:40:32
de esa interfaz. Es lo que me está
00:40:33
diciendo el compilador. Me dice, oye,
00:40:35
tú implementas Action Listener
00:40:38
estupendo. Te conviertes en una clase capaz
00:40:39
de escuchar del teclado del ratón de donde
00:40:41
te dé la gana. Pero tienes
00:40:43
que implementar los métodos vacíos.
00:40:45
¿Y cuáles son esos
00:40:48
métodos vacíos?
00:40:49
Pues este. Este de aquí.
00:40:51
Este
00:40:56
método es el método vacío
00:40:57
de Action Listener que tenemos que implementar.
00:40:59
y justo
00:41:01
casualmente en este método
00:41:03
es en el que tiene que estar
00:41:05
el código de respuesta al evento
00:41:07
que yo quiero capturar
00:41:09
¿vale? entonces para ver primero
00:41:10
que funciona
00:41:13
lo que yo quiero como código de respuesta
00:41:14
será
00:41:17
al evento del botón
00:41:18
coger el texto
00:41:20
hacer el cálculo de bisiesto
00:41:22
y ahora ya poner en la etiqueta
00:41:25
es bisiesto o no, todo eso es lo que querré hacer ahí dentro
00:41:27
pero antes de hacer eso
00:41:29
vamos a probarlo
00:41:31
viendo que funcione y que realmente captura el evento
00:41:32
poniendo un mensajito por consola sin más
00:41:35
para que veamos en la consola
00:41:37
esto
00:41:38
pulsaste botón
00:41:40
vale, pues ya tenemos
00:41:43
una clase que por el hecho
00:41:47
de implementar ActionListener es capaz
00:41:49
ya de enterarse de que han pasado cosas
00:41:51
en el teclado y en el ratón, es capaz de enterarse
00:41:53
y además tiene
00:41:55
sobre escrito un método
00:41:57
dentro del cual
00:41:58
tiene el código que va a ocurrir
00:42:00
cuando eso pase, eso es lo que va a ocurrir
00:42:02
¿con eso hemos terminado?
00:42:04
pues no, porque ahora
00:42:08
hay que crear ese objeto
00:42:10
yo he declarado la clase
00:42:12
pero no lo he creado, entonces este objeto no existe
00:42:14
¿no?
00:42:16
vale, pues entonces
00:42:19
en el constructor
00:42:20
que es en el que se hace todo lo del frame
00:42:21
una vez que he creado
00:42:23
el aspecto
00:42:26
que mi aspecto es este, una vez que lo he creado
00:42:27
y he terminado y ya está aquí,
00:42:29
ahora tendré que instanciar las clases
00:42:31
capturadoras,
00:42:34
las que solemos llamar capturadoras,
00:42:36
las que son capaces de enterarse de los eventos.
00:42:37
Pues venga, vamos a instanciarla.
00:42:40
Captura,
00:42:43
pulsar botón, la he llamado.
00:42:44
Tendrá un constructor por defecto, como no
00:42:59
le he puesto, tendrá un constructor. Venga, la instancio,
00:43:01
captura, pulsar botón, ala.
00:43:03
La importamos de
00:43:06
donde sea, ya está instanciada.
00:43:07
Y con esto hemos terminado,
00:43:09
no, nos falta el último paso, ya sí que es el último
00:43:11
el objeto está
00:43:13
pero oye, tenemos que decirle
00:43:14
cuidado
00:43:17
tienes que
00:43:17
especializarte en este componente
00:43:20
o sea, un objeto
00:43:23
capturador como estos
00:43:25
no puede estar a todo
00:43:26
un objeto capturador
00:43:28
hay que decirle tú estate atento aquí
00:43:31
entonces
00:43:33
¿a qué tiene que estar atento?
00:43:35
pues tiene que estar atento
00:43:38
a este botón.
00:43:40
Yo quiero que esa clase
00:43:45
capturadora se despierte
00:43:47
cuando le doy a este.
00:43:48
Quiero que se despierte cuando le doy a este. No quiero que se despierte
00:43:51
cuando navego con mi ratoncito por aquí,
00:43:53
ni quiero que se despierte cuando meto
00:43:55
aquí datos, ni quiero que se despierte
00:43:57
cuando redimensiono esto, no quiero que
00:43:59
se despierte con cualquiera de esas cosas.
00:44:01
Quiero que se despierte cuando
00:44:03
le doy al botón.
00:44:05
Luego, las clases capturadoras
00:44:07
hay que decirles tú,
00:44:09
especialízate en este componente
00:44:10
e ignora todo lo demás
00:44:13
porque si no se despertaría cuando
00:44:14
para cualquier cosa
00:44:16
¿vale? pues entonces
00:44:18
¿cómo le decimos tú
00:44:21
clase capturadora
00:44:23
especialízate en este botoncito
00:44:24
pues al botón le decimos
00:44:26
add action listener
00:44:29
y le damos ese objeto
00:44:30
y ya está
00:44:32
entonces el botoncito aparte de construirlo
00:44:33
y añadirlo al panel
00:44:39
el botón tiene algo más que el resto
00:44:41
el botón tiene un objeto
00:44:43
que está ahí pendiente de él siguiéndole todo el rato
00:44:45
que es este que acabo de crear antes
00:44:47
el resto de componentes
00:44:49
no tienen ningún objeto
00:44:52
ahí siguiéndoles
00:44:53
porque el resto de componentes yo me da igual
00:44:54
hacer click sobre ellos, hacer lo que me dé la gana
00:44:57
me da igual, no tienen ningún componente
00:44:59
siguiéndoles, pero el botón sí
00:45:01
el botón sí que tiene un componente siguiéndoles
00:45:02
porque cuando yo den él, quiero que salte
00:45:05
la clase, pues ahora ya sí
00:45:07
El botón tiene un capturador
00:45:09
Siguiendoles, tiene un capturador
00:45:12
A través de este método
00:45:14
Y este capturador yo lo he instanciado
00:45:16
Y es este
00:45:18
Entonces ahora ya sí que
00:45:18
Cuando
00:45:22
Vale, cuando
00:45:25
Yo lanzo mi aplicación
00:45:37
Aquí está, no pasa nada
00:45:41
Ahí está
00:45:44
Vale, no pasa nada
00:45:45
Y ahora doy a SBC esto
00:45:48
Y paz, efectivamente
00:45:50
la clase, el objeto
00:45:52
ha capturado el evento
00:45:54
lo ha capturado porque me ha aparecido esto
00:45:55
que le vuelvo a dar
00:45:57
otra vez
00:46:00
que le vuelvo a dar, que le vuelvo a dar, que le vuelvo a dar
00:46:01
claro, porque ya está, hay un objeto
00:46:03
que está ahí pendiente de este todo el rato
00:46:06
está todo el rato pendiente
00:46:08
y no está pendiente de los demás, yo puedo pulsar
00:46:09
en cualquier otro sitio y no pasa nada
00:46:12
porque ese objeto no está pendiente de los demás
00:46:13
ese objeto está solo pendiente del botón
00:46:15
y está pendiente del botón
00:46:17
y solo del botón
00:46:20
porque yo le he dicho
00:46:21
botón, añádete
00:46:24
a ese
00:46:26
pendiente de ti
00:46:28
añádetelo
00:46:29
a este
00:46:31
bueno, pues esta es la
00:46:33
filosofía de construcción de una interfaz
00:46:37
lo más
00:46:40
el esqueleto básico
00:46:40
¿qué es eso? yo tengo que instanciar un frame
00:46:43
tengo que instanciar un frame en algún momento
00:46:46
a través de un constructor
00:46:48
como siempre, pues el constructor
00:46:50
es el que tiene que construirlo y hacerlo todo
00:46:52
porque fuera del
00:46:54
constructor lo único que he hecho yo
00:46:56
ya es darle tamaño y hacerlo visible
00:46:58
que ni siquiera tendría
00:47:00
por qué hacerlo fuera, podría aquí mismo
00:47:02
al final hacer un
00:47:04
this.setSize
00:47:06
y this.setVisible, me da igual
00:47:08
pero bueno
00:47:10
lo dejamos así, vale, entonces el constructor
00:47:11
ya hace todo lo que yo tenga que hacer
00:47:14
que es añadir los componentes
00:47:16
al panel, personalizar
00:47:18
los componentes si yo quiero
00:47:20
y si algún componente tiene que tener
00:47:21
alguien ahí pendiente, porque al
00:47:24
interaccionar con él quiero que pasen cosas
00:47:26
pues a ese componente
00:47:28
le tendré que añadir lo que se
00:47:29
llama un listener, un escuchador, un listener
00:47:32
y ese escuchador lo tendré
00:47:34
que instanciar antes de añadírselo
00:47:36
y ese escuchador
00:47:38
que yo instancio tendrá que ser
00:47:40
heredero de ActionListener
00:47:42
porque si no lo es, no tiene la capacidad
00:47:44
de escuchar, y además de ser
00:47:46
heredero de ActionListener, yo pondré aquí
00:47:49
lo que quiero que ocurra
00:47:51
vale, paramos unos segundos
00:47:52
y ahora, claro, lo que tenemos es que completarlo
00:47:55
porque esto, yo no quería
00:47:58
que después de hacer esbis y esto
00:47:59
me saliera a pulsar este botón
00:48:01
yo lo que quería es que me cogiera lo que yo pongo aquí
00:48:03
y me pusiera el resultado
00:48:06
entonces no nos vale este evento
00:48:08
claro, hay que hacer ya el bueno
00:48:10
vale, vamos a parar unos
00:48:11
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 9
- Fecha:
- 21 de abril de 2024 - 19:04
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 48′ 15″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 225.99 MBytes