1 00:00:00,940 --> 00:00:17,140 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. 2 00:00:17,140 --> 00:00:26,530 pues un panel mondo y lirondo 3 00:00:26,530 --> 00:00:28,210 con una etiqueta en una esquinita 4 00:00:28,210 --> 00:00:30,410 que ponga coordenadas 0, 0 5 00:00:30,410 --> 00:00:33,189 vale, ¿va a pasar algo en esa aplicación? 6 00:00:33,829 --> 00:00:34,750 sí, va a pasar 7 00:00:34,750 --> 00:00:36,829 que cuando se desplace 8 00:00:36,829 --> 00:00:38,609 el ratón, luego ya tenemos 9 00:00:38,609 --> 00:00:40,490 un primer evento, el ratón 10 00:00:40,490 --> 00:00:42,770 moviéndose, ¿sobre quién? 11 00:00:43,009 --> 00:00:43,649 sobre el panel 12 00:00:43,649 --> 00:00:45,990 luego ya vamos identificando 13 00:00:45,990 --> 00:00:48,890 el que tiene que recibir el evento 14 00:00:48,890 --> 00:00:50,229 es el panel, ¿qué evento? 15 00:00:50,229 --> 00:00:54,329 que se mueva el ratón sobre él, vale, pues cuando se mueva el ratón 16 00:00:54,329 --> 00:00:58,289 sobre el panel, yo tengo que poner en la etiqueta 17 00:00:58,289 --> 00:01:01,189 label, las coordenadas del ratón 18 00:01:01,189 --> 00:01:06,189 en ese momento, bueno, más o menos, entonces ya me hago idea, ah, pues 19 00:01:06,189 --> 00:01:10,469 capturar algún evento de ratón en el panel, y en ese evento 20 00:01:10,469 --> 00:01:14,530 sacar, habrá algunos métodos, esperemos, para sacar coordenadas del ratón 21 00:01:14,530 --> 00:01:17,849 y esas coordenadas ponerlas en la label, vale, pues será eso 22 00:01:17,849 --> 00:01:20,969 vale, más eventos 23 00:01:20,969 --> 00:01:23,230 ah pues sí, si pulsamos 24 00:01:23,230 --> 00:01:23,849 una tecla 25 00:01:23,849 --> 00:01:28,480 se tiene que añadir 26 00:01:28,480 --> 00:01:30,640 un botón 27 00:01:30,640 --> 00:01:32,599 en la posición en la que 28 00:01:32,599 --> 00:01:34,239 esté el ratón en ese momento 29 00:01:34,239 --> 00:01:36,780 eso se me hace más raro, como saco yo la posición 30 00:01:36,780 --> 00:01:38,700 del ratón a través 31 00:01:38,700 --> 00:01:40,400 de un evento de teclado 32 00:01:40,400 --> 00:01:42,480 si no tiene nada que ver, no voy a poder 33 00:01:42,480 --> 00:01:44,859 del evento mouse event 34 00:01:44,859 --> 00:01:46,620 puedo sacar todo relacionado 35 00:01:46,620 --> 00:01:48,200 con el ratón en el momento en el que 36 00:01:48,200 --> 00:01:50,959 produjo ese evento, como por ejemplo 37 00:01:50,959 --> 00:01:52,879 la posición, pero del evento 38 00:01:52,879 --> 00:01:54,319 key event que es pulsar una tecla 39 00:01:54,319 --> 00:01:56,719 no voy a poder sacar una posición del ratón 40 00:01:56,719 --> 00:01:58,219 entonces bueno, algo tendremos que pensar 41 00:01:58,219 --> 00:02:00,680 bueno, pues como respuesta a ese evento 42 00:02:00,680 --> 00:02:01,420 key event 43 00:02:01,420 --> 00:02:05,019 tendremos que sacar la posición 44 00:02:05,019 --> 00:02:06,299 del ratón a saber cómo 45 00:02:06,299 --> 00:02:08,000 y crear un botón 46 00:02:08,000 --> 00:02:09,659 con esa posición 47 00:02:09,659 --> 00:02:12,960 con el texto de la tecla que hayamos 48 00:02:12,960 --> 00:02:13,460 pulsado 49 00:02:13,460 --> 00:02:18,560 vale, venga, pues hala 50 00:02:18,560 --> 00:02:21,659 pues vamos a arrancar a hacer esto 51 00:02:21,659 --> 00:02:24,159 aquí la escena 52 00:02:24,159 --> 00:02:25,219 es mínima 53 00:02:25,219 --> 00:02:27,800 un panel y una etiqueta, ya está 54 00:02:27,800 --> 00:02:29,879 no hay más, entonces aquí 55 00:02:29,879 --> 00:02:31,680 no vamos a matar moscas a cañonazos 56 00:02:31,680 --> 00:02:34,020 haciéndonos con fxml 57 00:02:34,020 --> 00:02:35,800 creándonos la escena, luego haciendo 58 00:02:35,800 --> 00:02:37,840 con un controller, no, esa era una 59 00:02:37,840 --> 00:02:39,840 capa que poníamos por 60 00:02:39,840 --> 00:02:42,020 encima de la estructura básica 61 00:02:42,020 --> 00:02:43,740 de JavaFX que ya hicimos 62 00:02:43,740 --> 00:02:45,360 en el primer ejercicio por lo menos 63 00:02:45,360 --> 00:02:46,740 o en los dos primeros, no lo sé 64 00:02:46,740 --> 00:02:49,939 que era, yo tengo mi aplicación 65 00:02:49,939 --> 00:02:53,479 en el que creo el panel, pongo componentes en el panel 66 00:02:53,479 --> 00:02:57,080 y le añado escuchadores de evento a los componentes 67 00:02:57,080 --> 00:02:58,960 esa es la estructura de JavaFX y no hay más 68 00:02:58,960 --> 00:03:02,159 otra cosa es que cuando ya empieza a tener un montón de componentes 69 00:03:02,159 --> 00:03:06,240 y la cosa engorda, puedo poner una capa por encima 70 00:03:06,240 --> 00:03:08,060 una capa por encima 71 00:03:08,060 --> 00:03:11,479 que me la dan las librerías de JavaFXML 72 00:03:11,479 --> 00:03:15,060 que son unas librerías que hacen cosas por mí 73 00:03:15,060 --> 00:03:17,960 entonces yo esas librerías 74 00:03:17,960 --> 00:03:19,560 las importa, las importo 75 00:03:19,560 --> 00:03:20,639 porque están en las dependencias 76 00:03:20,639 --> 00:03:23,560 y que hago, me creo un fichero 77 00:03:23,560 --> 00:03:25,780 xml y en ese fichero 78 00:03:25,780 --> 00:03:27,219 xml le explico 79 00:03:27,219 --> 00:03:29,539 lo que me da pereza hacer por código 80 00:03:29,539 --> 00:03:30,539 porque son muchas cosas 81 00:03:30,539 --> 00:03:32,680 se lo explico en ese xml 82 00:03:32,680 --> 00:03:35,539 entonces en lugar de explicárselo 83 00:03:35,539 --> 00:03:37,719 porque yo la sintaxis de sf 84 00:03:37,719 --> 00:03:39,280 xml no me la puedo usar de memoria 85 00:03:39,280 --> 00:03:41,879 afortunadamente tengo un software 86 00:03:41,879 --> 00:03:42,840 que es el steam builder 87 00:03:42,840 --> 00:03:44,960 que me permite arrastrando 88 00:03:44,960 --> 00:03:46,340 crear ese fxml 89 00:03:46,340 --> 00:03:48,759 entonces fxml es una explicación 90 00:03:48,759 --> 00:03:51,280 de cuáles son mis controles 91 00:03:51,280 --> 00:03:53,000 y con qué eventos 92 00:03:53,000 --> 00:03:55,039 va a responder cada control, es una explicación 93 00:03:55,039 --> 00:03:57,340 dada en un lenguaje extraño como es el fxml 94 00:03:57,340 --> 00:03:59,319 y ahora las librerías 95 00:03:59,319 --> 00:04:01,120 de fxml, las que hemos importado 96 00:04:01,120 --> 00:04:03,379 desde maven, cogen esa explicación 97 00:04:03,379 --> 00:04:04,879 y lo transforman 98 00:04:04,879 --> 00:04:07,000 internamente en un código que ya sí 99 00:04:07,000 --> 00:04:08,979 que responde al patrón que vimos 100 00:04:08,979 --> 00:04:11,300 en los primeros ejercicios 101 00:04:11,300 --> 00:04:12,879 entonces ahora cuando 102 00:04:12,879 --> 00:04:14,300 trabajamos con fxml 103 00:04:14,300 --> 00:04:16,980 estamos tapando todo eso, estamos poniendo una capa 104 00:04:16,980 --> 00:04:19,000 por encima, pero lo de abajo no ha desaparecido 105 00:04:19,000 --> 00:04:20,959 lo que pasa es que para no poner a mano 106 00:04:20,959 --> 00:04:22,920 todo eso, pues venga 107 00:04:22,920 --> 00:04:24,399 te lo explico con el fxml 108 00:04:24,399 --> 00:04:26,899 que voy a poner y como va a responder cada cosa 109 00:04:26,899 --> 00:04:29,019 te doy el fxml y tú librerías 110 00:04:29,019 --> 00:04:30,800 de fxml 111 00:04:30,800 --> 00:04:33,079 que están en las dependencias, tú ya construyes el código 112 00:04:33,079 --> 00:04:34,939 eso es lo que estamos haciendo, poner un patrón 113 00:04:34,939 --> 00:04:36,660 por encima, pero aquí 114 00:04:36,660 --> 00:04:38,860 que tengo un panel y una etiqueta, pues no 115 00:04:38,860 --> 00:04:41,040 lo vamos a hacer directamente 116 00:04:41,040 --> 00:04:42,579 vamos a hacer a mano 117 00:04:42,579 --> 00:04:44,579 Porque no somos tontos 118 00:04:44,579 --> 00:04:46,800 Pues venga 119 00:04:46,800 --> 00:04:47,540 Ala 120 00:04:47,540 --> 00:04:51,839 Nuestra aplicación entonces está aquí limpita 121 00:04:51,839 --> 00:04:54,480 Vamos a ver hasta donde llegamos 122 00:04:54,480 --> 00:04:55,579 Pues venga 123 00:04:55,579 --> 00:04:56,660 Me hago mi paquete 124 00:04:56,660 --> 00:05:00,040 Para hacer la aplicación 125 00:05:00,040 --> 00:05:09,680 Y aquí me voy a hacer 126 00:05:09,680 --> 00:05:11,819 Mi clase aplicación 127 00:05:11,819 --> 00:05:18,930 Con su método main 128 00:05:18,930 --> 00:05:21,649 Vale aquí 129 00:05:21,649 --> 00:05:24,050 acordaos de verificar 130 00:05:24,050 --> 00:05:25,829 que en el pom que yo os de 131 00:05:25,829 --> 00:05:31,540 en el plugin de fx 132 00:05:31,540 --> 00:05:33,540 estará 133 00:05:33,540 --> 00:05:34,740 puesto la clase 134 00:05:34,740 --> 00:05:36,360 que tiene el método main 135 00:05:36,360 --> 00:05:39,180 entonces yo aquí habré puesto cualquiera, esta misma 136 00:05:39,180 --> 00:05:41,519 seguramente, aseguraos 137 00:05:41,519 --> 00:05:43,420 de que la clase en la que vosotros 138 00:05:43,420 --> 00:05:45,339 tenéis vuestro main es la que está 139 00:05:45,339 --> 00:05:47,360 aquí, vale, porque si la habéis 140 00:05:47,360 --> 00:05:49,420 llamado de otra manera o la habéis puesto en otro 141 00:05:49,420 --> 00:05:51,680 paquete, pues tendréis 142 00:05:51,680 --> 00:05:52,579 que poner aquí esa 143 00:05:52,579 --> 00:05:55,660 aseguraos, estaría o no estará 144 00:05:55,660 --> 00:05:57,160 porque en vuestro caso no aplica 145 00:05:57,160 --> 00:05:59,420 en mi caso 146 00:05:59,420 --> 00:06:01,639 para no tener que cambiarlo al paquete 147 00:06:01,639 --> 00:06:03,779 lo he llamado tal cual y a la clase 148 00:06:03,779 --> 00:06:05,720 la he llamado tal cual, con lo cual no te voy a cambiar 149 00:06:05,720 --> 00:06:06,379 nada 150 00:06:06,379 --> 00:06:09,560 vale, bueno pues 151 00:06:09,560 --> 00:06:11,839 entonces, si esto queremos que sea 152 00:06:11,839 --> 00:06:13,860 el punto de arranque de una aplicación 153 00:06:13,860 --> 00:06:14,699 JavaFX 154 00:06:14,699 --> 00:06:16,860 tiene que heredar de 155 00:06:16,860 --> 00:06:19,819 application, tiene que heredar 156 00:06:19,819 --> 00:06:23,319 de aquí, y si hereda 157 00:06:23,319 --> 00:06:25,319 de aquí, tiene que 158 00:06:25,319 --> 00:06:27,040 implementar el 159 00:06:27,040 --> 00:06:29,579 bueno, primero la importo, tiene que implementar 160 00:06:29,579 --> 00:06:31,360 el método start 161 00:06:31,360 --> 00:06:35,199 este, en el 162 00:06:35,199 --> 00:06:36,939 método start es, en el que 163 00:06:36,939 --> 00:06:38,959 construimos la escena 164 00:06:38,959 --> 00:06:39,899 o las escenas 165 00:06:39,899 --> 00:06:43,199 y añadimos 166 00:06:43,199 --> 00:06:45,160 los eventos de respuesta 167 00:06:45,160 --> 00:06:46,800 a los controles de esa escena 168 00:06:46,800 --> 00:06:48,639 ahí hacemos todo eso 169 00:06:48,639 --> 00:06:51,439 repito, que trabajamos con fxml 170 00:06:51,439 --> 00:06:53,000 pues mi construir 171 00:06:53,000 --> 00:06:54,860 la escena, en lugar de poner yo los 172 00:06:54,860 --> 00:06:56,939 paneles, los botones 173 00:06:56,939 --> 00:06:58,660 todo, mi construir la escena va a ser 174 00:06:58,660 --> 00:07:01,180 oye, este es el fxml, construyétela tú desde aquí 175 00:07:01,180 --> 00:07:02,939 ¿vale? pero nosotros 176 00:07:02,939 --> 00:07:04,399 aquí no tenemos fxml, pues venga 177 00:07:04,399 --> 00:07:07,139 luego para que esta aplicación lance 178 00:07:07,139 --> 00:07:09,040 recordad que tenemos que llamar al método 179 00:07:09,040 --> 00:07:10,819 lance, pasándole los 180 00:07:10,819 --> 00:07:13,220 hipotéticos argumentos 181 00:07:13,220 --> 00:07:14,120 que haya aquí 182 00:07:14,120 --> 00:07:17,939 vale, pues entonces 183 00:07:17,939 --> 00:07:20,740 ¿qué vamos a hacer aquí? 184 00:07:20,740 --> 00:07:22,800 pues recordad que 185 00:07:22,800 --> 00:07:24,540 aquí, esto lo vimos 186 00:07:24,540 --> 00:07:26,720 en nuestra primera aplicación 187 00:07:26,720 --> 00:07:28,139 ya vimos que 188 00:07:28,139 --> 00:07:30,819 teníamos que crear una escena 189 00:07:30,819 --> 00:07:32,899 y ahora ya fijar 190 00:07:32,899 --> 00:07:34,980 a mi escenario, a mi stage 191 00:07:34,980 --> 00:07:36,980 esa escena y hacerla 192 00:07:36,980 --> 00:07:39,000 visible, entonces teníamos 193 00:07:39,000 --> 00:07:40,300 que crear aquí una escena 194 00:07:40,300 --> 00:07:45,829 que esto 195 00:07:45,829 --> 00:07:48,550 se creaba así, verdad 196 00:07:48,550 --> 00:07:54,500 ay la madre que te trajo 197 00:07:54,500 --> 00:07:57,120 que llevo diciendo 20 minutos 198 00:07:57,120 --> 00:07:58,560 que tenemos 199 00:07:58,560 --> 00:08:00,980 dos posibilidades, construir la escena 200 00:08:00,980 --> 00:08:01,459 a pelo 201 00:08:01,459 --> 00:08:04,720 o explicar 202 00:08:04,720 --> 00:08:06,860 lo que queremos en un fxml 203 00:08:06,860 --> 00:08:09,199 y decirle aquí, este es el fxml 204 00:08:09,199 --> 00:08:10,879 construyétela tú, o construirla a pelo 205 00:08:10,879 --> 00:08:12,959 entonces, estamos en ese segundo caso 206 00:08:12,959 --> 00:08:14,980 construirla a pelo, ¿vale? 207 00:08:17,439 --> 00:08:18,899 ¿qué pasa con el mundo y el hirondo? 208 00:08:19,040 --> 00:08:20,639 ¿es de algún meme vuestro 209 00:08:20,639 --> 00:08:22,339 de estas gilipollezas que veis en TikTok? 210 00:08:26,009 --> 00:08:27,689 porque él dice el hirondo y el hirondo 211 00:08:27,689 --> 00:08:28,930 y a pelo 212 00:08:33,509 --> 00:08:36,629 Pues no lo sé, vendrá del gremio. 213 00:08:38,529 --> 00:08:40,629 Bueno, pues nada, ¿hay algo más que diga que tenga que repetir? 214 00:08:42,789 --> 00:08:44,730 Tiramillas y tiramillas. 215 00:08:45,450 --> 00:08:47,230 Ah, no, el tiramillas no suelo decirlo. 216 00:08:51,009 --> 00:08:56,309 Bueno, pues entonces, la escena tenía que vamos a hacer a mano, 217 00:08:56,309 --> 00:08:59,210 no cargándola de un XML, ¿vale? 218 00:08:59,250 --> 00:09:00,590 No cargándola de un XML. 219 00:09:00,590 --> 00:09:02,190 la escena 220 00:09:02,190 --> 00:09:04,409 recordad que necesitaba 221 00:09:04,409 --> 00:09:07,110 un nodo raíz al que aferrarse 222 00:09:07,110 --> 00:09:08,490 y luego un tamaño 223 00:09:08,490 --> 00:09:10,350 un tamaño, el tamaño yo que sé 224 00:09:10,350 --> 00:09:12,809 400 225 00:09:12,809 --> 00:09:13,330 400 226 00:09:13,330 --> 00:09:16,549 esto es lo que necesitaba la escena 227 00:09:16,549 --> 00:09:18,789 y ahora, este nodo raíz 228 00:09:18,789 --> 00:09:20,730 normalmente que va a ser 229 00:09:20,730 --> 00:09:21,190 un panel 230 00:09:21,190 --> 00:09:24,110 la escena se aferra a un panel 231 00:09:24,110 --> 00:09:26,529 y ya en ese panel ponemos las cositas 232 00:09:26,529 --> 00:09:28,330 pues ese panel 233 00:09:28,330 --> 00:09:30,190 que sea 234 00:09:30,190 --> 00:09:35,740 me han dicho un panel normal y corriente 235 00:09:35,740 --> 00:09:37,259 pues esto podrá ser, ¿no? 236 00:09:41,049 --> 00:09:41,509 ala 237 00:09:41,509 --> 00:09:44,269 y ahora a mi stage 238 00:09:44,269 --> 00:09:46,470 a mi stage 239 00:09:46,470 --> 00:09:47,649 le fijaba la escena 240 00:09:47,649 --> 00:09:49,950 tendrá un método 241 00:09:49,950 --> 00:09:52,529 setScene, le fijaba 242 00:09:52,529 --> 00:09:54,330 la escena y ahora la hacía 243 00:09:54,330 --> 00:09:55,809 visible o algo así, ¿verdad? 244 00:09:56,809 --> 00:09:58,169 esto tenía un punto show 245 00:09:58,169 --> 00:09:59,429 o tenía algo, sí 246 00:09:59,429 --> 00:10:01,789 vale 247 00:10:01,789 --> 00:10:03,529 pues ya tenemos 248 00:10:03,529 --> 00:10:06,330 una escena asociada a un panel 249 00:10:06,330 --> 00:10:08,450 vamos a ejecutar esto 250 00:10:08,450 --> 00:10:09,570 a ver si hasta aquí vamos bien 251 00:10:09,570 --> 00:10:12,129 como es un proyecto maven 252 00:10:12,129 --> 00:10:14,529 recordad que no se ejecuta 253 00:10:14,529 --> 00:10:16,190 a través de la máquina virtual 254 00:10:16,190 --> 00:10:18,129 sino se ejecuta llamando a maven 255 00:10:18,129 --> 00:10:20,389 y en la primera 256 00:10:20,389 --> 00:10:21,669 ejecución le decimos 257 00:10:21,669 --> 00:10:24,090 oye tú runas 258 00:10:24,090 --> 00:10:26,309 maven build porque te ejecuto 259 00:10:26,309 --> 00:10:27,590 a través de ti maven 260 00:10:27,590 --> 00:10:30,389 maven build y él nos dice vale muy bien 261 00:10:30,389 --> 00:10:31,470 y que quieres que haga yo 262 00:10:31,470 --> 00:10:33,950 Pues lo que quiero que hagas es llamar 263 00:10:33,950 --> 00:10:35,809 Al plugin JavaFX 264 00:10:35,809 --> 00:10:38,049 Que te he puesto en el POM 265 00:10:38,049 --> 00:10:39,870 En particular quiero 266 00:10:39,870 --> 00:10:41,529 Que hagas run 267 00:10:41,529 --> 00:10:42,710 Vale 268 00:10:42,710 --> 00:10:45,350 A ver si hemos tenido suerte hasta aquí 269 00:10:45,350 --> 00:10:51,870 Vale, pues ya está, este es nuestro panel 270 00:10:51,870 --> 00:10:52,950 Que no tiene nada 271 00:10:52,950 --> 00:10:55,210 Pues ahora ya vamos a empezar a añadirle 272 00:10:55,210 --> 00:10:57,350 Los controles, que en nuestro caso es una etiqueta 273 00:10:57,350 --> 00:10:57,909 Sin más 274 00:10:57,909 --> 00:11:00,029 Y luego ya los eventos 275 00:11:00,029 --> 00:11:01,570 Que son dos 276 00:11:01,570 --> 00:11:04,690 Mouse event sobre el panel y keypress 277 00:11:04,690 --> 00:11:06,970 sobre el panel 278 00:11:06,970 --> 00:11:08,990 pues venga 279 00:11:08,990 --> 00:11:10,330 vamos a ver 280 00:11:10,330 --> 00:11:14,419 una etiqueta 281 00:11:14,419 --> 00:11:24,750 new label 282 00:11:24,750 --> 00:11:27,789 vale, inicialmente entiendo yo que el 283 00:11:27,789 --> 00:11:29,669 constructor tendrá la opción de a la vez que 284 00:11:29,669 --> 00:11:31,870 instancias ponerle ya un texto, aunque luego el texto 285 00:11:31,870 --> 00:11:33,210 lo podrás cambiar con set text 286 00:11:33,210 --> 00:11:35,970 y este texto de partida era 287 00:11:35,970 --> 00:11:39,210 coordenadas 288 00:11:39,210 --> 00:11:41,850 nos han dicho que de partida le pongamos 289 00:11:41,850 --> 00:11:43,330 esto, o algo así 290 00:11:43,330 --> 00:11:51,590 cuidado con todos los import que hagáis 291 00:11:51,590 --> 00:11:52,809 a ver si a toda velocidad 292 00:11:52,809 --> 00:11:54,850 importáis de cualquier lado 293 00:11:54,850 --> 00:11:56,870 no, siempre tenéis que importar del 294 00:11:56,870 --> 00:11:59,750 vale, y ahora tenemos que añadir 295 00:11:59,750 --> 00:12:03,470 la etiqueta 296 00:12:03,470 --> 00:12:04,809 a este de aquí 297 00:12:04,809 --> 00:12:07,289 al panel, vale 298 00:12:07,289 --> 00:12:08,529 entonces 299 00:12:08,529 --> 00:12:11,429 este tendrá un 300 00:12:11,429 --> 00:12:21,529 algún método 301 00:12:21,529 --> 00:12:23,090 para poner el componente en una posición 302 00:12:23,090 --> 00:12:24,049 concreta 303 00:12:24,049 --> 00:12:26,009 que 304 00:12:26,009 --> 00:12:31,840 setLayoutX y setLayoutY 305 00:12:31,840 --> 00:12:32,419 no, a ver 306 00:12:32,419 --> 00:12:38,679 a ver cuál es, si no lo 307 00:12:38,679 --> 00:12:39,879 busco 308 00:12:39,879 --> 00:12:47,350 sí, pero para ponerle 309 00:12:47,350 --> 00:12:48,110 el componente 310 00:12:48,110 --> 00:12:55,519 estos son los eventos 311 00:12:55,519 --> 00:13:06,899 a ver, voy a mirarlo 312 00:13:06,899 --> 00:13:09,320 que lo tengo 313 00:13:09,320 --> 00:13:10,159 por aquí 314 00:13:10,159 --> 00:13:14,000 Vale, aquí lo tengo 315 00:13:14,000 --> 00:13:19,360 Ah, vale, vale 316 00:13:19,360 --> 00:13:20,720 Que tengo que coger los estos 317 00:13:20,720 --> 00:13:22,899 Vale, vale, tengo que coger los nodos 318 00:13:22,899 --> 00:13:24,179 Y agregárselo como nodo 319 00:13:24,179 --> 00:13:26,600 Vale, vale, entonces 320 00:13:26,600 --> 00:13:27,299 Ok 321 00:13:27,299 --> 00:13:30,120 Vale, entonces, a ver 322 00:13:30,120 --> 00:13:30,840 Al 323 00:13:30,840 --> 00:13:34,399 Para añadir elementos al panel 324 00:13:34,399 --> 00:13:37,379 Yo del panel 325 00:13:37,379 --> 00:13:39,299 Cojo 326 00:13:39,299 --> 00:13:44,200 Uy, este no, cojo su lista 327 00:13:44,200 --> 00:13:50,019 veis el panel tiene 328 00:13:50,019 --> 00:13:52,059 un método getChildren 329 00:13:52,059 --> 00:13:54,240 que nos da la lista 330 00:13:54,240 --> 00:13:56,259 de los elementos que tiene 331 00:13:56,259 --> 00:13:58,460 ese panel, pues a la lista de elementos 332 00:13:58,460 --> 00:14:00,539 que tiene, le voy a poner la etiqueta 333 00:14:00,539 --> 00:14:01,419 ¿vale? 334 00:14:02,059 --> 00:14:04,259 estas cosas concretas, o sea cuando uno 335 00:14:04,259 --> 00:14:06,360 tiene, lo que decíamos ayer, uno tiene 336 00:14:06,360 --> 00:14:08,399 la idea de lo que 337 00:14:08,399 --> 00:14:10,120 tiene que hacer, perfectamente acotado 338 00:14:10,120 --> 00:14:11,460 de su diseño, lo que tiene que hacer 339 00:14:11,460 --> 00:14:14,279 para una consulta concreta 340 00:14:14,279 --> 00:14:16,139 pues hombre no puede ir ahí explorando 341 00:14:16,139 --> 00:14:18,059 los métodos, buscando 342 00:14:18,059 --> 00:14:19,960 sería lo ideal ir probando 343 00:14:19,960 --> 00:14:22,159 pero una cosa muy concreta pues nos ahorramos 344 00:14:22,159 --> 00:14:24,259 tiempo, se lo preguntamos a la guía y ya está 345 00:14:24,259 --> 00:14:26,039 si es que no vemos 346 00:14:26,039 --> 00:14:28,080 en el examen no obviamente, pero claro en el examen 347 00:14:28,080 --> 00:14:30,340 no vamos a poner nada que tengáis que averiguar 348 00:14:30,340 --> 00:14:32,200 vosotros, bueno pues 349 00:14:32,200 --> 00:14:33,340 entonces este 350 00:14:33,340 --> 00:14:36,259 me dice la ayuda que me dice 351 00:14:36,259 --> 00:14:38,399 todos los nodos que están en ese panel 352 00:14:38,399 --> 00:14:40,299 pues voy a añadirle 353 00:14:40,299 --> 00:14:42,620 yo la etiqueta 354 00:14:42,620 --> 00:14:43,960 ¿vale? 355 00:14:44,279 --> 00:14:46,759 pero a saber 356 00:14:46,759 --> 00:14:48,299 donde nos la ha puesto 357 00:14:48,299 --> 00:14:51,100 aquí no hemos hablado de posición en ningún momento 358 00:14:51,100 --> 00:14:52,960 a saber donde nos la ha puesto 359 00:14:52,960 --> 00:14:54,299 entonces 360 00:14:54,299 --> 00:14:57,320 vamos a ejecutar 361 00:14:57,320 --> 00:14:58,779 esto a ver donde me ha puesto la etiqueta 362 00:14:58,779 --> 00:15:10,450 bueno, por defecto me la ha puesto en la posición 363 00:15:10,450 --> 00:15:11,649 0,0, estupendo 364 00:15:11,649 --> 00:15:12,830 vale 365 00:15:12,830 --> 00:15:16,269 si yo quisiera ponerla en otra posición 366 00:15:16,269 --> 00:15:18,370 tendría que averiguar 367 00:15:18,370 --> 00:15:20,690 como cambiar la posición 368 00:15:20,690 --> 00:15:21,669 de un componente 369 00:15:21,669 --> 00:15:23,690 Y ahí mirando 370 00:15:23,690 --> 00:15:25,850 Ya si que llegaríamos a ese método 371 00:15:25,850 --> 00:15:26,730 Que estabais diciendo 372 00:15:26,730 --> 00:15:29,009 SetLayout 373 00:15:29,009 --> 00:15:31,210 Me dice, oye tu componente 374 00:15:31,210 --> 00:15:33,470 Colócate en esta posición, vamos a imaginar que queremos 375 00:15:33,470 --> 00:15:34,049 La posición 376 00:15:34,049 --> 00:15:37,070 50 para la X 377 00:15:37,070 --> 00:15:43,039 No, lo que yo quería 378 00:15:43,039 --> 00:15:45,100 Es añadirle un componente a un panel 379 00:15:45,100 --> 00:15:45,840 De tipo panel 380 00:15:45,840 --> 00:15:49,139 Esto es otra cosa, esto es fijar 381 00:15:49,139 --> 00:15:49,440 La 382 00:15:49,440 --> 00:15:52,659 Claro, la posición de ese componente 383 00:15:52,659 --> 00:16:02,730 Por ejemplo 384 00:16:02,730 --> 00:16:06,289 Si yo le fijo a una etiqueta 385 00:16:06,289 --> 00:16:07,889 A la etiqueta label que acabo de hacer 386 00:16:07,889 --> 00:16:10,750 Le fijo estas coordenadas de posición 387 00:16:10,750 --> 00:16:11,690 Y luego se la añado 388 00:16:11,690 --> 00:16:13,830 Pues entiendo que me la va a poner en otro sitio 389 00:16:13,830 --> 00:16:15,990 Vamos a ver 390 00:16:15,990 --> 00:16:17,970 Aquí me la había puesto en el sitio por defecto 391 00:16:17,970 --> 00:16:18,690 Que es 0, 0 392 00:16:18,690 --> 00:16:21,549 Vamos a ver ahora donde me la pone 393 00:16:21,549 --> 00:16:29,269 Efectivamente me la ha puesto en otra posición 394 00:16:29,269 --> 00:16:30,629 Vale 395 00:16:30,629 --> 00:16:33,409 Bueno pero nos gustaba 396 00:16:33,409 --> 00:16:35,129 la que tenía, la posición 00 397 00:16:35,129 --> 00:16:37,250 como es la por defecto, esto lo puedo 398 00:16:37,250 --> 00:16:42,419 entonces quitar, ahí se queda 399 00:16:42,419 --> 00:16:43,059 comentado 400 00:16:43,059 --> 00:16:44,779 vale 401 00:16:44,779 --> 00:16:48,440 bueno, pues ya tengo construida mi escena 402 00:16:48,440 --> 00:16:50,419 ya no hay más nodos, ni más nada 403 00:16:50,419 --> 00:16:52,159 que tenga que añadirle a mi panel 404 00:16:52,159 --> 00:16:54,399 la etiqueta, todo lo que viene 405 00:16:54,399 --> 00:16:56,500 ahora, es ahora capturar 406 00:16:56,500 --> 00:16:58,179 eventos, aquí no hay 407 00:16:58,179 --> 00:17:00,179 controller, ni hay nada, porque el controller 408 00:17:00,179 --> 00:17:01,700 el controller, repito 409 00:17:01,700 --> 00:17:04,240 es una clase que hacemos 410 00:17:04,240 --> 00:17:06,319 para que la entiendan las librerías 411 00:17:06,319 --> 00:17:08,440 de JavaFX y la conviertan 412 00:17:08,440 --> 00:17:10,359 en lo que vamos a hacer nosotros ahora 413 00:17:10,359 --> 00:17:12,380 a mano. Pero aquí no tenemos 414 00:17:12,380 --> 00:17:13,660 a JavaFX ML 415 00:17:13,660 --> 00:17:16,339 para decirle, oye tú, hazme 416 00:17:16,339 --> 00:17:18,259 estos eventos, yo te paso los 417 00:17:18,259 --> 00:17:19,740 métodos en el control y házmelos tú. 418 00:17:20,160 --> 00:17:22,319 No, aquí no tenemos eso, como cual es lo que vamos a hacer nosotros. 419 00:17:23,559 --> 00:17:24,019 Pues venga. 420 00:17:25,640 --> 00:17:26,420 ¿Qué eventos 421 00:17:26,420 --> 00:17:27,160 queremos capturar? 422 00:17:28,440 --> 00:17:29,240 El primero. 423 00:17:30,539 --> 00:17:31,740 El propio panel 424 00:17:31,740 --> 00:17:34,259 es un evento que va a recibir el panel, 425 00:17:34,259 --> 00:17:35,980 no la etiqueta. Podría ser un evento 426 00:17:35,980 --> 00:17:38,240 de la etiqueta, que cuando pinchemos en la etiqueta 427 00:17:38,240 --> 00:17:40,099 pase algo, pero no es un 428 00:17:40,099 --> 00:17:41,940 evento que va a recibir la etiqueta, es un evento 429 00:17:41,940 --> 00:17:44,079 que va a recibir el panel, cuando se 430 00:17:44,079 --> 00:17:45,960 mueva el ratón sobre el panel que pase 431 00:17:45,960 --> 00:17:47,920 algo, vale, pues 432 00:17:47,920 --> 00:17:49,940 como fijábamos la respuesta 433 00:17:49,940 --> 00:17:51,940 a un evento, cuando 434 00:17:51,940 --> 00:17:53,259 lo hacíamos a pelo 435 00:17:53,259 --> 00:17:55,039 como Miguel 436 00:17:55,039 --> 00:17:57,900 sin tener 437 00:17:57,900 --> 00:18:00,019 FXML, que nos pone 438 00:18:00,019 --> 00:18:01,920 un controlador, que es una especie 439 00:18:01,920 --> 00:18:04,079 de capa donde yo lo pongo y él ya se lo 440 00:18:04,079 --> 00:18:08,039 pues como lo hacíamos, pues cogíamos el componente 441 00:18:08,039 --> 00:18:10,519 que iba a recibir el evento, en nuestro caso se llama root 442 00:18:10,519 --> 00:18:14,140 y buscábamos aquí los métodos 443 00:18:14,140 --> 00:18:15,460 set on bla bla bla 444 00:18:15,460 --> 00:18:18,799 y estos métodos set on bla bla bla 445 00:18:18,799 --> 00:18:22,440 me dicen todos los eventos que puede recibir 446 00:18:22,440 --> 00:18:25,880 y yo le paso dentro el código de respuesta 447 00:18:25,880 --> 00:18:28,640 pues tendremos que buscar aquí por el propio nombre 448 00:18:28,640 --> 00:18:31,519 y por la ayuda, el que pegue al ratón moviéndose 449 00:18:31,519 --> 00:18:33,380 ¿vale? 450 00:18:33,380 --> 00:18:35,839 pues si vamos aquí buscándolos todos 451 00:18:35,839 --> 00:18:37,319 seton bla bla bla aquí 452 00:18:37,319 --> 00:18:39,380 no se cuanto bla bla bla 453 00:18:39,380 --> 00:18:42,039 veis no tiene 454 00:18:42,039 --> 00:18:43,380 un set on action 455 00:18:43,380 --> 00:18:45,859 porque el panel no tiene evento por defecto 456 00:18:45,859 --> 00:18:47,680 recordad siempre que on action 457 00:18:47,680 --> 00:18:50,079 es el evento por defecto de un componente 458 00:18:50,079 --> 00:18:51,980 si esto en lugar de un panel 459 00:18:51,980 --> 00:18:53,819 fuera un botón veríamos 460 00:18:53,819 --> 00:18:55,920 un set on action porque el botón si tiene 461 00:18:55,920 --> 00:18:57,720 un evento por defecto, este es un panel no tiene 462 00:18:57,720 --> 00:18:59,359 evento, que se hace por defecto con un panel 463 00:18:59,359 --> 00:19:01,819 ni idea, por eso no lo tiene 464 00:19:01,819 --> 00:19:03,880 vamos a ver si tiene mover ratón 465 00:19:03,880 --> 00:19:05,900 bueno, pues seguimos aquí bajando 466 00:19:05,900 --> 00:19:09,380 bajando, tiene cosas 467 00:19:09,380 --> 00:19:10,079 de ratón 468 00:19:10,079 --> 00:19:13,319 pues tiene toda la pinta de que este 469 00:19:13,319 --> 00:19:15,380 se adapta a lo que nos han dicho, cuando el ratón 470 00:19:15,380 --> 00:19:19,170 se mueva, cuando has movido 471 00:19:19,170 --> 00:19:21,230 el ratón, pues tiene toda la 472 00:19:21,230 --> 00:19:22,329 pinta de que este es el evento 473 00:19:22,329 --> 00:19:25,009 que salta cuando tú mueves el ratón sobre 474 00:19:25,009 --> 00:19:26,470 ese panel, cuando tú lo mueves 475 00:19:26,470 --> 00:19:29,069 por su nombre, este es el evento de cuando 476 00:19:29,069 --> 00:19:31,029 tú entras con el ratón en ese panel 477 00:19:31,029 --> 00:19:33,390 el evento de cuando tú sales 478 00:19:33,390 --> 00:19:35,269 con el ratón de ese panel 479 00:19:35,269 --> 00:19:37,029 pero este es el evento cuando tú lo mueves 480 00:19:37,029 --> 00:19:39,390 pues este 481 00:19:39,390 --> 00:19:41,269 es el que queremos 482 00:19:41,269 --> 00:19:42,849 y ahora 483 00:19:42,849 --> 00:19:49,029 ahora venía lo bonito 484 00:19:49,029 --> 00:19:51,650 vale, que teníamos 485 00:19:51,650 --> 00:19:52,309 que poner aquí 486 00:19:52,309 --> 00:19:54,630 pues aquí teníamos que poner 487 00:19:54,630 --> 00:19:56,710 un objeto 488 00:19:56,710 --> 00:20:01,349 vale, que tuviera 489 00:20:01,349 --> 00:20:02,990 dentro el método 490 00:20:02,990 --> 00:20:05,309 que tuviera dentro implementado 491 00:20:05,309 --> 00:20:07,390 el método con la respuesta 492 00:20:07,390 --> 00:20:08,490 a ese evento 493 00:20:08,490 --> 00:20:10,470 eso es lo que voy a poner ahí 494 00:20:10,470 --> 00:20:11,849 una instancia 495 00:20:11,849 --> 00:20:14,369 de una clase 496 00:20:14,369 --> 00:20:16,430 que tuviera dentro 497 00:20:16,430 --> 00:20:19,349 un método con la respuesta 498 00:20:19,349 --> 00:20:20,849 a este evento 499 00:20:20,849 --> 00:20:22,589 que en nuestro caso tendrá que ser 500 00:20:22,589 --> 00:20:25,269 capturar las coordenadas del ratón 501 00:20:25,269 --> 00:20:26,490 y ponerlas en la etiqueta 502 00:20:26,490 --> 00:20:29,210 vale, pues entonces 503 00:20:29,210 --> 00:20:31,309 vamos a hacerlo 504 00:20:31,309 --> 00:20:32,829 primero limpio completo 505 00:20:32,829 --> 00:20:35,109 y luego vamos a hacer la trampa 506 00:20:35,109 --> 00:20:37,349 bonita con la programación funcional 507 00:20:37,349 --> 00:20:38,609 que ya sabéis del otro día 508 00:20:38,609 --> 00:20:40,809 vale, vamos a hacerlo primero 509 00:20:40,809 --> 00:20:42,109 pues como es 510 00:20:42,109 --> 00:20:45,230 de principio a fin, ya no digo más a pelo 511 00:20:45,230 --> 00:20:47,049 porque os reís 512 00:20:47,049 --> 00:20:49,009 bueno, pues entonces 513 00:20:49,009 --> 00:20:51,089 yo necesito aquí un objeto 514 00:20:51,089 --> 00:20:53,170 pues por ejemplo 515 00:20:53,170 --> 00:20:54,349 lo voy a llamar new 516 00:20:54,349 --> 00:20:56,410 captura 517 00:20:56,410 --> 00:20:58,029 ratón 518 00:20:58,029 --> 00:21:03,910 necesito un objeto new captura ratón 519 00:21:03,910 --> 00:21:05,950 y necesito que este objeto 520 00:21:05,950 --> 00:21:07,509 tenga dentro 521 00:21:07,509 --> 00:21:10,049 el método con la respuesta 522 00:21:10,049 --> 00:21:11,789 a ese evento de mover el ratón 523 00:21:11,789 --> 00:21:13,970 lo estoy haciendo tal y como lo hicimos 524 00:21:13,970 --> 00:21:16,690 cuando hicimos esto en el primer proyecto 525 00:21:16,690 --> 00:21:18,730 vale, pues me tengo que hacer 526 00:21:18,730 --> 00:21:19,930 la clase captura ratón 527 00:21:19,930 --> 00:21:22,390 a ver, me la puedo hacer fuera 528 00:21:22,390 --> 00:21:24,130 pero como es una clase 529 00:21:24,130 --> 00:21:26,170 que se va a usar solo aquí 530 00:21:26,170 --> 00:21:27,750 y se va a instanciar solo aquí 531 00:21:27,750 --> 00:21:30,309 pues me la hago como clase interna, no pasa nada 532 00:21:30,309 --> 00:21:31,609 me la hago como clase interna 533 00:21:31,609 --> 00:21:33,730 fuera del método lógicamente 534 00:21:33,730 --> 00:21:36,250 porque las clases internas están dentro de otras clases 535 00:21:36,250 --> 00:21:37,930 pero fuera de métodos 536 00:21:37,930 --> 00:21:39,869 pues bueno, me la hago aquí 537 00:21:39,869 --> 00:21:41,970 que solo la uso aquí y ya está 538 00:21:41,970 --> 00:21:45,009 pues venga, me la hago aquí como clase interna 539 00:21:45,009 --> 00:21:46,950 captura 540 00:21:46,950 --> 00:21:48,589 ratón 541 00:21:48,589 --> 00:21:50,410 vale 542 00:21:50,410 --> 00:21:52,509 entonces 543 00:21:52,509 --> 00:21:54,269 ¿qué habíamos dicho de esta clase? 544 00:21:55,730 --> 00:21:57,190 pues que esta clase 545 00:21:57,190 --> 00:21:59,069 para que 546 00:21:59,069 --> 00:22:00,089 fuera una clase 547 00:22:00,089 --> 00:22:02,289 que generara objetos 548 00:22:02,289 --> 00:22:04,710 capaces de estar a la escucha 549 00:22:04,710 --> 00:22:06,589 de eventos, que eso ya es jugar un papel 550 00:22:06,589 --> 00:22:08,750 especial, pues para ser 551 00:22:08,750 --> 00:22:10,849 clases capaces de estar a la escucha, de captura 552 00:22:10,849 --> 00:22:12,369 de eventos, es decir, jugar ese papel 553 00:22:12,369 --> 00:22:14,950 para que una clase pueda jugar un papel 554 00:22:14,950 --> 00:22:16,869 especial, ¿qué tiene que hacer? 555 00:22:17,710 --> 00:22:18,390 Implementar algo. 556 00:22:19,190 --> 00:22:20,930 Entonces juega ya ese papel especial. 557 00:22:21,690 --> 00:22:23,049 Pues en este caso el papel 558 00:22:23,049 --> 00:22:25,049 que tiene que jugar es el de ser capaz 559 00:22:25,049 --> 00:22:26,930 de escuchar eventos y manejarlos. 560 00:22:27,569 --> 00:22:29,150 Pues lo que tiene que implementar 561 00:22:29,150 --> 00:22:30,369 es una interfaz que se llama 562 00:22:30,369 --> 00:22:32,650 EventHandler, que es la interfaz 563 00:22:32,650 --> 00:22:35,150 que te da el papel de ser capaz de manejar 564 00:22:35,150 --> 00:22:36,990 eventos, como su propio 565 00:22:36,990 --> 00:22:37,609 nombre dice. 566 00:22:38,750 --> 00:22:45,829 Entonces, implements event handler, si no me he equivocado. 567 00:22:47,369 --> 00:22:48,750 Vale, event handler. 568 00:22:49,289 --> 00:22:50,849 ¿Me habrá hecho el importe correcto? 569 00:22:50,930 --> 00:22:51,049 Sí. 570 00:22:53,500 --> 00:22:55,480 Vale, como veis nos aparece en amarillito. 571 00:22:56,440 --> 00:22:57,700 El amarillo ya es un aviso. 572 00:22:59,119 --> 00:23:03,059 El amarillo me está diciendo, oye, lo de siempre. 573 00:23:03,599 --> 00:23:04,539 O lo de casi siempre. 574 00:23:05,099 --> 00:23:06,740 Event handler es una clase genérica. 575 00:23:06,740 --> 00:23:30,559 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? 576 00:23:30,559 --> 00:23:33,420 ¿vale? ¿por qué no me parametrizas 577 00:23:33,420 --> 00:23:35,380 al tipo de evento? ¿qué tipo de evento estamos capturando? 578 00:23:35,500 --> 00:23:36,500 un evento de ratón 579 00:23:36,500 --> 00:23:39,200 pues entonces la parametrizamos 580 00:23:39,200 --> 00:23:41,079 a mouse event 581 00:23:41,079 --> 00:23:56,710 pero has puesto el método 582 00:23:56,710 --> 00:23:59,190 el método lo has llamado tal cual 583 00:23:59,190 --> 00:24:00,369 se llama en esa interfaz 584 00:24:00,369 --> 00:24:03,210 ahora lo vamos a poner de todas maneras 585 00:24:03,210 --> 00:24:05,269 porque si no, ¿cómo sabe aquí? 586 00:24:05,509 --> 00:24:06,869 y luego lo has instanciado aquí 587 00:24:06,869 --> 00:24:09,230 yo le pongo es event 588 00:24:09,230 --> 00:24:10,769 la fecha 589 00:24:10,769 --> 00:24:12,750 y se lo pongo en todo 590 00:24:12,750 --> 00:24:15,170 ya, claro, ya, pero es que tú 591 00:24:15,170 --> 00:24:17,390 claro, sí, pero eso es lo siguiente 592 00:24:17,390 --> 00:24:18,750 por partes, ¿vale? 593 00:24:20,009 --> 00:24:20,450 entonces 594 00:24:20,450 --> 00:24:23,450 pero hay que entender 595 00:24:23,450 --> 00:24:25,289 lo que quiero es que entendáis de dónde viene ese landa 596 00:24:25,289 --> 00:24:27,029 ¿vale? entonces 597 00:24:27,029 --> 00:24:29,349 bueno, pues ya está, esto ya es 598 00:24:29,349 --> 00:24:31,369 una clase capaz 599 00:24:31,369 --> 00:24:33,509 de escuchar eventos 600 00:24:33,509 --> 00:24:35,289 y no cualquier evento, sino 601 00:24:35,289 --> 00:24:36,529 además eventos de ratón 602 00:24:36,529 --> 00:24:39,230 bueno, pues ¿qué pasa cuando una clase 603 00:24:39,230 --> 00:24:40,369 implementa una interfaz? 604 00:24:40,369 --> 00:24:43,390 que tiene que implementar los métodos vacíos 605 00:24:43,390 --> 00:24:46,049 de esa interfaz, por eso me está avisando en rojo 606 00:24:46,049 --> 00:24:48,109 pues vamos a avisarlo 607 00:24:48,109 --> 00:24:52,829 vale, resulta que esta interfaz 608 00:24:52,829 --> 00:24:55,029 tiene un único método vacío 609 00:24:55,029 --> 00:24:57,910 eso ya no suena de la otra clase 610 00:24:57,910 --> 00:25:00,430 interfaz con un único método vacío 611 00:25:00,430 --> 00:25:03,769 interfaz funcional, vale, por ahora lo dejamos aparcado 612 00:25:03,769 --> 00:25:06,970 pero ya sabemos que un interfaz con un único método vacío es una interfaz funcional 613 00:25:06,970 --> 00:25:09,509 ¿qué peculiaridad tiene una interfaz funcional? 614 00:25:09,509 --> 00:25:12,369 que la puede implementar directamente poniendo una lámina 615 00:25:12,369 --> 00:25:13,470 ¿vale? eso es 616 00:25:13,470 --> 00:25:16,130 pero en realidad es esto 617 00:25:16,130 --> 00:25:17,730 vale, pues entonces 618 00:25:17,730 --> 00:25:20,109 ahora yo aquí ya 619 00:25:20,109 --> 00:25:21,410 sí que tengo que poner 620 00:25:21,410 --> 00:25:23,710 el código de respuesta 621 00:25:23,710 --> 00:25:25,670 a ese evento mover ratón 622 00:25:25,670 --> 00:25:26,890 ¿vale? pues vamos a hacerlo 623 00:25:26,890 --> 00:25:29,529 ¿qué tenemos que hacer aquí? 624 00:25:30,630 --> 00:25:32,329 sacar las coordenadas 625 00:25:32,329 --> 00:25:33,710 del ratón 626 00:25:33,710 --> 00:25:35,710 en el momento que se produjo el evento 627 00:25:35,710 --> 00:25:37,849 ¿vamos a poder sacarlas? 628 00:25:37,849 --> 00:25:54,529 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. 629 00:25:54,529 --> 00:25:58,109 el event dentro 630 00:25:58,109 --> 00:26:01,029 tiene un get x 631 00:26:01,029 --> 00:26:02,309 y un get y directamente 632 00:26:02,309 --> 00:26:05,230 que me da 633 00:26:05,230 --> 00:26:06,970 que tiene toda la pinta de que me da 634 00:26:06,970 --> 00:26:08,450 la posición del ratón 635 00:26:08,450 --> 00:26:10,509 en el momento que se genere ese evento 636 00:26:10,509 --> 00:26:11,809 vale pues 637 00:26:11,809 --> 00:26:16,049 entonces lo que yo tengo es 638 00:26:16,049 --> 00:26:17,289 lo voy a poner aquí aparte 639 00:26:17,289 --> 00:26:23,920 aquí tengo 640 00:26:23,920 --> 00:26:26,299 voy a 641 00:26:26,299 --> 00:26:27,500 aunque esto es un double 642 00:26:27,500 --> 00:26:30,500 voy a quedarme con la posición entera 643 00:26:30,500 --> 00:26:31,400 para que se vea 644 00:26:31,400 --> 00:26:33,599 para que luego 645 00:26:33,599 --> 00:26:35,259 en la etiqueta no se vea tan feo 646 00:26:35,259 --> 00:26:38,759 con todos los decimales 647 00:26:38,759 --> 00:26:40,599 que no tengo que formatearlo a dos decimales 648 00:26:40,599 --> 00:26:42,460 un rollo, me voy a hacer un casting aquí 649 00:26:42,460 --> 00:26:44,759 y me quedo 650 00:26:44,759 --> 00:26:46,119 con la posición y 651 00:26:46,119 --> 00:26:58,099 y aquí me hago el casting 652 00:26:58,099 --> 00:27:04,710 vale, estas son 653 00:27:04,710 --> 00:27:06,650 las posiciones que tenía 654 00:27:06,650 --> 00:27:08,529 el ratón cuando yo lo he movido 655 00:27:08,529 --> 00:27:10,509 el evento ha saltado 656 00:27:10,509 --> 00:27:11,470 y hemos llegado hasta aquí 657 00:27:11,470 --> 00:27:13,369 ¿qué es lo que hay que hacer? 658 00:27:14,569 --> 00:27:16,410 pues poner estas posiciones 659 00:27:16,410 --> 00:27:19,069 en el texto de mi etiqueta label 660 00:27:19,069 --> 00:27:23,289 poner esas posiciones en el texto de mi etiqueta label 661 00:27:23,289 --> 00:27:25,970 es decir, hacer aquí algo como esto 662 00:27:25,970 --> 00:27:32,839 label.sectest 663 00:27:32,839 --> 00:27:48,319 coordenadas pero en lugar de 00 664 00:27:48,319 --> 00:27:52,400 esto lo vamos a cortar por aquí 665 00:27:52,400 --> 00:27:54,640 para que sea posición x 666 00:27:54,640 --> 00:27:58,400 el guión otra vez 667 00:27:58,400 --> 00:28:02,180 y aquí cortamos 668 00:28:02,180 --> 00:28:05,140 para que en lugar de 0 669 00:28:05,140 --> 00:28:07,220 ponga posición y 670 00:28:07,220 --> 00:28:09,480 y aquí ya concateno 671 00:28:09,480 --> 00:28:10,880 con el final del 672 00:28:10,880 --> 00:28:13,180 este 673 00:28:13,180 --> 00:28:18,200 y aquí me falta un paréntesis 674 00:28:18,200 --> 00:28:19,660 vale, coordenadas 675 00:28:19,660 --> 00:28:21,420 posición x y en posición 676 00:28:21,420 --> 00:28:25,079 y mayúscula 677 00:28:25,079 --> 00:28:26,500 ¡Hala! Pues todo estupendo 678 00:28:26,500 --> 00:28:29,160 si no fuera porque el label no es visible desde aquí 679 00:28:29,160 --> 00:28:30,319 ¿verdad? 680 00:28:31,039 --> 00:28:32,460 todo magnífico 681 00:28:32,460 --> 00:28:35,039 el evento ya está completo, coge las 682 00:28:35,039 --> 00:28:36,839 coordenadas del ratón en el momento 683 00:28:36,839 --> 00:28:38,180 en el que se produjo el evento 684 00:28:38,180 --> 00:28:40,319 me las pone aquí 685 00:28:40,319 --> 00:28:42,500 en la etiqueta 686 00:28:42,500 --> 00:28:44,359 pero tengo un pequeño problema 687 00:28:44,359 --> 00:28:46,900 que mi etiqueta label no es visible 688 00:28:46,900 --> 00:28:48,660 desde aquí porque mi etiqueta label 689 00:28:48,660 --> 00:28:51,160 es un método local de start 690 00:28:51,160 --> 00:28:53,059 luego tengo 691 00:28:53,059 --> 00:28:53,799 un pequeño problema 692 00:28:53,799 --> 00:28:55,519 si lo quiero hacer así 693 00:28:55,519 --> 00:28:59,980 ¿cómo lo podríamos hacer? 694 00:29:00,700 --> 00:29:01,279 muy fácil 695 00:29:01,279 --> 00:29:05,180 antes que eso 696 00:29:05,180 --> 00:29:09,380 claro 697 00:29:09,380 --> 00:29:12,160 el problema que tengo es que tengo que acceder 698 00:29:12,160 --> 00:29:13,880 desde aquí a esta variable 699 00:29:13,880 --> 00:29:14,980 que es local de este método 700 00:29:14,980 --> 00:29:18,769 solución natural 701 00:29:18,769 --> 00:29:21,430 que es de hecho la que adoptan los 702 00:29:21,430 --> 00:29:23,529 frameworks de, se la inyecto por 703 00:29:23,529 --> 00:29:25,430 constructor, inyección por 704 00:29:25,430 --> 00:29:27,009 constructor, es 705 00:29:27,009 --> 00:29:29,609 que necesito en un método local de una 706 00:29:29,609 --> 00:29:31,589 clase algo, o en 707 00:29:31,589 --> 00:29:33,549 varios, propiedades 708 00:29:33,549 --> 00:29:35,230 de la clase que inyecto por constructor 709 00:29:35,230 --> 00:29:37,490 solución general para muchas situaciones 710 00:29:37,490 --> 00:29:39,329 de este tipo, que 711 00:29:39,329 --> 00:29:40,549 necesitas una etiqueta 712 00:29:40,549 --> 00:29:42,789 Ah, pues no pasa nada, inyectamela 713 00:29:42,789 --> 00:29:43,809 Yo la pongo aquí 714 00:29:43,809 --> 00:29:45,730 Esta es la que voy a usar 715 00:29:45,730 --> 00:29:48,309 Y tú inyectamela, por Dios 716 00:29:48,309 --> 00:29:49,549 Cuando me instancies 717 00:29:49,549 --> 00:30:09,769 ¿Vale? Esto se llama inyección por constructor 718 00:30:09,769 --> 00:30:12,190 Que es una arquitectura natural 719 00:30:12,190 --> 00:30:13,829 En una situación en la que nos veamos así 720 00:30:13,829 --> 00:30:15,970 Ahora 721 00:30:15,970 --> 00:30:17,549 Este ya 722 00:30:17,549 --> 00:30:19,650 Sí que va a acceder a la que le hemos 723 00:30:19,650 --> 00:30:21,690 Inyectado por constructor, que será esta 724 00:30:21,690 --> 00:30:23,410 Pero claro, inyectémosela bien 725 00:30:23,410 --> 00:30:26,190 Claro 726 00:30:26,190 --> 00:30:30,700 vale 727 00:30:30,700 --> 00:30:32,220 pues este evento ya está 728 00:30:32,220 --> 00:30:34,940 vamos a ver 729 00:30:34,940 --> 00:30:36,039 si esto nos funciona 730 00:30:36,039 --> 00:30:38,680 si 731 00:30:38,680 --> 00:30:40,059 ay que rapido 732 00:30:40,059 --> 00:30:47,140 vale pues si nos funciona 733 00:30:47,140 --> 00:30:52,180 pero efectivamente 734 00:30:52,180 --> 00:30:54,359 y paramos ahora antes de hacerlo 735 00:30:54,359 --> 00:30:56,119 pero efectivamente 736 00:30:56,119 --> 00:30:57,319 diríamos jolines 737 00:30:57,319 --> 00:30:59,700 tengo que hacer una clase 738 00:30:59,700 --> 00:31:01,640 para cada evento poner el método 739 00:31:01,640 --> 00:31:04,079 de inyectar las cosas y tengo que inyectar un montón 740 00:31:04,079 --> 00:31:06,019 me queda aquí un montón 741 00:31:06,019 --> 00:31:07,440 de componentes 742 00:31:07,440 --> 00:31:10,079 y un montón de clases 743 00:31:10,079 --> 00:31:11,980 pues hombre, entonces ahí es cuando 744 00:31:11,980 --> 00:31:13,819 decimos, a ver, ¿para qué se ha inventado 745 00:31:13,819 --> 00:31:14,779 la programación funcional? 746 00:31:16,000 --> 00:31:16,900 ¿Qué es EvenHandler? 747 00:31:17,640 --> 00:31:19,500 Una interfaz funcional 748 00:31:19,500 --> 00:31:22,059 porque solamente tiene un único método 749 00:31:22,059 --> 00:31:23,859 vacío, un único método 750 00:31:23,859 --> 00:31:24,500 que es Handler 751 00:31:24,500 --> 00:31:28,220 ¿Cómo podíamos instanciar 752 00:31:28,220 --> 00:31:30,380 objetos de interfaces funcionales 753 00:31:30,380 --> 00:31:32,380 sin necesidad de hacer una clase 754 00:31:32,380 --> 00:31:34,539 aparte y ya instanciar ese objeto 755 00:31:34,539 --> 00:31:36,420 pues me hago una función 756 00:31:36,420 --> 00:31:38,299 lambda sintácticamente correcta 757 00:31:38,299 --> 00:31:40,799 que represente 758 00:31:40,799 --> 00:31:42,599 el código de este método 759 00:31:42,599 --> 00:31:44,579 y esa función lambda 760 00:31:44,579 --> 00:31:46,559 la planto aquí y esa función 761 00:31:46,559 --> 00:31:48,500 lambda ya me está instanciando 762 00:31:48,500 --> 00:31:50,180 un objeto en particular 763 00:31:50,180 --> 00:31:52,579 de esta interfaz funcional 764 00:31:52,579 --> 00:31:54,940 e implementándome ese método 765 00:31:54,940 --> 00:31:55,960 ¿vale? 766 00:31:56,700 --> 00:31:58,519 pero paramos un segundito aquí 767 00:31:58,519 --> 00:31:59,619 y ahora lo hacemos después