1 00:00:00,560 --> 00:00:02,879 vale, pues ni pizarra ni nada 2 00:00:02,879 --> 00:00:03,759 pero luego es un pollo 3 00:00:03,759 --> 00:00:05,280 bueno, pues 4 00:00:05,280 --> 00:00:08,220 nosotros hasta el año pasado 5 00:00:08,220 --> 00:00:10,960 dábamos 6 00:00:10,960 --> 00:00:13,259 swing 7 00:00:13,259 --> 00:00:14,019 ¿vale? 8 00:00:19,500 --> 00:00:19,980 swing 9 00:00:19,980 --> 00:00:28,440 a ver, las interfaces gráficas en Java 10 00:00:28,440 --> 00:00:30,579 tradicionalmente 11 00:00:30,579 --> 00:00:32,560 se han hecho usando 12 00:00:32,560 --> 00:00:33,820 el paquete swing 13 00:00:33,820 --> 00:00:34,380 ¿vale? 14 00:00:36,920 --> 00:00:38,159 que en realidad 15 00:00:38,159 --> 00:00:39,399 se sigue usando 16 00:00:39,399 --> 00:00:41,259 en realidad se sigue usando 17 00:00:41,259 --> 00:00:43,759 porque tú puedes hacer cualquier cosa en Swing 18 00:00:43,759 --> 00:00:45,679 ¿vale? y hay 19 00:00:45,679 --> 00:00:47,520 alumnos que hasta no hace mucho 20 00:00:47,520 --> 00:00:49,039 incluso ahora supongo 21 00:00:49,039 --> 00:00:51,520 pues parte de lo que tenían que hacer en la empresa 22 00:00:51,520 --> 00:00:53,780 pues era ampliar 23 00:00:53,780 --> 00:00:55,659 modificar, hacer una aplicación que estaba 24 00:00:55,659 --> 00:00:56,939 hecha en Swing ¿vale? 25 00:00:57,159 --> 00:00:59,560 es un paquete que en realidad pues sigue 26 00:00:59,560 --> 00:01:01,700 estando ahí, son muchos paquetes 27 00:01:01,700 --> 00:01:02,179 ¿vale? 28 00:01:03,340 --> 00:01:06,159 entonces, ¿en qué se basa la construcción? 29 00:01:06,840 --> 00:01:07,500 a ver 30 00:01:07,500 --> 00:01:09,879 si hay ese ruido de fondo todo el rato es imposible 31 00:01:09,879 --> 00:01:11,340 hablar sin perder el hilo 32 00:01:11,340 --> 00:01:13,000 al final se dicen tonterías 33 00:01:13,000 --> 00:01:15,500 ¿vale? entonces 34 00:01:15,500 --> 00:01:17,939 ¿en qué se basa la construcción 35 00:01:17,939 --> 00:01:19,500 de interfaces gráficas en swing? 36 00:01:20,019 --> 00:01:21,959 bueno, pues tenemos unas librerías 37 00:01:21,959 --> 00:01:25,959 estas librerías, ya sabéis que son 38 00:01:25,959 --> 00:01:26,640 en realidad 39 00:01:26,640 --> 00:01:29,819 ficheros.jar con un montón de 40 00:01:29,819 --> 00:01:30,599 clases dentro 41 00:01:30,599 --> 00:01:34,280 y estas librerías 42 00:01:34,280 --> 00:01:35,180 ¿qué nos ofrecen? 43 00:01:35,180 --> 00:01:38,980 pues nos ofrecen afortunadamente cosas que ya están hechas 44 00:01:38,980 --> 00:01:43,019 para que yo las instancie en mi aplicación 45 00:01:43,019 --> 00:01:44,400 y las deje pegaditas 46 00:01:44,400 --> 00:01:46,819 por ejemplo, ¿qué me ofrece? 47 00:01:47,640 --> 00:01:49,659 ¿cuál es la clase básica de Swing? 48 00:01:50,560 --> 00:01:52,719 pues la clase JFrame 49 00:01:52,719 --> 00:01:55,480 ¿qué es el JFrame? 50 00:01:55,480 --> 00:01:58,019 el JFrame es esta ventanita de toda la vida 51 00:01:58,019 --> 00:02:02,560 la que tiene los estos de minimizar, de no sé qué y de cerrar 52 00:02:02,560 --> 00:02:05,540 esto es un JFrame 53 00:02:05,540 --> 00:02:07,019 esto ya está hecho 54 00:02:07,019 --> 00:02:09,439 claro, en la clase JFrame 55 00:02:09,439 --> 00:02:11,240 no tenemos que hacerlo, si tuviéramos que 56 00:02:11,240 --> 00:02:13,340 programar una interfaz gráfica desde cero sería una locura 57 00:02:13,340 --> 00:02:14,439 ¿vale? 58 00:02:15,400 --> 00:02:17,219 pero podemos hacerlo todo 59 00:02:17,219 --> 00:02:17,879 claro 60 00:02:17,879 --> 00:02:21,400 pero ya hay un montonazo de clases hechas 61 00:02:21,400 --> 00:02:22,580 en los paquetes de swing 62 00:02:22,580 --> 00:02:24,560 pues por ejemplo, entre ellos 63 00:02:24,560 --> 00:02:26,479 la clase JFrame 64 00:02:26,479 --> 00:02:28,919 este es el marco básico 65 00:02:28,919 --> 00:02:31,680 la raíz básica, el punto de partida 66 00:02:31,680 --> 00:02:33,680 básico de una aplicación 67 00:02:33,680 --> 00:02:34,360 hecha con swing 68 00:02:34,360 --> 00:02:36,479 entonces nosotros que hacemos 69 00:02:36,479 --> 00:02:39,460 nosotros que hacemos con swing 70 00:02:39,460 --> 00:02:41,080 pues hacemos nuestra propia 71 00:02:41,080 --> 00:02:42,699 clase 72 00:02:42,699 --> 00:02:44,900 que herede de jframe 73 00:02:44,900 --> 00:02:49,460 entonces al heredar de jframe 74 00:02:49,460 --> 00:02:51,159 pues nuestra aplicación, la que sea 75 00:02:51,159 --> 00:02:53,960 al heredar de jframe 76 00:02:53,960 --> 00:02:55,719 ya nuestra aplicación ya tiene 77 00:02:55,719 --> 00:02:57,680 esto, que es el 78 00:02:57,680 --> 00:02:59,139 marco de partida, ya tiene esto 79 00:02:59,139 --> 00:03:00,919 y a nosotros que hacemos 80 00:03:00,919 --> 00:03:04,919 Le añadimos a esto que ha heredado de JFrame 81 00:03:04,919 --> 00:03:06,340 Le añadimos ya lo que queramos 82 00:03:06,340 --> 00:03:08,719 Pues un panel con botones 83 00:03:08,719 --> 00:03:12,120 Otro panel por aquí con una de esta 84 00:03:12,120 --> 00:03:15,020 Una no sé qué de texto para no sé cuántos 85 00:03:15,020 --> 00:03:17,539 Un desplegable, un menú 86 00:03:17,539 --> 00:03:19,539 Le añadimos lo que nos dé la gana 87 00:03:19,539 --> 00:03:21,479 Y esto que le añadimos 88 00:03:21,479 --> 00:03:23,699 Afortunadamente también está hecho 89 00:03:23,699 --> 00:03:25,379 ¿Esto es un botón? 90 00:03:25,379 --> 00:03:28,599 Pues sí, yo tengo dentro de este paquete mío Swing 91 00:03:28,599 --> 00:03:32,500 tengo mi clase 92 00:03:32,500 --> 00:03:34,780 JButton que es ya un botoncito 93 00:03:34,780 --> 00:03:35,740 entero ya hecho 94 00:03:35,740 --> 00:03:38,500 lo único que tenemos que hacer es instanciarlo 95 00:03:38,500 --> 00:03:40,879 y ponerlo 96 00:03:40,879 --> 00:03:43,020 como propiedad dentro de mi app 97 00:03:43,020 --> 00:03:46,360 es decir, mi aplicación 98 00:03:46,360 --> 00:03:48,460 amplía, extiende 99 00:03:48,460 --> 00:03:50,319 hereda de JFrame, la amplía 100 00:03:50,319 --> 00:03:52,520 poniéndole cosas 101 00:03:52,520 --> 00:03:53,680 que la caracterizan 102 00:03:53,680 --> 00:03:55,900 ¿y qué es lo que caracteriza una clase? 103 00:03:56,039 --> 00:03:58,539 sus propiedades, pues pueden ser 104 00:03:58,539 --> 00:04:00,620 estos componentes que yo meto 105 00:04:00,620 --> 00:04:02,599 ¿vale? eso esencialmente 106 00:04:02,599 --> 00:04:04,639 es como se construye una aplicación en Swing 107 00:04:04,639 --> 00:04:06,759 heredamos de un JFrame 108 00:04:06,759 --> 00:04:08,659 y le metemos 109 00:04:08,659 --> 00:04:10,560 como propiedades ya que lo caracterizan 110 00:04:10,560 --> 00:04:12,319 a él de forma ya propia 111 00:04:12,319 --> 00:04:14,520 le metemos como 112 00:04:14,520 --> 00:04:16,500 propiedades los componentes que a mí me den la gana 113 00:04:16,500 --> 00:04:17,500 eso en resumen 114 00:04:17,500 --> 00:04:20,399 esos componentes son clases que ya están 115 00:04:20,399 --> 00:04:22,459 hechas afortunadamente, no podemos construir 116 00:04:22,459 --> 00:04:24,699 un botón desde cero, un área de texto 117 00:04:24,699 --> 00:04:26,139 desde cero, ¿vale? no podemos 118 00:04:26,139 --> 00:04:28,500 en el momento 119 00:04:28,500 --> 00:04:30,220 luego ya, esto luego tiene 120 00:04:30,220 --> 00:04:31,660 pues lógicamente matices 121 00:04:31,660 --> 00:04:34,699 aparte de añadir el botón 122 00:04:34,699 --> 00:04:36,560 por ejemplo como propiedad 123 00:04:36,560 --> 00:04:38,439 de mi clase aplicación 124 00:04:38,439 --> 00:04:40,060 como propiedad de mi clase aplicación 125 00:04:40,060 --> 00:04:41,480 que lo caracteriza de forma única 126 00:04:41,480 --> 00:04:44,579 pues luego ya tendré que ir a los métodos 127 00:04:44,579 --> 00:04:46,360 de esta clase botón para decidir 128 00:04:46,360 --> 00:04:48,000 donde se coloca dentro del frame 129 00:04:48,000 --> 00:04:50,360 luego ahí hay cosas de aprender a utilizar 130 00:04:50,360 --> 00:04:51,579 los métodos sin más 131 00:04:51,579 --> 00:04:53,079 para colocar las cosas 132 00:04:53,079 --> 00:04:57,540 entonces con eso uno construye 133 00:04:57,540 --> 00:04:59,639 su interfaz gráfica 134 00:04:59,639 --> 00:05:02,339 pero claro, aquí ya sí que aparece algo 135 00:05:02,339 --> 00:05:04,100 que ya sí que es 136 00:05:04,100 --> 00:05:05,519 completamente distinto 137 00:05:05,519 --> 00:05:07,819 a todo lo que hemos visto hasta ahora 138 00:05:07,819 --> 00:05:09,300 que ya sí que es novedoso 139 00:05:09,300 --> 00:05:11,959 y es que aquí hemos construido 140 00:05:11,959 --> 00:05:13,740 nuestra interfaz gráfica programando 141 00:05:13,740 --> 00:05:16,360 como sabemos hacer, haciendo nuestra clase 142 00:05:16,360 --> 00:05:17,860 heredando, poniéndole 143 00:05:17,860 --> 00:05:19,800 propiedades que en este caso 144 00:05:19,800 --> 00:05:22,279 serán componentes que lo particularizan 145 00:05:22,279 --> 00:05:24,139 ¿vale? cosas que sabemos 146 00:05:24,139 --> 00:05:24,560 hacer 147 00:05:24,560 --> 00:05:28,040 cambiar las características 148 00:05:28,040 --> 00:05:30,300 de estos objetos 149 00:05:30,300 --> 00:05:32,439 que a su vez tienen sus propias propiedades 150 00:05:32,439 --> 00:05:34,160 como color, todo eso ya lo sabemos hacer 151 00:05:34,160 --> 00:05:36,500 ¿vale? pero ¿qué conseguimos 152 00:05:36,500 --> 00:05:38,459 con eso? pues plantar ahí 153 00:05:38,459 --> 00:05:40,500 nuestra ventanita con un montón 154 00:05:40,500 --> 00:05:41,019 de cosas 155 00:05:41,019 --> 00:05:44,399 y ya está, y así nos hemos quedado, eso no vale para nada 156 00:05:44,399 --> 00:05:46,360 lógicamente, una ventana y un montón de cosas 157 00:05:46,360 --> 00:05:48,680 ¿dónde está ahí la comunicación 158 00:05:48,680 --> 00:05:49,420 con el usuario? 159 00:05:50,180 --> 00:05:51,920 pues la comunicación con el usuario está 160 00:05:51,920 --> 00:05:54,300 que ahora mi aplicación 161 00:05:54,300 --> 00:05:56,079 arranca, yo la arranco 162 00:05:56,079 --> 00:05:58,240 arrancar la aplicación implica 163 00:05:58,240 --> 00:05:59,620 que todo esto se construye 164 00:05:59,620 --> 00:06:00,899 y se queda ahí construido 165 00:06:00,899 --> 00:06:03,199 pero se queda ahí parado 166 00:06:03,199 --> 00:06:06,600 y ahora ya la aplicación está como ahí parada 167 00:06:06,600 --> 00:06:07,480 está como 168 00:06:07,480 --> 00:06:09,420 no es una aplicación que yo la arranco 169 00:06:09,420 --> 00:06:10,939 se construye esto y se termina 170 00:06:10,939 --> 00:06:14,199 yo la arranco y se queda ahí 171 00:06:14,199 --> 00:06:15,540 mi hilo de ejecución 172 00:06:15,540 --> 00:06:16,660 se queda ahí parado 173 00:06:16,660 --> 00:06:20,240 esperando una cosa que se llama 174 00:06:20,240 --> 00:06:21,339 eventos 175 00:06:21,339 --> 00:06:25,100 y los eventos 176 00:06:25,100 --> 00:06:28,879 es lo que el usuario hace desde fuera 177 00:06:28,879 --> 00:06:31,079 de forma completamente asíncrona cuando le dé la gana 178 00:06:31,079 --> 00:06:34,699 un evento es hacer clic en este botón con el ratón 179 00:06:34,699 --> 00:06:37,180 por ejemplo, otro evento puede ser 180 00:06:37,180 --> 00:06:40,259 escribir en esta área de texto, eventos hay un montón 181 00:06:40,259 --> 00:06:43,459 otro evento puede ser redimensionar 182 00:06:43,459 --> 00:06:46,300 un panel que tengo yo aquí, todos esos son eventos 183 00:06:46,300 --> 00:06:50,709 que vienen de forma asíncrona y 184 00:06:50,709 --> 00:06:53,389 hasta ahora no hemos hecho nada parecido a esto 185 00:06:53,389 --> 00:06:56,029 lo único que hemos hecho parecido a esto es 186 00:06:56,029 --> 00:06:57,970 la sentencia real 187 00:06:57,970 --> 00:06:59,750 de la consola, la única 188 00:06:59,750 --> 00:07:01,189 ¿qué hacía la sentencia real? 189 00:07:02,610 --> 00:07:03,750 el next in 190 00:07:03,750 --> 00:07:05,250 perdón, por ejemplo 191 00:07:05,250 --> 00:07:08,029 o el next line, o sea las sentencias del escáner 192 00:07:08,029 --> 00:07:09,350 con las que leíamos del teclado 193 00:07:09,350 --> 00:07:11,410 ¿qué hacía? pues 194 00:07:11,410 --> 00:07:12,769 el 195 00:07:12,769 --> 00:07:15,050 el hilo de ejecución 196 00:07:15,050 --> 00:07:16,550 se quedaba ahí parado 197 00:07:16,550 --> 00:07:17,449 ahí parado 198 00:07:17,449 --> 00:07:20,189 a la espera de que 199 00:07:20,189 --> 00:07:22,689 alguien escribiera algo 200 00:07:22,689 --> 00:07:24,589 en el teclado, y ese era el único evento 201 00:07:24,589 --> 00:07:25,129 posible 202 00:07:25,129 --> 00:07:27,610 escribir algo en el teclado 203 00:07:27,610 --> 00:07:29,149 ese era el único evento posible 204 00:07:29,149 --> 00:07:31,870 entonces cuando eso ocurría 205 00:07:31,870 --> 00:07:33,430 el hilo ya despertaba 206 00:07:33,430 --> 00:07:35,129 cogía lo que había en el teclado y hacía cosas 207 00:07:35,129 --> 00:07:37,189 eso era lo más parecido a esto que hemos hecho 208 00:07:37,189 --> 00:07:39,329 aquí lo que pasa es que hay un montón 209 00:07:39,329 --> 00:07:40,490 de eventos posibles 210 00:07:40,490 --> 00:07:42,129 pues 211 00:07:42,129 --> 00:07:45,810 hacer clic en un botón, escribir un área de texto 212 00:07:45,810 --> 00:07:47,470 hacer focus 213 00:07:47,470 --> 00:07:49,629 en un panel en lugar de en otro 214 00:07:49,629 --> 00:07:50,949 aquí hay un montón de eventos distintos 215 00:07:50,949 --> 00:07:52,670 no hay solo uno 216 00:07:52,670 --> 00:07:54,910 y cada evento 217 00:07:54,910 --> 00:07:57,009 distinto queremos una respuesta 218 00:07:57,009 --> 00:07:59,009 diferente, hasta ahora 219 00:07:59,009 --> 00:08:00,550 nuestro único evento era 220 00:08:00,550 --> 00:08:02,850 escribir en el teclado y la 221 00:08:02,850 --> 00:08:04,689 respuesta era única, que es 222 00:08:04,689 --> 00:08:06,649 coger lo que habíamos escrito 223 00:08:06,649 --> 00:08:08,790 y pasarlo a una variable, ya está 224 00:08:08,790 --> 00:08:11,089 y luego ya nosotros con eso en la variable 225 00:08:11,089 --> 00:08:13,110 hacemos lo que correspondiera 226 00:08:13,110 --> 00:08:15,050 pero aquí tendremos 227 00:08:15,050 --> 00:08:15,589 que hacer 228 00:08:15,589 --> 00:08:19,389 una cosa que es la gestión 229 00:08:19,389 --> 00:08:21,949 de los eventos 230 00:08:21,949 --> 00:08:29,709 y la gestión de los eventos implica 231 00:08:29,709 --> 00:08:31,730 decidir qué eventos 232 00:08:31,730 --> 00:08:33,730 nos importan de la aplicación, pero a lo mejor 233 00:08:33,730 --> 00:08:35,809 una aplicación, el único evento que nos importa es hacer clic 234 00:08:35,809 --> 00:08:37,149 en el botón, vale 235 00:08:37,149 --> 00:08:39,690 qué eventos nos importan de la aplicación 236 00:08:39,690 --> 00:08:41,309 pueden ser varios, uno 237 00:08:41,309 --> 00:08:43,809 qué código de respuesta 238 00:08:43,809 --> 00:08:45,870 vamos a dar a esos eventos, pues todo eso 239 00:08:45,870 --> 00:08:47,750 implica programar bastante 240 00:08:47,750 --> 00:08:49,830 y hasta ahora de todo eso 241 00:08:49,830 --> 00:08:50,730 no hemos tenido que hacer nada 242 00:08:50,730 --> 00:08:54,009 luego, construir una interfaz 243 00:08:54,009 --> 00:08:55,309 gráfica en swing 244 00:08:55,309 --> 00:08:57,789 y también en lo que vamos a ver 245 00:08:57,789 --> 00:08:59,929 en realidad tiene como dos partes 246 00:08:59,929 --> 00:09:02,049 por decirlo así, psicológicamente 247 00:09:02,049 --> 00:09:03,570 tiene dos momentos 248 00:09:03,570 --> 00:09:05,789 el momento de 249 00:09:05,789 --> 00:09:07,830 decidir el diseño de la interfaz 250 00:09:07,830 --> 00:09:09,870 voy a necesitar estos componentes, estos patins 251 00:09:09,870 --> 00:09:12,009 decidirlo, diseñarlo y hacer 252 00:09:12,009 --> 00:09:14,210 toda la parte de código para construirla 253 00:09:14,210 --> 00:09:15,830 el extend, el 254 00:09:15,830 --> 00:09:17,190 ir pegando, bla bla bla 255 00:09:17,190 --> 00:09:19,950 y luego ya, después de 256 00:09:19,950 --> 00:09:21,830 esa primera parte, tengo psicológicamente 257 00:09:21,830 --> 00:09:23,809 la segunda parte, que es 258 00:09:23,809 --> 00:09:25,750 ahora voy a ver cómo he gestionado los eventos 259 00:09:25,750 --> 00:09:28,450 qué componentes son los que pueden recibir 260 00:09:28,450 --> 00:09:30,389 evento, qué código, con qué 261 00:09:30,389 --> 00:09:32,789 código quiero yo responder a esos eventos 262 00:09:32,789 --> 00:09:34,470 etcétera, tendrás esas dos 263 00:09:34,470 --> 00:09:35,649 partes, vale 264 00:09:35,649 --> 00:09:38,659 bueno, pues 265 00:09:38,659 --> 00:09:42,019 nosotros hasta el año pasado esto lo veíamos con 266 00:09:42,019 --> 00:09:44,019 Swing, que es la herramienta de Java de toda la vida 267 00:09:44,019 --> 00:09:45,539 y este año 268 00:09:45,539 --> 00:09:47,279 lo vamos a ver con 269 00:09:47,279 --> 00:09:51,750 esto, vale 270 00:09:51,750 --> 00:09:53,990 sí, JavaFX 271 00:09:53,990 --> 00:09:56,950 que es la versión más moderna 272 00:09:56,950 --> 00:09:57,750 vale 273 00:09:57,750 --> 00:10:00,389 no 274 00:10:00,389 --> 00:10:03,570 a ver, podemos rápidamente en un pispás 275 00:10:03,570 --> 00:10:05,169 volver un poco la idea, pero bueno 276 00:10:05,169 --> 00:10:07,769 viene a ser un poco lo mismo, pero en versión antigua 277 00:10:07,769 --> 00:10:09,230 entonces 278 00:10:09,230 --> 00:10:11,289 los componentes por defecto de swing 279 00:10:11,289 --> 00:10:13,690 cuando los ponemos, vemos que su aspecto por defecto 280 00:10:13,690 --> 00:10:15,590 es muy anticuado, tú luego le puedes 281 00:10:15,590 --> 00:10:16,970 fijar el aspecto que te dé la gana 282 00:10:16,970 --> 00:10:19,350 pero ya solo ves el detalle de que 283 00:10:19,350 --> 00:10:21,669 el aspecto por defecto es muy anticuado 284 00:10:21,669 --> 00:10:23,289 JavaFX 285 00:10:23,289 --> 00:10:25,230 son controles como más modernos 286 00:10:25,230 --> 00:10:26,809 sin necesidad de 287 00:10:26,809 --> 00:10:29,389 cambiarle esto el aspecto, su aspecto por defecto 288 00:10:29,389 --> 00:10:30,669 es más moderno 289 00:10:30,669 --> 00:10:32,710 eso por un lado 290 00:10:32,710 --> 00:10:34,210 por otro lado 291 00:10:34,210 --> 00:10:36,690 incorpora ya 292 00:10:36,690 --> 00:10:38,870 conceptos que Swing no incorporaba 293 00:10:38,870 --> 00:10:40,090 porque todavía no estaban en Java 294 00:10:40,090 --> 00:10:42,330 como los de programación funcional 295 00:10:42,330 --> 00:10:44,909 con los que tendremos que meternos un pelinín 296 00:10:44,909 --> 00:10:46,830 solo para poder usarlo aquí 297 00:10:46,830 --> 00:10:47,830 un pelín solo 298 00:10:47,830 --> 00:10:51,590 el concepto de separación 299 00:10:51,590 --> 00:10:52,990 que en Swing estaba 300 00:10:52,990 --> 00:10:53,889 más mezclado 301 00:10:53,889 --> 00:10:56,250 de la vista 302 00:10:56,250 --> 00:10:58,090 separarla del código 303 00:10:58,090 --> 00:10:59,350 eso si no lo tenía 304 00:10:59,350 --> 00:11:01,850 pues java x ya veremos como 305 00:11:01,850 --> 00:11:03,950 la vista, la parte de diseño 306 00:11:03,950 --> 00:11:06,370 la puede separar completamente del código 307 00:11:06,370 --> 00:11:07,590 y meterla en archivo xml 308 00:11:07,590 --> 00:11:09,490 eso si que es novedoso 309 00:11:09,490 --> 00:11:12,269 yo toda la parte de diseño la meto 310 00:11:12,269 --> 00:11:13,429 no la hago en java 311 00:11:13,429 --> 00:11:15,690 la meto en archivos xml 312 00:11:15,690 --> 00:11:18,750 y ahora ya mi aplicación java lee de ellos 313 00:11:18,750 --> 00:11:20,509 entonces si yo quiero cambiar algo 314 00:11:20,509 --> 00:11:21,809 lo puedo cambiar en xml 315 00:11:21,809 --> 00:11:23,990 y cuando la aplicación arranca 316 00:11:23,990 --> 00:11:25,590 Pues le doy ese archivo 317 00:11:25,590 --> 00:11:27,009 No tengo que cambiar el código 318 00:11:27,009 --> 00:11:29,950 ¿Vale? También tiene una integración 319 00:11:29,950 --> 00:11:31,269 Con acceso a bases de datos 320 00:11:31,269 --> 00:11:33,049 Un poquito más 321 00:11:33,049 --> 00:11:35,110 Funcional 322 00:11:35,110 --> 00:11:38,029 Para eso, la integración a bases de datos 323 00:11:38,029 --> 00:11:39,330 Está mejor soportada aquí 324 00:11:39,330 --> 00:11:41,289 Que aquí, hay que hacerla más a mano 325 00:11:41,289 --> 00:11:43,690 Entonces, bueno, es la versión como más moderna 326 00:11:43,690 --> 00:11:44,049 ¿Vale? 327 00:11:44,629 --> 00:11:47,929 De aquí he hecho unos apuntillos 328 00:11:47,929 --> 00:11:49,850 Que ya os pasaré, pero después 329 00:11:49,850 --> 00:11:52,049 Cuando ya hayamos visto primero 330 00:11:52,049 --> 00:11:53,269 Cómo funciona 331 00:11:53,269 --> 00:11:56,090 para que os sirvan 332 00:11:56,090 --> 00:11:56,929 como recordatorio. 333 00:11:57,730 --> 00:11:59,690 Pero después, ¿vale? Primero vamos a aprender 334 00:11:59,690 --> 00:12:01,629 a hacerlo y luego ya eso que nos sirva como recordatorio. 335 00:12:01,789 --> 00:12:02,409 Es sencillo. 336 00:12:03,690 --> 00:12:06,149 ¿Vale? Bueno, pues entonces 337 00:12:06,149 --> 00:12:08,210 JavaFX 338 00:12:08,210 --> 00:12:09,750 la idea también es la misma. 339 00:12:11,029 --> 00:12:11,690 Tu interfaz, 340 00:12:11,789 --> 00:12:12,490 tu objeto, 341 00:12:12,970 --> 00:12:15,370 aquí no se llama el JFrame. 342 00:12:16,049 --> 00:12:18,009 En JavaFX es el Stage. 343 00:12:19,009 --> 00:12:19,789 O sea, el marco 344 00:12:19,789 --> 00:12:23,200 básico en 345 00:12:23,200 --> 00:12:24,539 Swin es el JFrame 346 00:12:24,539 --> 00:12:26,940 pues eso mismo, que es la ventanita 347 00:12:26,940 --> 00:12:28,799 con el minimizado, el cuadradito y esto 348 00:12:28,799 --> 00:12:31,299 eso mismo en JavaFX, en JavaFX es stage 349 00:12:31,299 --> 00:12:33,039 ya está, pero la idea 350 00:12:33,039 --> 00:12:34,899 es la misma, tú te haces tu stage 351 00:12:34,899 --> 00:12:36,860 le pones las escenas, que las escenas 352 00:12:36,860 --> 00:12:39,000 serían, pues ahora ya, el panel 353 00:12:39,000 --> 00:12:40,279 con los componentes 354 00:12:40,279 --> 00:12:43,159 y luego tienes que gestionar los eventos 355 00:12:43,159 --> 00:12:44,100 ¿vale? 356 00:12:46,500 --> 00:12:48,360 bueno, pues entonces, vamos a 357 00:12:48,360 --> 00:12:52,000 ver un poquito como arrancar 358 00:12:52,000 --> 00:12:54,320 vamos a ver si conseguimos arrancar una aplicación 359 00:12:54,320 --> 00:12:56,159 en JavaFX, porque no es tan 360 00:12:56,159 --> 00:12:57,059 trivial como en Swing 361 00:12:57,059 --> 00:12:59,679 por pequeñitas cosas 362 00:12:59,679 --> 00:13:06,679 bueno, primer problema 363 00:13:06,679 --> 00:13:08,840 si queremos hacer una aplicación con JavaFX 364 00:13:08,840 --> 00:13:11,139 primer problema que nos encontramos 365 00:13:11,139 --> 00:13:14,799 que lógicamente las clases 366 00:13:14,799 --> 00:13:16,840 que necesitamos, bueno no tan lógicamente 367 00:13:16,840 --> 00:13:17,940 podrían estar, pero bueno 368 00:13:17,940 --> 00:13:20,600 la clase stage, los componentes 369 00:13:20,600 --> 00:13:22,299 todo eso, las clases que necesitamos 370 00:13:22,299 --> 00:13:23,779 no las trae el JDK 371 00:13:23,779 --> 00:13:27,139 las trae el JDK, las tenemos que importar 372 00:13:27,139 --> 00:13:28,419 entonces 373 00:13:28,419 --> 00:13:30,320 eso ya es una primera complicación 374 00:13:30,320 --> 00:13:32,259 para nosotros, porque nosotros 375 00:13:32,259 --> 00:13:34,080 hasta ahora hemos visto 376 00:13:34,080 --> 00:13:36,220 cómo generar un JAR para poder 377 00:13:36,220 --> 00:13:37,840 difundir unas librerías nuestras 378 00:13:37,840 --> 00:13:40,100 y hemos visto cómo incorporarlo 379 00:13:40,100 --> 00:13:42,200 al ClassPath, pero 380 00:13:42,200 --> 00:13:44,460 no hemos necesitado, en ninguna de nuestras aplicaciones 381 00:13:44,460 --> 00:13:46,259 hemos necesitado, que yo recuerde, 382 00:13:46,340 --> 00:13:47,620 incorporar una librería externa para 383 00:13:47,620 --> 00:13:48,840 que funcione. 384 00:13:49,559 --> 00:13:51,980 Bueno, si podemos, cuando nos lo enseñaste un poco 385 00:13:51,980 --> 00:13:53,759 al principio del curso, cuando importábamos algo 386 00:13:53,759 --> 00:13:56,220 Sí, pero para aprender a hacerlo 387 00:13:56,220 --> 00:13:57,980 y para aprender cómo era, pero que todas las aplicaciones 388 00:13:57,980 --> 00:14:00,019 que hemos hecho, todas las clases 389 00:14:00,019 --> 00:14:02,179 que usábamos estaban en el JDK 390 00:14:02,179 --> 00:14:03,440 no necesitábamos importar nada 391 00:14:03,440 --> 00:14:05,820 bueno, pues aquí ya 392 00:14:05,820 --> 00:14:08,139 necesitamos librerías externas 393 00:14:08,139 --> 00:14:19,750 vale, esa es la primera complicación 394 00:14:19,750 --> 00:14:21,090 entonces, bueno 395 00:14:21,090 --> 00:14:23,429 no sería tan complicado porque efectivamente 396 00:14:23,429 --> 00:14:25,669 sabemos cómo importar 397 00:14:25,669 --> 00:14:27,929 librerías externas, cómo están las clases 398 00:14:27,929 --> 00:14:29,830 que uno distribuye por ahí al mundo 399 00:14:29,830 --> 00:14:33,570 están metidas en .jar, ¿verdad? 400 00:14:34,789 --> 00:14:36,129 esto es lo que es un .jar 401 00:14:36,129 --> 00:14:37,070 un .jar es 402 00:14:37,070 --> 00:14:39,809 un fichero comprimido que tiene un montón 403 00:14:39,809 --> 00:14:41,570 de clases, a su vez 404 00:14:41,570 --> 00:14:42,870 distribuidas en paquetillos 405 00:14:42,870 --> 00:14:45,730 entonces, importarlas 406 00:14:45,730 --> 00:14:47,889 ¿qué significa? pues lo hemos hecho alguna vez 407 00:14:47,889 --> 00:14:49,210 cuando hemos generado un hard 408 00:14:49,210 --> 00:14:51,610 pues añadirlas a la 409 00:14:51,610 --> 00:14:53,590 famosa variable classPath 410 00:14:53,590 --> 00:14:57,809 entonces, al añadirlas a la 411 00:14:57,809 --> 00:14:59,610 famosa variable classPath 412 00:14:59,610 --> 00:15:01,669 este hard, decir, oye, classPath 413 00:15:01,669 --> 00:15:03,690 tú, usa que mi 414 00:15:03,690 --> 00:15:05,789 aplicación va a usar las clases que están 415 00:15:05,789 --> 00:15:07,769 en este jar, eso es lo que realmente 416 00:15:07,769 --> 00:15:09,610 hacemos cuando importamos un jar 417 00:15:09,610 --> 00:15:11,889 desde Eclipse, le estamos diciendo 418 00:15:11,889 --> 00:15:13,909 a esta variable, oye tú 419 00:15:13,909 --> 00:15:16,070 mi aplicación 420 00:15:16,070 --> 00:15:17,629 va a usar clases que están 421 00:15:17,629 --> 00:15:19,789 en este jar, tenlo en cuenta, para que 422 00:15:19,789 --> 00:15:21,549 si yo te las pido con el import 423 00:15:21,549 --> 00:15:23,830 que tú sepas dónde están, eso es lo que hacemos 424 00:15:23,830 --> 00:15:25,649 entonces hasta ahí pues este 425 00:15:25,649 --> 00:15:27,649 punto no sería tan horrible, no sería 426 00:15:27,649 --> 00:15:29,570 un punto tan horrible, si sabemos hacer importar 427 00:15:29,570 --> 00:15:31,690 un jar para que se usen las clases, no sería tan horrible 428 00:15:31,690 --> 00:15:33,509 vale, pues sí 429 00:15:33,509 --> 00:15:35,250 se convierte en un pelín horrible 430 00:15:35,250 --> 00:15:37,330 Bueno, no un pelín horrible 431 00:15:37,330 --> 00:15:40,269 Pero un pelín no tan fácil 432 00:15:40,269 --> 00:15:41,129 Como esto 433 00:15:41,129 --> 00:15:43,350 A ver, me distraigo mucho 434 00:15:43,350 --> 00:15:45,649 ¿Por qué no os escribís las cosas? 435 00:15:45,970 --> 00:15:46,990 ¿O habláis por señas? 436 00:15:47,909 --> 00:15:50,570 ¿No podéis estar hablando de fondo cuando alguien está hablando? 437 00:15:50,970 --> 00:15:52,269 Es que eso no se puede hacer 438 00:15:52,269 --> 00:15:55,009 Podéis no prestarme atención 439 00:15:55,009 --> 00:15:56,730 Pero no me distraigáis 440 00:15:56,730 --> 00:15:58,389 Si habláis, me distraéis 441 00:15:58,389 --> 00:16:00,470 Os lo vais escribiendo en el monitor 442 00:16:00,470 --> 00:16:01,149 Si queréis 443 00:16:01,149 --> 00:16:06,759 Vale, entonces 444 00:16:06,759 --> 00:16:09,879 esto, que sería 445 00:16:09,879 --> 00:16:11,980 en principio, bueno, no es una complicación 446 00:16:11,980 --> 00:16:13,860 tan grande, bueno, no es una complicación tan grande 447 00:16:13,860 --> 00:16:15,299 ya sabemos añadir un JAR a un CLASSPAD 448 00:16:15,299 --> 00:16:17,759 ya sabemos, pues si se convierte 449 00:16:17,759 --> 00:16:19,419 en una complicación un poquito más grande, ¿por qué? 450 00:16:20,340 --> 00:16:22,220 porque estas librerías 451 00:16:22,220 --> 00:16:23,039 de JavaX 452 00:16:23,039 --> 00:16:26,100 usan el sistema 453 00:16:26,100 --> 00:16:27,299 de módulos 454 00:16:27,299 --> 00:16:30,179 ¿os acordáis 455 00:16:30,179 --> 00:16:32,200 el módulo info que nos ha dado guerra alguna vez? 456 00:16:33,139 --> 00:16:34,220 el módulo info 457 00:16:34,220 --> 00:16:36,159 que decía, nada, bórralo y así no nos molesta 458 00:16:36,159 --> 00:17:10,359 Vale, pues las librerías de JavaX, por estar hechas a partir de la versión JBK10 o no sé qué, usan el concepto de módulo de Java, que no es un concepto en realidad que se haya usado mucho y esté muy extendido, pero bueno, hay que conocerlo, pues si usamos alguna librería que lo usa, pues para no tener que pegarnos con ella demasiado, usa el concepto de módulo. 459 00:17:10,359 --> 00:17:12,740 entonces, eso implica 460 00:17:12,740 --> 00:17:13,539 que esto 461 00:17:13,539 --> 00:17:16,880 no sea tan sencillo 462 00:17:16,880 --> 00:17:17,839 importar el hat 463 00:17:17,839 --> 00:17:20,059 de las librerías JavaFX 464 00:17:20,059 --> 00:17:21,819 no sea tan sencillo 465 00:17:21,819 --> 00:17:24,200 como agregarlo al classpath 466 00:17:24,200 --> 00:17:26,140 con el configure buildpath 467 00:17:26,140 --> 00:17:27,119 que hemos hecho hasta ahora 468 00:17:27,119 --> 00:17:28,059 vale 469 00:17:28,059 --> 00:17:34,589 entonces, ¿qué implicaciones tiene 470 00:17:34,589 --> 00:17:36,410 que usen el concepto de módulo? 471 00:17:37,410 --> 00:17:38,730 un poquito por encima 472 00:17:38,730 --> 00:17:40,490 que es esto de los módulos, un poco por encima 473 00:17:40,490 --> 00:17:41,869 no es algo que a nosotros nos importe 474 00:17:41,869 --> 00:17:44,730 ni vayamos a trabajar con ello, ni vayamos a semear de ello, ni de nada. 475 00:17:45,210 --> 00:17:48,109 Pero sí un poco nos importa saber qué es esto de módulos 476 00:17:48,109 --> 00:17:50,710 porque JavaFX los usa. 477 00:17:51,109 --> 00:17:54,450 Y eso nos va a implicar, más que nos va a implicar, 478 00:17:54,529 --> 00:17:56,809 pues nos va a permitir entender por qué lo vamos a hacer 479 00:17:56,809 --> 00:17:57,970 con la herramienta que lo vamos a hacer. 480 00:17:58,769 --> 00:17:58,990 ¿Vale? 481 00:18:00,069 --> 00:18:03,950 Pues, ¿qué son los módulos en una aplicación Java que use módulos? 482 00:18:05,309 --> 00:18:08,950 Bueno, pues si una aplicación Java no usa módulos, 483 00:18:08,950 --> 00:18:12,920 todo el código está 484 00:18:12,920 --> 00:18:15,420 todo junto, es como si fuera todo el código 485 00:18:15,420 --> 00:18:16,559 está en la misma caja 486 00:18:16,559 --> 00:18:19,220 entonces todo el código que usa la aplicación 487 00:18:19,220 --> 00:18:21,119 estará pues en los hard 488 00:18:21,119 --> 00:18:23,619 en las propias clases que yo he hecho 489 00:18:23,619 --> 00:18:25,440 estará donde esté, pero está como 490 00:18:25,440 --> 00:18:27,460 todo el código junto y cuando digo 491 00:18:27,460 --> 00:18:29,500 junto es que hay una 492 00:18:29,500 --> 00:18:30,660 única variable 493 00:18:30,660 --> 00:18:33,059 ¿vale? una única variable 494 00:18:33,059 --> 00:18:35,599 que es la variable classPath que afortunadamente 495 00:18:35,599 --> 00:18:37,619 como trabajamos con un entorno de desarrollo 496 00:18:37,619 --> 00:18:39,740 la maneja el entorno de desarrollo 497 00:18:39,740 --> 00:18:40,819 y no la manejamos nosotros. 498 00:18:41,660 --> 00:18:43,599 Pues hay una única variable que nos dice 499 00:18:43,599 --> 00:18:46,500 oye, esta aplicación usa este hard, 500 00:18:46,819 --> 00:18:48,559 usa estos paquetes, usa no sé qué, 501 00:18:48,680 --> 00:18:50,160 usa no sé cuántos, está todo aquí. 502 00:18:51,660 --> 00:18:51,859 ¿Vale? 503 00:18:52,799 --> 00:18:55,140 Entonces es como si estuviera todo metido en la misma caja. 504 00:18:56,180 --> 00:18:56,380 ¿Vale? 505 00:18:57,480 --> 00:18:59,519 Cuando una aplicación usa módulos, 506 00:18:59,519 --> 00:19:02,279 lo que ocurre es que es como si el código 507 00:19:02,279 --> 00:19:05,519 se distribuyera, se separara 508 00:19:05,519 --> 00:19:07,400 en cajitas separadas. 509 00:19:08,220 --> 00:19:09,180 En cajitas separadas. 510 00:19:09,740 --> 00:19:19,180 y cada cajita es un módulo, cada cajita es un módulo y el módulo declara dentro información 511 00:19:19,180 --> 00:19:27,859 sobre qué cosas uso yo de otras cajas y qué cosas de las que yo tengo dentro permito usar, 512 00:19:27,859 --> 00:19:35,039 entonces una aplicación con módulos, cada parte del código, estas clases, estas clases, 513 00:19:35,039 --> 00:19:36,519 clases, cada parte del código 514 00:19:36,519 --> 00:19:39,079 puede ser un módulo diferente 515 00:19:39,079 --> 00:19:40,619 cada módulo 516 00:19:40,619 --> 00:19:43,119 se describe en el famoso 517 00:19:43,119 --> 00:19:44,079 módulo info 518 00:19:44,079 --> 00:19:46,599 por eso cuando hacéis 519 00:19:46,599 --> 00:19:48,440 una aplicación en Eclipse 520 00:19:48,440 --> 00:19:50,200 él asume 521 00:19:50,200 --> 00:19:52,440 que va a haber un solo módulo 522 00:19:52,440 --> 00:19:55,160 que es vuestra aplicación, un único módulo 523 00:19:55,160 --> 00:19:57,319 y os crea ya un módulo info 524 00:19:57,319 --> 00:19:59,299 para describir ese módulo 525 00:19:59,299 --> 00:20:01,220 ¿qué ocurre? que si hay un solo 526 00:20:01,220 --> 00:20:01,740 módulo 527 00:20:01,740 --> 00:20:04,440 podemos pasar 528 00:20:04,440 --> 00:20:06,359 de eso completamente, si hay un solo módulo 529 00:20:06,359 --> 00:20:08,319 da igual, está todo en la misma caja 530 00:20:08,319 --> 00:20:10,339 igual, entonces borramos el módulo info 531 00:20:10,339 --> 00:20:12,200 y lo quedamos tan tranquilo, porque no hay 532 00:20:12,200 --> 00:20:14,180 no hace falta que describir el módulo 533 00:20:14,180 --> 00:20:15,680 ni nada, porque solo hay uno 534 00:20:15,680 --> 00:20:17,640 pero si hubiera varios 535 00:20:17,640 --> 00:20:20,180 cada módulo tiene su módulo info 536 00:20:20,180 --> 00:20:22,240 que el módulo info es un ficherito de texto 537 00:20:22,240 --> 00:20:24,200 que dice, oye 538 00:20:24,200 --> 00:20:26,480 este módulo 539 00:20:26,480 --> 00:20:28,640 necesita las clases 540 00:20:28,640 --> 00:20:30,000 de aquí, de aquí, de aquí 541 00:20:30,000 --> 00:20:32,599 y además permite el uso 542 00:20:32,599 --> 00:20:34,779 de las clases suyas, esta y esta 543 00:20:34,779 --> 00:20:36,700 y esta, entonces se queda todo como más 544 00:20:36,700 --> 00:20:38,480 compartimentado, más encapsulado 545 00:20:38,480 --> 00:20:40,400 para esto van los módulos en realidad 546 00:20:40,400 --> 00:20:42,900 para tener el código más organizado, más compartimentado 547 00:20:42,900 --> 00:20:44,779 más compartimentado 548 00:20:46,359 --> 00:20:46,880 y todo eso 549 00:20:46,880 --> 00:20:47,640 para eso vale 550 00:20:47,640 --> 00:20:50,680 que normalmente las aplicaciones de 551 00:20:50,680 --> 00:20:52,619 todo el mundo, de toda la vida de Dios son un solo módulo 552 00:20:52,619 --> 00:20:55,839 y ya está, y el módulo info 553 00:20:55,839 --> 00:20:57,920 describe ese módulo si es que lo queremos usar 554 00:20:57,920 --> 00:20:58,740 pero no hace falta 555 00:20:58,740 --> 00:21:00,799 bueno 556 00:21:00,799 --> 00:21:03,359 el módulo es como un paquete 557 00:21:03,359 --> 00:21:04,740 entonces para distintas 558 00:21:04,740 --> 00:21:07,299 cada módulo tiene un montón de paquetes 559 00:21:07,299 --> 00:21:07,599 dentro 560 00:21:07,599 --> 00:21:11,200 cada módulo es como una parte 561 00:21:11,200 --> 00:21:13,380 de mi código, o sea mi código a lo mejor son 562 00:21:13,380 --> 00:21:15,599 mi aplicación, son mil clases 563 00:21:15,599 --> 00:21:17,359 y puedo tener un módulo 564 00:21:17,359 --> 00:21:18,799 con 500, otro módulo con 150 565 00:21:18,799 --> 00:21:20,700 y otro módulo con 250, yo que sé 566 00:21:20,700 --> 00:21:23,500 o sea un paquete tiene clases y un módulo tiene paquetes 567 00:21:23,500 --> 00:21:26,400 exacto 568 00:21:26,400 --> 00:21:28,859 y un módulo aparte de sus clases 569 00:21:28,859 --> 00:21:30,920 puede ser que necesite para funcionar 570 00:21:30,920 --> 00:21:32,819 clases de otro módulo, porque lo llaman 571 00:21:32,819 --> 00:21:33,819 sus propias clases 572 00:21:33,819 --> 00:21:36,720 y además puede ser que quiera dar 573 00:21:36,720 --> 00:21:38,759 permiso para que otros módulos usen sus 574 00:21:38,759 --> 00:21:41,059 clases o las instancien, pues todo eso 575 00:21:41,059 --> 00:21:42,720 se describe en el módulo 576 00:21:42,720 --> 00:21:43,099 info 577 00:21:43,099 --> 00:21:46,740 ¿vale? con que nos quedemos con eso 578 00:21:46,740 --> 00:21:47,640 es suficiente 579 00:21:47,640 --> 00:21:49,339 no hay más 580 00:21:49,339 --> 00:21:52,680 entonces, ¿qué ocurre? 581 00:21:54,180 --> 00:21:54,500 bueno 582 00:21:54,500 --> 00:21:56,720 pues que las librerías 583 00:21:56,720 --> 00:21:57,799 de JavaFX 584 00:21:57,799 --> 00:22:01,519 están modularizadas 585 00:22:01,519 --> 00:22:03,000 es decir, son .jar 586 00:22:03,000 --> 00:22:05,480 que están separados por módulos 587 00:22:05,480 --> 00:22:07,460 eso es lo que nos implica 588 00:22:07,460 --> 00:22:08,000 ahora nosotros 589 00:22:08,000 --> 00:22:11,500 nuestra aplicación va a seguir siendo un módulo igualmente 590 00:22:11,500 --> 00:22:12,819 mi aplicación va a ser un módulo 591 00:22:12,819 --> 00:22:15,480 pero va a necesitar cosas 592 00:22:15,480 --> 00:22:17,240 de otros módulos 593 00:22:17,240 --> 00:22:19,039 que no lo sabré yo 594 00:22:19,039 --> 00:22:21,500 porque ya son estas librerías que yo descargaré 595 00:22:22,259 --> 00:22:23,039 ¿vale? 596 00:22:23,400 --> 00:22:24,920 pero mi aplicación va a ser igual 597 00:22:24,920 --> 00:22:26,599 un mismo módulo como lo hemos hecho siempre 598 00:22:26,599 --> 00:22:28,859 lo único es que ahora 599 00:22:28,859 --> 00:22:31,460 las clases 600 00:22:31,460 --> 00:22:32,839 que tenemos que importar 601 00:22:32,839 --> 00:22:35,700 no son puntojar que están ahí sueltos 602 00:22:35,700 --> 00:22:37,259 de la vida de Dios, yo los meto al 603 00:22:37,259 --> 00:22:39,480 claspaz y ya está, no son puntojar 604 00:22:39,480 --> 00:22:41,319 que están sueltos para que vayan al claspaz 605 00:22:41,319 --> 00:22:42,640 lo que son 606 00:22:42,640 --> 00:22:44,539 son módulos 607 00:22:44,539 --> 00:22:47,200 entonces importar un módulo 608 00:22:47,200 --> 00:22:50,859 no es tan sencillo 609 00:22:50,859 --> 00:22:53,140 entonces esa es la primera 610 00:22:53,140 --> 00:22:55,019 cosa peliaguda, que las 611 00:22:55,019 --> 00:22:57,440 librerías de JavaFX al ser en realidad 612 00:22:57,440 --> 00:22:59,539 al estar organizadas en módulos 613 00:22:59,539 --> 00:23:01,000 ellas, al estar organizadas en módulos 614 00:23:01,000 --> 00:23:03,759 yo no incorporo el jar al classpath y se acabó 615 00:23:03,759 --> 00:23:05,480 no, tengo que hacer algo más 616 00:23:05,480 --> 00:23:06,579 ¿vale? 617 00:23:08,740 --> 00:23:10,079 y ahora eso por un lado 618 00:23:10,079 --> 00:23:12,920 y por otro lado, arrancar la aplicación 619 00:23:12,920 --> 00:23:13,839 tampoco es trivial 620 00:23:13,839 --> 00:23:16,680 ¿vale? porque para cuando la aplicación 621 00:23:16,680 --> 00:23:18,599 arranca, hay que decir 622 00:23:18,599 --> 00:23:20,180 no puedo arrancarla como he hecho hasta ahora 623 00:23:20,180 --> 00:23:22,079 de runas, java, application, no 624 00:23:22,079 --> 00:23:24,160 porque cuando una aplicación tiene módulos 625 00:23:24,160 --> 00:23:26,440 para arrancarla, tenemos que 626 00:23:26,440 --> 00:23:28,359 explicarle a la aplicación 627 00:23:28,359 --> 00:23:30,180 dónde se encuentran esos módulos, 628 00:23:30,299 --> 00:23:32,000 porque ahora no hay un classpath donde está todo. 629 00:23:32,539 --> 00:23:33,859 Ahora no hay un classpath donde está todo. 630 00:23:34,740 --> 00:23:37,279 Ahora hay que arrancarla con unos parámetros 631 00:23:37,279 --> 00:23:40,079 que informen de dónde están esos módulos 632 00:23:40,079 --> 00:23:41,279 que yo he incorporado. 633 00:23:42,759 --> 00:23:43,240 Conclusión. 634 00:23:44,039 --> 00:23:46,279 Se convierte en mucho más complicado 635 00:23:46,279 --> 00:23:48,059 importar las librerías 636 00:23:48,059 --> 00:23:49,579 y arrancar la aplicación. 637 00:23:51,099 --> 00:23:53,079 Podríamos hacerlo incorporando las librerías 638 00:23:53,079 --> 00:23:54,160 al módulo de path 639 00:23:54,160 --> 00:23:55,579 y luego arrancando la aplicación 640 00:23:55,579 --> 00:23:57,819 dándole unos parámetros a la máquina virtual, 641 00:23:57,819 --> 00:23:59,339 dándole las rutas de los módulos 642 00:23:59,339 --> 00:24:00,839 podríamos hacerlo así y ya está 643 00:24:00,839 --> 00:24:03,559 pero ya empieza a complicarse 644 00:24:03,559 --> 00:24:05,859 una tarea tan automática 645 00:24:05,859 --> 00:24:06,619 entre comillas 646 00:24:06,619 --> 00:24:09,759 como importar librerías y ejecutar 647 00:24:09,759 --> 00:24:11,980 que en principio es automática hasta ahora 648 00:24:11,980 --> 00:24:13,359 importo librerías, ejecuto 649 00:24:13,359 --> 00:24:15,559 pues una tarea que en principio debería ser automática 650 00:24:15,559 --> 00:24:17,359 se empieza a hacer complicada 651 00:24:17,359 --> 00:24:19,599 entonces como se empieza a hacer complicada 652 00:24:19,599 --> 00:24:21,019 y no tiene sentido que lo hagamos todo el rato 653 00:24:21,019 --> 00:24:22,359 cada vez que queremos incorporar la aplicación 654 00:24:22,359 --> 00:24:24,160 ni nosotros ni el universo 655 00:24:24,160 --> 00:24:27,400 pues aquí es donde ya empiezan a cobrar 656 00:24:27,400 --> 00:24:29,240 sentido unas cosas 657 00:24:29,240 --> 00:24:30,819 que igual habéis mencionado ya 658 00:24:30,819 --> 00:24:33,000 en entornos de desarrollo 659 00:24:33,000 --> 00:24:35,259 que son las herramientas de 660 00:24:35,259 --> 00:24:37,559 gestión 661 00:24:37,559 --> 00:24:45,829 de proyectos. Como por ejemplo 662 00:24:45,829 --> 00:24:50,059 Maven 663 00:24:50,059 --> 00:24:52,059 ¿Os suena el nombre? 664 00:24:53,200 --> 00:24:54,339 Sí, pero no 665 00:24:54,339 --> 00:24:55,460 hemos empezado a verlo. 666 00:24:55,880 --> 00:24:57,460 Por ejemplo, Gradle 667 00:24:57,460 --> 00:25:00,220 otra también, que son las dos más 668 00:25:00,220 --> 00:25:00,799 comunes. 669 00:25:01,799 --> 00:25:03,559 En Java esencialmente es. 670 00:25:07,009 --> 00:25:08,750 Entonces, estas herramientas 671 00:25:08,750 --> 00:25:10,170 de gestión de proyectos, ¿qué hacen? 672 00:25:12,930 --> 00:25:14,569 Pues es un pequeño software 673 00:25:14,569 --> 00:25:16,789 que hace 674 00:25:16,789 --> 00:25:18,490 algunas tareas por nosotros. 675 00:25:19,450 --> 00:25:20,970 Nosotros la configuramos, 676 00:25:21,349 --> 00:25:22,950 configuramos esa herramienta, 677 00:25:23,369 --> 00:25:25,329 que es un pequeño software, la configuramos 678 00:25:25,329 --> 00:25:27,509 con ficheros de configuración 679 00:25:27,509 --> 00:25:31,250 y esa herramienta 680 00:25:31,250 --> 00:25:33,069 hace ya tareas 681 00:25:33,069 --> 00:25:34,789 por nosotros y nos ahorra trabajo. 682 00:25:34,789 --> 00:25:36,230 Puede hacer tareas como compilar, 683 00:25:36,769 --> 00:25:38,230 puede hacer tareas como pasar test, 684 00:25:38,750 --> 00:25:40,490 puede hacer tareas como esta, 685 00:25:41,210 --> 00:25:42,769 que es la que nos va a venir bien a nosotros, 686 00:25:42,930 --> 00:25:45,869 que es incorporar librerías y arrancar la aplicación, 687 00:25:46,470 --> 00:25:48,809 puede hacer todo eso por nosotros. 688 00:25:49,769 --> 00:25:51,470 Entonces, ahora sí que tiene sentido 689 00:25:51,470 --> 00:25:54,789 que incorporemos a nuestros proyectos 690 00:25:54,789 --> 00:25:58,029 esta pequeña o grande, según el uso que queramos darla, 691 00:25:58,390 --> 00:25:59,670 de gestión de proyectos 692 00:25:59,670 --> 00:26:03,190 y así nos va a facilitar incorporar las librerías 693 00:26:03,190 --> 00:26:05,230 y arrancar el proyecto, nos lo va a facilitar. 694 00:26:05,230 --> 00:26:09,069 Bueno, pues entonces 695 00:26:09,069 --> 00:26:11,269 Vamos a 696 00:26:11,269 --> 00:26:13,789 Arrancar un primer proyecto 697 00:26:13,789 --> 00:26:14,470 Con Mabel 698 00:26:14,470 --> 00:26:19,849 Importando las librerías del JavaFX 699 00:26:19,849 --> 00:26:21,630 Aquí ya, claro 700 00:26:21,630 --> 00:26:23,309 Cuando uno empieza a importar librerías 701 00:26:23,309 --> 00:26:26,670 A partir de ahora ya 702 00:26:26,670 --> 00:26:28,970 Os he dicho librerías hasta ahora todo el rato 703 00:26:28,970 --> 00:26:31,630 Porque es una palabra que nos es más familiar 704 00:26:31,630 --> 00:26:33,490 Una librería es un conjunto de clases 705 00:26:33,490 --> 00:26:34,109 Que voy a usar 706 00:26:34,109 --> 00:26:37,150 pero la palabra que deberíamos usar 707 00:26:37,150 --> 00:26:39,170 y vamos a usar a partir de ahora 708 00:26:39,170 --> 00:26:41,750 porque es la palabra técnica de desarrollo 709 00:26:41,750 --> 00:26:43,309 es dependencia 710 00:26:43,309 --> 00:26:45,250 dependencia es 711 00:26:45,250 --> 00:26:47,630 un conjunto de clases 712 00:26:47,630 --> 00:26:49,230 de los cuales tu aplicación depende 713 00:26:49,230 --> 00:26:50,769 para funcionar porque los usa 714 00:26:50,769 --> 00:26:53,130 entonces 715 00:26:53,130 --> 00:26:56,049 nuestra aplicación va a necesitar 716 00:26:56,049 --> 00:26:57,289 las dependencias 717 00:26:57,289 --> 00:26:58,829 de JavaFX 718 00:26:58,829 --> 00:27:02,589 mejor decirlo así 719 00:27:02,589 --> 00:27:04,910 que decir las librerías de JavaFX 720 00:27:04,910 --> 00:27:06,769 entonces 721 00:27:06,769 --> 00:27:08,509 Maven, para lo que es 722 00:27:08,509 --> 00:27:10,250 maravilloso, imprescindible 723 00:27:10,250 --> 00:27:13,150 ya en cuanto tú empiezas a usar librerías externas 724 00:27:13,150 --> 00:27:14,910 o dependencias, es para 725 00:27:14,910 --> 00:27:16,150 la gestión de dependencias 726 00:27:16,150 --> 00:27:18,690 porque si no tendríamos que estar buscando por el mundo 727 00:27:18,690 --> 00:27:20,589 por internet, por todos lados, los hard 728 00:27:20,589 --> 00:27:22,410 descargarlos, incorporarlos 729 00:27:22,410 --> 00:27:24,690 y eso es un rollo, pues Maven hace 730 00:27:24,690 --> 00:27:25,809 todo eso por nosotros 731 00:27:25,809 --> 00:27:29,089 entonces, usar herramientas de gestión de proyectos 732 00:27:29,089 --> 00:27:29,970 cuando ya el proyecto 733 00:27:29,970 --> 00:27:32,250 incorporar dependencias, tengo que estar 734 00:27:32,250 --> 00:27:34,849 automatizando pruebas o cosas, ya es imprescindible 735 00:27:34,849 --> 00:27:36,509 pues venga 736 00:27:36,509 --> 00:27:38,390 ahora ya precisamente 737 00:27:38,390 --> 00:27:40,650 cuando ya necesitamos dependencias 738 00:27:40,650 --> 00:27:42,490 externas, maven y 739 00:27:42,490 --> 00:27:44,490 rollos de estos, ahora es cuando ya 740 00:27:44,490 --> 00:27:46,450 empiezan a pasar cosas 741 00:27:46,450 --> 00:27:48,490 en función de la versión que tengamos 742 00:27:48,490 --> 00:27:50,329 de Eclipse, de JDK, etc 743 00:27:50,329 --> 00:27:52,430 entonces ahora ya pues 744 00:27:52,430 --> 00:27:54,490 algunos os funcionarán desde el principio 745 00:27:54,490 --> 00:27:56,710 a otros no, tendréis que retocar cosas 746 00:27:56,710 --> 00:27:58,670 etc, veremos, misterio 747 00:27:58,670 --> 00:28:03,349 Claro, Mabel automáticamente 748 00:28:03,349 --> 00:28:04,910 Tú le dices, quiero esto 749 00:28:04,910 --> 00:28:07,289 Y de forma transparente para ti 750 00:28:07,289 --> 00:28:09,289 Se conecta al repositorio suyo de Mabel 751 00:28:09,289 --> 00:28:11,430 Lo descarga y te lo deja 752 00:28:11,430 --> 00:28:12,849 En un repositorio local 753 00:28:12,849 --> 00:28:14,809 Para que no tengas que estar todo el rato 754 00:28:14,809 --> 00:28:15,730 ¿Vale? 755 00:28:16,329 --> 00:28:18,910 Cuando tu aplicación arranca, va al repositorio local 756 00:28:18,910 --> 00:28:20,349 Si ve que el repositorio local está vacío 757 00:28:20,349 --> 00:28:22,890 Automáticamente, sin decirte nada, se vuelve a conectar y te lo baja 758 00:28:22,890 --> 00:28:24,390 ¿Vale? 759 00:28:26,279 --> 00:28:27,859 Pues venga, vamos a ver si tenemos suerte 760 00:28:27,859 --> 00:28:29,400 Y nos funciona todo desde el principio 761 00:28:29,400 --> 00:28:32,460 que no es tan fácil 762 00:28:32,460 --> 00:28:34,220 que nos funcione todo desde el principio 763 00:28:34,220 --> 00:28:37,819 cuando ya dependemos de cosas raras 764 00:28:37,819 --> 00:28:39,660 vale 765 00:28:39,660 --> 00:28:50,559 a ver, bueno 766 00:28:50,559 --> 00:28:53,380 son las 37, vamos a aprovechar a parar aquí un momento 767 00:28:53,380 --> 00:28:55,900 a ver 768 00:28:55,900 --> 00:28:58,059 un momentito