20260505 EJER6_JAVAFX_1 - 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:
Nuestro ejercicio 6. Utiliza un panel normal y corriente. En este panel vas a poner una etiqueta que diga coordenadas 00. Pues hasta ahí es fácil. Un panel limpio, mondo y lirondo. Y una etiqueta ahí puesta.
00:00:00
pues un panel mondo y lirondo
00:00:17
con una etiqueta en una esquinita
00:00:26
que ponga coordenadas 0, 0
00:00:28
vale, ¿va a pasar algo en esa aplicación?
00:00:30
sí, va a pasar
00:00:33
que cuando se desplace
00:00:34
el ratón, luego ya tenemos
00:00:36
un primer evento, el ratón
00:00:38
moviéndose, ¿sobre quién?
00:00:40
sobre el panel
00:00:43
luego ya vamos identificando
00:00:43
el que tiene que recibir el evento
00:00:45
es el panel, ¿qué evento?
00:00:48
que se mueva el ratón sobre él, vale, pues cuando se mueva el ratón
00:00:50
sobre el panel, yo tengo que poner en la etiqueta
00:00:54
label, las coordenadas del ratón
00:00:58
en ese momento, bueno, más o menos, entonces ya me hago idea, ah, pues
00:01:01
capturar algún evento de ratón en el panel, y en ese evento
00:01:06
sacar, habrá algunos métodos, esperemos, para sacar coordenadas del ratón
00:01:10
y esas coordenadas ponerlas en la label, vale, pues será eso
00:01:14
vale, más eventos
00:01:17
ah pues sí, si pulsamos
00:01:20
una tecla
00:01:23
se tiene que añadir
00:01:23
un botón
00:01:28
en la posición en la que
00:01:30
esté el ratón en ese momento
00:01:32
eso se me hace más raro, como saco yo la posición
00:01:34
del ratón a través
00:01:36
de un evento de teclado
00:01:38
si no tiene nada que ver, no voy a poder
00:01:40
del evento mouse event
00:01:42
puedo sacar todo relacionado
00:01:44
con el ratón en el momento en el que
00:01:46
produjo ese evento, como por ejemplo
00:01:48
la posición, pero del evento
00:01:50
key event que es pulsar una tecla
00:01:52
no voy a poder sacar una posición del ratón
00:01:54
entonces bueno, algo tendremos que pensar
00:01:56
bueno, pues como respuesta a ese evento
00:01:58
key event
00:02:00
tendremos que sacar la posición
00:02:01
del ratón a saber cómo
00:02:05
y crear un botón
00:02:06
con esa posición
00:02:08
con el texto de la tecla que hayamos
00:02:09
pulsado
00:02:12
vale, venga, pues hala
00:02:13
pues vamos a arrancar a hacer esto
00:02:18
aquí la escena
00:02:21
es mínima
00:02:24
un panel y una etiqueta, ya está
00:02:25
no hay más, entonces aquí
00:02:27
no vamos a matar moscas a cañonazos
00:02:29
haciéndonos con fxml
00:02:31
creándonos la escena, luego haciendo
00:02:34
con un controller, no, esa era una
00:02:35
capa que poníamos por
00:02:37
encima de la estructura básica
00:02:39
de JavaFX que ya hicimos
00:02:42
en el primer ejercicio por lo menos
00:02:43
o en los dos primeros, no lo sé
00:02:45
que era, yo tengo mi aplicación
00:02:46
en el que creo el panel, pongo componentes en el panel
00:02:49
y le añado escuchadores de evento a los componentes
00:02:53
esa es la estructura de JavaFX y no hay más
00:02:57
otra cosa es que cuando ya empieza a tener un montón de componentes
00:02:58
y la cosa engorda, puedo poner una capa por encima
00:03:02
una capa por encima
00:03:06
que me la dan las librerías de JavaFXML
00:03:08
que son unas librerías que hacen cosas por mí
00:03:11
entonces yo esas librerías
00:03:15
las importa, las importo
00:03:17
porque están en las dependencias
00:03:19
y que hago, me creo un fichero
00:03:20
xml y en ese fichero
00:03:23
xml le explico
00:03:25
lo que me da pereza hacer por código
00:03:27
porque son muchas cosas
00:03:29
se lo explico en ese xml
00:03:30
entonces en lugar de explicárselo
00:03:32
porque yo la sintaxis de sf
00:03:35
xml no me la puedo usar de memoria
00:03:37
afortunadamente tengo un software
00:03:39
que es el steam builder
00:03:41
que me permite arrastrando
00:03:42
crear ese fxml
00:03:44
entonces fxml es una explicación
00:03:46
de cuáles son mis controles
00:03:48
y con qué eventos
00:03:51
va a responder cada control, es una explicación
00:03:53
dada en un lenguaje extraño como es el fxml
00:03:55
y ahora las librerías
00:03:57
de fxml, las que hemos importado
00:03:59
desde maven, cogen esa explicación
00:04:01
y lo transforman
00:04:03
internamente en un código que ya sí
00:04:04
que responde al patrón que vimos
00:04:07
en los primeros ejercicios
00:04:08
entonces ahora cuando
00:04:11
trabajamos con fxml
00:04:12
estamos tapando todo eso, estamos poniendo una capa
00:04:14
por encima, pero lo de abajo no ha desaparecido
00:04:16
lo que pasa es que para no poner a mano
00:04:19
todo eso, pues venga
00:04:20
te lo explico con el fxml
00:04:22
que voy a poner y como va a responder cada cosa
00:04:24
te doy el fxml y tú librerías
00:04:26
de fxml
00:04:29
que están en las dependencias, tú ya construyes el código
00:04:30
eso es lo que estamos haciendo, poner un patrón
00:04:33
por encima, pero aquí
00:04:34
que tengo un panel y una etiqueta, pues no
00:04:36
lo vamos a hacer directamente
00:04:38
vamos a hacer a mano
00:04:41
Porque no somos tontos
00:04:42
Pues venga
00:04:44
Ala
00:04:46
Nuestra aplicación entonces está aquí limpita
00:04:47
Vamos a ver hasta donde llegamos
00:04:51
Pues venga
00:04:54
Me hago mi paquete
00:04:55
Para hacer la aplicación
00:04:56
Y aquí me voy a hacer
00:05:00
Mi clase aplicación
00:05:09
Con su método main
00:05:11
Vale aquí
00:05:18
acordaos de verificar
00:05:21
que en el pom que yo os de
00:05:24
en el plugin de fx
00:05:25
estará
00:05:31
puesto la clase
00:05:33
que tiene el método main
00:05:34
entonces yo aquí habré puesto cualquiera, esta misma
00:05:36
seguramente, aseguraos
00:05:39
de que la clase en la que vosotros
00:05:41
tenéis vuestro main es la que está
00:05:43
aquí, vale, porque si la habéis
00:05:45
llamado de otra manera o la habéis puesto en otro
00:05:47
paquete, pues tendréis
00:05:49
que poner aquí esa
00:05:51
aseguraos, estaría o no estará
00:05:52
porque en vuestro caso no aplica
00:05:55
en mi caso
00:05:57
para no tener que cambiarlo al paquete
00:05:59
lo he llamado tal cual y a la clase
00:06:01
la he llamado tal cual, con lo cual no te voy a cambiar
00:06:03
nada
00:06:05
vale, bueno pues
00:06:06
entonces, si esto queremos que sea
00:06:09
el punto de arranque de una aplicación
00:06:11
JavaFX
00:06:13
tiene que heredar de
00:06:14
application, tiene que heredar
00:06:16
de aquí, y si hereda
00:06:19
de aquí, tiene que
00:06:23
implementar el
00:06:25
bueno, primero la importo, tiene que implementar
00:06:27
el método start
00:06:29
este, en el
00:06:31
método start es, en el que
00:06:35
construimos la escena
00:06:36
o las escenas
00:06:38
y añadimos
00:06:39
los eventos de respuesta
00:06:43
a los controles de esa escena
00:06:45
ahí hacemos todo eso
00:06:46
repito, que trabajamos con fxml
00:06:48
pues mi construir
00:06:51
la escena, en lugar de poner yo los
00:06:53
paneles, los botones
00:06:54
todo, mi construir la escena va a ser
00:06:56
oye, este es el fxml, construyétela tú desde aquí
00:06:58
¿vale? pero nosotros
00:07:01
aquí no tenemos fxml, pues venga
00:07:02
luego para que esta aplicación lance
00:07:04
recordad que tenemos que llamar al método
00:07:07
lance, pasándole los
00:07:09
hipotéticos argumentos
00:07:10
que haya aquí
00:07:13
vale, pues entonces
00:07:14
¿qué vamos a hacer aquí?
00:07:17
pues recordad que
00:07:20
aquí, esto lo vimos
00:07:22
en nuestra primera aplicación
00:07:24
ya vimos que
00:07:26
teníamos que crear una escena
00:07:28
y ahora ya fijar
00:07:30
a mi escenario, a mi stage
00:07:32
esa escena y hacerla
00:07:34
visible, entonces teníamos
00:07:36
que crear aquí una escena
00:07:39
que esto
00:07:40
se creaba así, verdad
00:07:45
ay la madre que te trajo
00:07:48
que llevo diciendo 20 minutos
00:07:54
que tenemos
00:07:57
dos posibilidades, construir la escena
00:07:58
a pelo
00:08:00
o explicar
00:08:01
lo que queremos en un fxml
00:08:04
y decirle aquí, este es el fxml
00:08:06
construyétela tú, o construirla a pelo
00:08:09
entonces, estamos en ese segundo caso
00:08:10
construirla a pelo, ¿vale?
00:08:12
¿qué pasa con el mundo y el hirondo?
00:08:17
¿es de algún meme vuestro
00:08:19
de estas gilipollezas que veis en TikTok?
00:08:20
porque él dice el hirondo y el hirondo
00:08:26
y a pelo
00:08:27
Pues no lo sé, vendrá del gremio.
00:08:33
Bueno, pues nada, ¿hay algo más que diga que tenga que repetir?
00:08:38
Tiramillas y tiramillas.
00:08:42
Ah, no, el tiramillas no suelo decirlo.
00:08:45
Bueno, pues entonces, la escena tenía que vamos a hacer a mano,
00:08:51
no cargándola de un XML, ¿vale?
00:08:56
No cargándola de un XML.
00:08:59
la escena
00:09:00
recordad que necesitaba
00:09:02
un nodo raíz al que aferrarse
00:09:04
y luego un tamaño
00:09:07
un tamaño, el tamaño yo que sé
00:09:08
400
00:09:10
400
00:09:12
esto es lo que necesitaba la escena
00:09:13
y ahora, este nodo raíz
00:09:16
normalmente que va a ser
00:09:18
un panel
00:09:20
la escena se aferra a un panel
00:09:21
y ya en ese panel ponemos las cositas
00:09:24
pues ese panel
00:09:26
que sea
00:09:28
me han dicho un panel normal y corriente
00:09:30
pues esto podrá ser, ¿no?
00:09:35
ala
00:09:41
y ahora a mi stage
00:09:41
a mi stage
00:09:44
le fijaba la escena
00:09:46
tendrá un método
00:09:47
setScene, le fijaba
00:09:49
la escena y ahora la hacía
00:09:52
visible o algo así, ¿verdad?
00:09:54
esto tenía un punto show
00:09:56
o tenía algo, sí
00:09:58
vale
00:09:59
pues ya tenemos
00:10:01
una escena asociada a un panel
00:10:03
vamos a ejecutar esto
00:10:06
a ver si hasta aquí vamos bien
00:10:08
como es un proyecto maven
00:10:09
recordad que no se ejecuta
00:10:12
a través de la máquina virtual
00:10:14
sino se ejecuta llamando a maven
00:10:16
y en la primera
00:10:18
ejecución le decimos
00:10:20
oye tú runas
00:10:21
maven build porque te ejecuto
00:10:24
a través de ti maven
00:10:26
maven build y él nos dice vale muy bien
00:10:27
y que quieres que haga yo
00:10:30
Pues lo que quiero que hagas es llamar
00:10:31
Al plugin JavaFX
00:10:33
Que te he puesto en el POM
00:10:35
En particular quiero
00:10:38
Que hagas run
00:10:39
Vale
00:10:41
A ver si hemos tenido suerte hasta aquí
00:10:42
Vale, pues ya está, este es nuestro panel
00:10:45
Que no tiene nada
00:10:51
Pues ahora ya vamos a empezar a añadirle
00:10:52
Los controles, que en nuestro caso es una etiqueta
00:10:55
Sin más
00:10:57
Y luego ya los eventos
00:10:57
Que son dos
00:11:00
Mouse event sobre el panel y keypress
00:11:01
sobre el panel
00:11:04
pues venga
00:11:06
vamos a ver
00:11:08
una etiqueta
00:11:10
new label
00:11:14
vale, inicialmente entiendo yo que el
00:11:24
constructor tendrá la opción de a la vez que
00:11:27
instancias ponerle ya un texto, aunque luego el texto
00:11:29
lo podrás cambiar con set text
00:11:31
y este texto de partida era
00:11:33
coordenadas
00:11:35
nos han dicho que de partida le pongamos
00:11:39
esto, o algo así
00:11:41
cuidado con todos los import que hagáis
00:11:43
a ver si a toda velocidad
00:11:51
importáis de cualquier lado
00:11:52
no, siempre tenéis que importar del
00:11:54
vale, y ahora tenemos que añadir
00:11:56
la etiqueta
00:11:59
a este de aquí
00:12:03
al panel, vale
00:12:04
entonces
00:12:07
este tendrá un
00:12:08
algún método
00:12:11
para poner el componente en una posición
00:12:21
concreta
00:12:23
que
00:12:24
setLayoutX y setLayoutY
00:12:26
no, a ver
00:12:31
a ver cuál es, si no lo
00:12:32
busco
00:12:38
sí, pero para ponerle
00:12:39
el componente
00:12:47
estos son los eventos
00:12:48
a ver, voy a mirarlo
00:12:55
que lo tengo
00:13:06
por aquí
00:13:09
Vale, aquí lo tengo
00:13:10
Ah, vale, vale
00:13:14
Que tengo que coger los estos
00:13:19
Vale, vale, tengo que coger los nodos
00:13:20
Y agregárselo como nodo
00:13:22
Vale, vale, entonces
00:13:24
Ok
00:13:26
Vale, entonces, a ver
00:13:27
Al
00:13:30
Para añadir elementos al panel
00:13:30
Yo del panel
00:13:34
Cojo
00:13:37
Uy, este no, cojo su lista
00:13:39
veis el panel tiene
00:13:44
un método getChildren
00:13:50
que nos da la lista
00:13:52
de los elementos que tiene
00:13:54
ese panel, pues a la lista de elementos
00:13:56
que tiene, le voy a poner la etiqueta
00:13:58
¿vale?
00:14:00
estas cosas concretas, o sea cuando uno
00:14:02
tiene, lo que decíamos ayer, uno tiene
00:14:04
la idea de lo que
00:14:06
tiene que hacer, perfectamente acotado
00:14:08
de su diseño, lo que tiene que hacer
00:14:10
para una consulta concreta
00:14:11
pues hombre no puede ir ahí explorando
00:14:14
los métodos, buscando
00:14:16
sería lo ideal ir probando
00:14:18
pero una cosa muy concreta pues nos ahorramos
00:14:19
tiempo, se lo preguntamos a la guía y ya está
00:14:22
si es que no vemos
00:14:24
en el examen no obviamente, pero claro en el examen
00:14:26
no vamos a poner nada que tengáis que averiguar
00:14:28
vosotros, bueno pues
00:14:30
entonces este
00:14:32
me dice la ayuda que me dice
00:14:33
todos los nodos que están en ese panel
00:14:36
pues voy a añadirle
00:14:38
yo la etiqueta
00:14:40
¿vale?
00:14:42
pero a saber
00:14:44
donde nos la ha puesto
00:14:46
aquí no hemos hablado de posición en ningún momento
00:14:48
a saber donde nos la ha puesto
00:14:51
entonces
00:14:52
vamos a ejecutar
00:14:54
esto a ver donde me ha puesto la etiqueta
00:14:57
bueno, por defecto me la ha puesto en la posición
00:14:58
0,0, estupendo
00:15:10
vale
00:15:11
si yo quisiera ponerla en otra posición
00:15:12
tendría que averiguar
00:15:16
como cambiar la posición
00:15:18
de un componente
00:15:20
Y ahí mirando
00:15:21
Ya si que llegaríamos a ese método
00:15:23
Que estabais diciendo
00:15:25
SetLayout
00:15:26
Me dice, oye tu componente
00:15:29
Colócate en esta posición, vamos a imaginar que queremos
00:15:31
La posición
00:15:33
50 para la X
00:15:34
No, lo que yo quería
00:15:37
Es añadirle un componente a un panel
00:15:43
De tipo panel
00:15:45
Esto es otra cosa, esto es fijar
00:15:45
La
00:15:49
Claro, la posición de ese componente
00:15:49
Por ejemplo
00:15:52
Si yo le fijo a una etiqueta
00:16:02
A la etiqueta label que acabo de hacer
00:16:06
Le fijo estas coordenadas de posición
00:16:07
Y luego se la añado
00:16:10
Pues entiendo que me la va a poner en otro sitio
00:16:11
Vamos a ver
00:16:13
Aquí me la había puesto en el sitio por defecto
00:16:15
Que es 0, 0
00:16:17
Vamos a ver ahora donde me la pone
00:16:18
Efectivamente me la ha puesto en otra posición
00:16:21
Vale
00:16:29
Bueno pero nos gustaba
00:16:30
la que tenía, la posición 00
00:16:33
como es la por defecto, esto lo puedo
00:16:35
entonces quitar, ahí se queda
00:16:37
comentado
00:16:42
vale
00:16:43
bueno, pues ya tengo construida mi escena
00:16:44
ya no hay más nodos, ni más nada
00:16:48
que tenga que añadirle a mi panel
00:16:50
la etiqueta, todo lo que viene
00:16:52
ahora, es ahora capturar
00:16:54
eventos, aquí no hay
00:16:56
controller, ni hay nada, porque el controller
00:16:58
el controller, repito
00:17:00
es una clase que hacemos
00:17:01
para que la entiendan las librerías
00:17:04
de JavaFX y la conviertan
00:17:06
en lo que vamos a hacer nosotros ahora
00:17:08
a mano. Pero aquí no tenemos
00:17:10
a JavaFX ML
00:17:12
para decirle, oye tú, hazme
00:17:13
estos eventos, yo te paso los
00:17:16
métodos en el control y házmelos tú.
00:17:18
No, aquí no tenemos eso, como cual es lo que vamos a hacer nosotros.
00:17:20
Pues venga.
00:17:23
¿Qué eventos
00:17:25
queremos capturar?
00:17:26
El primero.
00:17:28
El propio panel
00:17:30
es un evento que va a recibir el panel,
00:17:31
no la etiqueta. Podría ser un evento
00:17:34
de la etiqueta, que cuando pinchemos en la etiqueta
00:17:35
pase algo, pero no es un
00:17:38
evento que va a recibir la etiqueta, es un evento
00:17:40
que va a recibir el panel, cuando se
00:17:41
mueva el ratón sobre el panel que pase
00:17:44
algo, vale, pues
00:17:45
como fijábamos la respuesta
00:17:47
a un evento, cuando
00:17:49
lo hacíamos a pelo
00:17:51
como Miguel
00:17:53
sin tener
00:17:55
FXML, que nos pone
00:17:57
un controlador, que es una especie
00:18:00
de capa donde yo lo pongo y él ya se lo
00:18:01
pues como lo hacíamos, pues cogíamos el componente
00:18:04
que iba a recibir el evento, en nuestro caso se llama root
00:18:08
y buscábamos aquí los métodos
00:18:10
set on bla bla bla
00:18:14
y estos métodos set on bla bla bla
00:18:15
me dicen todos los eventos que puede recibir
00:18:18
y yo le paso dentro el código de respuesta
00:18:22
pues tendremos que buscar aquí por el propio nombre
00:18:25
y por la ayuda, el que pegue al ratón moviéndose
00:18:28
¿vale?
00:18:31
pues si vamos aquí buscándolos todos
00:18:33
seton bla bla bla aquí
00:18:35
no se cuanto bla bla bla
00:18:37
veis no tiene
00:18:39
un set on action
00:18:42
porque el panel no tiene evento por defecto
00:18:43
recordad siempre que on action
00:18:45
es el evento por defecto de un componente
00:18:47
si esto en lugar de un panel
00:18:50
fuera un botón veríamos
00:18:51
un set on action porque el botón si tiene
00:18:53
un evento por defecto, este es un panel no tiene
00:18:55
evento, que se hace por defecto con un panel
00:18:57
ni idea, por eso no lo tiene
00:18:59
vamos a ver si tiene mover ratón
00:19:01
bueno, pues seguimos aquí bajando
00:19:03
bajando, tiene cosas
00:19:05
de ratón
00:19:09
pues tiene toda la pinta de que este
00:19:10
se adapta a lo que nos han dicho, cuando el ratón
00:19:13
se mueva, cuando has movido
00:19:15
el ratón, pues tiene toda la
00:19:19
pinta de que este es el evento
00:19:21
que salta cuando tú mueves el ratón sobre
00:19:22
ese panel, cuando tú lo mueves
00:19:25
por su nombre, este es el evento de cuando
00:19:26
tú entras con el ratón en ese panel
00:19:29
el evento de cuando tú sales
00:19:31
con el ratón de ese panel
00:19:33
pero este es el evento cuando tú lo mueves
00:19:35
pues este
00:19:37
es el que queremos
00:19:39
y ahora
00:19:41
ahora venía lo bonito
00:19:42
vale, que teníamos
00:19:49
que poner aquí
00:19:51
pues aquí teníamos que poner
00:19:52
un objeto
00:19:54
vale, que tuviera
00:19:56
dentro el método
00:20:01
que tuviera dentro implementado
00:20:02
el método con la respuesta
00:20:05
a ese evento
00:20:07
eso es lo que voy a poner ahí
00:20:08
una instancia
00:20:10
de una clase
00:20:11
que tuviera dentro
00:20:14
un método con la respuesta
00:20:16
a este evento
00:20:19
que en nuestro caso tendrá que ser
00:20:20
capturar las coordenadas del ratón
00:20:22
y ponerlas en la etiqueta
00:20:25
vale, pues entonces
00:20:26
vamos a hacerlo
00:20:29
primero limpio completo
00:20:31
y luego vamos a hacer la trampa
00:20:32
bonita con la programación funcional
00:20:35
que ya sabéis del otro día
00:20:37
vale, vamos a hacerlo primero
00:20:38
pues como es
00:20:40
de principio a fin, ya no digo más a pelo
00:20:42
porque os reís
00:20:45
bueno, pues entonces
00:20:47
yo necesito aquí un objeto
00:20:49
pues por ejemplo
00:20:51
lo voy a llamar new
00:20:53
captura
00:20:54
ratón
00:20:56
necesito un objeto new captura ratón
00:20:58
y necesito que este objeto
00:21:03
tenga dentro
00:21:05
el método con la respuesta
00:21:07
a ese evento de mover el ratón
00:21:10
lo estoy haciendo tal y como lo hicimos
00:21:11
cuando hicimos esto en el primer proyecto
00:21:13
vale, pues me tengo que hacer
00:21:16
la clase captura ratón
00:21:18
a ver, me la puedo hacer fuera
00:21:19
pero como es una clase
00:21:22
que se va a usar solo aquí
00:21:24
y se va a instanciar solo aquí
00:21:26
pues me la hago como clase interna, no pasa nada
00:21:27
me la hago como clase interna
00:21:30
fuera del método lógicamente
00:21:31
porque las clases internas están dentro de otras clases
00:21:33
pero fuera de métodos
00:21:36
pues bueno, me la hago aquí
00:21:37
que solo la uso aquí y ya está
00:21:39
pues venga, me la hago aquí como clase interna
00:21:41
captura
00:21:45
ratón
00:21:46
vale
00:21:48
entonces
00:21:50
¿qué habíamos dicho de esta clase?
00:21:52
pues que esta clase
00:21:55
para que
00:21:57
fuera una clase
00:21:59
que generara objetos
00:22:00
capaces de estar a la escucha
00:22:02
de eventos, que eso ya es jugar un papel
00:22:04
especial, pues para ser
00:22:06
clases capaces de estar a la escucha, de captura
00:22:08
de eventos, es decir, jugar ese papel
00:22:10
para que una clase pueda jugar un papel
00:22:12
especial, ¿qué tiene que hacer?
00:22:14
Implementar algo.
00:22:17
Entonces juega ya ese papel especial.
00:22:19
Pues en este caso el papel
00:22:21
que tiene que jugar es el de ser capaz
00:22:23
de escuchar eventos y manejarlos.
00:22:25
Pues lo que tiene que implementar
00:22:27
es una interfaz que se llama
00:22:29
EventHandler, que es la interfaz
00:22:30
que te da el papel de ser capaz de manejar
00:22:32
eventos, como su propio
00:22:35
nombre dice.
00:22:36
Entonces, implements event handler, si no me he equivocado.
00:22:38
Vale, event handler.
00:22:47
¿Me habrá hecho el importe correcto?
00:22:49
Sí.
00:22:50
Vale, como veis nos aparece en amarillito.
00:22:53
El amarillo ya es un aviso.
00:22:56
El amarillo me está diciendo, oye, lo de siempre.
00:22:59
O lo de casi siempre.
00:23:03
Event handler es una clase genérica.
00:23:05
Es decir, te estás convirtiendo en una clase capaz de capturar eventos, de capturar cualquier tipo de evento. Cuidado porque entonces aquí vas a poder generar efectos secundarios porque vas a poder confundir cosas. ¿Por qué no mejor me parametrizas al tipo de evento que estás capturando?
00:23:06
¿vale? ¿por qué no me parametrizas
00:23:30
al tipo de evento? ¿qué tipo de evento estamos capturando?
00:23:33
un evento de ratón
00:23:35
pues entonces la parametrizamos
00:23:36
a mouse event
00:23:39
pero has puesto el método
00:23:41
el método lo has llamado tal cual
00:23:56
se llama en esa interfaz
00:23:59
ahora lo vamos a poner de todas maneras
00:24:00
porque si no, ¿cómo sabe aquí?
00:24:03
y luego lo has instanciado aquí
00:24:05
yo le pongo es event
00:24:06
la fecha
00:24:09
y se lo pongo en todo
00:24:10
ya, claro, ya, pero es que tú
00:24:12
claro, sí, pero eso es lo siguiente
00:24:15
por partes, ¿vale?
00:24:17
entonces
00:24:20
pero hay que entender
00:24:20
lo que quiero es que entendáis de dónde viene ese landa
00:24:23
¿vale? entonces
00:24:25
bueno, pues ya está, esto ya es
00:24:27
una clase capaz
00:24:29
de escuchar eventos
00:24:31
y no cualquier evento, sino
00:24:33
además eventos de ratón
00:24:35
bueno, pues ¿qué pasa cuando una clase
00:24:36
implementa una interfaz?
00:24:39
que tiene que implementar los métodos vacíos
00:24:40
de esa interfaz, por eso me está avisando en rojo
00:24:43
pues vamos a avisarlo
00:24:46
vale, resulta que esta interfaz
00:24:48
tiene un único método vacío
00:24:52
eso ya no suena de la otra clase
00:24:55
interfaz con un único método vacío
00:24:57
interfaz funcional, vale, por ahora lo dejamos aparcado
00:25:00
pero ya sabemos que un interfaz con un único método vacío es una interfaz funcional
00:25:03
¿qué peculiaridad tiene una interfaz funcional?
00:25:06
que la puede implementar directamente poniendo una lámina
00:25:09
¿vale? eso es
00:25:12
pero en realidad es esto
00:25:13
vale, pues entonces
00:25:16
ahora yo aquí ya
00:25:17
sí que tengo que poner
00:25:20
el código de respuesta
00:25:21
a ese evento mover ratón
00:25:23
¿vale? pues vamos a hacerlo
00:25:25
¿qué tenemos que hacer aquí?
00:25:26
sacar las coordenadas
00:25:30
del ratón
00:25:32
en el momento que se produjo el evento
00:25:33
¿vamos a poder sacarlas?
00:25:35
Pues seguro, porque este objeto mouse event es el objeto que tiene dentro todo lo relacionado con el evento de ratón. Malo será que no tenga las posiciones del ratón en ese momento. Malo será. Vamos a cotillar a ver qué tiene el event dentro.
00:25:37
el event dentro
00:25:54
tiene un get x
00:25:58
y un get y directamente
00:26:01
que me da
00:26:02
que tiene toda la pinta de que me da
00:26:05
la posición del ratón
00:26:06
en el momento que se genere ese evento
00:26:08
vale pues
00:26:10
entonces lo que yo tengo es
00:26:11
lo voy a poner aquí aparte
00:26:16
aquí tengo
00:26:17
voy a
00:26:23
aunque esto es un double
00:26:26
voy a quedarme con la posición entera
00:26:27
para que se vea
00:26:30
para que luego
00:26:31
en la etiqueta no se vea tan feo
00:26:33
con todos los decimales
00:26:35
que no tengo que formatearlo a dos decimales
00:26:38
un rollo, me voy a hacer un casting aquí
00:26:40
y me quedo
00:26:42
con la posición y
00:26:44
y aquí me hago el casting
00:26:46
vale, estas son
00:26:58
las posiciones que tenía
00:27:04
el ratón cuando yo lo he movido
00:27:06
el evento ha saltado
00:27:08
y hemos llegado hasta aquí
00:27:10
¿qué es lo que hay que hacer?
00:27:11
pues poner estas posiciones
00:27:14
en el texto de mi etiqueta label
00:27:16
poner esas posiciones en el texto de mi etiqueta label
00:27:19
es decir, hacer aquí algo como esto
00:27:23
label.sectest
00:27:25
coordenadas pero en lugar de 00
00:27:32
esto lo vamos a cortar por aquí
00:27:48
para que sea posición x
00:27:52
el guión otra vez
00:27:54
y aquí cortamos
00:27:58
para que en lugar de 0
00:28:02
ponga posición y
00:28:05
y aquí ya concateno
00:28:07
con el final del
00:28:09
este
00:28:10
y aquí me falta un paréntesis
00:28:13
vale, coordenadas
00:28:18
posición x y en posición
00:28:19
y mayúscula
00:28:21
¡Hala! Pues todo estupendo
00:28:25
si no fuera porque el label no es visible desde aquí
00:28:26
¿verdad?
00:28:29
todo magnífico
00:28:31
el evento ya está completo, coge las
00:28:32
coordenadas del ratón en el momento
00:28:35
en el que se produjo el evento
00:28:36
me las pone aquí
00:28:38
en la etiqueta
00:28:40
pero tengo un pequeño problema
00:28:42
que mi etiqueta label no es visible
00:28:44
desde aquí porque mi etiqueta label
00:28:46
es un método local de start
00:28:48
luego tengo
00:28:51
un pequeño problema
00:28:53
si lo quiero hacer así
00:28:53
¿cómo lo podríamos hacer?
00:28:55
muy fácil
00:29:00
antes que eso
00:29:01
claro
00:29:05
el problema que tengo es que tengo que acceder
00:29:09
desde aquí a esta variable
00:29:12
que es local de este método
00:29:13
solución natural
00:29:14
que es de hecho la que adoptan los
00:29:18
frameworks de, se la inyecto por
00:29:21
constructor, inyección por
00:29:23
constructor, es
00:29:25
que necesito en un método local de una
00:29:27
clase algo, o en
00:29:29
varios, propiedades
00:29:31
de la clase que inyecto por constructor
00:29:33
solución general para muchas situaciones
00:29:35
de este tipo, que
00:29:37
necesitas una etiqueta
00:29:39
Ah, pues no pasa nada, inyectamela
00:29:40
Yo la pongo aquí
00:29:42
Esta es la que voy a usar
00:29:43
Y tú inyectamela, por Dios
00:29:45
Cuando me instancies
00:29:48
¿Vale? Esto se llama inyección por constructor
00:29:49
Que es una arquitectura natural
00:30:09
En una situación en la que nos veamos así
00:30:12
Ahora
00:30:13
Este ya
00:30:15
Sí que va a acceder a la que le hemos
00:30:17
Inyectado por constructor, que será esta
00:30:19
Pero claro, inyectémosela bien
00:30:21
Claro
00:30:23
vale
00:30:26
pues este evento ya está
00:30:30
vamos a ver
00:30:32
si esto nos funciona
00:30:34
si
00:30:36
ay que rapido
00:30:38
vale pues si nos funciona
00:30:40
pero efectivamente
00:30:47
y paramos ahora antes de hacerlo
00:30:52
pero efectivamente
00:30:54
diríamos jolines
00:30:56
tengo que hacer una clase
00:30:57
para cada evento poner el método
00:30:59
de inyectar las cosas y tengo que inyectar un montón
00:31:01
me queda aquí un montón
00:31:04
de componentes
00:31:06
y un montón de clases
00:31:07
pues hombre, entonces ahí es cuando
00:31:10
decimos, a ver, ¿para qué se ha inventado
00:31:11
la programación funcional?
00:31:13
¿Qué es EvenHandler?
00:31:16
Una interfaz funcional
00:31:17
porque solamente tiene un único método
00:31:19
vacío, un único método
00:31:22
que es Handler
00:31:23
¿Cómo podíamos instanciar
00:31:24
objetos de interfaces funcionales
00:31:28
sin necesidad de hacer una clase
00:31:30
aparte y ya instanciar ese objeto
00:31:32
pues me hago una función
00:31:34
lambda sintácticamente correcta
00:31:36
que represente
00:31:38
el código de este método
00:31:40
y esa función lambda
00:31:42
la planto aquí y esa función
00:31:44
lambda ya me está instanciando
00:31:46
un objeto en particular
00:31:48
de esta interfaz funcional
00:31:50
e implementándome ese método
00:31:52
¿vale?
00:31:54
pero paramos un segundito aquí
00:31:56
y ahora lo hacemos después
00:31:58
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 2
- Fecha:
- 5 de mayo de 2026 - 12:37
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 32′ 02″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 126.85 MBytes