1 00:00:00,430 --> 00:00:07,190 Voy a grabar esta clase, por lo tanto, si habláis, me dais vuestro consentimiento para que grabe vuestra voz. 2 00:00:07,929 --> 00:00:13,169 Entonces, hoy vamos a ver un proyecto un poquito completo, ¿vale? 3 00:00:13,169 --> 00:00:19,190 De una pequeña aplicación sencilla sobre gestión de alumnos. 4 00:00:19,309 --> 00:00:22,730 Por ejemplo, añadir, quitar, vamos a ver si nos da tiempo. 5 00:00:23,129 --> 00:00:28,030 Pero al menos añadir un alumno y mirar qué alumnos hemos metido, ¿vale? 6 00:00:28,030 --> 00:00:54,990 El objetivo de esta aplicación es principalmente hacer el interfaz gráfico, el interfaz gráfico sencillo, repasaremos un poquito los ficheros quizás, un poquito las colecciones, pero muchas cosas que vamos a hacer aquí explícitamente las haré mal o de una forma muy sencilla para mantener la dificultad del ejercicio lo más baja posible. 7 00:00:54,990 --> 00:00:59,149 algunos, el usuario me pone un nombre 8 00:00:59,149 --> 00:01:03,170 y a lo mejor, o la edad del alumno, hago para decir, pues en vez de la edad 9 00:01:03,170 --> 00:01:07,450 me pone una string de caracteres y explota 10 00:01:07,450 --> 00:01:11,290 todo, pues a lo mejor eso no lo compruebo para evitar 11 00:01:11,290 --> 00:01:14,890 que se añada un montón de código 12 00:01:14,890 --> 00:01:18,790 un montón de comprobaciones que ya hemos visto en otro momento 13 00:01:18,790 --> 00:01:23,530 y que no quiero que ahora vayan a ser de sobrecarga 14 00:01:23,530 --> 00:01:25,730 con respecto a lo que tenemos que aprender ahora, ¿vale? 15 00:01:25,870 --> 00:01:29,650 Eso no quita que en un programa hecho bien habría que hacer comprobaciones, 16 00:01:29,790 --> 00:01:35,790 habría que recoger posibles excepciones, habría que hacer un poquito de control 17 00:01:35,790 --> 00:01:36,750 para que esto funcione. 18 00:01:36,870 --> 00:01:40,430 Eso no quita que luego en casa vosotros podáis rehacer este ejercicio 19 00:01:40,430 --> 00:01:46,209 y hacerlo bien, hacerlo lo más bonito posible, hacerlo guay para vuestro contexto 20 00:01:46,209 --> 00:01:50,430 de alumno que tienen que aprender a hacer estas cosas, ¿vale? 21 00:01:50,430 --> 00:02:11,830 Entonces, algunas cosillas, si os ocurren, pero aquí deberíamos comprobar que no sé qué, pues lo podéis decir, queda grabado, he ido allí, si veo que hay una cosa interesante para ese contexto, digo sí, vale, hagámoslo, si veo que todavía no, pues digo, mirad, esto sí, habría que comprobarlo, como buena idea, pero no lo vamos a hacer en este contexto, ¿vale? 22 00:02:11,830 --> 00:02:21,789 entonces vamos a crear un nuevo proyectito yo o vamos a elegir nuestro javascript project esto 23 00:02:21,789 --> 00:02:34,189 aparece porque tenemos instalado el plugin fx clips vale si no no aparece este de aquí se puede 24 00:02:34,189 --> 00:02:38,650 hacer si se puede hacer pero esto ya me da un poquito una mano porque me da una estructura ya 25 00:02:38,650 --> 00:02:44,530 hecho. Si no os aparece esta parte de aquí, esta carpeta de JavaFX hay que tener que instalar ese 26 00:02:44,530 --> 00:02:59,969 plugin. Lo llamamos GUI escuela, GUI alumnos o GUI escuela. Aquí tenemos nuestra estructura ya un 27 00:02:59,969 --> 00:03:07,710 poquito hecha, donde sustancialmente nos pone una aplicación, nos pone un main y un CSS vacíos. El 28 00:03:07,710 --> 00:03:11,629 El main no es el que nos interesa, es un main un poquito distinto. 29 00:03:11,810 --> 00:03:18,330 Este main de aquí nos serviría para construir sustancialmente una aplicación desde cero 30 00:03:18,330 --> 00:03:26,189 sin usar el SXML y sin usar el SimBuilder, que se puede hacer, ¿vale? 31 00:03:26,189 --> 00:03:33,409 Es simplemente que cualquier opción, cualquier botón que creo lo debería crear aquí directamente 32 00:03:33,409 --> 00:03:37,189 como en formato de texto, ¿vale? En formato de código. 33 00:03:37,189 --> 00:03:39,009 y se puede hacer, yo puedo decirle 34 00:03:39,009 --> 00:03:40,169 mira, tráeme un nuevo 35 00:03:40,169 --> 00:03:42,789 combo box 36 00:03:42,789 --> 00:03:45,030 y este combo box posicionamelo en este 37 00:03:45,030 --> 00:03:47,370 punto y que sea grande este tamaño 38 00:03:47,370 --> 00:03:48,849 todo por línea de comando 39 00:03:48,849 --> 00:03:50,330 por comandos Java, vale 40 00:03:50,330 --> 00:03:52,949 solo que pierdo un poco la visión de que 41 00:03:52,949 --> 00:03:54,530 estoy haciendo, entonces con 42 00:03:54,530 --> 00:03:56,830 el scene builder es mucho más sencillo 43 00:03:56,830 --> 00:03:58,889 si, entonces 44 00:03:58,889 --> 00:04:00,870 para eso en vez de utilizar 45 00:04:00,870 --> 00:04:02,849 este main que me da, pues tengo que utilizar 46 00:04:02,849 --> 00:04:04,770 un main donde sustancialmente carga 47 00:04:04,770 --> 00:04:06,669 ese fichero, vale, ahora lo hacemos 48 00:04:06,669 --> 00:04:14,169 entonces la primera cosa que veo que aquí faltan a estas clases estas clases no me la reconoce 49 00:04:14,169 --> 00:04:20,629 dice dónde están no sé qué son porque me falta ponerle esas librerías donde dentro aparecen las 50 00:04:20,629 --> 00:04:28,470 distintas clases que pertenecen a JavaScript entonces me voy a mi proyecto botón derecho 51 00:04:28,470 --> 00:04:37,069 sobre el proyecto, me voy a propiedades, java build path, vale, y aquí dentro de librerías me voy a 52 00:04:37,069 --> 00:04:44,189 módulo de path, módulo de path, le digo añadir jarra externos, esto lo tendréis que hacer muy 53 00:04:44,189 --> 00:04:52,279 probablemente en el examen, vale, o esto o lo de maven que todavía no lo es, aquí busco la carpeta 54 00:04:52,279 --> 00:05:02,100 que he bajado, esta de aquí, que está el CDK de Java CX, y dentro de la carpeta librerías me vienen estos JAR. 55 00:05:02,199 --> 00:05:06,899 Estos son los JAR que tenemos que incluir a nuestro proyecto para que funcione, ¿vale? 56 00:05:07,199 --> 00:05:13,980 Una vez añadidos, le doy a Play and Close, y entonces estas cosas de aquí ya se reconocen, 57 00:05:14,079 --> 00:05:18,160 porque los importes que he hecho, pues ya funcionan, ¿sí? 58 00:05:18,160 --> 00:05:21,540 Aquí luego utilizaremos otras cosas 59 00:05:21,540 --> 00:05:22,980 Otras cosillas para aquí y para allá 60 00:05:22,980 --> 00:05:25,600 Como información al procesador, al preprocesador 61 00:05:25,600 --> 00:05:26,579 O otras clases 62 00:05:26,579 --> 00:05:28,779 Cuando no las ve, pues tendré que decirle 63 00:05:28,779 --> 00:05:30,860 Mira, impórtala, no creando una clase 64 00:05:30,860 --> 00:05:32,959 Me va siempre importándola 65 00:05:32,959 --> 00:05:35,079 Desde estas clases ya hechas 66 00:05:35,079 --> 00:05:36,399 Porque quiero una cosa en concreto 67 00:05:36,399 --> 00:05:37,939 ¿Dudas? 68 00:05:39,279 --> 00:05:39,540 Vale 69 00:05:39,540 --> 00:05:42,939 Entonces, si yo la lanzo 70 00:05:42,939 --> 00:05:44,319 Ahora ya me debería funcionar 71 00:05:44,319 --> 00:05:46,519 Pero lo que me crea 72 00:05:46,519 --> 00:05:47,899 Es una ventanita 73 00:05:47,899 --> 00:05:49,899 vacía. ¿Vale? 74 00:05:50,339 --> 00:05:51,959 Ese está aquí. Entonces, yo 75 00:05:51,959 --> 00:05:54,019 aquí podría crear ahora un botón, 76 00:05:54,180 --> 00:05:56,079 ponerlo en esta posición de aquí 77 00:05:56,079 --> 00:05:57,699 y pillando el espacio 78 00:05:57,699 --> 00:05:59,980 asumiendo que este es 0,0 79 00:05:59,980 --> 00:06:02,139 como se hace en 80 00:06:02,139 --> 00:06:03,959 HTML, ¿no? Que lo habéis 81 00:06:03,959 --> 00:06:05,860 hecho por ahí, habéis 82 00:06:05,860 --> 00:06:07,100 hecho algunas cosas con 83 00:06:07,100 --> 00:06:09,500 JavaScript. 84 00:06:10,300 --> 00:06:11,660 De mover algún objeto, 85 00:06:11,920 --> 00:06:13,959 de posicionar algún botón, 86 00:06:14,079 --> 00:06:14,819 no sé si lo habéis hecho. 87 00:06:16,000 --> 00:06:17,680 Se puede hacer utilizando DOM, 88 00:06:17,680 --> 00:06:24,300 pero nosotros queremos hacer esto de forma gráfica por lo tanto esto me interesa 89 00:06:24,300 --> 00:06:30,579 vale para completar empezar a hacer la cosa necesito al menos otro fichero vale entonces 90 00:06:30,579 --> 00:06:40,680 me voy al botón derecho y añado un file en realidad por aquí está esto yo quiero vale 91 00:06:40,680 --> 00:06:46,360 el new fxml documento pero por alguna razón misteriosa funciona mal por lo tanto nosotros 92 00:06:46,360 --> 00:06:53,600 lo hacemos como añadir un fichero nuevo que te digo yo que es y pongo aquí lo que me da la gana 93 00:06:53,600 --> 00:07:08,540 vista.fxml interfaz.gui.fxml importante que cuando ahora cargáis este fichero de aquí este 94 00:07:08,540 --> 00:07:16,879 fichero en el comando que carga el fichero pues tenga gui.fxml con un fichero para ir a 95 00:07:16,879 --> 00:07:21,019 pillarlo. Si no lo pilláis, si no metéis eso, pues claramente no lo encontrará y te dirá que no puede. 96 00:07:21,019 --> 00:07:29,420 También se enfada porque este de aquí debería ser un fichero xml y está vacío por lo tanto 97 00:07:29,420 --> 00:07:35,600 te dirá que hay errores. También necesitaremos lo que es un controlador. Entonces ponemos aquí 98 00:07:35,600 --> 00:07:44,779 un GoogleController, por ejemplo, que sustancialmente nos hará una clase donde pondremos todos los 99 00:07:44,779 --> 00:07:50,180 métodos para que cuando doy un botón, muevo algo o tengo que hacer algo, pues aquí está 100 00:07:50,180 --> 00:07:58,339 la aspirón que tengo que ejecutar. Luego tendré que sustancialmente de alguna forma conectar las 101 00:07:58,339 --> 00:08:07,019 tres cosas o sea por un lado el xml por otro lado el controlador y por otro lado la lógica de mi de 102 00:08:07,019 --> 00:08:13,279 mi programa de lo que hace vale entonces para lo que queremos hacer nosotros es gestión de alumnos 103 00:08:13,279 --> 00:08:20,579 con un gestor pues no existe tenemos también otras clave otras clases que por ahora yo pongo todo 104 00:08:20,579 --> 00:08:25,100 aquí dentro para que sea más sencillo pero estaría bien que quizás estuvieran en paquetes distintos 105 00:08:25,620 --> 00:08:32,460 Uno que modeliza a los alumnos, por ejemplo, y otro que modeliza el gestor del alumno. 106 00:08:32,460 --> 00:08:38,159 El que añade, que tiene la lista de alumnos, que puede añadir, puede remover, puede cambiar la cosa. 107 00:08:38,279 --> 00:08:40,639 Sostancialmente, los ejercicios que hacíamos antes. 108 00:08:41,120 --> 00:08:47,259 Lo que hemos hecho hasta ver la gráfica de UDF sería una clase como esta que vamos a hacer. 109 00:08:47,700 --> 00:08:55,019 Queremos, justo para completarlo, tendremos una clase alumno y tendremos una clase. 110 00:08:56,860 --> 00:09:08,259 gestor alumno gestor si estás hablando un poquito las clases que vamos a utilizar en esta en esta 111 00:09:08,259 --> 00:09:24,570 en este proyecto sí botón derecho ni un philip botón derecho sobre la aplicación ni un philip 112 00:09:28,269 --> 00:09:33,370 y luego allí con la extensión s xml vale cuidado que a veces ponéis xml 113 00:09:33,370 --> 00:09:39,669 luego no funciona, sobre todo si no ponéis fxml cuando dais botón aquí no sale esto de abrir con 114 00:09:39,669 --> 00:09:51,620 scenebuilder vale más o menos lo tenemos vamos a abrir el scenebuilder vale vamos a crear algo 115 00:09:51,620 --> 00:09:59,820 entonces abro el botón derecho sobre el gui.fxml open with scenebuilder si lo he configurado bien 116 00:09:59,820 --> 00:10:05,279 vale, os acordáis que tenía que decirle dónde está el Scene Builder, pues debería abrirse esto. 117 00:10:05,279 --> 00:10:12,779 Vale, los cambios que hago aquí, al guardarlos, se guardarán dentro gubi.fxml. Estoy editando esto, 118 00:10:12,779 --> 00:10:23,460 por ahora no hay nada. Dudas hasta aquí. Nuestro objetivo es que tengamos una interfaz gráfico que 119 00:10:23,460 --> 00:10:29,639 tiene dos pestañitas, una pestañita que me permite añadir nuevos alumnos y otra pestañita que me 120 00:10:29,639 --> 00:10:36,960 permite browser navegar sobre los alumnos que ya existen vale entonces tengo que elegir un 121 00:10:36,960 --> 00:10:44,279 contenedor vale normalmente las cosas así están hechas con hay paneles hay corchos imaginaos 122 00:10:44,279 --> 00:10:51,000 corcho del resto de la pared donde yo pongo controles botones cosas para escribir cosas 123 00:10:51,000 --> 00:10:59,320 para leer cosas la combo box check box radio button lo que me hace falta vale en algunos 124 00:10:59,320 --> 00:11:05,440 casos necesito uno solo en algunos casos necesito varios hay opciones para que pinche un botón y se 125 00:11:05,440 --> 00:11:10,779 abre una ventana cosas y por ahora lo mantenemos sencillos y hacemos simplemente una única ventana 126 00:11:10,779 --> 00:11:17,940 que tenga dos pestañas vale para esto nosotros la otra vez utilizamos como contenedor el pain 127 00:11:17,940 --> 00:11:24,759 que es como un panel básico, pero además de esto usáis scroll pane, flow pane, border plane y cosas 128 00:11:24,759 --> 00:11:30,059 por el estilo que mañana nos enseñáis vosotros cuando yo no trabajo y uno de ellos es el tab pane. 129 00:11:30,059 --> 00:11:36,779 El tab pane es un panel pensado para que tú puedas ponerle dentro tabs. Las tabs son estas 130 00:11:36,779 --> 00:11:42,940 pestañas. Entonces si tú usas un tab pane luego puedes añadir cuantas tabs te da la gana y en 131 00:11:42,940 --> 00:11:49,059 cada tab montar una interfaz gráfica distinta. Entonces nosotros pillamos el campaign, el que 132 00:11:49,059 --> 00:11:56,259 no es empty aunque luego son parecidos, lo pongo aquí y me sale esta cosa aquí. Ya está una 133 00:11:58,759 --> 00:12:07,620 ventana que tiene aquí arriba dos pestañitas y yo crearé en una todo lo que me sirve para añadir 134 00:12:07,620 --> 00:12:14,059 un nuevo alumno, en una me daré todo lo que me sirve para ver el contenido de un alumno, por ejemplo. 135 00:12:14,899 --> 00:12:20,700 Empezamos con la primera, pues aquí ponemos crear alumno, por ejemplo. 136 00:12:22,960 --> 00:12:27,799 Entonces, esta de aquí será la pestañita que cuando pincho pues me permite crear un alumno. 137 00:12:29,139 --> 00:12:35,759 Para que crea un alumno tengo que saber qué es un alumno. Entonces, ¿qué nos interesa 138 00:12:35,759 --> 00:12:55,679 interés de un alumno. Nombre. No nos compliquemos. Lo que quiero decir es que aquí cada alumno 139 00:12:55,679 --> 00:12:59,440 debería tener un identificador, el identificador debería ser único, cuidado con eso, pero 140 00:12:59,440 --> 00:13:03,379 pues mantengámoslo sencillo, lo hago todas estas cosas de las que ya hemos hablado y 141 00:13:03,379 --> 00:13:07,100 que funcionaban en los ejercicios y ya hemos hecho, pues podéis aplicarlo aquí. Pero 142 00:13:07,100 --> 00:13:12,120 no vayamos a, hagamos un alumno con 56 datos, que así cada vez que tenga que hacer una 143 00:13:12,120 --> 00:13:17,340 prueba, tengo que poner 56 datos. No, algo muy básico. Pero vamos a ir, o double nota media. 144 00:13:20,799 --> 00:13:26,379 Ya está. O sea, muy sencillo. Tanto, ahora veremos que hablaremos dos veces, haremos una cosa para 145 00:13:26,379 --> 00:13:32,320 el nombre, una cosa para la media, pues si tengo que hacerlo 56 veces para los 56 datos, pues eso 146 00:13:32,320 --> 00:13:38,679 es para vosotros que tenéis mucho tiempo libre. ¿Vale? Entonces, estos dos serían para crear una 147 00:13:38,679 --> 00:13:46,419 luego claramente se podría complicar cuantos da la gana botón derecho surge a un constructor 148 00:13:46,419 --> 00:13:58,559 me costó donde derecho surge a un tri vale para que si quiero poner un string con solo 149 00:13:58,559 --> 00:14:10,519 Podría hasta toquetear el equals, el hashcode y todas estas cosas dependiendo de lo que quiero hacer con estas cosas. 150 00:14:11,279 --> 00:14:17,240 Repito, lo mantengo lo más sencillo, si necesito algo volveré aquí a toquetear estas cosas. 151 00:14:18,100 --> 00:14:22,019 Por ahora yo creo que con esto es suficiente, más o menos. 152 00:14:22,019 --> 00:14:32,600 Podría esto escribirlo de otra forma, pero por ahora lo dejo así para que ya veremos cómo sale y si me gusta o lo quiero poner de otra forma. 153 00:14:33,299 --> 00:14:34,940 Por ahora, muy básico. 154 00:14:35,120 --> 00:14:38,480 Simplemente para que sepa que para crear un alumno necesito estos dos datos. 155 00:14:38,480 --> 00:14:48,820 Por lo tanto, en mi interfaz necesito algo donde escribir el nombre, algo donde escribir la nota media 156 00:14:48,820 --> 00:14:56,759 y algo donde poner un botón para decir lo que hay hasta todo guarda 157 00:14:59,419 --> 00:15:15,450 voy a cambiar esto ahí no está final por qué por tonterías pero porque luego cuando llegaremos a 158 00:15:15,450 --> 00:15:20,730 allí en vez de la toma usamos el punto para explotar programas que supuestamente pongamos 159 00:15:20,730 --> 00:15:22,669 enteros, tanto es el primer ejemplo, 160 00:15:22,789 --> 00:15:24,049 lo mantenemos lo más sencillo posible. 161 00:15:24,610 --> 00:15:25,970 ¿Vale? Ok. 162 00:15:26,490 --> 00:15:28,570 ¿Cómo lo hago? Pues necesito 163 00:15:28,570 --> 00:15:30,370 algo donde pueda escribir el nombre. 164 00:15:30,809 --> 00:15:32,429 ¿Dónde se escribe? Para escribir 165 00:15:32,429 --> 00:15:34,710 hay varias cosas, pero nos interesa 166 00:15:34,710 --> 00:15:36,870 principalmente el textarea 167 00:15:36,870 --> 00:15:38,590 o textfield. ¿Qué diferencia 168 00:15:38,590 --> 00:15:40,309 hay entre textarea y textfield? ¿Lo sabéis? 169 00:15:40,429 --> 00:15:42,590 ¿Lo habéis visto en el input de... 170 00:15:43,409 --> 00:15:44,409 Bueno, concretamente 171 00:15:44,409 --> 00:15:46,350 en HTML el textarea 172 00:15:46,350 --> 00:15:48,129 no es un input, pero existe. 173 00:15:48,429 --> 00:15:48,830 ¿Lo habéis visto? 174 00:15:48,830 --> 00:15:52,090 nosotros usamos TextField 175 00:15:52,090 --> 00:15:54,570 pongo un TextField aquí 176 00:15:54,570 --> 00:15:57,230 pongo otro TextField 177 00:15:57,230 --> 00:15:57,990 aquí 178 00:15:57,990 --> 00:16:01,789 y luego 179 00:16:01,789 --> 00:16:03,590 aquí pondré el nombre 180 00:16:03,590 --> 00:16:05,409 aquí pondré la nota 181 00:16:05,409 --> 00:16:07,250 final hemos dicho 182 00:16:07,250 --> 00:16:08,809 y un botón aquí 183 00:16:08,809 --> 00:16:11,409 para que cuando lo pinche 184 00:16:11,409 --> 00:16:13,690 pues diga vale créame un alumno 185 00:16:13,690 --> 00:16:14,409 y guarda 186 00:16:14,409 --> 00:16:17,049 estas son las cosas digamos 187 00:16:17,049 --> 00:16:19,090 fundamentales que necesito 188 00:16:19,090 --> 00:16:38,649 Luego, para hacerlo un poquito más bonito, lo que puede hacer es usar también labels para decir, por ejemplo, que aquí me diga que este es el nombre y otro label que me diga que esta es la nota media, si no, no sé qué es, ¿vale? Y aquí lo pongo. Esto es nombre, dos puntos. Y lo hago un poquito más grande para que se vea. 189 00:16:38,649 --> 00:16:55,789 nombre de los puntos y es todo lo nuevo aquí y aquí no está 190 00:16:57,250 --> 00:17:08,480 un deseo porque debería trabajar en esto de hacerlo más bonito que quede bonito hacerlo 191 00:17:08,480 --> 00:17:16,640 más así aquí a de botón más grande para que sea más fácil de pinchar y poner aquí añade al alumno 192 00:17:25,500 --> 00:17:26,720 hasta un poco 193 00:17:26,720 --> 00:17:45,849 si son tres cosas es feo es normal que quede feo vale os recuerdo también que para que esto sea 194 00:17:45,849 --> 00:17:52,809 más bonito también a nivel gráfico puede utilizar css vale entonces lo que vamos a hacer nosotros 195 00:17:52,809 --> 00:17:58,089 es por ahora lo vamos a hacer así luego cuando esto funcione pues le hacemos una foto a esta 196 00:17:58,089 --> 00:18:04,089 cosa aquí le decimos a charly pt oye mira anunciarse para que esto haga más bonito y él 197 00:18:04,089 --> 00:18:08,869 me creará un css para que se van parezca más profesionales más bonito y ese punto 198 00:18:08,869 --> 00:18:18,410 copio ese css y vamos a ver si funciona muy bien entonces esta sería la primera pantalla vamos a 199 00:18:18,410 --> 00:18:23,230 trabajar con esta es simplemente que pongo el nombre pongo la nota y le doy el intro y lo 200 00:18:23,230 --> 00:18:33,170 ¿Vale? Entonces, ¿qué necesito más aquí? Primero, voy a leer esto y esto. O sea, lo que está escrito aquí y aquí se tiene que leer cuando pincho esto. 201 00:18:33,390 --> 00:18:41,670 Entonces, necesito identificarlos estos dos. Por ejemplo, esta cosa aquí no cambiará. Esta label de aquí no la voy a cambiar en la vida. 202 00:18:41,769 --> 00:18:47,809 Entonces, no hace falta que la identifique. En ningún momento diré, oye, píllame esa label y cámbiale el color. 203 00:18:47,809 --> 00:18:50,769 porque podría hacerlo, pero en mi programa no, ¿vale? 204 00:18:50,910 --> 00:18:57,650 Pero sí en algún momento tendré que decir, lo que está dentro de este text field, píllamelo, ¿vale? 205 00:18:57,670 --> 00:19:01,690 Para eso lo tengo que identificar, para identificarlo le tengo que dar un nombre, ¿vale? 206 00:19:02,049 --> 00:19:11,049 Entonces, este de aquí lo pincho, me voy a code, y aquí donde está el fx dos puntos id, 207 00:19:11,049 --> 00:19:13,369 le doy un identificador, por ejemplo 208 00:19:13,369 --> 00:19:15,029 esta es nombre 209 00:19:15,029 --> 00:19:17,630 y este de aquí 210 00:19:17,630 --> 00:19:19,430 es nota 211 00:19:19,430 --> 00:19:23,359 ¿tengo que identificar 212 00:19:23,359 --> 00:19:23,880 botón? 213 00:19:26,299 --> 00:19:28,359 no, porque el botón me interesará 214 00:19:28,359 --> 00:19:29,799 cuando lo pincho, hace algo 215 00:19:29,799 --> 00:19:32,779 pero no cambia o no tengo 216 00:19:32,779 --> 00:19:34,359 que ir a pillar ese control 217 00:19:34,359 --> 00:19:36,319 para hacer algo sobre ese control, por lo tanto 218 00:19:36,319 --> 00:19:38,759 no me interesa, si al pincharlo 219 00:19:38,759 --> 00:19:40,480 quisiera cambiar el 220 00:19:40,480 --> 00:19:42,339 lo que está escrito diciendo 221 00:19:42,339 --> 00:19:44,220 muy bien, lo has hecho, o cosas por el estilo 222 00:19:44,220 --> 00:19:46,539 pues entonces sí lo debería identificar, ¿vale? 223 00:19:49,859 --> 00:19:52,119 No devuelve nada 224 00:19:52,119 --> 00:19:56,220 este de aquí para allá. Podría poner aquí un label escondido que no ponga 225 00:19:56,220 --> 00:20:00,140 nada para que cuando pinche añade alumno me ponga alumno añadido o algo 226 00:20:00,140 --> 00:20:03,319 por el estilo. Pero esas son cosas avanzadas, por ahora son avanzadas. 227 00:20:03,960 --> 00:20:08,319 Son cosas sencillas, pero no quiero sobrecargar, ¿vale? Entonces, vale, 228 00:20:08,440 --> 00:20:11,480 muy bien, esto está pillando forma. 229 00:20:11,480 --> 00:20:21,160 necesito ahora decir que cuando pinche aquí pues de alguna forma él sepa que haga algo 230 00:20:21,160 --> 00:20:26,359 vale entonces como lo hago esto no lo he guardado todavía debería guardarlo más a menudo pero 231 00:20:33,069 --> 00:20:37,029 entonces el controlador me creo una 232 00:20:37,029 --> 00:20:56,869 y le digo que este de aquí pertenece a fxml vale esta cosa de aquí me está diciendo hoy mira 233 00:20:56,869 --> 00:21:07,490 esto es algo especial no es un método cualquiera es un método que luego irá relacionado con fxml 234 00:21:07,490 --> 00:21:14,490 por lo tanto, en los editores de fxml quiero poder ver esta opción de aquí, en un cierto sentido. 235 00:21:14,490 --> 00:21:23,490 Fijaos que se enfada, dice no, no lo quiero, entonces tú le dices, mira, añádeme requires.fx al módulo jave.info, a este módulo de aquí, ¿vale? 236 00:21:23,490 --> 00:21:31,490 Entonces, tú lo añades y con un poco de suerte te va a enfadar. 237 00:21:31,490 --> 00:21:40,269 luego importas también esta cosa aquí y ya está soy feliz vale entonces aquí fijaos que no hace 238 00:21:40,269 --> 00:21:48,890 nada pero es para que quede aquí este segundo vale entonces si ahora voy aquí y me voy a 239 00:21:48,890 --> 00:21:59,460 controller abajo a la izquierda con un poco de suerte se pincho aquí me aparece la aplicación 240 00:21:59,460 --> 00:22:08,400 está de aquí la clase es agua y controles porque él se da cuenta que al ponerle este arroba pues 241 00:22:08,400 --> 00:22:15,119 hay algo que puede trabajar con esto aquí y lo añade diciendo y mira hasta allí la puedes 242 00:22:15,119 --> 00:22:19,859 utilizar es una clase que puedes utilizar como controles sustancialmente le están diciendo esto 243 00:22:19,859 --> 00:22:28,559 es la parte digamos visual y quien controla quien pilla los eventos y hace algo es esta clase de 244 00:22:28,559 --> 00:22:33,359 aquí. Posiblemente podéis añadir más de un control, pero obviamente no. 245 00:22:34,440 --> 00:22:39,359 Entonces, si os aparece, la seleccionáis y ya está. 246 00:22:39,400 --> 00:22:45,059 Se queda conectado que esta interfaz gráfica de aquí, pues tiene como 247 00:22:45,059 --> 00:22:48,420 controller, llamarán los métodos de esta clase de aquí. 248 00:22:48,900 --> 00:22:55,299 Si lo habéis hecho bien, cuando pincháis aquí y vais a onAction, os aparecerá aquí la 249 00:22:55,299 --> 00:23:00,400 posibilidad de elegir los métodos que están dentro de esa clase ahora que no 250 00:23:00,400 --> 00:23:07,599 aparece lo que os aconsejo yo si no aparece es hacer esta clase porque 251 00:23:07,599 --> 00:23:15,480 esta clase no está no no parece vale guardar lo que tenéis aquí cerrar el 252 00:23:15,480 --> 00:23:23,380 sin builder y volver a abrirlo porque a veces necesita tener todo el controlador 253 00:23:23,380 --> 00:23:25,799 entonces no lo ve y cuando añades el controlador 254 00:23:25,799 --> 00:23:27,599 él todavía se queda con 255 00:23:27,599 --> 00:23:29,720 lo que había cargado antes y entonces no ha cargado 256 00:23:29,720 --> 00:23:31,359 que existe este controlador. 257 00:23:32,579 --> 00:23:33,720 Si en vez aparece 258 00:23:33,720 --> 00:23:35,759 lo ponéis aquí, le ponéis aquí 259 00:23:35,759 --> 00:23:37,599 que su acción es 260 00:23:37,599 --> 00:23:39,579 el añadir, así sabéis que 261 00:23:39,579 --> 00:23:41,000 cuando pincháis este botón 262 00:23:41,000 --> 00:23:42,920 lo que hace es añadir. 263 00:23:44,039 --> 00:23:45,640 O sea, cuando pincharé este botón 264 00:23:45,640 --> 00:23:47,900 se ejecutará este método de aquí. 265 00:23:48,579 --> 00:23:49,799 Si queréis, para que 266 00:23:49,799 --> 00:23:51,500 haga algo, le ponéis un ciso 267 00:23:51,500 --> 00:24:04,539 de pulsado guardo aquí guarda acá guardo arriba guardo todo acordaos de que por ahora yo no he 268 00:24:04,539 --> 00:24:10,900 guardado nada y por lo tanto si me voy a mi gui sigue vacío no ha hecho nada todavía vale esto 269 00:24:10,900 --> 00:24:16,240 es hecho mal debería es guardar más a menudo pero hay que yo quiero que veáis que ahora es cuando 270 00:24:16,240 --> 00:24:23,799 se guarda vale entonces en el momento en que este de aquí decidís guardarlo sabe esto se ha guardado 271 00:24:23,799 --> 00:24:32,200 en FX y esto se debería actualizar. Si no se actualiza, lo actualizáis vosotros pulsando F5, ¿vale? 272 00:24:33,200 --> 00:24:45,980 O pulsando Edit, ¿dónde está? File, Edit, Refresh, por aquí, File, File, File, 273 00:24:45,980 --> 00:24:52,039 a estar aquí con derecho y reflejo 274 00:24:52,039 --> 00:24:59,700 tened en cuenta esto hacerlo más a menudo porque a veces hace el cambio por aquí y 275 00:24:59,700 --> 00:25:08,059 no se ve vale la forma de refrescar esto con lo que se ha hecho fuera es con f5 la forma de 276 00:25:08,059 --> 00:25:13,279 refrescar esto con lo que se ha hecho fuera es no lo sé si queréis estar seguro pues lo que hacéis 277 00:25:13,279 --> 00:25:19,779 guardáis todo cerráis y abrís otra vez de todas formas tened en cuenta que también 278 00:25:21,240 --> 00:25:25,940 no se suele trabajar en paralelo hago algo aquí algo aquí algo aquí algo aquí algo aquí 279 00:25:25,940 --> 00:25:32,000 no pues hago la interfaz gráfica cuando tengo la interfaz gráfica me paso a hacer el back end 280 00:25:32,000 --> 00:25:38,059 si necesito algo vuelvo a tuquetear la parte gráfica pero no es que añado uno y voy a hacer 281 00:25:38,059 --> 00:25:42,559 su código añado uno y voy a hacer su código antes uno piensa un poquito lo que tiene que hacer de 282 00:25:42,559 --> 00:25:49,700 pensadlo vosotros si queréis empezar por el backend hacer la parte que funcione todo y cuando ya 283 00:25:49,700 --> 00:25:53,960 funciona todo le pongo un interfaz gráfico porque sé que puedo pedir o si quiero hacer un interfaz 284 00:25:53,960 --> 00:26:01,880 gráfico para ver que se puede pedir y luego hago que funcione entonces si esto está bien yo tengo 285 00:26:01,880 --> 00:26:07,200 un error y no sé de qué es el alumno, por qué alumno tienes un error. Aquí, media. 286 00:26:07,200 --> 00:26:17,220 Vale, veis que lo he guardado, voy a cerrarlo, si me lo voy a abrir, me peta todo el rato. Borra. 287 00:26:17,220 --> 00:26:25,559 Probablemente has guardado algo malo y ahora al recargarlo no lo entiendo. Posiblemente tú 288 00:26:25,559 --> 00:26:31,079 lo has guardado y luego has modificado algo malo y entonces al cargarlo no lo mira. 289 00:26:31,079 --> 00:26:52,680 borrar la carpeta lo que es lo que puede ser aparte de algunos 290 00:26:52,680 --> 00:26:54,539 problemillas así. Por favor, chicos. 291 00:26:55,700 --> 00:26:56,940 La similar me ha dado 292 00:26:56,940 --> 00:26:58,920 a mí también a veces de cosas 293 00:26:58,920 --> 00:27:00,799 de arrastrar esto y tardar 294 00:27:00,799 --> 00:27:02,420 un minuto en hacerlo. No sé por qué. 295 00:27:03,119 --> 00:27:05,119 Lo más probable es que 296 00:27:05,119 --> 00:27:06,920 estos programas 297 00:27:06,920 --> 00:27:08,880 son relativamente delicados. En el sentido que 298 00:27:08,880 --> 00:27:10,519 ellos tienen que interpretar 299 00:27:10,519 --> 00:27:12,819 esta cosa de aquí y a partir de 300 00:27:12,819 --> 00:27:14,759 esta cosa aquí transformarla en 301 00:27:14,759 --> 00:27:16,720 esta cosa aquí. ¿Vale? Cuanto 302 00:27:16,720 --> 00:27:18,960 más sea complejo esto, más es probable 303 00:27:18,960 --> 00:27:21,019 que se guíe. ¿Sí? Normalmente 304 00:27:21,019 --> 00:27:28,140 las cosas, si la ha hecho él, no debería dar este problema, ¿vale? Pero si, por ejemplo, ha metido hasta aquí 305 00:27:28,140 --> 00:27:32,980 y yo, sin darme cuenta, he borrado algo aquí, he cambiado algo aquí, cuando él intenta interpretarlo, 306 00:27:33,099 --> 00:27:37,619 como no es código que ha hecho él, pues se puede liar. O si vosotros decís, no, esto lo cambio a mano, 307 00:27:37,740 --> 00:27:41,740 pues se ponga aquí 115 en vez de otra cosa, pues llega un momento que a lo mejor te quites algo 308 00:27:41,740 --> 00:27:49,299 que cuando él intenta interpretarlo no se encuentra con lo que normalmente es y puede que se lie un poco, ¿vale? 309 00:27:49,299 --> 00:27:57,599 Normalmente no debería hacerlo. Lo guardo, lo cierro y lo vuelvo a abrir. 310 00:27:57,599 --> 00:28:19,900 Perfecto. ¿Qué os pasa? Si hacéis una cosa sencilla, rehacer esto son 20 segundos. 311 00:28:19,900 --> 00:28:26,339 Pasará nada. Borro el fichero, lo limpio e intento hacerlo otra vez. Si estás haciendo un programa un 312 00:28:26,339 --> 00:28:33,720 poquito más más complejo es hacer copias o sea una interfaz mientras que funciona hacéis una copia y 313 00:28:33,720 --> 00:28:39,460 cuando hacéis la modificación de eso lo hacéis en un fichero distinto para que tengáis un backup que 314 00:28:39,460 --> 00:28:44,599 funciona es el último que funcionaba y los cambios lo hacéis en un fichero nuevo cuando llega un 315 00:28:44,599 --> 00:28:49,980 momento que el fichero nuevo explota pues tenéis siempre un paso anterior para decir no mira esto 316 00:28:49,980 --> 00:28:55,019 me funciona vuelvo a ese de allí y vuelvo a hacer sólo lo último que he hecho no hagáis cambios 317 00:28:55,019 --> 00:28:57,019 siempre sobre este aquí porque lleva un momento 318 00:28:57,019 --> 00:28:59,200 que es un poco como cuando 319 00:28:59,200 --> 00:29:01,160 yo os decía, cuando vosotros en un examen estáis 320 00:29:01,160 --> 00:29:03,099 haciendo varios métodos y habéis 321 00:29:03,099 --> 00:29:04,660 hecho un método y este método funciona 322 00:29:04,660 --> 00:29:06,720 y ahora empezáis otro método 323 00:29:06,720 --> 00:29:09,099 pues guardad lo que habéis 324 00:29:09,099 --> 00:29:11,099 hecho hasta ahora porque si el nuevo método 325 00:29:11,099 --> 00:29:12,759 no lo conseguís hacer y os sale 326 00:29:12,759 --> 00:29:14,339 un asco y no 327 00:29:14,339 --> 00:29:16,980 arranca ni siquiera el programa 328 00:29:16,980 --> 00:29:19,019 siempre podéis, tenéis la opción de 329 00:29:19,019 --> 00:29:20,859 entregar la última versión 330 00:29:20,859 --> 00:29:23,039 que si arrancaba y es más bonito 331 00:29:23,039 --> 00:29:24,839 que entregar algo que le da el player 332 00:29:24,839 --> 00:29:27,740 no funciona. ¿Entiendes? 333 00:29:28,660 --> 00:29:30,359 Entonces podéis gestionar. Ahora, no lo sé 334 00:29:30,359 --> 00:29:32,279 qué habéis hecho vosotros, que son 335 00:29:32,279 --> 00:29:34,299 tres clics y ya os habéis cargado 336 00:29:34,299 --> 00:29:36,440 el programa. Pues, no lo sé. 337 00:29:37,579 --> 00:29:37,819 No sé. 338 00:29:38,839 --> 00:29:39,420 Era un tío. 339 00:29:42,359 --> 00:29:44,140 Vale. Entonces, 340 00:29:44,619 --> 00:29:46,339 si 341 00:29:46,339 --> 00:29:48,720 todo esto funciona, 342 00:29:49,519 --> 00:29:50,519 ahora mismo 343 00:29:50,519 --> 00:29:52,220 yo lanzo esto 344 00:29:52,220 --> 00:29:52,859 y ¿qué pasa? 345 00:29:52,859 --> 00:30:02,700 nada sale otra vez la interfaz está aquí básica porque no hay modificador main vale en el main en 346 00:30:02,700 --> 00:30:10,440 algún momento del main le tengo que decir oye mira yo quiero a que tú crees aquí un interfaz 347 00:30:10,440 --> 00:30:18,119 gráfico que pero no es esto es un interfaz gráfico basado sobre este fichero de aquí 348 00:30:18,119 --> 00:30:26,240 vete a este fichero de aquí y úsalo vale para eso tengo que decir cárgalo entonces esto que 349 00:30:26,240 --> 00:30:33,779 probablemente muy probablemente en un ejercicio de examen os lo pasaré os lo pondré por algún 350 00:30:33,779 --> 00:30:41,460 lado porque de memoria no me lo sé se basa sobre esta cosa aquí vale tú tienes un fxml loader que 351 00:30:41,460 --> 00:30:47,579 es un objeto que lo que hace es pillar un fichero y luego le puedes decir cárgalo vale una vez 352 00:30:47,579 --> 00:30:53,019 cargado pues setas la escena, setas cuál es el título de la ventana y 353 00:30:53,019 --> 00:31:00,180 sustancialmente la haces ver. Esto debería ser el start nuestro, entonces me lo 354 00:31:00,180 --> 00:31:10,480 copio y lo sustituyo. 355 00:31:10,480 --> 00:31:29,920 Fijaos que aquí está usando stage, el primary stage, mientras aquí dentro usa stage, entonces o cambio esto por esto, o cambio esto por esto, ¿vale? 356 00:31:29,920 --> 00:31:39,059 Pero bueno, esto se llama stage, ¿sí? Entonces, ¿qué hace esto aquí? Dice, mira, crea un objeto loader asociado con este fichero. 357 00:31:39,059 --> 00:31:41,299 yo no lo tengo este fichero, mi fichero se llama así 358 00:31:41,299 --> 00:31:44,420 entonces 359 00:31:44,420 --> 00:31:46,559 ahora tengo un objeto 360 00:31:46,559 --> 00:31:48,279 que puede cargar, vale 361 00:31:48,279 --> 00:31:49,660 y le digo, oye mira 362 00:31:49,660 --> 00:31:51,920 esta es la raíz 363 00:31:51,920 --> 00:31:54,359 de toda mi estructura de 364 00:31:54,359 --> 00:31:56,859 controles y paneles 365 00:31:56,859 --> 00:31:58,160 y cosas por el estilo, vale 366 00:31:58,160 --> 00:32:00,380 esta raíz es 367 00:32:00,380 --> 00:32:02,440 cárgala desde este 368 00:32:02,440 --> 00:32:04,519 cargador, entonces este de aquí se va 369 00:32:04,519 --> 00:32:06,000 a este fichero, lo analiza 370 00:32:06,000 --> 00:32:07,299 y me pilla 371 00:32:07,299 --> 00:32:10,039 la raíz, quien será la raíz 372 00:32:10,039 --> 00:32:20,380 de mi sistema, esto, vale, esta es la raíz de lo que he hecho yo, este TimePane, vale, 373 00:32:20,900 --> 00:32:32,180 este TimePane será mi objeto padre, objeto progenitor, no sé cómo llamarlo, vale, 374 00:32:33,500 --> 00:32:38,460 y sustancialmente luego creo una escena, esto es el tamaño de la ventana, vale, 375 00:32:38,460 --> 00:32:43,519 Dice, esta nueva escena que tú creas tiene como base este objeto de aquí. 376 00:32:43,720 --> 00:32:49,119 O sea, que lo que va al fondo es este TablePane con luego todas las cosas a partir de él, ¿vale? 377 00:32:49,680 --> 00:32:53,819 Y que es grande 640 x 480 píxeles, ¿sí? 378 00:32:53,819 --> 00:32:58,960 Si yo cambio esto, cambiará el tamaño inicial de mi ventana, ¿sí? 379 00:32:59,440 --> 00:33:02,500 Luego esto seta el título arriba, ¿vale? 380 00:33:02,720 --> 00:33:05,319 Esto lo llamaremos gestor alumno. 381 00:33:09,559 --> 00:33:16,220 Luego, llave CX funciona como una alegría de un teatro. 382 00:33:17,079 --> 00:33:20,380 Tú creas escenas y tienes un escenario. 383 00:33:21,119 --> 00:33:25,160 Entonces, en un cierto momento le dices, ahora en el escenario va esta escena. 384 00:33:25,839 --> 00:33:32,400 Tú has creado esta escena de aquí, cuya base es raíz, es este objeto que has cargado de aquí. 385 00:33:32,599 --> 00:33:34,640 O sea, sustancialmente has cargado esta escena. 386 00:33:34,640 --> 00:33:37,519 y ahora le dices en el escenario 387 00:33:37,519 --> 00:33:39,460 la escena 388 00:33:39,460 --> 00:33:41,440 que se va a hacer es esta escena 389 00:33:41,440 --> 00:33:43,019 que me he creado y luego 390 00:33:43,019 --> 00:33:44,640 enseña 391 00:33:44,640 --> 00:33:46,740 ¿si? 392 00:33:47,339 --> 00:33:49,599 ¿entiendes? si yo quisiera cambiar 393 00:33:49,599 --> 00:33:51,680 lo que se ve aquí completamente 394 00:33:51,680 --> 00:33:53,720 podría crear una escena distinta 395 00:33:53,720 --> 00:33:55,380 y decirle oye mira 396 00:33:55,380 --> 00:33:57,579 carga esta nueva escena y mandala en el escenario 397 00:33:57,579 --> 00:33:59,460 ¿si? entonces cambiaría 398 00:33:59,460 --> 00:34:00,480 de una ventana a otra 399 00:34:00,480 --> 00:34:03,140 nosotros esto lo hemos hecho con los tabs 400 00:34:03,140 --> 00:34:21,969 Si todo esto funciona está bien, ahora al lanzar me debería cargar mi objeto, donde 401 00:34:21,969 --> 00:34:29,869 aquí esto está, si le pongo el otro pues todavía no lo he hecho. 402 00:34:29,869 --> 00:34:38,409 Esto debería funcionar, si lo pincho me debería decir, haz pulsado, cada vez que lo pincho 403 00:34:38,409 --> 00:34:51,309 llama ese método. ¿Dudas? Vale, muy bien. Entonces tenemos esta aplicación que cuando pulsamos el botón 404 00:34:51,309 --> 00:35:02,219 ejecutar. Entonces, ahora nuestra idea sería la siguiente. Yo quiero que una persona pueda poner 405 00:35:02,219 --> 00:35:08,159 aquí un nombre, poner aquí una nota, darle año de alumno y que esta información se guarde por algún 406 00:35:08,159 --> 00:35:15,980 lado entonces necesito encontrar una estructura para poder guardar estas cosas vale y esto será 407 00:35:15,980 --> 00:35:27,880 mi gestor tenía creado esto esto en mi clase gestor es la que se encargará de mantener allí 408 00:35:27,880 --> 00:35:35,760 dentro los alumnos vale entonces la clase gestor necesita una estructura de datos para poder guardar 409 00:35:35,760 --> 00:35:55,179 alumnos. Lo hacemos sencillo. ArrayList, alumno, alumnos, y lo que hago es, un constructor, 410 00:35:55,179 --> 00:36:15,070 public, gestor, que lo que hace es, alumnos es igual a new ArrayList de alumno, vacía, 411 00:36:15,070 --> 00:36:24,789 para hacerlo bien esto debería ser privado al gestor y cualquier cosa que se haga pase por 412 00:36:24,789 --> 00:36:31,170 el gestor vale para que el gestor tenga control sobre sus alumnos y sobre lo que estás haciendo 413 00:36:31,170 --> 00:36:35,429 al alumno que tú no puede llegar un momento y cambiar completamente los alumnos a otra cosa 414 00:36:35,429 --> 00:36:40,650 pues super estilo por ahora no dejo así y si tengo que hacer un acceso directo a un acceso directo 415 00:36:40,650 --> 00:36:42,030 y cambio lo que me da la gana, ¿vale? 416 00:36:42,369 --> 00:36:45,869 Pero todas las cosas que hemos visto anteriormente 417 00:36:45,869 --> 00:36:49,389 de que debería proteger los datos 418 00:36:49,389 --> 00:36:51,969 y mantener que la gente no pueda hacer lo que le da la gana 419 00:36:51,969 --> 00:36:53,110 y añadir cosas que no son, 420 00:36:53,530 --> 00:36:55,429 pues debería aplicarlo también aquí. 421 00:36:58,989 --> 00:37:00,869 No sé si hacer... 422 00:37:01,610 --> 00:37:03,590 Ahora dejámoslo así, ¿vale? 423 00:37:04,489 --> 00:37:05,809 Muy sencillo. 424 00:37:06,309 --> 00:37:08,050 Con esto, cuando crea un gestor, 425 00:37:08,050 --> 00:37:25,309 En este pongámosle un public void add, alumno add, que lo que hace es alumnos.add. 426 00:37:29,559 --> 00:37:33,739 Este es un método de gestor que yo le digo, oye, gestor, añádeme un alumno, 427 00:37:33,900 --> 00:37:36,820 y lo que hace él dentro es añadirlo a su clase. 428 00:37:36,820 --> 00:38:04,440 Vamos a mantenerlo así y así lo hacemos un poquito más seco, ¿vale? Entonces yo para añadir alumnos hago así, podría también sobrecargar add haciendo dame un string nombre int nota y añado un new alumno nombre not. 429 00:38:04,440 --> 00:38:07,440 Entonces tengo la posibilidad 430 00:38:07,440 --> 00:38:09,280 Mi gestor de añadirle a un alumno 431 00:38:09,280 --> 00:38:10,440 Directamente que he creado yo 432 00:38:10,440 --> 00:38:13,400 O añadirle solo los datos 433 00:38:13,400 --> 00:38:15,599 Y que él dentro me crea un nuevo alumno 434 00:38:15,599 --> 00:38:16,099 Y lo añado 435 00:38:16,099 --> 00:38:21,059 Vale 436 00:38:21,059 --> 00:38:25,280 Entonces, ¿cómo uso esto 437 00:38:25,280 --> 00:38:27,219 Desde fuera? 438 00:38:28,019 --> 00:38:28,179 ¿Sí? 439 00:38:28,679 --> 00:38:30,800 Lo que me interesa es el GuyController 440 00:38:30,800 --> 00:38:32,719 Este de aquí 441 00:38:32,719 --> 00:38:34,260 Tiene que dentro del add 442 00:38:34,260 --> 00:38:36,539 Añadir aquí 443 00:38:36,539 --> 00:38:43,460 Como es un controlador, yo aquí necesito el acceso a mi gestor. 444 00:38:44,159 --> 00:38:46,960 Por algún lado aquí necesito este gestor. 445 00:38:47,980 --> 00:38:51,179 Entonces tengo varias formas para hacerlas. 446 00:38:51,400 --> 00:38:59,820 Uno es que el gestor yo lo cree estático en alguna clase y que luego accedes típicamente a esa clase. 447 00:38:59,820 --> 00:39:07,960 Otra opción es que este gestor se crea aquí a la hora de inicializar este gestor, ¿vale? 448 00:39:08,320 --> 00:39:14,019 Entonces, vamos a hacerlo con inicialización para que veáis, si me acuerdo cómo se llama. 449 00:39:15,179 --> 00:39:22,599 Aquí yo puedo hacer que esto implemente inicializable. 450 00:39:24,380 --> 00:39:28,960 Donde está clase inicializable es de JavaFX, FXML, ¿vale? 451 00:39:29,820 --> 00:39:38,239 Esta cosa aquí me está diciendo, oye, mira, aquí voy a crear un nuevo método, que es el método de inicialice, ¿vale? 452 00:39:38,320 --> 00:39:42,719 Que se llamará al inicializar este controlador. 453 00:39:42,719 --> 00:39:52,039 Al principio, si tú eres inicializable, el sistema en automático lo que va a llamar es esta inicialización, ¿vale? 454 00:39:52,340 --> 00:39:56,840 Si os fijáis, se queja porque dice, oye, mira, has dicho implementa inicializable, pero te falta un método. 455 00:39:57,780 --> 00:39:59,059 Te falta este método de aquí. 456 00:39:59,820 --> 00:40:06,619 Este método aquí se llamará a la hora de inicializar este sistema. 457 00:40:07,739 --> 00:40:14,260 Estas serían las cosas que yo voy a hacer al principio para que funcione. 458 00:40:14,260 --> 00:40:32,610 Para ver si funciona de verdad, si esto es verdad, ahora al lanzar esto debería hacer un inicialice, debería escribir esta cosa de aquí como primera cosa y luego abrir la ventana. 459 00:40:33,070 --> 00:40:33,769 Vamos a ver si es verdad. 460 00:40:33,769 --> 00:40:56,969 Entonces, al lanzar la ventana sin haber hecho nada, fijaos que tarda un ratito, yo lanzo y cuando se inicializa la ventana, pues entonces se lanza este eje. 461 00:40:57,449 --> 00:41:09,289 Entonces, este es un método que se está ejecutando desde dentro de WeController y que se inicializará al principio de mi ventana. 462 00:41:09,289 --> 00:41:17,570 enlazado la aplicación y se lanza esto. Entonces, a esta altura aquí es donde yo quiero crear un gestor. 463 00:41:17,570 --> 00:41:31,190 Entonces, si me queda aquí un gestor y cuando se inicializa, yo haré G es igual y un gestor. 464 00:41:31,190 --> 00:41:41,679 Entonces, al inicializarse, esta cosa aquí la pillo con G y ahora yo tengo este G que puedo utilizar 465 00:41:41,679 --> 00:41:49,179 por cualquier lado, ¿vale? Por ejemplo, aquí ahora le podría decir que cuando pulso Add me dice g.sithe. 466 00:41:49,179 --> 00:42:06,000 No, g.no puedo. Vamos a hacerlo. El gestor tendrá un método sitte, public void sitte, que me dice 467 00:42:06,000 --> 00:42:29,940 cuántos alumnos tiene. O... return alumnos.c. Entonces, ahora puedo desde aquí decir 468 00:42:29,940 --> 00:42:38,440 Escríbeme size. Como por ahora no he puesto nada, me espero que aquí salga cero, ¿vale? 469 00:42:40,179 --> 00:42:55,159 Cuando pulse el botón Add, ¿eh? ¡Tac! Cero. Si yo en inicialización, por ejemplo, 470 00:42:55,159 --> 00:42:57,039 g.add 471 00:42:57,039 --> 00:42:58,760 añado un alumno 472 00:42:58,760 --> 00:42:59,960 dato 473 00:42:59,960 --> 00:43:01,840 pes 474 00:43:01,840 --> 00:43:07,699 pues ahora al darle al botón 475 00:43:07,699 --> 00:43:10,039 dice que hay uno 476 00:43:10,039 --> 00:43:12,920 o sea que esto es 477 00:43:12,920 --> 00:43:15,119 el gestor creado 478 00:43:15,119 --> 00:43:17,139 ¿vale? más adelante 479 00:43:17,139 --> 00:43:18,280 por ahora es pronto 480 00:43:18,280 --> 00:43:21,139 aquí es donde yo podría decir 481 00:43:21,139 --> 00:43:23,179 oye mira, vete a mirar si tengo 482 00:43:23,179 --> 00:43:25,460 alumnos ya guardados en un fichero 483 00:43:25,460 --> 00:43:26,840 si los tienes 484 00:43:26,840 --> 00:43:28,579 guardados en un fichero los alumnos 485 00:43:28,579 --> 00:43:30,940 Cárgalos antes de nada 486 00:43:30,940 --> 00:43:33,059 Al inicializar la aplicación 487 00:43:33,059 --> 00:43:35,139 Ya cárganos los alumnos que ya había creado 488 00:43:35,139 --> 00:43:36,239 En sesiones anteriores 489 00:43:36,239 --> 00:43:37,960 Así los tienes ya a disposición 490 00:43:37,960 --> 00:43:40,440 Sería en este 491 00:43:40,440 --> 00:43:41,599 Metodito 492 00:43:41,599 --> 00:43:43,179 ¿Entiendes? 493 00:43:43,659 --> 00:43:45,739 Y esto es el metodito que se llama 494 00:43:45,739 --> 00:43:47,420 Antes de que empiece 495 00:43:47,420 --> 00:43:49,980 La aplicación 496 00:43:49,980 --> 00:43:50,760 Digamos así 497 00:43:50,760 --> 00:43:54,400 Entonces ahora tengo este gestor G 498 00:43:54,400 --> 00:43:56,420 Vamos a implementar 499 00:43:56,420 --> 00:43:57,320 Add de verdad 500 00:43:57,320 --> 00:44:02,599 ¿Vale? Para implementar ADD yo tengo que tener acceso a dos cosas, ¿vale? 501 00:44:03,079 --> 00:44:08,460 A esto y a esto, que había llamado nota y nombre, ¿sí? 502 00:44:08,900 --> 00:44:19,840 Entonces, le voy a decir, le voy a decir, oye, mira, tu controlador tiene un control que es un text field que se llama nombre. 503 00:44:21,099 --> 00:44:24,980 Y un text field que se llama nota. 504 00:44:26,239 --> 00:44:26,880 ¿Sí? 505 00:44:27,320 --> 00:44:28,920 Y me dice, ¿y qué es este next field? 506 00:44:29,280 --> 00:44:33,139 Y tú le dices, es un control de esto de JavaFX async. 507 00:44:34,460 --> 00:44:35,719 Vale, perfecto. 508 00:44:36,940 --> 00:44:42,679 Ahora, pero le dices que es, mientras esto es un objeto que he creado yo, que es mío, 509 00:44:43,440 --> 00:44:51,059 estos, estos dos, no son objetos cualquiera que estoy creando a nivel de código, 510 00:44:51,239 --> 00:44:53,860 mas son estas casillas de aquí. 511 00:44:53,860 --> 00:44:56,559 entonces de alguna forma le tengo que decir 512 00:44:56,559 --> 00:44:57,019 oye mira 513 00:44:57,019 --> 00:44:59,559 estas dos variables 514 00:44:59,559 --> 00:45:02,019 no son variables cualquiera 515 00:45:02,019 --> 00:45:04,639 que ahora inicializaré 516 00:45:04,639 --> 00:45:06,639 como me da la gana, sino que las encuentro 517 00:45:06,639 --> 00:45:08,159 por algún lado ya creadas 518 00:45:08,159 --> 00:45:12,170 ¿dónde? ¿dónde se han creado 519 00:45:12,170 --> 00:45:12,869 esas dos cosas? 520 00:45:13,769 --> 00:45:16,210 en el fxml, entonces ¿cómo podré 521 00:45:16,210 --> 00:45:17,530 decirle, oye mira tú 522 00:45:17,530 --> 00:45:19,369 eres de fxml 523 00:45:19,369 --> 00:45:22,780 muy bien 524 00:45:22,780 --> 00:45:33,719 este es de aquí, que no es tan inicializado 525 00:45:33,719 --> 00:45:34,500 por ningún lado 526 00:45:34,500 --> 00:45:37,360 en realidad me está diciendo, mira, no son 527 00:45:37,360 --> 00:45:39,420 variables que creas ahora 528 00:45:39,420 --> 00:45:41,480 como esta de aquí, que luego tendrás que inicializar 529 00:45:41,480 --> 00:45:43,139 tú, porque si no se me queda nul 530 00:45:43,139 --> 00:45:45,599 son variables que están relacionadas 531 00:45:45,599 --> 00:45:46,800 con fxml, entonces 532 00:45:46,800 --> 00:45:49,480 su declaración, vete a buscar 533 00:45:49,480 --> 00:45:51,519 en fxml, él irá 534 00:45:51,519 --> 00:45:53,079 a buscar en el fxml 535 00:45:53,079 --> 00:45:55,800 buscará por aquí, se encontrará 536 00:45:55,800 --> 00:45:57,300 que, uy, existe uno 537 00:45:57,300 --> 00:45:59,420 cuya idea es nombre, pues esto es 538 00:45:59,420 --> 00:46:01,099 el nombre, y este de aquí 539 00:46:01,099 --> 00:46:02,699 una nota, pues esta es la nota 540 00:46:02,699 --> 00:46:15,869 entiende entonces si esto funciona con suerte controlador ahora yo aquí le puedo decir oye mira 541 00:46:15,869 --> 00:46:29,650 me imprimes el contenido de nombre por ejemplo nombre punto text si esto funciona cuando pincho 542 00:46:29,650 --> 00:46:38,389 el botón add vale me debería escribir el contenido del texto de nombre vamos a verlo yo tengo mi 543 00:46:39,650 --> 00:46:49,820 ventana le escribo hola si funciona cuando pincho aquí aquí escribirá hola y aquí pongo gato 544 00:46:51,119 --> 00:46:59,599 cuando pincho aquí me pone gato fijaos que en ningún lado yo he hecho un new text field no lo 545 00:46:59,599 --> 00:47:01,679 he creado, pero con esta cosa 546 00:47:01,679 --> 00:47:03,699 de aquí, él me ha hecho una asociación 547 00:47:03,699 --> 00:47:06,000 entre esta variable que usaré 548 00:47:06,000 --> 00:47:07,679 a nivel gráfico, a nivel 549 00:47:07,679 --> 00:47:09,860 de código, con el entorno 550 00:47:09,860 --> 00:47:11,219 gráfico que he creado 551 00:47:11,219 --> 00:47:14,000 a través de la simbilla. 552 00:47:15,019 --> 00:47:15,119 ¿Sí? 553 00:47:16,179 --> 00:47:17,619 Esto son 554 00:47:17,619 --> 00:47:19,860 las típicas cosas que os van a crear 555 00:47:19,860 --> 00:47:21,659 1200 problemas. 556 00:47:21,960 --> 00:47:23,320 Porque os olvidáis 557 00:47:23,320 --> 00:47:25,800 esta cosa de aquí, y entonces 558 00:47:25,800 --> 00:47:28,059 estáis creando algo que no está asociado 559 00:47:28,059 --> 00:47:30,059 con la casillita, escribís en la casillita 560 00:47:30,059 --> 00:47:31,920 intentáis utilizarla y no va a funcionar 561 00:47:31,920 --> 00:47:33,940 hay que poner 562 00:47:33,940 --> 00:47:35,760 una etiqueta de esa por cada variable 563 00:47:35,760 --> 00:47:36,739 vale 564 00:47:36,739 --> 00:47:43,340 porque esta es una información de profundizador para esta 565 00:47:43,340 --> 00:47:44,280 vale 566 00:47:44,280 --> 00:47:47,239 dudas hasta aquí, vale, entonces 567 00:47:47,239 --> 00:47:48,179 si esto funciona 568 00:47:48,179 --> 00:47:51,380 cuando hago el add, pues que tendré que hacer 569 00:47:51,380 --> 00:47:52,760 o simplemente decir 570 00:47:52,760 --> 00:47:55,360 gestor 571 00:47:55,360 --> 00:47:56,659 añade 572 00:47:56,659 --> 00:47:59,179 lo que está en nombre 573 00:47:59,179 --> 00:48:00,639 .gettext 574 00:48:00,639 --> 00:48:04,940 coma lo que está en nota 575 00:48:04,940 --> 00:48:05,900 punto de text. 576 00:48:08,059 --> 00:48:08,739 Justo. 577 00:48:20,039 --> 00:48:27,000 Lo que decíamos antes. 578 00:48:27,619 --> 00:48:29,000 Habría que comprobar 579 00:48:29,000 --> 00:48:31,320 si hay algo 580 00:48:31,320 --> 00:48:32,719 aquí dentro y algo aquí dentro. 581 00:48:32,960 --> 00:48:35,480 Claro. Pero esto ya no funciona. 582 00:48:36,159 --> 00:48:37,300 Antes de este de aquí 583 00:48:37,300 --> 00:48:39,000 le estoy pasando string string 584 00:48:39,000 --> 00:48:49,059 pero no tengo ningún método que añade string string que es esto mint integer punto parche 585 00:48:49,059 --> 00:48:54,880 inter de esta cosa aquí ahora sí y claro que si aquí dentro escrito con cubrirlo esto explota 586 00:48:54,880 --> 00:49:00,699 debería ponerlo en contra que para evitar que explote sí pero es lo que decíamos antes lo 587 00:49:00,699 --> 00:49:06,579 vamos a mantener lo más sencillo posible es asumamos que el ser humano que utiliza esta 588 00:49:06,579 --> 00:49:12,340 cosa pues no está haciendo errores 589 00:49:13,579 --> 00:49:18,780 entonces aquí vosotros aquí deberíais decir voy a mirar esto voy a que mirar 590 00:49:18,780 --> 00:49:24,139 que dentro nula no será nunca pero sí que podría ser vacío 591 00:49:24,139 --> 00:49:29,019 si no es esta vacío pues no lo haga voy a mirar si este alumno ya existe si este alumno 592 00:49:29,019 --> 00:49:33,400 no lo añadas esto es un set en vez que una release todas estas cosas deberías 593 00:49:33,400 --> 00:49:39,139 tenerla en mente. Pero no estamos viendo esto, estamos viendo nosotros una pequeña 594 00:49:39,139 --> 00:49:47,500 interfaz que haga cosas. Que luego el programa esté hecho muy básico, sí, pero lo mantenemos 595 00:49:47,500 --> 00:50:02,199 básico por eso, para no sobrecargar de información. Y por ejemplo me ponga aquí un ciso g.alumnos, 596 00:50:02,199 --> 00:50:10,119 Para ver que cuando añade un elemento, pues aquí me de cuántos elementos están añadidos. 597 00:50:10,119 --> 00:50:17,460 Entonces ya está. Yo tengo este fantástico programa ahora que funciona fenomenal y puedo 598 00:50:17,460 --> 00:50:28,380 añadir el alumno Paco con un 5. ¿Veis que ha añadido uno? Luego añado Sara con un 7. 599 00:50:28,380 --> 00:51:04,480 Si ahora escribo cosas raras, explota. Fijaos que explota pero la interfaz gráfica sigue allí. 600 00:51:04,480 --> 00:51:12,460 yo esto lo debería decir ay mira que esto me hace algo vale pero esto si ahora añado stefano 601 00:51:12,460 --> 00:51:22,099 con un 10 también no ha explotado la interfaz entera la interfaz en un cierto sentido se ha 602 00:51:22,099 --> 00:51:27,460 protegido en la aplicación no ha acabado ha hecho algo raro aquí ha explotado esto no debería haber 603 00:51:27,460 --> 00:51:32,980 pasado y aquí debería haber hecho algo debería haber metido aquí un mensaje de oye mira esto 604 00:51:32,980 --> 00:51:44,309 no se ha podido insertar o cosas por el estilo vale pero lo probamos a hacer escribimos aquí 605 00:51:44,309 --> 00:51:50,469 lo que se está haciendo vale cuando pincho aquí que aquí me esquiva se ha insertado el alumno no 606 00:51:50,469 --> 00:51:58,150 sé qué o no se ha podido insertar más vamos a modificar lo que tenemos para que tiene cuenta 607 00:51:58,150 --> 00:52:02,329 que se ahora de inicio pues todo lo que he hecho hasta ahora no se ha guardado un fichero ni nada 608 00:52:02,329 --> 00:52:05,670 Entonces, empezaría desde cero otra vez, ¿vale? 609 00:52:06,349 --> 00:52:10,289 Entonces, vamos a modificar esto para que aquí haya algo que yo pueda escribir. 610 00:52:10,590 --> 00:52:12,210 Por ejemplo, un label. 611 00:52:13,429 --> 00:52:23,510 Un label, pongo aquí, lo vacío. 612 00:52:24,690 --> 00:52:29,190 Y como ahora tengo que escribir aquí algo, me voy a dar un identificador. 613 00:52:29,710 --> 00:52:31,949 Lo voy a llamar resultado. 614 00:52:33,869 --> 00:52:36,940 Res, ¿vale? 615 00:52:37,360 --> 00:52:38,119 O res text. 616 00:52:38,119 --> 00:53:02,340 Muy bien, lo guardo, me voy aquí, recargo, repico, y ahora para que lo pueda utilizar 617 00:53:02,340 --> 00:53:13,599 de aquí, voy a hacer lo mismo. Arroba fxml un label que se llama res.txt. ¿Qué es el 618 00:53:13,599 --> 00:53:21,000 label? Pues el label, importalo, tac. Entonces ahora tengo una asociación con eso. Cuando 619 00:53:21,000 --> 00:53:24,840 hago el art pues aquí en vez de hacer estar aquí puedo poner 620 00:53:28,380 --> 00:53:33,719 si eso no es punto de que esté punto 7 621 00:53:44,960 --> 00:53:45,760 en que usado 622 00:53:48,320 --> 00:53:49,380 punto 623 00:53:49,380 --> 00:54:15,170 Realmente he importado lo que no es. He importado Java lang class by label que no es. Lo que tengo 624 00:54:15,170 --> 00:54:26,599 a importar es el label de JavaFX. Ahora que he importado el correcto, cuando le hago esto punto, 625 00:54:26,599 --> 00:54:37,820 me da los métodos del label de joyce x incluyendo el set de texto entonces insertado alumno 626 00:54:49,360 --> 00:54:55,760 con esto me dice insertado alumno si quiero hacerlo un poco más bonito podría poner alumno 627 00:54:55,760 --> 00:55:13,900 a es igual a new alumno de esta cosa aquí. Añado el alumno, insertado alumno y te digo 628 00:55:13,900 --> 00:55:29,849 que alumno es. Entonces ahora yo tengo esta cosa aquí que me dice, Estefano con un 10, 629 00:55:29,849 --> 00:55:40,159 al añadirlo me dice insertado alumno, alumno Estefano con un 10. Añado gato, parece que 630 00:55:40,159 --> 00:55:45,760 Si lo pego ahora es un 7, aceptado dato con 7. 631 00:55:45,760 --> 00:55:52,039 Si pongo una cosa así, pues explota no me dice nada, vamos a intentar que haga algo. 632 00:55:52,039 --> 00:55:56,320 Entonces, yo lo intento este de aquí, ¿vale? 633 00:55:56,320 --> 00:56:04,000 Si cuando llego, ahí es donde explotará, explota en un formato, por lo tanto sale aquí. 634 00:56:04,000 --> 00:56:29,119 Hago un try, catch, excepción, error, insertar, alu. 635 00:56:36,429 --> 00:56:41,630 Entonces, si intento hacer esta cosa, si mientras hago esta cosa sale cualquier excepción, 636 00:56:42,309 --> 00:56:48,530 pues lo que te diré es, en ese campo de allí, te pondré, ha habido un error, insertar, alu. 637 00:56:48,530 --> 00:56:57,480 Hasta podría intentar decirte qué ha pasado. 638 00:56:57,480 --> 00:57:28,340 me lanzo, si pongo algo bien me lo añade, si pongo algo con un error, pues me dice error al insertar alumno, fijaos que aquí ya no explota, me dice este string de dos ss, pues no, no, esto ya es un punto más serio, ¿dudas? 639 00:57:28,340 --> 00:57:32,460 el label que te sale abajo 640 00:57:32,460 --> 00:57:33,840 cuando creas un alumno 641 00:57:33,840 --> 00:57:35,079 como lo haces 642 00:57:35,079 --> 00:57:36,619 en el style builder 643 00:57:36,619 --> 00:57:39,860 en el style builder el label que has puesto 644 00:57:39,860 --> 00:57:41,719 justo después del botón 645 00:57:41,719 --> 00:57:43,820 he puesto un label que está por aquí 646 00:57:43,820 --> 00:57:45,760 y le he puesto 647 00:57:45,760 --> 00:57:46,639 un id 648 00:57:46,639 --> 00:57:55,019 dudas 649 00:57:55,019 --> 00:58:05,980 porque 650 00:58:05,980 --> 00:58:07,019 ¿cómo voy a participar 651 00:58:07,019 --> 00:58:09,219 en lo de REST XT 652 00:58:09,219 --> 00:58:10,260 porque no sale 653 00:58:10,260 --> 00:58:22,719 Porque has importado el que no es. Tienes que importar esta cosa del level. Borras el level, 654 00:58:22,719 --> 00:58:28,619 lo importas otra vez, pero importando el JavaScript. ¿Vale? ¿Dudas hasta aquí? 655 00:58:28,619 --> 00:58:39,699 Vale, muy bien, esto funciona. Vamos a hacer la segunda parte. ¿Vale? Entonces, 656 00:58:39,699 --> 00:58:45,900 si este de aquí me permite añadir alumnos, yo quiero que esto me permita ver los alumnos que 657 00:58:45,900 --> 00:58:57,880 hay entonces la tabla 2 que es mostrar alumno vamos a hacer de esta forma pillamos dos botones 658 00:58:57,880 --> 00:59:08,579 un botón lo ponemos aquí un botón lo ponemos aquí a la izquierda un botón lo ponemos aquí 659 00:59:08,579 --> 00:59:29,579 a derecho, a este le ponemos allí, a este le ponemos así, y en el medio ponemos un textarea, 660 00:59:29,579 --> 00:59:48,110 por ejemplo, así. Lo podemos hacer con textfield distintos y cosas así, pero al menos así utilizamos 661 00:59:48,110 --> 00:59:55,849 otro comando, ¿vale? ¿Qué es esto? La idea es que cuando yo entra aquí y pulse a estos botones de 662 00:59:55,849 --> 01:00:00,530 aquí me vaya recorriendo todos los alumnos que yo tengo y me escriba a los 663 01:00:00,530 --> 01:00:09,750 alumnos aquí. Entonces tengo dos métodos aquí, cuando pincharé aquí haré al 664 01:00:09,750 --> 01:00:14,309 siguiente alumno, cuando pincharé aquí será el anterior alumno. 665 01:00:14,309 --> 01:00:19,989 Entonces me voy a... ¿esto lo puedo guardar? 666 01:00:20,610 --> 01:00:24,190 En esto no tengo que cambiarlo, esto no tengo que cambiarlo, esto sí tengo que 667 01:00:24,190 --> 01:00:33,579 cambiarlo, por lo tanto le tengo que dar un nombre. Esto será mi txtAlumno. Es un 668 01:00:33,579 --> 01:00:41,639 textarea. Esto será txtAlumno. Cuarto y ya está. 669 01:00:41,639 --> 01:00:51,550 Desde la perspectiva del controlador tendré dos métodos. Un método que 670 01:00:51,550 --> 01:01:11,900 será public void anterior y otro método que será public void siguiente. Pon su etiqueta para decir 671 01:01:11,900 --> 01:01:23,019 cuidado lo quiero utilizar en fxml. Entonces ahora si vuelvo aquí puedo hacer que este botón de aquí 672 01:01:23,019 --> 01:01:34,840 al pulsarlo haga anterior y este botón de aquí al pulsarlo haga siguiente. Lo mismo que hemos 673 01:01:34,840 --> 01:01:40,059 hecho antes, ¿vale? Ahora mi controlador tiene dos métodos más, tiene el método anterior y 674 01:01:40,059 --> 01:01:45,699 siguiente que los ha añadido ahora, pues lo asocio a este botón onAction anterior, 675 01:01:45,699 --> 01:01:53,260 este botón onAction siguiente. La parte gráfica ya la he hecho, ahora consiste, 676 01:01:53,260 --> 01:02:28,679 ahora lo que tengo que hacer es que hagan algo y dudas hasta aquí y paramos aquí entonces estábamos 677 01:02:28,679 --> 01:02:33,139 aquí hemos completado la parte de crear alumnos vamos a mostrar alumnos donde hemos creado esta 678 01:02:33,139 --> 01:02:39,340 situación de aquí vale tenemos un texto que se llama texto alumno aquí en el medio que es un 679 01:02:39,340 --> 01:02:44,619 campo un área de texto y dos botones vale hemos asociado al botón de la izquierda el botón de 680 01:02:44,619 --> 01:02:51,780 la derecha siguiente anterior vale esto es lo que hemos hecho antes teniendo en cuenta que como esta 681 01:02:51,780 --> 01:02:59,440 interfaz tiene este controlador todos los fichas de los métodos que yo pondré aquí etiquetados con 682 01:02:59,440 --> 01:03:08,440 me aparecerán aquí para poder reutilizarlos en botones o campos o lo que sea. 683 01:03:08,440 --> 01:03:13,440 Puedo hacer hasta que varios botones llamen el mismo método si quiero. 684 01:03:13,440 --> 01:03:26,900 Pero esto no sé si lo he guardado, lo guardo, vuelvo para acá, recargo y ahora mi aplicación 685 01:03:26,900 --> 01:03:33,500 aplicación debería tener en el lado así esto para crear nuevos alumnos y aquí 686 01:03:33,500 --> 01:03:39,500 nada porque no la legalidad entonces voy aquí 687 01:03:40,800 --> 01:03:50,300 debería ahora ahora 688 01:03:50,300 --> 01:03:55,460 entonces vamos ahora a implementar esta parte de 689 01:03:55,460 --> 01:04:17,610 Paso número 1. Vamos a ver qué tiene que verse. Estamos en el controller. La idea es que me 690 01:04:17,610 --> 01:04:26,050 gustaría que el primer alumno se viera directamente, pero es que no sé cuántos alumnos hay. De hecho, 691 01:04:26,050 --> 01:04:31,570 la primera vez que lo abro los alumnos están vacíos vale entonces por ahora está vacío pues 692 01:04:31,570 --> 01:04:37,250 por ahora no hago nada en el inicialización luego después cuando ponemos los ficheros 693 01:04:37,250 --> 01:04:50,000 pues haremos algo aquí también entonces al principio una vez creado o sea hacemos que 694 01:04:50,000 --> 01:04:58,619 porque no lo quiero hacer por cada pues haremos que cuando cambio a esta pestaña de aquí pues no 695 01:04:58,619 --> 01:05:12,760 se vea nada vale se cargue al dar la primera vez aquí al botón entonces voy a tener cuando pincho 696 01:05:12,760 --> 01:05:19,039 el siguiente pensamos consiguiente tengo que cargar en esa área la información del siguiente 697 01:05:19,039 --> 01:05:20,840 elemento, ¿vale? 698 01:05:20,840 --> 01:05:21,480 El siguiente 699 01:05:21,480 --> 01:05:25,739 alumno, ¿vale? 700 01:05:26,139 --> 01:05:27,480 Entonces, primera cosa, me pregunto 701 01:05:27,480 --> 01:05:28,360 si hay alumnos. 702 01:05:29,059 --> 01:05:31,079 Si g.si 703 01:05:31,079 --> 01:05:34,599 es mayor que cero, 704 01:05:36,440 --> 01:05:37,139 entonces es igual. 705 01:05:38,019 --> 01:05:38,280 ¿Vale? 706 01:05:38,280 --> 01:05:39,840 Si no hay alumnos, 707 01:05:40,199 --> 01:05:41,119 no cargo nada. 708 01:05:43,360 --> 01:05:44,739 Me tengo 709 01:05:44,739 --> 01:05:46,500 que acordar 710 01:05:46,500 --> 01:05:48,460 en qué alumno estoy 711 01:05:48,460 --> 01:05:49,960 ahora mismo. Entonces, 712 01:05:49,960 --> 01:06:01,260 voy a crear un int posición, que es al acero, ¿vale? Y que si hay un alumno, 713 01:06:02,380 --> 01:06:17,800 lo que tengo que cargar es ese alumno allí. Si pincho en siguiente, pero lo que me gustaría 714 01:06:17,800 --> 01:06:24,880 es que si hay alumnos vaya al siguiente alumno y lo cargue vale entonces la idea sería posición 715 01:06:24,880 --> 01:06:33,269 más más y ahora cargue la información de la posición más más pero para que esto funcione 716 01:06:33,269 --> 01:06:44,250 debería poner aquí menos 1 entonces posición más más media cero entonces lo que voy a hacer es 717 01:06:44,250 --> 01:06:49,230 como hay elementos pues estaría en la posición cero voy a pillar el alumno cero para pillar 718 01:06:49,230 --> 01:06:57,170 alumno cero tengo que acceder a la posición cero de esta array y no tengo nada para poder 719 01:06:57,170 --> 01:07:08,730 pillar esta array list. Por lo tanto necesito hacer una cosa como public alumno getIntIndex 720 01:07:08,730 --> 01:07:12,039 que me permita hacer 721 01:07:12,039 --> 01:07:12,800 return 722 01:07:12,800 --> 01:07:15,440 alumnos.get 723 01:07:15,440 --> 01:07:16,559 index. 724 01:07:20,800 --> 01:07:22,460 Entonces, le paso un índice 725 01:07:22,460 --> 01:07:24,380 y me devuelve el índice. Si lo tengo, 726 01:07:24,500 --> 01:07:25,880 me devuelve el alumno en ese índice. 727 01:07:26,579 --> 01:07:28,199 Lo puedo hacer porque estoy utilizando 728 01:07:28,199 --> 01:07:30,260 una revista. Si tuviera un set 729 01:07:30,260 --> 01:07:32,619 o cosas por el estilo, sería un poco distinto. 730 01:07:33,360 --> 01:07:34,820 Pero, este de aquí 731 01:07:34,820 --> 01:07:36,079 hará 732 01:07:36,079 --> 01:07:37,960 alumno 733 01:07:37,960 --> 01:07:39,280 actual 734 01:07:39,280 --> 01:07:42,039 es igual a 735 01:07:42,039 --> 01:07:43,780 gestor.get 736 01:07:43,780 --> 01:07:47,780 post. Ahora tengo 737 01:07:47,780 --> 01:07:49,760 el alumno, ¿vale? Y este alumno lo 738 01:07:49,760 --> 01:07:51,760 quiero imprimir 739 01:07:51,760 --> 01:07:53,280 en 740 01:07:53,280 --> 01:07:55,960 el área de texto. 741 01:07:56,440 --> 01:07:57,800 ¿Vale? Esta área de texto 742 01:07:57,800 --> 01:07:59,739 aquí, que se 743 01:07:59,739 --> 01:08:01,539 llama text-alumno. 744 01:08:02,380 --> 01:08:03,820 Entonces, para que pueda acceder 745 01:08:03,820 --> 01:08:05,820 a esa de allí, la tengo 746 01:08:05,820 --> 01:08:07,400 que hacer algo de este estilo. 747 01:08:07,780 --> 01:08:09,539 Es decir, oye, mira, xml. 748 01:08:10,260 --> 01:08:11,019 Fxml. 749 01:08:11,019 --> 01:08:27,310 vas a tener un textarea que se llama textalumno. ¿Y qué es este textarea? Pues importa el control. 750 01:08:27,310 --> 01:08:41,390 ¿Vale? Entonces, aquí, ahora lo que voy a hacer es textalumno.getSetText de actual.23. 751 01:08:41,390 --> 01:08:59,720 Lo lanzo, creo un alumno, que es el alumno A con 22. Me voy a mostrar al alumno y pincho siguiente, 752 01:08:59,720 --> 01:09:05,600 me aparece aquí el alumno. Está claro que si pincho otra vez siguiente explota. 753 01:09:05,600 --> 01:09:13,039 ¿Por qué explota? Porque esto sigue adelante, adelante, adelante, adelante y llega un momento 754 01:09:13,039 --> 01:09:19,739 que se pasará del 6 y explota. Entonces hagamos aquí un pequeño controlito para evitar que 755 01:09:19,739 --> 01:09:28,060 explote, si posición es mayor, es igual a g.sit, 756 01:09:28,720 --> 01:09:31,119 quiere decir que me he pasado. 757 01:09:32,779 --> 01:09:37,199 Si posición es 1 y yo tengo la posición 1, no existe. 758 01:09:38,420 --> 01:09:41,819 Entonces lo que hago es dos opciones. 759 01:09:42,140 --> 01:09:44,840 O lo dejo en el último o vuelvo al primero, 760 01:09:45,039 --> 01:09:47,000 dependiendo de cómo quiero que funcione. 761 01:09:47,000 --> 01:09:49,880 Si yo quiero que sea como circular 762 01:09:49,880 --> 01:09:51,840 Si estoy en el último alumno 763 01:09:51,840 --> 01:09:54,220 Y voy al siguiente, va al primero 764 01:09:54,220 --> 01:09:56,260 Pues tengo que hacer una cosa 765 01:09:56,260 --> 01:09:58,420 La otra opción es que si llego al último 766 01:09:58,420 --> 01:10:00,539 Y no hay último, pues se quede en el último 767 01:10:00,539 --> 01:10:03,220 Hagámoslo circular 768 01:10:03,220 --> 01:10:05,899 Entonces, si la posición 769 01:10:05,899 --> 01:10:07,800 Es el máximo 770 01:10:07,800 --> 01:10:09,439 Quiere decir 771 01:10:09,439 --> 01:10:11,840 Que posh vuelve a hacer 772 01:10:11,840 --> 01:10:14,760 Si yo estoy en la posición 9 773 01:10:14,760 --> 01:10:15,960 Que es el último alumno 774 01:10:15,960 --> 01:10:17,960 y salgo a la posición 10 y no hay 775 01:10:17,960 --> 01:10:20,119 el alumno 10, pues la posición es 0. 776 01:10:20,739 --> 01:10:21,539 Entonces me pondrá el 0. 777 01:10:24,050 --> 01:10:26,189 Tú das, y luego 778 01:10:26,189 --> 01:10:28,010 pillas al alumno 779 01:10:28,010 --> 01:10:28,930 y lo cagas. 780 01:10:29,930 --> 01:10:31,869 Ya está. Ahora, ¿cómo 781 01:10:31,869 --> 01:10:32,649 hago el anterior? 782 01:10:34,770 --> 01:10:35,289 Parecido. 783 01:10:37,029 --> 01:10:37,930 Si hay, 784 01:10:38,409 --> 01:10:39,989 porque si no hay alumnos, 785 01:10:40,489 --> 01:10:41,949 estos botones no tienen que hacer nada, 786 01:10:43,170 --> 01:10:43,989 resto 1, 787 01:10:45,329 --> 01:10:45,850 y si resulta 788 01:10:45,850 --> 01:10:50,329 resulta que la posición es menor que cero, 789 01:10:51,750 --> 01:10:53,529 esto hay menos uno, menos dos, menos tres, 790 01:10:53,989 --> 01:10:56,989 pues entonces tengo que ir a la última posición, 791 01:10:57,649 --> 01:11:00,689 que será G.7. 792 01:11:02,010 --> 01:11:06,069 ¿Sí o no? 793 01:11:06,869 --> 01:11:11,210 Esto lo hemos hecho algunas veces de forma textual. 794 01:11:11,829 --> 01:11:14,449 Y a este punto pillo esa posición en la imprimida. 795 01:11:14,449 --> 01:11:47,090 De hecho, esta parte de aquí es igual en los dos, entonces lo que podría hacer es crearme un metodito, private void print area, en el que te paso un infos y lo que haces tú es esto. 796 01:11:47,090 --> 01:11:56,289 Y aquí Arash. 797 01:12:01,289 --> 01:12:22,100 ¿Por qué? Porque así si ahora cambio cómo se ve el alumno, pues lo cambio aquí y en automático se me aplica tanto al botón derecho como al botón izquierdo. 798 01:12:22,100 --> 01:12:30,920 Si yo este código lo duplico y luego cambio uno, lo tengo que cambiar igual también el 799 01:12:30,920 --> 01:12:31,920 otro lado. 800 01:12:31,920 --> 01:12:38,039 Ahora lo tengo centralizado en un solo sitio y siempre llamará esta cosa. 801 01:12:38,039 --> 01:12:40,039 Ahora hacemos un ejemplo. 802 01:12:40,039 --> 01:13:06,909 Tengo aquí, tengo el señor S, tengo el señor G, y tengo el señor U, y ahora me pongo aquí, y tengo S, tengo G, tengo U, y tengo S, G, U, S, G, U. 803 01:13:06,909 --> 01:13:17,140 va por un lado y va por el otro. Y puedo ir mirando todos mis alumnos, ¿sí? 804 01:13:17,140 --> 01:13:26,039 Ahora, si yo quisiera, no me gusta así, lo quiero de otro formato, por ejemplo, 805 01:13:26,039 --> 01:13:34,460 escribir alumno, luego irte a una nueva... 806 01:13:34,460 --> 01:13:37,840 no sé si es esta barra o la otra barra 807 01:13:37,840 --> 01:13:39,659 la inversa 808 01:13:39,659 --> 01:13:42,699 barra n 809 01:13:42,699 --> 01:13:44,119 más 810 01:13:44,119 --> 01:13:46,779 aquí escribo 811 01:13:46,779 --> 01:13:48,439 nombre 812 01:13:48,439 --> 01:13:49,579 dos puntos 813 01:13:49,579 --> 01:13:51,840 y luego pongo 814 01:13:51,840 --> 01:13:53,819 actual 815 01:13:53,819 --> 01:13:55,920 punto nombre 816 01:13:55,920 --> 01:13:59,100 más 817 01:13:59,100 --> 01:14:02,140 barra n otra vez 818 01:14:02,140 --> 01:14:04,640 nota dos puntos 819 01:14:04,640 --> 01:14:05,779 más 820 01:14:05,779 --> 01:14:08,319 actual punto nota 821 01:14:08,319 --> 01:14:24,960 fijaos que 822 01:14:24,960 --> 01:14:26,460 las notas no las he 823 01:14:26,460 --> 01:14:30,699 no las he limitado desde la 10 824 01:14:30,699 --> 01:14:32,500 o sea que faltaría 825 01:14:32,500 --> 01:14:34,520 es que ahora me lo escribo así 826 01:14:34,520 --> 01:14:37,000 y me da igual 827 01:14:37,000 --> 01:14:38,800 el botón que pincho porque el formato 828 01:14:38,800 --> 01:14:40,720 este aquí ya no depende, si había 829 01:14:40,720 --> 01:14:42,619 dejado dos veces y lo había modificado en uno 830 01:14:42,619 --> 01:14:44,600 cuando daba a la derecha me lo ponía 831 01:14:44,600 --> 01:14:46,460 en esta cosa aquí y cuando daba a la izquierda 832 01:14:46,460 --> 01:14:47,819 me lo volvía a poner con el otro 833 01:14:47,819 --> 01:14:48,939 código 834 01:14:48,939 --> 01:14:58,130 y si tenéis código duplicado y tenéis que modificarlo por un lado y por el otro cuando 835 01:14:58,130 --> 01:15:11,500 cambiáis algo, pues maldición. Ya está, ya tengo mi fantástica aplicación de forma visual, 836 01:15:11,500 --> 01:15:16,720 con interfaz gráfico en el que puedo añadir alumnos, todos los alumnos que me dé la gana. 837 01:15:25,949 --> 01:15:31,949 Y puedo ir mirando mis alumnos. 838 01:15:31,949 --> 01:15:39,409 ¿Qué me faltaría poder hacer? 839 01:15:39,409 --> 01:15:41,409 Pues, por ejemplo, guardarlos. 840 01:15:41,409 --> 01:15:44,409 Guardarlos y cargarlos. 841 01:15:44,409 --> 01:15:54,409 Entonces, lo que podríamos hacer es que se cargue el fichero. 842 01:15:54,409 --> 01:16:00,170 hay un fichero que se cargue en automático cuando arranco esto vale pero para guardarlo 843 01:16:00,170 --> 01:16:04,810 si yo puedo hacer cambios puede añadir alumnos pero no vaya una tercera pastañita aquí de guardar 844 01:16:04,810 --> 01:16:13,029 en el que hay un botón para guardar en un fichero podría también hacer aquí una cosa que sea de 845 01:16:13,029 --> 01:16:17,949 cargar y guardar o sea guardar y cargar para que haya dos botones de pilla este fichero 846 01:16:17,949 --> 01:16:27,010 pero para hacer las dos cosas que una sea automática y una que sea por un botón pues 847 01:16:27,010 --> 01:16:31,689 entonces hacemos sólo un botón aquí que actualiza la cosa yo puedo hacer cambios 848 01:16:31,689 --> 01:16:36,550 pero estos cambios son provisionales hasta que lo guarde vale pero cada vez que arranca 849 01:16:36,550 --> 01:16:43,810 pues intenta cargar un fichero explico lo que quiero hacer entonces que tengo que hacer 850 01:16:43,810 --> 01:16:51,170 Pues me voy aquí, añado una tercera tab. ¿Cómo se añade una tercera tab? Pues en la hierarquía aquí, 851 01:16:51,170 --> 01:16:59,069 hay un tab aquí, un tab aquí, pues necesito un tercer tab. Me voy a donde están los tabs, 852 01:16:59,069 --> 01:17:08,750 están aquí al otro lado, en containers, me busco un tab pane, un tab, esto, dentro está un tab pane. 853 01:17:08,750 --> 01:17:24,500 Vamos a ver si con esto me lo hace bien. Y lo añado aquí. Tengo otro tab. Dentro de este tab le pongo solo un botón grande de save. 854 01:17:24,500 --> 01:17:43,470 Como quiero que cargue en automático, vale. Pues entonces el nombre del fichero que carga no lo puedo... 855 01:17:43,470 --> 01:17:59,800 Le pongo un TextField, que será el nombre del fichero donde se guarda, y un botón para 856 01:17:59,800 --> 01:18:09,720 guardarlo. 857 01:18:09,720 --> 01:18:17,640 El botón pone Sabe o Guardar. 858 01:18:17,640 --> 01:18:41,899 Este de aquí le pongo, si queréis, también un Label, para que ponga Nombre, Fichero. 859 01:18:41,920 --> 01:18:53,399 Entonces yo escribo aquí el nombre del fichero y al pulsar guardar quiero que me guarde los alumnos que tengo ahora en ese fichero. 860 01:18:54,220 --> 01:19:02,399 Luego haré que al arrancar busca un fichero con un determinado nombre que es standard.dat. 861 01:19:03,300 --> 01:19:06,619 Si ese fichero está, me carga esos ficheros. 862 01:19:06,619 --> 01:19:12,359 Entonces, si yo quiero que se carguen al principio, pues pongo aquí standard.dat y lo que escriba allí se cargará al fichero. 863 01:19:12,479 --> 01:19:14,979 Y si en vez de que quiero una copia de beta, pues lo puedo hacer también. 864 01:19:16,180 --> 01:19:18,979 Es una cosa maravillosa, pero me interesa. Es para pronto. 865 01:19:20,340 --> 01:19:24,579 Entonces, necesito que cuando pincho este botón haga algo. 866 01:19:24,579 --> 01:19:30,579 Me voy a mi controlador y me creo un nuevo método. 867 01:19:30,579 --> 01:19:42,760 un nuevo método que es arroba fxml y será un bo, public, private o depende de donde lo quiera usar, 868 01:19:42,760 --> 01:20:03,119 private void guardar y entonces quiero que al pinchar este guardar su onAction, 869 01:20:03,119 --> 01:20:05,460 que no lo ha cargado 870 01:20:05,460 --> 01:20:10,449 a ver si lo recarga, me voy al 871 01:20:10,449 --> 01:20:12,850 controller y voy a seleccionar 872 01:20:12,850 --> 01:20:13,689 otra vez esta 873 01:20:13,689 --> 01:20:15,890 y a veces 874 01:20:15,890 --> 01:20:18,250 sí que me lo recarga, ¿veis? 875 01:20:19,029 --> 01:20:19,909 ahora está guardado 876 01:20:19,909 --> 01:20:24,609 entonces al pinchar esto se guardará 877 01:20:24,609 --> 01:20:26,590 cuando yo uso el guardar 878 01:20:26,590 --> 01:20:28,989 quiero saber lo que está escrito aquí dentro 879 01:20:28,989 --> 01:20:30,609 por lo tanto a este de aquí 880 01:20:30,609 --> 01:20:31,909 le doy un nombre 881 01:20:31,909 --> 01:20:33,810 pero 882 01:20:33,810 --> 01:20:36,029 ¿vale? 883 01:20:36,029 --> 01:20:57,439 y aquí a bonito guarda con esto he acabado guardo y vuelvo aquí corre cargo por si acaso lo lanzo 884 01:20:57,439 --> 01:21:12,619 ahí que exista, aquí. Vale, muy bien. Entonces, cuando pincharé ese botón, se lanza este guardar. 885 01:21:12,619 --> 01:21:19,100 ¿Qué tengo que hacer? Tengo que guardar un fichero, guardar todo lo que tengo en un fichero, 886 01:21:19,100 --> 01:21:26,140 vale entonces vamos a intentar hacerlo 887 01:21:26,140 --> 01:21:36,039 primero necesito el fichero vale file f es igual a new file 888 01:21:36,039 --> 01:21:59,250 que le pongo aquí que le pongo aquí como llamado 889 01:21:59,250 --> 01:22:08,470 primero tengo que referirme a él y lo he llamado fichero y entonces 890 01:22:08,470 --> 01:22:18,300 ahora es fichero.getText. Con esto creo un fichero asociado con lo que he escrito allí. 891 01:22:18,300 --> 01:22:26,100 Esto claramente es un java.io, se puede usar java.io que hemos visto con files y cosas por 892 01:22:26,100 --> 01:22:32,880 el estilo. Eso ya lo dejamos a vosotros. Entonces ahora tengo que escribir en este fichero. Para 893 01:22:32,880 --> 01:22:38,979 escribir en este fichero necesito un canal de escritura en ese fichero. ¿Qué uso? ¿Qué hago? 894 01:22:38,979 --> 01:22:58,939 never in the light. ¿Por qué no? Si hago un File Writer, ¿para qué sirve el File Writer? ¿Escribir qué? 895 01:23:01,840 --> 01:23:10,260 ¿Texto? ¿Quiero escribir texto? ¿Quiero irme a recorrer todos mis alumnos y reescribirlos en texto 896 01:23:10,260 --> 01:23:15,659 para que luego cuando lo vaya a leer tenga que reconstruirme todos los alumnos en formato texto? 897 01:23:15,659 --> 01:23:41,289 de nuevo object output stream host es igual a new object output stream de new file output stream 898 01:23:41,289 --> 01:24:05,739 que es esto, impórtalo, que es esto, impórtalo, me quejo, re quejo. Ahí. O esto lo creo dentro del... 899 01:24:05,739 --> 01:24:28,569 Ahí. Entonces he creado este OS, ¿vale? Puedo escribir cosas. ¿Qué escribo? Pues yo lo que voy a hacer es escribir gestor. 900 01:24:29,590 --> 01:24:48,739 at, va al gestor, le digo, escúchame gestor, eres realizable, perfecto, ya está, te puede escribir. 901 01:24:48,739 --> 01:25:06,840 Entonces lo que va a hacer, en el que es controller, es escribir directamente os.freeTheObject de, 902 01:25:06,840 --> 01:25:29,520 Cuando le das al save, lo que hace es escribir el gestor entero en el fichero. 903 01:25:29,520 --> 01:25:34,140 Como el gestor tiene dentro una red de alumnos, pues escribe la red de alumnos. 904 01:25:34,220 --> 01:25:37,859 Como la red de alumnos tiene dentro alumnos, pues escribirá a los alumnos. 905 01:25:38,119 --> 01:25:41,340 Escríbelo tú, como te da la gana, como quieras. Escríbelo. 906 01:25:41,680 --> 01:25:41,819 Sí. 907 01:25:42,319 --> 01:25:44,600 ¿Y en la que falta que el alumno sea serializable? 908 01:25:44,600 --> 01:25:47,760 ¿Qué lo sabe? ¿Tú qué dices? 909 01:25:53,880 --> 01:25:55,739 ¿Tú qué opinas? ¿Por qué me lo preguntas? 910 01:25:57,930 --> 01:25:59,050 Porque normalmente con otra 911 01:25:59,050 --> 01:26:00,829 salida de su propiedad que he hecho yo 912 01:26:00,829 --> 01:26:03,430 no sabría. O sea, mi 913 01:26:03,430 --> 01:26:04,710 individuo me ha sufrido por eso. 914 01:26:05,010 --> 01:26:06,489 Pero no me lo preguntes. 915 01:26:07,789 --> 01:26:08,550 No lo sé. 916 01:26:09,250 --> 01:26:10,449 Afírmalo. ¿Cómo que no lo sabes? 917 01:26:11,850 --> 01:26:12,109 Claro. 918 01:26:13,029 --> 01:26:14,930 Lo puedo probar. Va a explotar. 919 01:26:15,449 --> 01:26:17,029 ¿Vale? Porque, claro, gestor 920 01:26:17,029 --> 01:26:19,130 es serializable, puede, pero para que 921 01:26:19,130 --> 01:26:20,869 sea serializable, ese puede ser 922 01:26:20,869 --> 01:26:24,229 realizar, todos los objetos que usa tienen que ser serializables. 923 01:26:24,229 --> 01:26:27,289 Entonces a la lista es realizable, pero al alumno no. 924 01:26:27,289 --> 01:26:29,510 Entonces explotará a un cierto momento diciendo que cuando 925 01:26:29,510 --> 01:26:32,090 intenta escribir al alumno dice que no es realizable. 926 01:26:32,090 --> 01:26:33,590 Vale, perfecto, no pasa nada. 927 01:26:33,590 --> 01:26:39,890 Cuando explotará, pues le pongo aquí implements serializable. 928 01:26:39,890 --> 01:26:40,630 Correcto, ¿eh? 929 01:26:40,630 --> 01:26:44,739 Bien. 930 01:26:44,739 --> 01:26:47,680 Sí, ahora debería ser todo serializable, 931 01:26:47,680 --> 01:26:50,319 esperando que a la lista sea realizable y que escriba sí. 932 01:26:50,319 --> 01:26:51,880 ¿Vale? 933 01:26:51,880 --> 01:26:53,560 Perfecto, guardo todo así. 934 01:26:53,560 --> 01:26:57,119 ¿Podría hacer lo distinto de guardar alumno por alumno? 935 01:26:57,239 --> 01:26:57,420 Sí. 936 01:26:57,579 --> 01:26:58,800 ¿En el examen qué me van a pedir? 937 01:26:58,939 --> 01:26:59,979 Pues no lo sé, lo que te pidan. 938 01:27:00,340 --> 01:27:00,520 ¿Vale? 939 01:27:00,520 --> 01:27:07,039 Está claro que si te pidan guarda alumno por alumno y tú guardas el arreglisto, pues 940 01:27:07,039 --> 01:27:08,520 fracasó un cero. 941 01:27:09,239 --> 01:27:09,439 ¿Veis? 942 01:27:12,739 --> 01:27:14,140 Tiqui, tiqui, tiqui, tiqui, tiqui. 943 01:27:17,180 --> 01:27:27,439 Ahora, si esto funciona, y esto a lo mejor debería ser cuando aquí hay algo, ¿vale? 944 01:27:27,439 --> 01:27:41,779 Entonces, si fichero.getText.length es mayor que cero. 945 01:27:50,619 --> 01:27:55,800 Si hay algo escrito en ese campo, pues entonces me creas el fichero. 946 01:27:56,060 --> 01:28:00,199 Si no hay nada, pues no intento guardar porque no sabía dónde guardar. 947 01:28:02,100 --> 01:28:02,279 ¿Sí? 948 01:28:03,100 --> 01:28:15,260 Si esto funciona, ahora yo puedo lanzarlo, puedo escribir aquí el señor A y el señor B, 949 01:28:15,260 --> 01:28:26,600 que se ven aquí, y cuando voy a guardar alumnos, lo puedo guardar en alumnos.dat, 950 01:28:26,600 --> 01:28:46,510 le doy a guardar y con un poco de suerte por algún lado, se ha creado alumnus.dat y si 951 01:28:46,510 --> 01:28:54,130 voy a mirar que hay dentro, no lo entiendo, pero con un poco de suerte por algún lado veo el señor A 952 01:28:54,130 --> 01:29:06,569 Esto no es texto, es binario, es una representación de la tabla, pero este de aquí sería mi gestor. 953 01:29:06,569 --> 01:29:15,789 Este es mi gestor. Si yo al arrancar importo este gestor, ya tengo dentro los alumnos listos. 954 01:29:15,789 --> 01:29:19,310 Que es lo que va a intentar hacer ahora 955 01:29:19,310 --> 01:29:20,689 Vale, vamos a ver 956 01:29:20,689 --> 01:29:22,489 Pues vamos a ver que 957 01:29:22,489 --> 01:29:25,350 Yo puedo guardar donde me da la gana 958 01:29:25,350 --> 01:29:26,869 ¿Vale? Pero mi sistema 959 01:29:26,869 --> 01:29:28,430 Al arrancar 960 01:29:28,430 --> 01:29:32,050 Va a buscar alumnos.dat 961 01:29:32,050 --> 01:29:34,350 Y lo que está en alumnos.dat 962 01:29:34,350 --> 01:29:34,949 Lo carga 963 01:29:34,949 --> 01:29:36,250 Yo puedo 964 01:29:36,250 --> 01:29:39,109 Guardar los ficheros donde me da la gana 965 01:29:39,109 --> 01:29:41,069 Pero si sobreescribo este alumno.dat 966 01:29:41,069 --> 01:29:42,630 Es el que se recargará 967 01:29:42,630 --> 01:29:44,050 La próxima vez que arranque el programa 968 01:29:44,050 --> 01:29:44,890 ¿Vale? 969 01:29:45,789 --> 01:29:52,689 Entonces, quiero que esto se haga de forma automática, por lo tanto lo voy a poner en inicialización. 970 01:29:52,989 --> 01:30:02,149 Cuando inicializa, en vez de crear el gestor directamente, lo que va a ver es si existe este fichero. 971 01:30:03,930 --> 01:30:12,569 Entonces, file f es igual a new file de alumnos.dat, uno en concreto. 972 01:30:12,569 --> 01:30:15,670 porque es inicializado, no sé cuál es 973 01:30:15,670 --> 01:30:17,670 entonces asumo que haya este fichero 974 01:30:17,670 --> 01:30:19,670 por defecto que es de donde se cargan 975 01:30:19,670 --> 01:30:21,810 los datos, si yo quiero que se carguen la próxima vez 976 01:30:21,810 --> 01:30:24,069 simplemente los guardo aquí 977 01:30:24,069 --> 01:30:24,449 ¿vale? 978 01:30:24,970 --> 01:30:33,250 si existe, pues entonces 979 01:30:33,250 --> 01:30:37,069 cargaré el gestor desde allí 980 01:30:37,069 --> 01:30:38,310 dentro, si no 981 01:30:38,310 --> 01:30:44,060 me creo un gestor nuevo 982 01:30:44,060 --> 01:30:46,770 ¿ok? 983 01:30:47,569 --> 01:30:49,989 ¿y cómo lo hago? pues tengo que utilizar 984 01:30:49,989 --> 01:30:51,229 un input 985 01:30:51,229 --> 01:31:13,109 object.inputStream ois es igual a new object.inputStream de new filenputStream de f 986 01:31:13,109 --> 01:31:51,199 esto de aquí lo pondré en un try, este de aquí lo importo, este de aquí lo importo, ya lo tengo, ¿vale? 987 01:31:51,199 --> 01:32:09,930 ¿Y qué hago? Pues g es igual a gestor de ois.readoption, ois.readoption me dice, ah, class not found, 988 01:32:09,930 --> 01:32:22,890 pues añádelo aquí ahora si explota por esto por esto por cualquier otra causa podría hacerla así 989 01:32:22,890 --> 01:32:38,520 si explota hasta así quiere decir que ha intentado pillar este objeto y por alguna razón no ha 990 01:32:38,520 --> 01:32:53,420 funcionado pues entonces crema si no he conseguido cargarlo pues que era un gestor normal todo esto 991 01:32:53,420 --> 01:33:08,949 fase de inicialización. Podría hasta hacerlo así, a lo mejor se queda más creando un gestor nuevo y 992 01:33:08,949 --> 01:33:19,640 si consigo cargarlo lo sustituyo. Pero siempre gasto, me queda un gestor verde. Tampoco me 993 01:33:19,640 --> 01:33:26,239 gasta mucho. Si es un gestor nuevo vacío, si existe el fichero intento cargarlo, si no lo 994 01:33:26,239 --> 01:33:30,500 he cargado porque ha explotado por aquí, pues entonces no hará nada y entonces me lo dejará 995 01:33:30,500 --> 01:33:45,539 como así. Con esto debería funcionar. Vamos a verlo. Lo lanzo. Fijaos que existe en este momento 996 01:33:45,539 --> 01:33:56,500 alumnos.dat. Entonces, al lanzarlo, él debería intentar cargar ese fichero y si ahora me va a 997 01:33:56,500 --> 01:34:07,840 mostrar alumno, ya están los alumnos que había hecho antes. Ahora puedo añadir. Añado Q y lo 998 01:34:07,840 --> 01:34:25,779 puedo ver Q, pero si ahora cierro, al recargarlo, Q no existe. Solo hay B, porque no la he guardado. 999 01:34:27,319 --> 01:34:43,270 Si añado Q, que ahora está, y lo guardo en alumnos.dat, al rearrancar, después de haberlo 1000 01:34:43,270 --> 01:35:08,210 cerrado, pues cuesta. Si añado p, que ahora está, y lo guardo, pero en gato.dat, cuando apago y 1001 01:35:08,210 --> 01:35:21,859 re-enciendo, no está. Porque ahora tengo dos ficheros, uno es alumno.dat y uno es gato.dat. 1002 01:35:22,000 --> 01:35:35,300 Aquí sí estaría p, pero no es el fichero que se carga al abancar. Por lo tanto, ¿para qué me 1003 01:35:35,300 --> 01:35:42,199 podría servir? Yo normalmente guardo siempre en alumno.dat, pero de vez en cuando hago una copia 1004 01:35:42,199 --> 01:35:47,479 que no sea alumno por si se me estropea, pues lo guardo en otro lado. Hasta podría hacerlo así, 1005 01:35:47,479 --> 01:36:01,579 hacer que por defecto me ponga alumno.dat. Está escrito. Pero si yo quiero guardarlo en otro lado, 1006 01:36:01,579 --> 01:36:03,140 pues lo puedo modificar 1007 01:36:03,140 --> 01:36:20,529 aquí tengo estos 1008 01:36:20,529 --> 01:36:22,649 aquí ya me lo pone 1009 01:36:22,649 --> 01:36:25,069 para que sustancialmente le dé a guardar 1010 01:36:25,069 --> 01:36:27,210 pero si luego quiero cambiarlo para poner un backup 1011 01:36:27,210 --> 01:36:28,369 o cosa por el estilo, lo puedo dar 1012 01:36:28,369 --> 01:36:30,090 ¿sí? 1013 01:36:31,569 --> 01:36:32,369 pues ya está 1014 01:36:32,369 --> 01:36:35,050 tengo mi interfaz gráfica, puedo añadir alumnos 1015 01:36:35,050 --> 01:36:36,789 puedo mirarlos, puedo 1016 01:36:36,789 --> 01:36:38,430 guardar 1017 01:36:38,430 --> 01:36:40,789 ¿vale? y esto como 1018 01:36:40,789 --> 01:36:41,949 primer 1019 01:36:41,949 --> 01:36:44,109 prototipo