1 00:00:00,000 --> 00:00:09,300 Entonces, vamos a ir, voy a grabar esta clase, por lo tanto si habláis o escribís algo, pues será grabado para siempre en mis vídeos, ¿vale? 2 00:00:09,460 --> 00:00:17,859 Ok, entonces, repito porque antes no lo he dicho, tenemos instalados el SimBuilder instalado, ¿vale? 3 00:00:17,899 --> 00:00:29,000 Tenemos este zip de aquí, que estos dos se pueden bajar desde el sitio de Gluon, o sea que se bajan tranquilamente, o desde mi aula virtual, si queréis. 4 00:00:30,000 --> 00:00:38,899 Esta carpeta aquí la tenemos por algún lado, nosotros la tenemos en el Workspace y tenemos instalado el plugin de JavaFX aquí dentro, ¿vale? 5 00:00:38,899 --> 00:00:49,200 Aquí estamos, así se queda grabado. Es este de aquí. Yo busco aquí JavaFX y aquí dentro esto, ¿vale? 6 00:00:49,420 --> 00:00:52,600 Que está instalado. A partir de aquí es donde empezamos, ¿vale? 7 00:00:53,280 --> 00:00:57,840 Entonces, nosotros lo que vamos a hacer es crear un nuevo proyecto, ¿vale? 8 00:00:57,840 --> 00:01:07,560 Pero en vez de un proyecto Java, vamos a Over, la instalación del plugin me ha dado esta nueva carpetita aquí, 9 00:01:07,560 --> 00:01:14,200 donde vienen cosas de Java CX. Yo voy a utilizar el proyecto Java CX, ¿vale? 10 00:01:16,019 --> 00:01:21,500 Esto le doy un nombre, por ejemplo, GUI botones, ¿vale? 11 00:01:22,719 --> 00:01:27,700 Y entonces me crea un nuevo proyecto. Este proyecto de aquí tiene esta estructura, ¿vale? 12 00:01:27,700 --> 00:01:28,900 Algunas cosas ya están. 13 00:01:29,400 --> 00:01:34,980 Lo que le falta al proyecto es todo lo que está relacionado con JavaFX. 14 00:01:35,500 --> 00:01:35,680 ¿Vale? 15 00:01:35,760 --> 00:01:37,000 Entonces, se lo tengo que añadir. 16 00:01:37,079 --> 00:01:42,439 Para añadírselo, en el proyecto Maven, pues, habría el pom.xml que me dice, 17 00:01:42,560 --> 00:01:45,640 importame lo que tenga que importar, pero como nosotros no lo usamos todavía, 18 00:01:46,099 --> 00:01:52,780 pues, vamos a Properties, vamos a Java Build Path, vamos a Librerías, 19 00:01:52,780 --> 00:01:56,680 y aquí donde está el Modul Path, añadimos los Jara externos. 20 00:01:56,680 --> 00:02:03,319 estos tengo que navegar a buscar la carpeta esta que había extraído dentro 21 00:02:03,319 --> 00:02:07,280 de la carpeta que había extraído está la carpeta lib y dentro lib están estos 22 00:02:07,280 --> 00:02:11,120 jar estos son todos los jar que me sirven son las colecciones de clases 23 00:02:11,120 --> 00:02:19,240 relacionadas con javas x que sustancialmente me sirven vale algunas 24 00:02:19,240 --> 00:02:26,000 de estas serán demasiadas y no la uso pero para estar seguro selecciono todos 25 00:02:26,000 --> 00:02:34,280 y lo conecto vale aquí le doy a aplicar el clave cerrar y por lo tanto ahora me reconoce todas 26 00:02:34,280 --> 00:02:42,599 estas claves una pregunta si dice algo o alguien de los que están conectados desde casa me lo decís 27 00:02:42,599 --> 00:02:49,139 vamos a ver qué dice 28 00:02:49,139 --> 00:02:59,919 lo tendremos que hacer pues depende antes del examen ya se os dirá cómo se va a hacer vale 29 00:02:59,919 --> 00:03:04,979 si se os dice podéis usar lo que os da la gana si se os dice podéis usar la librería 30 00:03:04,979 --> 00:03:09,900 si tenéis que usar llave pero todavía es pronto porque tanto esto no será el próximo examen más 31 00:03:09,900 --> 00:03:16,439 el examen siguiente por lo tanto por ahora esto lo tenemos todavía que decidir vale la idea que 32 00:03:16,439 --> 00:03:22,919 en clase veremos las dos cosas o podréis hacer las dos cosas luego más adelante para el examen 33 00:03:22,919 --> 00:03:27,900 el problema de maven es que necesita internet entonces el día del examen por algún lado hay 34 00:03:27,900 --> 00:03:32,520 problemas con internet o tenemos que quitaros el cable y cosas por eso para tener maven puede ser 35 00:03:32,520 --> 00:03:37,560 más complejo entonces a lo mejor os daremos simplemente la librería de java px vosotros 36 00:03:37,560 --> 00:03:45,360 como programadores que sois vais a aprender las dos cosas vale entonces una vez que tengo esta 37 00:03:45,360 --> 00:03:56,159 cosa de aquí hecha vale ya en teoría funciona vale este es un proyecto básico de fx que es una 38 00:03:56,159 --> 00:04:04,400 ventana vale pero no es lo que me interesa a mí me interesa crear aquí un par de cosas más primero 39 00:04:04,400 --> 00:04:15,620 un fichero que será mi interfaz o interfaz.fxml esto será el fichero donde estará la interfaz 40 00:04:15,620 --> 00:04:27,819 gráfica que editaremos con SimBuilder y por otro lado un controlador que 41 00:04:27,819 --> 00:04:33,699 estará, dónde estarán los métodos que vienen llamados desde la interfaz. 42 00:04:33,699 --> 00:04:39,639 Esto es normal que es de error porque por ahora está vacío y como es un fichero xml debería 43 00:04:39,639 --> 00:04:47,379 tener algo, pues por ahora no lo es. Entonces vamos a hacer botón derecho sobre la interfaz 44 00:04:47,379 --> 00:04:54,459 de fxml y aquí me da la opción de abrirlo con SimBuilder. Pincho aquí y me debería abrir 45 00:04:54,459 --> 00:05:06,699 ahí entonces ahora aquí tengo por un lado aquí contenedores y controles vale este de aquí son 46 00:05:06,699 --> 00:05:12,339 los dos principales que vamos a utilizar hay otras opciones como para hacer menús para ver 47 00:05:13,800 --> 00:05:20,939 en este chat gráficos y cosas por el estilo por ahora nosotros nos centraremos en los primeros 48 00:05:20,939 --> 00:05:27,199 dos por otro lado siempre de aquí utilizamos el inspector la parte que a la derecha principalmente 49 00:05:27,199 --> 00:05:34,079 el properties y el code vale esto será la pestaña que me permite digamos hacer de puente entre lo 50 00:05:34,079 --> 00:05:42,899 que veo aquí y lo que veo en el lado de modificación en el eclipse y luego aquí abajo el controller que 51 00:05:42,899 --> 00:05:50,100 me permite decir si esta es la parte digamos frontal la parte de front-end de la parte que 52 00:05:50,100 --> 00:05:56,860 que el usuario ve esta la conexión con sí vale más cuando hay un evento quién es el que recupera este 53 00:05:56,860 --> 00:06:01,740 evento y hace algo pues esta clase de controller allí dentro encontraré los métodos que lo que 54 00:06:01,740 --> 00:06:09,160 asignaré a los varios votos vamos a empezar por ejemplo hacer algo sencillo vale allá que aquí 55 00:06:09,160 --> 00:06:19,139 haya unos botones entonces eso es un pain es sólo un panel es un corcho donde luego apuntaré pondré 56 00:06:19,139 --> 00:06:27,240 todos los varios controles y pongo unos botones vale esto podría poner más esto es para hacerlo 57 00:06:27,240 --> 00:06:41,019 de forma visual vale en teoría esto si yo podría hacer comandos aquí de java para que me añada 58 00:06:41,019 --> 00:06:46,779 botones meten los botones las posiciones en algún lado cosas y de hecho este tipo de ejercicio aquí 59 00:06:46,779 --> 00:06:56,019 donde hay 24 botones llama más a que no se haga así más se haga con un Ford vale que pero está 60 00:06:56,019 --> 00:07:01,060 fuera de lo que estamos viendo por ahora por lo tanto por ahora lo dejo así vale quiero 24 botones 61 00:07:01,060 --> 00:07:10,470 me ponga aquí hago 24 botones este es el botón 1 y este es el último muy vale entonces la idea es 62 00:07:10,470 --> 00:07:15,930 que luego puede tener 3 4 5 lo que quiero hacer es que cuando hago clic en este botón este botón 63 00:07:15,930 --> 00:07:17,610 de alguna forma se desactive 64 00:07:17,610 --> 00:07:20,230 y marque aquí que ha sido pulsado. 65 00:07:20,509 --> 00:07:21,870 ¿Vale? Esto luego 66 00:07:21,870 --> 00:07:23,930 si uno le ha hecho un poco 67 00:07:23,930 --> 00:07:25,990 de fantasía, a partir de una cosa así 68 00:07:25,990 --> 00:07:28,050 puede intentar hacer algún juego 69 00:07:28,050 --> 00:07:29,230 como por ejemplo el 70 00:07:29,230 --> 00:07:32,509 Buscaminas 71 00:07:32,509 --> 00:07:33,930 o cosas por el estilo. ¿Vale? 72 00:07:34,430 --> 00:07:35,930 Con un poco de fantasía y un poco de trabajo. 73 00:07:36,230 --> 00:07:37,170 ¿Vale? Esto sería como 74 00:07:37,170 --> 00:07:39,730 el ancestro 75 00:07:39,730 --> 00:07:41,329 de un Buscaminas. ¿Sí? 76 00:07:42,269 --> 00:07:42,750 Vale. 77 00:07:42,750 --> 00:07:49,370 ahora lo que yo quiero es que cuando pinche aquí estos botones hagan algo vale entonces para eso 78 00:07:49,370 --> 00:07:56,689 necesito un controlador el me ve de controlador no vale entonces me voy a aquí donde creado el 79 00:07:56,689 --> 00:08:03,889 controller vale y le digo le creó al menos un método vale por ahora lo vamos a hacer mal luego 80 00:08:03,889 --> 00:08:25,810 después lo intentamos hacer mejor. Entonces hago un fxml, mongoprivate, por ejemplo, private, void, click1, que hará cosas. Por ahora lo que quiero que haga es simplemente escribir click en pantalla. 81 00:08:25,810 --> 00:08:50,669 Ahora veis que esto se enfada, me dice oye mira no sé qué es, entonces le tenemos que decir oye mira quiero que en el módulo info pues requiera javacx.xml 82 00:08:50,669 --> 00:08:58,330 porque se puede ver en javainfo aquí todavía esto no está el required, está solo el controls pero le falta esta otra cosa. 83 00:08:58,590 --> 00:09:03,210 Pues como me ayuda él a hacerlo, tampoco es un problema, le digo sí, sí, sí, hazlo. 84 00:09:04,470 --> 00:09:13,149 Entonces ahora me ha añadido aquí esta cosa aquí también, sigue enfadándose porque dice, vale, tengo que importar también aquí esta parte de aquí, ¿vale? 85 00:09:13,789 --> 00:09:23,889 Esta línea de aquí, lo que hace es una llamada al preprocesador que me dice, oye, mira, esta cosa de aquí juega en el mundo de JavaFX. 86 00:09:23,889 --> 00:09:32,730 entonces cuando tú vas a entrelazar el mundo que está creando en el sim builder con el mundo que 87 00:09:32,730 --> 00:09:38,289 se existe aquí en la parte de eclipse pues esta es una parte fundamental esto tiene que estar 88 00:09:38,289 --> 00:09:44,669 disponible también al otro lado en un cierto sentido quiero juntar esto con lo que viene 89 00:09:44,669 --> 00:09:49,610 aquí. Que no lo he guardado todavía 90 00:09:49,610 --> 00:09:50,929 y por lo tanto no está. ¿Vale? 91 00:09:51,190 --> 00:09:56,240 Lo voy a guardar. Y entonces con 92 00:09:56,240 --> 00:09:58,200 esta cosa aquí. ¿Vale? De alguna 93 00:09:58,200 --> 00:10:00,340 forma aquí pondré cosas 94 00:10:00,340 --> 00:10:01,960 que hacen referencia 95 00:10:01,960 --> 00:10:04,220 a esta cosa de aquí. ¿Vale? 96 00:10:05,399 --> 00:10:05,779 Ahora, 97 00:10:06,120 --> 00:10:08,080 si tengo un poco de suerte, a un cierto 98 00:10:08,080 --> 00:10:09,820 momento esto debería aparecer aquí. 99 00:10:10,000 --> 00:10:11,379 Debería aparecer la clase. 100 00:10:11,919 --> 00:10:14,440 Como a veces no se actualiza, 101 00:10:15,360 --> 00:10:16,100 vamos a hacerlo 102 00:10:16,100 --> 00:10:18,259 distinto. Que lo cierro 103 00:10:18,259 --> 00:10:19,100 y lo vuelvo a abrir. 104 00:10:20,220 --> 00:10:28,659 Ahora se va a dar cuenta que existe este controlador, que este controlador tiene esta etiqueta AFX y me debería decir, 105 00:10:29,059 --> 00:10:40,320 ah, sí, ok, lo reconozco como una clase posible de controlador y que si tú la seleccionas, pues entonces yo sé que el controlador de esta interfaz es esta clase. 106 00:10:40,320 --> 00:10:43,379 si esto lo reconoce 107 00:10:43,379 --> 00:10:45,740 como ha pasado aquí, entonces cuando yo me voy 108 00:10:45,740 --> 00:10:47,860 a un botón, selecciono el botón 109 00:10:47,860 --> 00:10:49,879 y me voy al on action 110 00:10:49,879 --> 00:10:51,480 él 111 00:10:51,480 --> 00:10:53,919 me enseña 112 00:10:53,919 --> 00:10:56,100 cuáles son los métodos que se pueden utilizar 113 00:10:56,100 --> 00:10:57,379 al momento de hacer clic 114 00:10:57,379 --> 00:10:59,720 ¿vale? entonces por ejemplo 115 00:10:59,720 --> 00:11:01,840 yo puedo pillar este de aquí y ahora 116 00:11:01,840 --> 00:11:03,139 he apuntado que 117 00:11:03,139 --> 00:11:05,720 esta interfaz tiene 118 00:11:05,720 --> 00:11:07,740 una clase 119 00:11:07,740 --> 00:11:09,320 controladora que es esta de aquí 120 00:11:09,320 --> 00:11:15,100 Y, en particular, este botón, cuando lo clico, lo que hace es ejecutar este método. 121 00:11:16,679 --> 00:11:22,679 Tened en cuenta que esto no se refleja en ningún lado aquí, por ahora. 122 00:11:23,500 --> 00:11:26,600 Si lo busco, no veo nada de estas cosas, porque tengo que guardar todavía. 123 00:11:27,659 --> 00:11:35,299 Entonces, guardo esto, vuelvo aquí, lo recargo en S5, o con un poco de suerte ya lo he hecho, 124 00:11:35,679 --> 00:11:39,480 y si ahora voy a mirar, por algún lado veo esta referencia. 125 00:11:39,480 --> 00:11:42,279 ahora tengo este botón 126 00:11:42,279 --> 00:11:44,120 que al hacer on action 127 00:11:44,120 --> 00:11:45,860 al hacer click pues llamará 128 00:11:45,860 --> 00:11:46,919 este método de aquí 129 00:11:46,919 --> 00:11:49,779 y aquí por algún lado 130 00:11:49,779 --> 00:11:52,000 el controlador 131 00:11:52,000 --> 00:11:53,919 de esta ventana 132 00:11:53,919 --> 00:11:56,139 es esta clase de aquí 133 00:11:56,139 --> 00:11:57,120 si 134 00:11:57,120 --> 00:11:58,639 dudas 135 00:11:58,639 --> 00:12:04,529 con esta cosa maravillosa si yo la lanzo 136 00:12:04,529 --> 00:12:06,649 que pasa nada como siempre 137 00:12:06,649 --> 00:12:08,429 vale porque mi main 138 00:12:08,429 --> 00:12:10,549 todavía está cargando 139 00:12:10,549 --> 00:12:11,909 esta ventana vacía 140 00:12:11,909 --> 00:12:21,409 vale no está haciendo nada con este xml para que funcione este xml no tengo que crearme una 141 00:12:21,409 --> 00:12:30,629 escena de esta forma mantengo que cargar este fichero de aquí vale ahora yo tengo mala memoria 142 00:12:30,629 --> 00:12:37,919 siempre se me olvida como se carga por lo tanto lo uniré en otro proyecto pero vosotros lo aprendéis 143 00:12:37,919 --> 00:12:50,519 memoria esta cosa aquí porque estas cosas de aquí lanzan a posibles excepciones por lo tanto esto es 144 00:12:50,519 --> 00:12:58,559 protegido con un proyecto lo que yo quiero es esto vale este de aquí que es es un fichero es un 145 00:12:58,559 --> 00:13:07,519 objeto de JavaFX que es fxmlLoader, el cargador de un objeto fxml, que 146 00:13:07,519 --> 00:13:12,559 sustancialmente lo que me crea es un objeto Loader que con el método load 147 00:13:12,559 --> 00:13:22,559 importa, lee, entiende, importa este xml. Este es un lenguaje xml, yo podría 148 00:13:22,559 --> 00:13:30,059 esto editarlo a mano, pero tengo un editor visual, un editor gráfico, por lo tanto soy más feliz, 149 00:13:30,059 --> 00:13:37,860 pero luego esta información de aquí tiene que ser procesada por alguien para que entienda que 150 00:13:37,860 --> 00:13:47,279 esta de aquí es esta interfaz. Y quien lo hace es, a punto, este objeto de aquí. Me creo un nuevo 151 00:13:47,279 --> 00:13:57,740 de este tipo y lo analizo al otro lado vale entonces esto lo pongo aquí 152 00:13:59,799 --> 00:14:06,759 veis que el start pilla un objeto stage vale que aquí se llama primary stage mientras que aquí 153 00:14:06,759 --> 00:14:11,820 estoy usando stage o cambio esto cambio esto pero sería este el objeto que quiero utilizar 154 00:14:11,820 --> 00:14:22,980 entonces este de aquí es un cargador una cosa que puede cargar un este objeto de aquí fijaos 155 00:14:22,980 --> 00:14:27,940 que esto se llama google.xml pero en mi proyecto yo lo llamando interfaz por lo tanto esto tendrá 156 00:14:27,940 --> 00:14:36,539 que ser fichero interfaz si no me dice no consigo encontrar el fichero y luego un parent root esto 157 00:14:36,539 --> 00:14:44,039 aquí es como el elemento raíz de mi interfaz. A partir de allí construiré todo el resto. Sería 158 00:14:44,039 --> 00:14:54,220 este. En la jerarquía este señor de aquí. Esto sería mi root. Y cuando tú llamas el loader.load 159 00:14:54,220 --> 00:15:01,500 lo que hace él es cargarte toda la interfaz leyendo este fichero de aquí y luego a partir 160 00:15:01,500 --> 00:15:03,539 de haber leído este pichón aquí, te devuelve 161 00:15:03,539 --> 00:15:05,159 un puntero 162 00:15:05,159 --> 00:15:06,980 un handler 163 00:15:06,980 --> 00:15:09,720 un elemento 164 00:15:09,720 --> 00:15:10,899 un manejador 165 00:15:10,899 --> 00:15:12,480 que me permite 166 00:15:12,480 --> 00:15:15,559 que apunta 167 00:15:15,559 --> 00:15:17,159 al objeto raíz 168 00:15:17,159 --> 00:15:19,539 de mi interfaz 169 00:15:19,539 --> 00:15:21,440 sustancialmente después de haberlo cargado 170 00:15:21,440 --> 00:15:23,580 me devuelve un puntero 171 00:15:23,580 --> 00:15:24,759 a este señor de aquí 172 00:15:24,759 --> 00:15:27,039 para que yo lo pueda luego utilizar como decir 173 00:15:27,039 --> 00:15:29,480 mira, ahora dibújame la interfaz 174 00:15:29,480 --> 00:15:30,960 a partir de este 175 00:15:30,960 --> 00:15:32,720 elemento 176 00:15:32,720 --> 00:15:34,799 ¿sí? ¿por qué? 177 00:15:35,279 --> 00:15:37,019 porque cuando luego creo una 178 00:15:37,019 --> 00:15:38,960 escena, ¿vale? 179 00:15:39,139 --> 00:15:40,960 una escena se basa sobre 180 00:15:40,960 --> 00:15:41,679 dame 181 00:15:41,679 --> 00:15:44,559 un elemento raíz 182 00:15:44,559 --> 00:15:47,259 a partir del que yo podré mirar 183 00:15:47,259 --> 00:15:49,220 qué componentes has puesto tú dentro 184 00:15:49,220 --> 00:15:51,019 yo por ejemplo he puesto dos botones 185 00:15:51,019 --> 00:15:53,200 pero habría podido poner un tap panel 186 00:15:53,200 --> 00:15:55,240 podría haber pues otra cosa, pero a partir 187 00:15:55,240 --> 00:15:57,100 de este root, que es 188 00:15:57,100 --> 00:15:58,879 digamos la raíz, yo podré tirar 189 00:15:58,879 --> 00:16:04,580 diciendo dame sus hijos dame los que es como un contenedor dame los que el contenido y a 190 00:16:04,580 --> 00:16:08,639 partir del contenido puede tirar el contenido del contenido del contenido de proteína y ir 191 00:16:08,639 --> 00:16:13,759 dibujando todo pero todo tiene que empezar desde un punto y este es mi punto de empiezo digamos 192 00:16:13,759 --> 00:16:24,340 para dibujar la la interfaz y el tamaño de la ventana que quiero crear vale os decía ayer que 193 00:16:24,340 --> 00:16:27,440 Y JavaFX se usa como una analogía de un teatro. 194 00:16:27,860 --> 00:16:32,399 Yo por un lado tengo un stage, que es el palco. 195 00:16:34,399 --> 00:16:36,379 Y por otro lado tengo escenas. 196 00:16:36,820 --> 00:16:40,799 Mis ventanas, mi interfaz, son escenas de un palco. 197 00:16:40,799 --> 00:16:45,480 En cada momento yo puedo decir, mira, ahora va a empezar la escena A, 198 00:16:46,000 --> 00:16:48,799 pues cárdala en el palco y que se vea. 199 00:16:49,740 --> 00:16:52,700 Entonces yo tengo este stage hecho. 200 00:16:52,700 --> 00:17:05,160 Voy a cargar esta escena creando una nueva escena basándome sobre la raíz que me ha dado el cargador del fichero XML y el tamaño que quiero que tenga esta escena. 201 00:17:06,339 --> 00:17:14,920 Y a este punto, bueno, esto es opcional, le doy un título a lo que se ve ahora, ¿vale? 202 00:17:15,359 --> 00:17:22,099 Y luego en el palco seto una determinada escena y la enseño, ¿vale? 203 00:17:22,700 --> 00:17:24,700 Este de aquí será botones. 204 00:17:27,339 --> 00:17:31,900 Entonces, si todo funciona ahora, pues me carga este fichero, 205 00:17:32,140 --> 00:17:37,240 me lo selecciona como una escena y luego lo enseña en el barco. 206 00:17:38,599 --> 00:17:38,819 ¿Leí? 207 00:17:42,089 --> 00:17:43,190 Vaya, una maravilla. 208 00:17:43,950 --> 00:17:47,529 Fijaos que esto, botones, es esta cosa aquí. 209 00:17:49,369 --> 00:17:52,450 Es el nombrecito que pongo a la venta. 210 00:17:53,250 --> 00:17:56,569 Entonces, como ahora tengo dos botones y este botón de aquí 211 00:17:56,569 --> 00:17:59,089 tenía también un método 212 00:17:59,089 --> 00:18:00,829 del controlador, cuando yo 213 00:18:00,829 --> 00:18:03,309 clico este botón de aquí, en teoría 214 00:18:03,309 --> 00:18:08,140 me hace algo. 215 00:18:09,519 --> 00:18:09,859 ¿Dudas? 216 00:18:11,700 --> 00:18:12,480 Este no hace 217 00:18:12,480 --> 00:18:13,960 nada porque todavía no le he dicho que haga nada. 218 00:18:15,400 --> 00:18:15,980 ¿Eh? Vale. 219 00:18:17,220 --> 00:18:18,140 ¿Dudas? Hasta aquí. 220 00:18:22,299 --> 00:18:23,220 No sé nunca dónde está. 221 00:18:23,220 --> 00:18:24,059 ¿Dónde está? 222 00:18:25,400 --> 00:18:25,960 Ahí. 223 00:18:29,440 --> 00:18:30,079 ¿Por qué? 224 00:18:30,240 --> 00:18:32,480 Pero si le cae información de un fichero, 225 00:18:32,599 --> 00:18:34,980 eso también tiraría yo de la excepción. 226 00:18:35,119 --> 00:18:45,200 no habría que meterlo dentro del try técnicamente yo creo que el quien lanza el este es sólo un 227 00:18:45,200 --> 00:18:51,720 constructor vale el constructor pillará los recursos desde desde este fichero no sé si 228 00:18:51,720 --> 00:18:57,619 este constructor lanza una excepción o no pero me da la impresión que no o que no sé o que sea 229 00:18:57,619 --> 00:19:04,220 posible no controlarla vale el problema serio es cuando lo vas a utilizar es como si este aquí 230 00:19:04,220 --> 00:19:09,019 se almacena hace por algún lado donde lo va a leer pero todavía no lo va a leer en el momento 231 00:19:09,019 --> 00:19:15,140 en que lo lee es cuando efectivamente lo cargas entonces es aquí donde podría lanzar la ejecución 232 00:19:16,380 --> 00:19:32,220 pero entonces muy bien por ahora me olvido del botón 2 lo que quiere que cuando pincho 233 00:19:32,220 --> 00:19:38,900 el botón 1 haga algo y se sienta como aplicado entonces como yo quiero modificar este señor 234 00:19:38,900 --> 00:19:44,900 quiero editar su contenido porque cuando lo pincho quiero que ponga click vale entonces 235 00:19:44,900 --> 00:19:55,990 necesito una referencia el mismo entonces me voy a ir y lo llamo de alguna forma como ve uno si 236 00:19:55,990 --> 00:20:08,380 alguno está sufriendo es normal vale lo estoy haciendo mal ya lo he dicho igual una vez guardado 237 00:20:08,380 --> 00:20:16,619 aquí lo tengo que recargar fijaos que ahora se llama b1 este señor vale entonces desde el 238 00:20:16,619 --> 00:20:22,720 controlador yo lo que puedo hacer es oye mira ahora tengo una referencia al botón 1 vale 239 00:20:22,720 --> 00:20:30,480 entonces le puedo decir oye mira esta es como como lo hemos hecho hasta ayer más o menos aquí 240 00:20:30,480 --> 00:20:41,910 yo tengo un botón B1, este botón de aquí es un JavaFX sin botón. Cuidado cuando importáis así 241 00:20:41,910 --> 00:20:47,130 de leer bien, ¿vale? Porque hay otras clases que se llaman botón, como por ejemplo el Java AWT, 242 00:20:47,130 --> 00:20:52,410 ¿vale? Entonces, si importáis esto en vez que este de aquí, pues a lo mejor luego no nos funciona, 243 00:20:52,410 --> 00:20:59,250 ¿vale? Entonces, tengo este botón, lo que hago es que cuando se haga el clic 1, pues lo que quiero 244 00:20:59,250 --> 00:21:16,819 hacer es cambiar este botón. Entonces b1 punto b para text, set text, set algo, set idea, set text, 245 00:21:16,819 --> 00:21:31,819 set text, esto me podría funcionar y lo cambio a clicked. Vamos a ver si esto funciona. Lanzo, 246 00:21:31,819 --> 00:21:46,230 tengo el botón 1, si lo pincho, clic. Fenomenal. Me gustaría también B1.7 enable, está enable, 247 00:21:46,230 --> 00:22:03,569 no está, lo conseguiremos. Enable Focus, porque para darle este efecto de... 248 00:22:03,569 --> 00:22:08,410 pero no lo encuentro 249 00:22:08,410 --> 00:22:08,569 ¿vale? 250 00:22:10,569 --> 00:22:11,210 la 251 00:22:11,210 --> 00:22:14,170 orden 252 00:22:14,170 --> 00:22:15,710 estable 253 00:22:15,710 --> 00:22:23,460 is disabled 254 00:22:23,460 --> 00:22:24,619 is disabled 255 00:22:24,619 --> 00:22:35,079 no sé muy bien 256 00:22:35,079 --> 00:22:37,319 tiene que haber una 257 00:22:37,319 --> 00:22:42,140 esta habría que verlo ¿vale? 258 00:22:42,140 --> 00:22:48,740 porque normalmente los controles pueden ser deshabilitados aquí esto parece como deshabilitado 259 00:22:48,740 --> 00:22:57,440 en el en el enunciado entonces la idea sería hacer clic y deshabilitarlo solo que no sé 260 00:22:57,440 --> 00:23:01,380 exactamente cuál es el método 261 00:23:01,940 --> 00:23:05,200 los estables 262 00:23:06,200 --> 00:23:10,519 ay true 263 00:23:10,519 --> 00:23:15,880 vamos a ver cómo funciona 264 00:23:16,680 --> 00:23:22,200 y me queda como de solitaria no lo puedo explicar 265 00:23:22,200 --> 00:23:34,450 muy bien esto funciona si todo perfecto entonces vosotros con los 150 botones que hacéis que 266 00:23:34,450 --> 00:23:39,650 tenéis que hacéis pues hacéis esta cosa aquí le cambiáis todos los unos con dos 267 00:23:42,829 --> 00:23:53,509 y ya está vais a este de aquí al botón 2 le dais el clic 2 y ya está ya lo he hecho lo 268 00:23:53,509 --> 00:24:01,990 entrego y saco un cero. Muy bien. Esa era mi pregunta. ¿Esa era tu pregunta? Si sacas un cero, sí. 269 00:24:03,829 --> 00:24:11,990 A ver, ha sido mi respuesta. A tu pregunta yo te he dicho, si me lo haces así, yo mañana te pido 270 00:24:11,990 --> 00:24:25,299 150. Y si me salen los 150 así, yo te pido 1200. Pero los 1200 ya me pongo detrás tuya y miro que 271 00:24:25,299 --> 00:24:41,009 lo hagas tú manualmente. Que a lo mejor luego lo pides a HGPT o a CERAVIL. 272 00:24:41,009 --> 00:24:57,640 Ah, porque no he dado el nombre al botón 2. El botón 2 se debería llamar B2. Guardo aquí. Lo recargo. Estoy seguro de que se ha recargado. 273 00:25:02,559 --> 00:25:31,940 Nada. Entonces, este de aquí es, digamos, lo que deberíais haber hecho vosotros en los 10 minutos que me he ido, ¿vale? En el sentido que con lo que sabéis hacer hasta ahora, con lo que hemos visto hasta ahora y con vuestra gran vaguería de no mirar en casa algo más que se podría hacer, pues esto es lo máximo que podríais hacer, ¿vale? 274 00:25:31,940 --> 00:25:40,619 Ahora, como todas las cosas de este tipo, no es bueno, ¿vale? No es bonito, ¿vale? 275 00:25:40,859 --> 00:25:50,940 ¿En qué sentido? Cuando hay cosas iguales que se repiten, cuando vosotros os encontráis en un sitio donde habéis escrito un código 276 00:25:50,940 --> 00:26:01,490 y lo vais a copiar igual, cambiando un numerito, pues lo más probable es que lo estéis haciendo mal, ¿vale? 277 00:26:01,490 --> 00:26:08,869 en la idea es que mañana yo te digo mira en vez que cliquen de lo quiero yo es distinto lo quiero 278 00:26:08,869 --> 00:26:13,369 poner de otra forma pues tú tienes que ir a cambiar todos estas cosas aquí ha puesto pico 279 00:26:13,369 --> 00:26:21,470 no funciona además esto es un método único es está haciendo algo el solo entonces la idea de 280 00:26:21,470 --> 00:26:32,410 que esté repetido etcétera habría que encontrar una forma para que esto sea un poquito más 281 00:26:32,410 --> 00:26:46,269 genérico entonces nosotros hasta ahora hemos hecho métodos así pero yo hace aquí me permite 282 00:26:46,269 --> 00:27:07,720 hacer métodos así. Esta cosa de aquí debería estar por algún lado. A ver cuál tendría que importar ahora. 283 00:27:07,720 --> 00:27:22,359 Este señor de aquí es una pequeña maravilla de la naturaleza, que es cuando yo llamo este método 284 00:27:22,359 --> 00:27:31,539 de aquí en vez de no tener parámetros va a tener un parámetro que es una acción de evento o sea 285 00:27:31,539 --> 00:27:42,680 algo que ha pasado y esta cosa de aquí no se la tengo que pasar yo se va a encargar java fx con 286 00:27:42,680 --> 00:27:49,539 todos los cableados que está porque tal que tiene por debajo de gestionar de tal forma que cuando se 287 00:27:49,539 --> 00:27:59,140 llame este método de aquí el genere un objeto acción event que representa el evento que ha 288 00:27:59,140 --> 00:28:08,279 causado ese clic o sea que este de aquí es un objeto que tendrá dentro información sobre la 289 00:28:08,279 --> 00:28:19,259 la origen de ese evento que en automático se va a crear dentro la maquinaria de java fx para crear 290 00:28:19,259 --> 00:28:26,640 un objeto con la información necesaria y me lo pasa a este método de aquí cuando se tiene que 291 00:28:26,640 --> 00:28:37,200 ejecutar o sea que estos tipos de métodos de aquí se usan cuando lo importante es que haya pasado 292 00:28:37,200 --> 00:28:43,720 un evento pero no me interesa tanto quien ha generado el evento o las características de 293 00:28:43,720 --> 00:28:49,799 este evento. Me interesa que cuando se origina este evento, haz algo. Entonces no necesito 294 00:28:49,799 --> 00:28:54,599 saber nada de información sobre quién lo ha hecho, cómo se ha hecho, por qué se ha 295 00:28:54,599 --> 00:29:02,619 hecho. Sin embargo, otras veces yo puedo generar un controlador, un método, que pero dice 296 00:29:02,619 --> 00:29:08,960 oye, mira, necesito saber quién ha hecho este evento. Necesito decir por qué ha salido 297 00:29:08,960 --> 00:29:10,960 este evento, es decir, que ha pasado 298 00:29:10,960 --> 00:29:12,740 ¿sí? entonces 299 00:29:12,740 --> 00:29:14,779 le pongo esta cosa aquí, esto 300 00:29:14,779 --> 00:29:16,839 luego no lo tengo que rellenar yo 301 00:29:16,839 --> 00:29:18,839 me lo rellena automáticamente yo a hacer 302 00:29:18,839 --> 00:29:20,160 ¿sí? 303 00:29:23,559 --> 00:29:25,680 una vez que yo estoy aquí dentro, puedo hacer 304 00:29:25,680 --> 00:29:26,460 algo con este 305 00:29:26,460 --> 00:29:29,099 e. ¿vale? 306 00:29:29,099 --> 00:29:30,619 y si os fijáis 307 00:29:30,619 --> 00:29:32,640 hay unas cuantas opciones 308 00:29:32,640 --> 00:29:34,059 en particular 309 00:29:34,059 --> 00:29:36,740 este señor, getSource 310 00:29:36,740 --> 00:29:38,799 o sea 311 00:29:38,799 --> 00:29:40,299 pillar la origen 312 00:29:40,299 --> 00:29:50,079 GetSource me devuelve un objeto, un object en general, pero en particular se va a leer que es 313 00:29:50,079 --> 00:29:53,799 the object on which the event initially occurred. 314 00:29:55,740 --> 00:30:02,259 Esto es el objeto sobre el que ha pasado algo que me lo devuelve. 315 00:30:02,400 --> 00:30:07,059 En nuestro caso, si este de aquí se lo ponga un botón, esta cosa de aquí será un botón. 316 00:30:07,059 --> 00:30:29,740 Por ahora. Escribamos este. Entonces, ¿cómo lo cambiamos? Pues, acordaos, si no, no se da cuenta que lo puedo utilizar al otro lado. 317 00:30:29,740 --> 00:30:52,180 Guardo esta cosa aquí, me voy aquí y digo, mira, al botón, en vez de darle el B1, no, perdón, en vez de darle el click 1, que era el que solo funciona con el botón 1, le voy a dar click, que es el general, el genérico. 318 00:30:52,180 --> 00:30:55,180 Vamos a ver qué hace. 319 00:30:55,180 --> 00:30:57,180 Sabe. 320 00:30:57,180 --> 00:30:59,180 Vuelvo aquí. 321 00:30:59,180 --> 00:31:01,180 Recargo esta cosa. 322 00:31:01,180 --> 00:31:03,180 Lo lanzo. 323 00:31:03,180 --> 00:31:08,619 Y ahora sigo teniendo el botón 2 que funciona consigo mismo. 324 00:31:08,619 --> 00:31:12,619 Pero el botón 1, cuando lo pincho, me lanza esto. 325 00:31:12,619 --> 00:31:19,619 Lo veis que la origen es un botón de identificador B1. 326 00:31:19,619 --> 00:31:24,339 Que me está identificando el botón que se ha pinchado. 327 00:31:26,839 --> 00:31:33,359 Entonces, con esta cosa mágica aquí, yo ya no necesito tener B1, B2, B3. 328 00:31:33,500 --> 00:31:35,759 Puedo borrar toda esta cosa aquí. 329 00:31:38,970 --> 00:31:40,690 Tener solo este método de aquí. 330 00:31:41,309 --> 00:31:47,710 Y a través de este, saber si es aplicado con el botón 1 o con el botón 2. 331 00:31:48,109 --> 00:31:48,369 ¿Cómo? 332 00:31:49,250 --> 00:31:49,470 Sí. 333 00:31:49,470 --> 00:31:58,609 Pero en este builder, por cada botón que tú crees, el ID del botón tienes que ponerle B1, B2, B3. 334 00:31:58,710 --> 00:32:01,809 No. Ahora lo hacemos. 335 00:32:03,309 --> 00:32:10,710 Button B es igual a A, A. Button de E.de. 336 00:32:10,829 --> 00:32:20,789 Esto, independientemente de quién haya generado este objeto, me lo pillará. 337 00:32:20,789 --> 00:32:22,750 y como yo esta cosa aquí la doy 338 00:32:22,750 --> 00:32:24,670 solo a los botones, sé que son botones 339 00:32:24,670 --> 00:32:26,869 si yo hiciera esto dándoselo 340 00:32:26,869 --> 00:32:28,710 a un botón y a otros elementos pues 341 00:32:28,710 --> 00:32:30,829 esto sería más complejo de organizar 342 00:32:30,829 --> 00:32:32,029 a lo mejor debería hacer un 343 00:32:32,029 --> 00:32:34,890 instance of o cosas por el estilo 344 00:32:34,890 --> 00:32:37,190 pero como ahora se lo estoy dando solo a botones 345 00:32:37,190 --> 00:32:38,750 pues no me importa 346 00:32:38,750 --> 00:32:40,950 le digo, mira, pilla el origen 347 00:32:40,950 --> 00:32:43,029 es un objeto, este objeto es un botón 348 00:32:43,029 --> 00:32:44,490 lo hemos visto aquí que es un botón 349 00:32:44,490 --> 00:32:45,809 ¿vale? 350 00:32:46,930 --> 00:32:48,829 entonces, este botón 351 00:32:48,829 --> 00:32:50,690 me lo pones aquí y es el botón B 352 00:32:50,690 --> 00:33:02,130 Y ahora, a este botón de aquí, le cambias el text con clicker y luego lo desactivas. 353 00:33:02,130 --> 00:33:19,759 Me da aceptable, que busca aceptable en vez de aceptable. Justo. Esto ahora es un método que no 354 00:33:19,759 --> 00:33:25,579 me depende de crear al botón 1 ponerle botón 1, al botón 2 ponerle botón 2, al botón 3 botón 2, 355 00:33:25,579 --> 00:33:33,680 porque no está usando un identificador. De hecho, yo puedo irme aquí y quitarse los identificadores. 356 00:33:34,980 --> 00:33:44,839 Ya no me sirven los identificadores. Y esto, todos los botones tendrán el mismo action click. 357 00:33:48,059 --> 00:33:56,420 Guardo, espero no explote, voy aquí, lo recargo bien esta cosa aquí, veo que ahora ningún botón tiene un 358 00:33:56,420 --> 00:34:03,559 identificador y lo que pasará ahora es que cuando lo lanzó al hacer clic ese 359 00:34:03,559 --> 00:34:09,679 botón generará un evento este evento me dará la como source ese botón concreto y 360 00:34:09,679 --> 00:34:15,380 ese cambiará y ese cambiará ese se declara independientemente es lo absoluto 361 00:34:15,380 --> 00:34:24,969 sólo un sueldo entiende ahora con poca suerte que no sé si lo hará esto 362 00:34:24,969 --> 00:34:39,550 Si yo lo copio este de aquí, veis que me viene ya, y yo en realidad a estos de aquí no le tengo que hacer mucho, no le tengo que poner ni identificador ni nada, lo único que tengo que hacer es que tenga un action click. 363 00:34:40,329 --> 00:34:46,150 Y yo puedo hacer cuantas copias me da la gana, este de aquí, y esto ya funcionará. 364 00:34:49,059 --> 00:34:50,980 Ahora se llaman todos botón 2, pero... 365 00:34:50,980 --> 00:35:01,219 Entonces, ahora yo guardo, vuelvo aquí, aquí están todas estas maravillas de aquí, ahora 366 00:35:01,219 --> 00:35:14,250 lo lanzo y esto ya funciona, o sea, esto, cuando pinche el que pinche, si yo pillara 367 00:35:14,250 --> 00:35:23,230 este button, le hago un extend y me creo button mina, que tiene sus parámetros para saber 368 00:35:23,230 --> 00:35:34,230 si tiene una mina o no, pues ya me estoy acercando al Buscaminas. Luego tendré que hacer un 369 00:35:34,230 --> 00:35:39,570 array o algo por el estilo para distribuir las minas, para hacer la parte más difícil 370 00:35:39,570 --> 00:35:44,289 del Buscaminas, que es que cuando le doy un clic a un sitio que no hay mina, me tiene 371 00:35:44,289 --> 00:35:52,110 que mirar alrededor cuántas minas hay. Esa es la parte más difícil del Buscaminas. 372 00:35:52,110 --> 00:35:59,909 O en la funcionalidad esta que cuando pincho en una casilla que tiene cero minas, pues me abre todas las que están alrededor. 373 00:36:01,309 --> 00:36:07,630 Esto es un poco de flexibilidad y un poco de baile, forre, cosas por el estilo. 374 00:36:09,130 --> 00:36:16,889 Pero, ahora los mecanismos gráficos para hacerlos ya los tengo. 375 00:36:16,889 --> 00:36:26,289 Lo único que me falta ahora es paciencia y gana para hacer toda la parte detrás del algoritmo. 376 00:36:26,289 --> 00:36:39,760 Da igual. Lo que pasa aquí ahora nosotros es que estos botones de aquí, si tú quieres poner 100 377 00:36:39,760 --> 00:36:46,300 botones, no puedes ponerlos de uno en uno manualmente. Deberías hacer, parecido al 378 00:36:46,300 --> 00:36:52,059 main que nos crea él, pues un bucle que te cree todos los botones uno al lado de otro. 379 00:36:52,059 --> 00:36:57,400 y nosotros por ahora no lo hacemos porque no nos interesa ese tipo de interfaz o nos interesa más 380 00:36:57,400 --> 00:37:03,480 los interfaces gestionales que hacemos con este vas aquí bueno también no sé yo sí 381 00:37:07,579 --> 00:37:17,900 hay una fila y luego la selección pero el problema es que si lo haces así a lo mejor 382 00:37:17,900 --> 00:37:23,800 puedes hacer un campo 100% ya por 10 vale con 100 botones ok es ese campo allí no lo puedes 383 00:37:23,800 --> 00:37:31,239 modificar lo bonito a nivel de programación podría ser hacer estas cosas de aquí con 384 00:37:32,840 --> 00:37:37,159 tú dices qué tamaño quieres que era un 5 x 5 un 20 x 20 385 00:37:37,159 --> 00:37:54,880 de esta clase concreta dudas vale entonces lo que hemos aprendido ahora es que hay 386 00:37:54,880 --> 00:38:08,380 dos tipos de métodos que hacen de controlador de un evento. Hay los métodos que no le interesa 387 00:38:08,380 --> 00:38:16,239 nada de la información del evento, le interesa sólo que el evento se haya verificado, que son 388 00:38:16,239 --> 00:38:17,559 los que no tienen 389 00:38:17,559 --> 00:38:19,659 esto 390 00:38:19,659 --> 00:38:22,300 y los que en vez dicen, oye, mira, no 391 00:38:22,300 --> 00:38:24,280 necesito más información sobre el 392 00:38:24,280 --> 00:38:26,420 evento, al menos saber quién ha lanzado 393 00:38:26,420 --> 00:38:28,219 este evento para poder hacer algo 394 00:38:28,219 --> 00:38:29,119 sobre ese 395 00:38:29,119 --> 00:38:30,920 en concreto. 396 00:38:32,380 --> 00:38:34,139 ¿Sí? Y podéis 397 00:38:34,139 --> 00:38:36,239 usar los dos, dependiendo de cuál queréis 398 00:38:36,239 --> 00:38:37,900 utilizar. Si lo usáis mal, 399 00:38:38,239 --> 00:38:38,760 os suspendo. 400 00:38:40,059 --> 00:38:40,300 ¿Sí? 401 00:38:40,300 --> 00:38:40,340 ¿Sí? 402 00:38:47,550 --> 00:38:48,550 Gracias.