1 00:00:00,000 --> 00:00:03,720 Vale, pues nuestra arquitectura de clases 2 00:00:03,720 --> 00:00:07,139 Aplicación que tiene una interfaz gráfica 3 00:00:07,139 --> 00:00:10,019 Repito, la interfaz gráfica lo único que aporta es 4 00:00:10,019 --> 00:00:12,300 Que mi forma de introducir datos 5 00:00:12,300 --> 00:00:15,539 Y mi manera de ver los resultados 6 00:00:15,539 --> 00:00:20,679 Va a ser distinta al escáner y al System Outprint LN 7 00:00:20,679 --> 00:00:22,660 Todo lo demás es igual 8 00:00:22,660 --> 00:00:25,879 Si nosotros tenemos que trabajar con alumnos 9 00:00:25,879 --> 00:00:28,559 Con profesores, con clientes, con facturas 10 00:00:28,559 --> 00:00:52,560 Esas clases seguirán estando y seguiremos teniendo nuestras colecciones de facturas de clientes que tendremos que recorrer, con las que tendremos que hacer cosas, con las que tendremos que hacer sumas. Todo eso seguirá estando. Lo único que cambiará es la forma en la que nosotros introduzcamos los datos desde fuera y la manera en la que veremos los resultados. Pues la suma del total de facturas, la nota de un alumno, es lo único que va a cambiar. 11 00:00:52,560 --> 00:00:54,219 ¿Vale? Es lo único que va a cambiar 12 00:00:54,219 --> 00:00:56,100 Bueno, pues entonces 13 00:00:56,100 --> 00:00:59,039 Una aplicación que tiene una interfaz gráfica 14 00:00:59,039 --> 00:01:01,100 Que hemos decidido que tiene una interfaz gráfica 15 00:01:01,100 --> 00:01:02,840 Tendrá entonces 16 00:01:02,840 --> 00:01:04,599 Como elemento para 17 00:01:04,599 --> 00:01:07,299 Recoger datos y mostrar resultados 18 00:01:07,299 --> 00:01:08,959 Un JFrame 19 00:01:08,959 --> 00:01:10,299 Que es lo que vimos el otro día 20 00:01:10,299 --> 00:01:13,099 Pero un JFrame básico 21 00:01:13,099 --> 00:01:14,560 Normal y corriente, no hombre, no 22 00:01:14,560 --> 00:01:16,620 Uno personalizado 23 00:01:16,620 --> 00:01:19,060 Uno personalizado 24 00:01:19,060 --> 00:01:21,739 Al aspecto que nosotros queremos 25 00:01:21,739 --> 00:01:44,920 Entonces, personalizar un JFrame básico es hacer una clase nuestra que hereda de él, ¿vale? Que hereda de él. Bueno, pues entonces, la arquitectura, la arquitectura básica, una de ellas, vamos, para mostrar una aplicación en swing es, me voy a hacer mi JFrame personalizado, es decir, heredero de JFrame. 26 00:01:44,920 --> 00:02:10,960 Y ahora, este JFrame cuando se construye, este JFrame se construye cuando arranca la aplicación, obviamente, en mi main, aquí se construye, cuando arranca la aplicación en el main se construye aquí, ¿no? Aquí, pues aquí es lo que estoy haciendo, construirlo cuando arranca la aplicación, luego además le doy un tamaño, el que yo quiera, y lo hago visible para que se vea, ¿vale? 27 00:02:10,960 --> 00:02:19,939 Y podría hacer más cosas con él porque V, por ser JFrame, tiene un montón de métodos para hacer cosas que uno se puede poner a investigar 28 00:02:19,939 --> 00:02:23,180 y trabajar con Swim al nivel de profundidad que le dé la gana. 29 00:02:24,659 --> 00:02:27,120 Vale, pues entonces, pero se construye aquí en el constructor. 30 00:02:28,139 --> 00:02:34,599 Por eso decíamos, vale, pues en el constructor, que es este, en el constructor, es donde yo tengo que poner todo el rollo, 31 00:02:34,599 --> 00:02:36,879 Todo el rollo patatero de 32 00:02:36,879 --> 00:02:39,180 ¿Qué componentes quiero? 33 00:02:40,460 --> 00:02:42,819 Añadírselos a algún panel del frame 34 00:02:42,819 --> 00:02:44,139 ¿Vale? 35 00:02:44,180 --> 00:02:46,680 Porque recordad que los componentes 36 00:02:46,680 --> 00:02:48,939 Que son los que reciben y muestran datos 37 00:02:48,939 --> 00:02:50,919 Botones, áreas de texto 38 00:02:50,919 --> 00:02:52,000 Los componentes 39 00:02:52,000 --> 00:02:55,280 No van directamente al frame 40 00:02:55,280 --> 00:02:57,240 El frame es como el marco raíz 41 00:02:57,240 --> 00:02:59,340 Al frame van paneles 42 00:02:59,340 --> 00:03:01,900 Y los paneles ya llevan los componentes 43 00:03:01,900 --> 00:03:02,560 ¿Vale? 44 00:03:02,560 --> 00:03:07,039 Pues entonces, nosotros decidimos qué componentes me interesan en este ejemplo 45 00:03:07,039 --> 00:03:10,219 Queríamos una etiqueta 46 00:03:10,219 --> 00:03:13,439 Simplemente para mostrar el texto e introduzca el año 47 00:03:13,439 --> 00:03:15,680 Un área de texto 48 00:03:15,680 --> 00:03:19,379 Para poder introducir yo el dato 49 00:03:19,379 --> 00:03:21,759 Una etiqueta para mostrar el resultado 50 00:03:21,759 --> 00:03:25,379 Y un botoncito para decir, calcula a ver si es bisiesto 51 00:03:25,379 --> 00:03:27,759 Una vez decidido lo añadíamos a un panel 52 00:03:27,759 --> 00:03:30,379 ¿A cuál? Podría hacerle un panel si me daba la gana 53 00:03:30,379 --> 00:03:31,939 un jPanel 54 00:03:31,939 --> 00:03:36,080 pero podemos trabajar con el que ya me da el frame 55 00:03:36,080 --> 00:03:37,860 que me da uno por defecto 56 00:03:37,860 --> 00:03:39,580 que yo lo puedo sacar con este método 57 00:03:39,580 --> 00:03:41,960 con este método 58 00:03:41,960 --> 00:03:43,879 podíamos sacar el panel por defecto 59 00:03:43,879 --> 00:03:45,039 del frame 60 00:03:45,039 --> 00:03:47,960 y a ese panel por defecto le añadimos los componentes 61 00:03:48,620 --> 00:03:51,939 si añadimos los componentes y más 62 00:03:51,939 --> 00:03:53,860 ¿qué ocurría? que se ponían unos 63 00:03:53,860 --> 00:03:55,919 encima de otros, no íbamos a ver ninguno 64 00:03:55,919 --> 00:03:56,900 nada más que el último 65 00:03:56,900 --> 00:03:59,639 entonces a ese panel hay que darle 66 00:03:59,639 --> 00:04:01,340 un gestor de ubicación 67 00:04:01,340 --> 00:04:04,180 que él use 68 00:04:04,180 --> 00:04:05,659 para decidir 69 00:04:05,659 --> 00:04:07,780 donde van los componentes, gestores de ubicaciones 70 00:04:07,780 --> 00:04:09,680 miles, para hacer gestión de ubicación 71 00:04:09,680 --> 00:04:11,400 hay mil clases, mil rollos, mil historias 72 00:04:11,400 --> 00:04:13,500 que uno no pasa nada, se coge un libro 73 00:04:13,500 --> 00:04:15,599 se lee las 500 primeras páginas 74 00:04:15,599 --> 00:04:17,339 y con esas 500 primeras páginas, pues ya conoce 75 00:04:17,339 --> 00:04:18,379 todos los gestores de ubicación 76 00:04:18,379 --> 00:04:21,920 como nosotros no nos vamos a meter por ese camino 77 00:04:21,920 --> 00:04:23,459 pues por ejemplo 78 00:04:23,459 --> 00:04:25,860 vamos a fijar un gestor 79 00:04:25,860 --> 00:04:27,180 de ubicación que era este 80 00:04:27,180 --> 00:04:29,459 el de tipo flow layout, este 81 00:04:29,459 --> 00:04:32,100 lo instancio y le digo al panel 82 00:04:32,100 --> 00:04:34,240 oye, que este es tu jefe, este es tu gestor 83 00:04:34,240 --> 00:04:36,199 de ubicación y a partir 84 00:04:36,199 --> 00:04:38,459 de ahí ya los componentes 85 00:04:38,459 --> 00:04:40,180 se van colocando como el jefe 86 00:04:40,180 --> 00:04:41,339 flow layout manda 87 00:04:41,339 --> 00:04:43,860 y el jefe flow layout como manda 88 00:04:43,860 --> 00:04:45,959 pues manda uno detrás de otro 89 00:04:45,959 --> 00:04:47,120 ¿vale? 90 00:04:48,139 --> 00:04:50,339 entonces en cuanto a la construcción del aspecto 91 00:04:50,339 --> 00:04:52,120 de la vista, eso es lo más sencillo 92 00:04:52,120 --> 00:04:54,660 ahora la vista se tiene que comportar 93 00:04:54,660 --> 00:04:56,079 cuando yo haga algo 94 00:04:56,079 --> 00:04:57,120 tienen que pasar cosas 95 00:04:57,120 --> 00:04:59,680 entonces hay que decidir 96 00:04:59,680 --> 00:05:01,540 qué tipo de acciones 97 00:05:01,540 --> 00:05:04,120 sobre la interfaz, qué tipo de acciones 98 00:05:04,120 --> 00:05:05,759 me interesan a mí 99 00:05:05,759 --> 00:05:07,680 capturar, qué tipo de acciones 100 00:05:07,680 --> 00:05:09,600 en nuestra aplicación 101 00:05:09,600 --> 00:05:12,620 la única acción que nos 102 00:05:12,620 --> 00:05:16,540 interesaba 103 00:05:16,540 --> 00:05:17,319 capturar 104 00:05:17,319 --> 00:05:22,089 era la de darle al botón 105 00:05:22,089 --> 00:05:24,389 era la única acción que nos interesaba calcular 106 00:05:24,389 --> 00:05:26,430 luego entonces, la arquitectura 107 00:05:26,430 --> 00:05:28,350 ¿cuál era? pues la arquitectura 108 00:05:28,350 --> 00:05:30,509 era, para capturar 109 00:05:30,509 --> 00:05:31,050 un evento 110 00:05:31,050 --> 00:05:34,430 para capturar un evento y darle al botón es un evento 111 00:05:34,430 --> 00:05:36,870 estirar una ventana es un evento 112 00:05:36,870 --> 00:05:40,870 que el ratón navegue es otro evento 113 00:05:40,870 --> 00:05:43,790 pues para capturar un evento 114 00:05:43,790 --> 00:05:45,509 tenemos que hacer una clase 115 00:05:45,509 --> 00:05:49,550 que sea capaz de permanecer a la escucha de ese evento 116 00:05:49,550 --> 00:05:52,389 y dentro de esa clase 117 00:05:52,389 --> 00:05:54,629 metemos el código de respuesta al evento 118 00:05:54,629 --> 00:05:58,670 entonces una clase que sea capaz de permanecer 119 00:05:58,670 --> 00:06:00,569 la escucha de un evento no es una clase 120 00:06:00,569 --> 00:06:02,790 cualquiera, tiene que ser una clase 121 00:06:02,790 --> 00:06:03,910 con ese comportamiento 122 00:06:03,910 --> 00:06:06,730 comportamiento, ser capaz de escuchar 123 00:06:06,730 --> 00:06:08,449 a ver si pasa esto 124 00:06:08,449 --> 00:06:10,649 ser capaz de estar atento, eso no es una 125 00:06:10,649 --> 00:06:12,589 clase cualquiera que se pueda programar 126 00:06:12,589 --> 00:06:14,769 así como así, porque implica programar 127 00:06:14,769 --> 00:06:16,449 muchas cosas raras, implica programar 128 00:06:16,449 --> 00:06:18,709 estar yo pendiente del ratón, ¿de cómo programamos eso? 129 00:06:19,350 --> 00:06:20,529 no sabemos programar eso 130 00:06:20,529 --> 00:06:22,250 pero afortunadamente hay una 131 00:06:22,250 --> 00:06:25,129 interfaz ya hecha que es Action Listener 132 00:06:25,129 --> 00:06:26,589 que tiene todo eso hecho 133 00:06:26,589 --> 00:06:30,990 estupendo, me hago yo una clase que implemente esa interfaz 134 00:06:30,990 --> 00:06:39,100 ¿vale? que es lo que hicimos aquí 135 00:06:39,100 --> 00:06:42,120 me hago yo una clase que implemente esa interfaz 136 00:06:42,120 --> 00:06:46,800 magnífico, ya tengo una clase que es capaz de estar pendiente 137 00:06:46,800 --> 00:06:50,620 de escuchar los eventos que ocurran sobre la interfaz 138 00:06:50,620 --> 00:06:54,279 bueno, y ahora ya, dentro de esa clase 139 00:06:54,279 --> 00:06:58,000 la parte de programar, ser capaz de estar pendiente, no tengo que hacerla 140 00:06:58,000 --> 00:07:01,100 esa ya la coge de lo que esté por defecto 141 00:07:01,100 --> 00:07:02,759 hecho en Action Listener, ya lo coge de ahí 142 00:07:02,759 --> 00:07:04,740 yo solo tengo que añadir 143 00:07:04,740 --> 00:07:06,540 el que, solo tenemos que añadir 144 00:07:06,540 --> 00:07:08,259 el código de respuesta 145 00:07:08,259 --> 00:07:09,399 a el evento 146 00:07:09,399 --> 00:07:12,439 escuchar el evento ya lo hace ella sola 147 00:07:12,439 --> 00:07:15,060 por ser Action Listener, ya lo hace sola, estará ahí pendiente 148 00:07:15,060 --> 00:07:16,759 solo tenemos que ponerle 149 00:07:16,759 --> 00:07:18,420 y cómo vas a responder 150 00:07:18,420 --> 00:07:20,639 cuando ese evento ocurra, cómo vas a responder 151 00:07:20,639 --> 00:07:22,939 porque cada aplicación 152 00:07:22,939 --> 00:07:24,079 querrá responder de su manera 153 00:07:24,079 --> 00:07:27,120 bueno, pues ese cómo vas a responder 154 00:07:27,120 --> 00:07:31,160 esa respuesta lo metíamos en este método que había que sobreescribir obligatoriamente 155 00:07:31,160 --> 00:07:34,860 este método. Entonces en nuestro caso nuestra respuesta era 156 00:07:34,860 --> 00:07:38,879 coger el año que habíamos metido, si es bisiesto 157 00:07:38,879 --> 00:07:42,959 poner el texto en la etiqueta y si no lo es poner este otro texto 158 00:07:42,959 --> 00:07:47,040 en la etiqueta. Entonces para hacer el código de 159 00:07:47,040 --> 00:07:50,060 respuesta necesitábamos el text fill 160 00:07:50,060 --> 00:07:59,160 de la ventana, esta, este de aquí y también 161 00:07:59,160 --> 00:08:00,220 necesitábamos 162 00:08:00,220 --> 00:08:02,639 la etiqueta 163 00:08:02,639 --> 00:08:04,600 esto de aquí 164 00:08:04,600 --> 00:08:09,100 esta, como eran variables 165 00:08:09,100 --> 00:08:10,800 locales al main teníamos un problema 166 00:08:10,800 --> 00:08:13,160 pero nosotros 167 00:08:13,160 --> 00:08:15,040 sabemos resolver eso pasando 168 00:08:15,040 --> 00:08:17,040 por parámetro lo que un método necesite 169 00:08:17,040 --> 00:08:18,300 ¿vale? 170 00:08:18,839 --> 00:08:21,000 entonces esta clase necesita 171 00:08:21,000 --> 00:08:23,160 estas propiedades ¿vale? se las paso 172 00:08:23,160 --> 00:08:24,680 al constructor por parámetro 173 00:08:24,680 --> 00:08:26,740 se las paso por parámetro 174 00:08:26,740 --> 00:08:28,339 aquí las tengo pasadas por parámetro 175 00:08:28,339 --> 00:08:30,959 las uso para inicializar 176 00:08:30,959 --> 00:08:32,139 variables de esta clase 177 00:08:32,139 --> 00:08:34,620 ahora ya las que pase por parámetros 178 00:08:34,620 --> 00:08:36,179 son estas, las mismas 179 00:08:36,179 --> 00:08:38,159 porque las he inicializado 180 00:08:38,159 --> 00:08:40,340 y ya está, y ya las tengo 181 00:08:40,340 --> 00:08:42,679 y ya puedo trabajar con ellas, etc. 182 00:08:44,340 --> 00:08:44,600 ¿vale? 183 00:08:47,240 --> 00:08:48,419 bueno, pues esto es lo que se supone 184 00:08:48,419 --> 00:08:50,240 que tenía que estar claro a día de hoy 185 00:08:50,240 --> 00:08:51,320 y cualquier 186 00:08:51,320 --> 00:08:54,740 y la que os dije de hacer la suma 187 00:08:54,740 --> 00:08:55,899 la resta era hacer esto mismo 188 00:08:55,899 --> 00:08:57,460 pero cambiando el código de respuesta 189 00:08:57,460 --> 00:08:59,320 nada más, y cambiando la vista 190 00:08:59,320 --> 00:09:01,840 bueno, pues 191 00:09:01,840 --> 00:09:04,259 el que no lo haya hecho que lo haga 192 00:09:04,259 --> 00:09:05,440 porque es repetir esto de aquí 193 00:09:05,440 --> 00:09:09,350 vale, pues a ver 194 00:09:09,350 --> 00:09:12,610 seguimos avanzando un poco 195 00:09:12,610 --> 00:09:23,450 bueno, pues en este caso 196 00:09:23,450 --> 00:09:26,889 el código de respuesta 197 00:09:26,889 --> 00:09:28,690 para mi 198 00:09:28,690 --> 00:09:30,190 ah bueno, y se me ha olvidado decir 199 00:09:30,190 --> 00:09:32,309 que esta clase, ActionListener 200 00:09:32,309 --> 00:09:34,769 que es una clase que es capaz de escuchar 201 00:09:34,769 --> 00:09:37,009 y además ofrece un código de respuesta 202 00:09:37,009 --> 00:09:38,309 esta clase 203 00:09:38,309 --> 00:09:40,450 el objeto 204 00:09:40,450 --> 00:09:42,450 que instanciemos hay que decirle a qué componente 205 00:09:42,450 --> 00:09:44,269 tiene que escuchar, claro, porque 206 00:09:44,269 --> 00:09:46,129 si no, ¿qué evento 207 00:09:46,129 --> 00:09:48,230 escuchamos? ¿El que haces en el ratón? ¿El que haces 208 00:09:48,230 --> 00:09:50,450 en la área de texto? ¿Cuál? ¿A cuál escuchas? 209 00:09:50,509 --> 00:09:51,629 Hay que decirle, oye tú, 210 00:09:52,370 --> 00:09:53,610 objeto de esta clase 211 00:09:53,610 --> 00:09:56,110 de quien tienes que estar pendiente es de este. 212 00:09:56,970 --> 00:09:57,190 ¿Vale? 213 00:09:58,169 --> 00:10:00,330 Luego los objetos que se instancian de estas 214 00:10:00,330 --> 00:10:02,590 clases, esos objetos 215 00:10:02,590 --> 00:10:04,429 van a estar pendientes 216 00:10:04,429 --> 00:10:06,549 de los componentes que nosotros le digamos. 217 00:10:06,549 --> 00:10:09,149 pero hay que decirles de qué 218 00:10:09,149 --> 00:10:11,710 componentes tiene que estar pendiente 219 00:10:11,710 --> 00:10:13,710 si no decimos de qué 220 00:10:13,710 --> 00:10:15,769 componentes tiene que estar pendiente, no va a estar pendiente de nadie 221 00:10:15,769 --> 00:10:17,509 eso como lo hacíamos 222 00:10:17,509 --> 00:10:19,070 pues decíamos, oye tú, botón 223 00:10:19,070 --> 00:10:21,190 botón 224 00:10:21,190 --> 00:10:23,629 como el componente, como esa clase 225 00:10:23,629 --> 00:10:25,669 escuchadora, esa clase capturadora 226 00:10:25,669 --> 00:10:27,830 tiene que estar pendiente del botón 227 00:10:27,830 --> 00:10:29,570 porque el evento 228 00:10:29,570 --> 00:10:31,570 que nos interesa es este 229 00:10:31,570 --> 00:10:32,169 del botón 230 00:10:32,169 --> 00:10:34,049 ¿vale? 231 00:10:34,049 --> 00:10:38,779 Como el objeto de la clase capturadora 232 00:10:38,779 --> 00:10:40,039 Tiene que estar pendiente de este 233 00:10:40,039 --> 00:10:44,710 Pues hay que decirle 234 00:10:44,710 --> 00:10:46,049 Oye tú, botón 235 00:10:46,049 --> 00:10:49,250 Va a estar pendiente de ti 236 00:10:49,250 --> 00:10:50,850 Y eso se le decía mediante el método 237 00:10:50,850 --> 00:10:52,169 AddActionListener 238 00:10:52,169 --> 00:10:53,429 Va a estar pendiente de ti 239 00:10:53,429 --> 00:10:55,230 Un objeto de esta clase 240 00:10:55,230 --> 00:10:56,330 ¿Vale? 241 00:10:56,350 --> 00:10:57,509 Que instanciábamos aquí 242 00:10:57,509 --> 00:10:59,429 Pasándole los datos que necesitábamos, etc. 243 00:11:00,830 --> 00:11:02,049 Si esto no lo hacemos 244 00:11:02,049 --> 00:11:03,029 Porque se nos olvida 245 00:11:03,029 --> 00:11:06,950 Pues entonces ya podemos tener clase 246 00:11:06,950 --> 00:11:07,929 Escuchadora 247 00:11:07,929 --> 00:11:09,570 Podemos tener lo que nos dé la gana 248 00:11:09,570 --> 00:11:14,429 Ahí he cerrado la esta 249 00:11:14,429 --> 00:11:15,190 Pero no he 250 00:11:15,190 --> 00:11:21,450 Ahí está la consola 251 00:11:21,450 --> 00:11:22,929 Aquí 252 00:11:22,929 --> 00:11:26,450 Ahí, vale 253 00:11:26,450 --> 00:11:31,379 Vale, si a mí se me olvida esto 254 00:11:31,379 --> 00:11:32,639 Ejecuto 255 00:11:32,639 --> 00:11:34,279 Y ahora ya puedo darle al botón 256 00:11:34,279 --> 00:11:35,320 Todo lo que me dé la gana 257 00:11:35,320 --> 00:11:36,840 Que esto no hace nada 258 00:11:36,840 --> 00:11:40,500 ¿Por qué? Porque el botón no tiene asociado 259 00:11:40,500 --> 00:11:42,460 un objeto de la clase 260 00:11:42,460 --> 00:11:44,600 capturadora, no va a hacer nada 261 00:11:44,600 --> 00:11:45,559 pero no lo tiene asociado 262 00:11:45,559 --> 00:11:53,000 entonces tendríamos que 263 00:11:53,000 --> 00:11:55,500 cuando hagamos esto 264 00:11:55,500 --> 00:11:58,000 ahora ya si, este botón tiene asociado 265 00:11:58,000 --> 00:11:59,059 un objeto de esa clase 266 00:11:59,059 --> 00:12:01,600 luego ahora ya si, cuando yo 267 00:12:01,600 --> 00:12:05,570 ejecute esto, pues ahora ya si 268 00:12:05,570 --> 00:12:07,210 tendrá respuesta, vale 269 00:12:07,210 --> 00:12:17,419 vale, bueno, alguna duda 270 00:12:17,419 --> 00:12:17,980 no, verdad 271 00:12:17,980 --> 00:12:24,110 bueno, pues todo es práctica 272 00:12:24,110 --> 00:12:26,470 todo es práctica, volver a hacerlo 273 00:12:26,470 --> 00:12:29,149 volver a hacer lo mismo de clase 274 00:12:29,149 --> 00:12:31,370 y luego volver a hacerlo cambiando una cosita 275 00:12:31,370 --> 00:12:33,230 que a mí se me ocurra, pues en lugar de que muestre 276 00:12:33,230 --> 00:12:34,710 si es bisiesto, que muestre no sé qué 277 00:12:34,710 --> 00:12:36,850 pues ahora que me muestre dos cosas 278 00:12:36,850 --> 00:12:38,950 cambiando cositas, esa es la única manera 279 00:12:38,950 --> 00:12:39,629 ¿vale? práctica 280 00:12:39,629 --> 00:12:42,389 vale, pues a ver 281 00:12:42,389 --> 00:12:43,690 seguimos 282 00:12:43,690 --> 00:12:46,110 aquí en este caso 283 00:12:46,110 --> 00:12:49,250 el código de respuesta 284 00:12:49,250 --> 00:12:51,129 al hecho de 285 00:12:51,129 --> 00:12:52,029 pulsar al botón 286 00:12:52,029 --> 00:12:53,789 pues bueno, era cortito 287 00:12:53,789 --> 00:12:56,470 Era tocar solamente 288 00:12:56,470 --> 00:12:59,149 Un text field para sacar el dato 289 00:12:59,149 --> 00:13:01,090 Y tocar una etiqueta 290 00:13:01,090 --> 00:13:03,570 Para poner ahí el resultado 291 00:13:03,570 --> 00:13:05,309 Era un código cortito 292 00:13:05,309 --> 00:13:07,029 Y solo necesitaba dos cosas 293 00:13:07,029 --> 00:13:08,570 De la interfaz, dato y result 294 00:13:08,570 --> 00:13:09,350 Solo necesitaba eso 295 00:13:09,350 --> 00:13:12,490 Entonces el hecho de que no pudiera acceder 296 00:13:12,490 --> 00:13:14,210 A ellas, el hecho de que no pudiera acceder 297 00:13:14,210 --> 00:13:15,570 Lo hemos solucionado 298 00:13:15,570 --> 00:13:18,090 Relativamente fácil diciendo 299 00:13:18,090 --> 00:13:19,509 Bueno, pasaselo al constructor 300 00:13:19,509 --> 00:13:22,629 Vale, pasaselo al constructor 301 00:13:22,629 --> 00:13:25,070 inicializas esto, con esos datos 302 00:13:25,070 --> 00:13:26,809 que has pasado ya puedes trabajar con ellos 303 00:13:26,809 --> 00:13:29,370 pero hombre, es un poco engorroso 304 00:13:29,370 --> 00:13:31,590 es un poco engorroso 305 00:13:31,590 --> 00:13:32,429 porque si 306 00:13:32,429 --> 00:13:35,169 el código de respuesta, el evento 307 00:13:35,169 --> 00:13:37,370 tuviera que tocar un montón 308 00:13:37,370 --> 00:13:39,269 de cosas de la interfaz, un montón 309 00:13:39,269 --> 00:13:40,669 te podría ocurrir un montón 310 00:13:40,669 --> 00:13:43,330 y poner un desplegable nuevo y añadir 311 00:13:43,330 --> 00:13:45,570 un slider, vete a saber, igual el código de respuesta 312 00:13:45,570 --> 00:13:47,070 de un botón es hacer un montón de cosas 313 00:13:47,070 --> 00:13:49,470 y tiene que tocar un montón de 314 00:13:49,470 --> 00:13:51,190 componentes de 315 00:13:51,190 --> 00:13:52,529 la clase frame 316 00:13:52,529 --> 00:13:55,149 pues esta solución es un rollo, porque tenemos que hacer 317 00:13:55,149 --> 00:13:57,330 un constructor al que le pasemos ahí un montón 318 00:13:57,330 --> 00:13:59,429 de cosas, no es la solución 319 00:13:59,429 --> 00:14:01,009 habitual, que normalmente uno 320 00:14:01,009 --> 00:14:03,070 uno utiliza 321 00:14:03,070 --> 00:14:04,909 o uno ve, no es la solución habitual 322 00:14:04,909 --> 00:14:05,990 ¿vale? 323 00:14:07,629 --> 00:14:09,269 entonces, ¿cuál es 324 00:14:09,269 --> 00:14:11,090 la estructura más cómoda? 325 00:14:11,649 --> 00:14:13,250 para que desde aquí 326 00:14:13,250 --> 00:14:15,549 desde esta clase capturadora 327 00:14:15,549 --> 00:14:17,210 podamos acceder 328 00:14:17,210 --> 00:14:18,850 a todo lo que hay en el frame 329 00:14:18,850 --> 00:14:21,909 ¿Qué será nuestro problema, verdad? 330 00:14:22,690 --> 00:14:25,149 Desde aquí acceder a todo lo que hay en el frame 331 00:14:25,149 --> 00:14:27,789 ¿Cuál es la forma más sencilla? 332 00:14:28,750 --> 00:14:30,769 Bueno, pues la forma más sencilla es 333 00:14:30,769 --> 00:14:35,690 incorporando una nueva estructura de clases 334 00:14:35,690 --> 00:14:39,429 que se usa bastante por las ventajas que ahora podemos ver 335 00:14:39,429 --> 00:14:42,009 que es la estructura de clases internas 336 00:14:42,009 --> 00:14:43,049 ¿Vale? 337 00:14:44,070 --> 00:14:46,269 Clases internas, lo hemos imaginado hasta ahora, ¿verdad? 338 00:14:46,269 --> 00:14:49,350 es una de las cosas que dice 339 00:14:49,350 --> 00:14:51,470 cuando yo os digo una clase puede tener dentro 340 00:14:51,470 --> 00:14:53,429 propiedades y métodos 341 00:14:53,429 --> 00:14:55,629 y luego siempre a veces decía, bueno os miento un pelín 342 00:14:55,629 --> 00:14:57,049 pero os tengo que mentir porque bueno 343 00:14:57,049 --> 00:14:59,850 aparte de propiedades y métodos puede tener otra clase 344 00:14:59,850 --> 00:15:01,429 ¿vale? 345 00:15:02,250 --> 00:15:03,629 y entonces el hecho de que 346 00:15:03,629 --> 00:15:05,490 una clase pueda tener otra 347 00:15:05,490 --> 00:15:07,389 dentro y ahora veremos lo que significa eso 348 00:15:07,389 --> 00:15:09,370 nos facilita el diseño un montón 349 00:15:09,370 --> 00:15:11,250 en un montón de situaciones 350 00:15:11,250 --> 00:15:13,350 en una de ellas cuando 351 00:15:13,350 --> 00:15:15,330 trabajamos con interfaces gráficas, es básico 352 00:15:15,330 --> 00:15:18,309 Es básico, ¿vale? El poder hacer una clase dentro de otra 353 00:15:18,309 --> 00:15:19,970 Vamos a 354 00:15:19,970 --> 00:15:25,350 A entender un poco eso de las clases internas 355 00:15:25,350 --> 00:15:26,669 Porque se usa muchísimo 356 00:15:26,669 --> 00:15:28,850 En un montón de contextos 357 00:15:28,850 --> 00:15:30,269 No solo en interfaces gráficas 358 00:15:30,269 --> 00:15:34,250 Vamos a intentar entenderlo 359 00:15:34,250 --> 00:15:37,919 Vale 360 00:15:37,919 --> 00:15:39,360 A ver 361 00:15:39,360 --> 00:15:44,830 Esto si alguien lo ve ya se habrá dado cuenta 362 00:15:44,830 --> 00:15:45,990 De que se ve en espejo 363 00:15:45,990 --> 00:15:48,950 Pero es que no sé cambiarlo 364 00:15:48,950 --> 00:15:50,009 Y da igual, tampoco 365 00:15:50,009 --> 00:15:51,429 Se entiende de igual 366 00:15:51,429 --> 00:15:53,309 Quien quiera entenderlo va a entender igual 367 00:15:53,309 --> 00:16:07,450 A ver 368 00:16:07,450 --> 00:16:11,029 Pues venga, clases 369 00:16:11,029 --> 00:16:12,730 Vamos a ver un poquito 370 00:16:12,730 --> 00:16:14,289 Sin volvernos locos tampoco 371 00:16:14,289 --> 00:16:41,889 Vale, pues a ver 372 00:16:41,889 --> 00:16:43,370 Nosotros cuando hemos hecho una clase 373 00:16:43,370 --> 00:16:44,210 Hasta ahora 374 00:16:44,210 --> 00:16:47,970 Porque hemos tenido que definir una clase 375 00:16:47,970 --> 00:16:50,690 Silencio 376 00:16:50,690 --> 00:16:53,870 Una clase cliente, una clase factura 377 00:16:53,870 --> 00:16:55,710 Una clase producto, porque nuestra aplicación 378 00:16:55,710 --> 00:16:56,690 Trabajaba con eso 379 00:16:56,690 --> 00:16:59,830 ¿Vale? Pues 380 00:16:59,830 --> 00:17:04,579 Imaginaos la clase A 381 00:17:04,579 --> 00:17:07,829 ¿Vale? Nuestra clase 382 00:17:07,829 --> 00:17:09,829 ¿Qué tenía? Tenía siempre 383 00:17:09,829 --> 00:17:11,970 Propiedades que son 384 00:17:11,970 --> 00:17:14,329 Las que van a caracterizar 385 00:17:14,329 --> 00:17:15,730 Los objetos de esa clase 386 00:17:15,730 --> 00:17:18,049 ¿No? La clase factura 387 00:17:18,049 --> 00:17:19,789 Pues puede tener, ¿Qué caracteriza una factura? 388 00:17:20,269 --> 00:17:21,930 Su número, su concepto 389 00:17:21,930 --> 00:17:23,710 ¿Qué caracteriza a un cliente? 390 00:17:23,990 --> 00:17:26,069 Su NIF, su nombre, bueno las propiedades 391 00:17:26,069 --> 00:17:26,890 Lo de toda la vida, ¿no? 392 00:17:28,450 --> 00:17:28,670 ¿Sí? 393 00:17:30,470 --> 00:17:37,420 lo que fuera, además una clase que tenía los métodos 394 00:17:37,420 --> 00:17:41,339 que es los objetos de esa clase a qué código pueden invocar 395 00:17:41,339 --> 00:17:45,660 normalmente ese código para hacer cosas con los datos de ese objeto 396 00:17:45,660 --> 00:17:49,559 con parámetros que ese objeto recibe y hacer ahí funcionalidades 397 00:17:49,559 --> 00:17:53,420 pues una factura puede llamar a métodos para hacer funcionalidades 398 00:17:53,420 --> 00:17:56,799 relacionadas con calcular el importe con IVA, lo que sea 399 00:17:56,799 --> 00:18:00,900 ¿vale? entonces dentro de esos métodos el constructor, claro, etc. 400 00:18:00,900 --> 00:18:05,069 eso era la otra cosa que tenía una clase 401 00:18:05,069 --> 00:18:07,410 los métodos, es decir 402 00:18:07,410 --> 00:18:09,930 ¿qué funciona? ya el código de la aplicación 403 00:18:09,930 --> 00:18:11,730 ¿qué quiero yo 404 00:18:11,730 --> 00:18:12,829 que haga esa aplicación? 405 00:18:12,970 --> 00:18:15,410 esa aplicación lo que va a hacer lo metemos en métodos 406 00:18:15,410 --> 00:18:16,390 que son los que hacen las cosas 407 00:18:16,390 --> 00:18:19,650 pues obtener el resultado de no sé qué 408 00:18:19,650 --> 00:18:21,829 calcular la edad 409 00:18:21,829 --> 00:18:23,589 del cliente, lo que fuera, lo que yo quiero 410 00:18:23,589 --> 00:18:25,650 que haga la aplicación va a ir en los métodos 411 00:18:25,650 --> 00:18:27,829 correspondientes que trabajan con las propiedades 412 00:18:27,829 --> 00:18:28,549 de la clase 413 00:18:28,549 --> 00:18:31,509 para que cada objeto pueda 414 00:18:31,509 --> 00:18:33,809 llamar al método, trabajando con sus propias propiedades 415 00:18:33,809 --> 00:18:35,589 etcétera, lo de siempre, vale 416 00:18:35,589 --> 00:18:37,910 bueno, pues una clase 417 00:18:37,910 --> 00:18:39,089 además de todo esto 418 00:18:39,089 --> 00:18:41,609 propiedades y métodos puede tener también 419 00:18:41,609 --> 00:18:45,130 dentro, lo pongo ahí para que no me 420 00:18:45,130 --> 00:18:47,029 cabe, una o más clases dentro 421 00:18:47,029 --> 00:18:48,690 de ella, una o más clases 422 00:18:48,690 --> 00:18:51,210 directamente tal cual, imaginaos que esta 423 00:18:51,210 --> 00:18:53,309 tiene además dentro 424 00:18:53,309 --> 00:18:54,650 otra clase 425 00:18:54,650 --> 00:19:00,650 de nuevo con sus propiedades 426 00:19:00,650 --> 00:19:02,170 y sus métodos, me da lo mismo 427 00:19:02,170 --> 00:19:16,119 vale, pues a ver que implicaciones 428 00:19:16,119 --> 00:19:18,400 tiene que una clase esté dentro de otra. 429 00:19:20,180 --> 00:19:22,140 A ver, tenemos que verlo de alguna manera 430 00:19:22,140 --> 00:19:25,220 como de esta clase se instanciarán objetos 431 00:19:25,220 --> 00:19:27,680 y de esta otra se instanciarán otros 432 00:19:27,680 --> 00:19:30,900 que son distintos, ¿vale? 433 00:19:31,839 --> 00:19:35,839 No es que el hecho de que esta clase esté dentro 434 00:19:35,839 --> 00:19:40,160 signifique que cuando yo hago un objeto de esta clase 435 00:19:40,160 --> 00:19:42,759 va a tener dentro un objeto de esta otra, no. 436 00:19:43,660 --> 00:19:46,359 Para que esta clase, cuando yo instancie un objeto de esta 437 00:19:46,359 --> 00:19:48,200 tenga dentro un objeto de esta otra 438 00:19:48,200 --> 00:19:50,359 pues tendría que hacer una propiedad así 439 00:19:50,359 --> 00:19:52,400 ¿no? 440 00:19:53,500 --> 00:19:54,759 entonces si yo le hago una propiedad 441 00:19:54,759 --> 00:19:56,660 así, esta clase 442 00:19:56,660 --> 00:19:58,700 tiene dentro cuando yo la instancie 443 00:19:58,700 --> 00:20:00,579 además de un entero A y un entero B 444 00:20:00,579 --> 00:20:02,220 tiene dentro un objeto de esta otra 445 00:20:02,220 --> 00:20:04,599 entonces cuando yo quiero que una clase 446 00:20:04,599 --> 00:20:06,819 un objeto de una clase tenga dentro 447 00:20:06,819 --> 00:20:07,839 un objeto de otra 448 00:20:07,839 --> 00:20:10,619 esto no es un rollo de clases internas 449 00:20:10,619 --> 00:20:11,900 yo lo he hecho siempre así 450 00:20:11,900 --> 00:20:13,859 declaramos una propiedad 451 00:20:13,859 --> 00:20:16,279 cuyo tipo sea esa otra clase y ya está 452 00:20:16,279 --> 00:20:18,299 Y esa es la relación de composición de toda la vida. 453 00:20:19,019 --> 00:20:25,160 Un cliente puede tener dentro un objeto pedido, por ejemplo. 454 00:20:26,220 --> 00:20:28,380 Pues el cliente tiene su objeto pedido dentro. 455 00:20:28,559 --> 00:20:33,359 Y cuando instancie un cliente, ese cliente tendrá dentro un objeto pedido 456 00:20:33,359 --> 00:20:35,839 que también habrá que instanciar, lo que hemos trabajado siempre. 457 00:20:36,960 --> 00:20:38,940 Bueno, pues lo de las clases internas no es eso. 458 00:20:39,839 --> 00:20:43,799 No es que un objeto de la clase A tenga obligatoriamente un objeto de la clase B. 459 00:20:43,799 --> 00:20:45,519 No, estos se instancian por separado. 460 00:20:46,279 --> 00:21:05,220 El que sea una clase interna, la implicación que tiene es conceptual, en realidad, es conceptual y es, oye, yo puedo instanciar objetos de A cuando me den la gana y no necesito saber nada de la clase interna B, nada, puedo instanciar objetos de A cuando yo quiera, ¿vale? 461 00:21:05,220 --> 00:21:11,579 Por ejemplo, puedo instanciar un objeto de la clase A como lo instancio de toda la vida. 462 00:21:17,940 --> 00:21:18,339 Y ya está. 463 00:21:18,460 --> 00:21:23,539 Y este objeto, a este objeto B no le interesa nada. 464 00:21:23,900 --> 00:21:26,380 No le interesa para nada a este objeto. 465 00:21:26,380 --> 00:21:31,680 Ni es consciente de su existencia, ni tiene ningún objeto B dentro, nada. 466 00:21:32,400 --> 00:21:36,319 Vale, pero ¿ahora qué pasa con B cuando yo quiero instanciar objetos de la clase B? 467 00:21:37,200 --> 00:21:38,799 Bueno, pues esto es un tema conceptual. 468 00:21:38,799 --> 00:21:42,200 estos objetos se supone que son objetos 469 00:21:42,200 --> 00:21:43,859 que por diseño de la aplicación 470 00:21:43,859 --> 00:21:45,960 solo tiene sentido que existan 471 00:21:45,960 --> 00:21:48,519 si existe un objeto de la clase A 472 00:21:48,519 --> 00:21:50,200 previo, si existe un objeto 473 00:21:50,200 --> 00:21:52,319 ¿vale? por ejemplo 474 00:21:52,319 --> 00:21:54,380 imaginaos que hay una aplicación en la que 475 00:21:54,380 --> 00:21:55,140 hay 476 00:21:55,140 --> 00:22:04,200 pues clientes 477 00:22:04,200 --> 00:22:06,339 ¿vale? y hay pedidos 478 00:22:06,339 --> 00:22:08,000 y yo quiero 479 00:22:08,000 --> 00:22:10,519 y solo tiene sentido que exista un pedido 480 00:22:10,519 --> 00:22:12,519 si existe un cliente 481 00:22:12,519 --> 00:22:14,700 Solo tiene sentido que está un pedido si existe un cliente. 482 00:22:15,119 --> 00:22:19,119 Entonces, yo podré instanciar un pedido si existe un cliente previamente, 483 00:22:19,319 --> 00:22:22,079 pero eso no significa que mi cliente tenga dentro ese pedido. 484 00:22:22,700 --> 00:22:23,480 No lo tiene dentro. 485 00:22:24,200 --> 00:22:25,559 Es otra forma de relacionarse. 486 00:22:26,839 --> 00:22:29,200 Yo puedo instanciar mi cliente, no tiene ningún pedido dentro. 487 00:22:29,799 --> 00:22:32,359 Y luego, para instanciar la clase pedido que está dentro, 488 00:22:32,359 --> 00:22:37,039 para instanciarla, la tengo que instanciar si existe un cliente previamente. 489 00:22:38,220 --> 00:22:40,900 Y entonces, la primera implicación que ocurre es 490 00:22:40,900 --> 00:22:42,680 Que esta clase no se llama así. 491 00:22:43,640 --> 00:22:46,380 Esta clase, su nombre, por ser clase interna esta, 492 00:22:47,119 --> 00:22:49,900 su nombre es más complejo, es esta. 493 00:22:50,380 --> 00:22:51,579 Esta clase no se llama así. 494 00:22:55,950 --> 00:22:57,069 Y siguiente implicación. 495 00:22:57,690 --> 00:23:01,109 Que para instanciarlo, hay que instanciarlo asociado 496 00:23:01,109 --> 00:23:03,529 a un objeto de la clase A previo. 497 00:23:03,829 --> 00:23:04,269 Algo así. 498 00:23:05,009 --> 00:23:06,509 Ahora lo hacemos en... 499 00:23:13,470 --> 00:23:14,009 ¿Vale? 500 00:23:17,220 --> 00:23:18,339 Entonces, esta es la idea. 501 00:23:18,579 --> 00:23:21,319 Los objetos de la clase A se instancian y no... 502 00:23:21,319 --> 00:23:26,519 Para ello, si es transparente, los objetos de la clase B, ¿vale? 503 00:23:26,519 --> 00:23:27,519 Es completamente transparente. 504 00:23:27,859 --> 00:23:31,460 No es como cuando tienes una clase cliente con un objeto pedido dentro. 505 00:23:31,980 --> 00:23:33,799 Para instanciar el cliente tienes que instanciar el pedido. 506 00:23:33,940 --> 00:23:34,299 Aquí no. 507 00:23:35,220 --> 00:23:36,319 La clase es interna. 508 00:23:37,039 --> 00:23:42,819 Tú puedes instanciar objetos de esta clase y para ella esta otra clase es que ni existe, ni le interesa, ni le importa. 509 00:23:43,180 --> 00:23:50,140 Pero ahora sí, cuando instancias objetos de esta, por ser interna esta otra, primero el nombre cambia. 510 00:23:50,140 --> 00:23:52,700 El nombre de la clase realmente cambia, se convierte en este. 511 00:23:53,359 --> 00:23:58,920 Y segundo, solo puedes instanciarlos asociados a un objeto que ya exista 512 00:23:58,920 --> 00:24:01,440 de la clase en la cual está contenido. 513 00:24:02,579 --> 00:24:07,279 Entonces, no es que sea una arquitectura que sea imprescindible, 514 00:24:07,359 --> 00:24:11,779 tú puedes hacer clase A y clase B por libre, pero te facilita dos cosas. 515 00:24:12,539 --> 00:24:14,460 La primera es un tema de diseño. 516 00:24:15,000 --> 00:24:19,039 Con esto fuerzas a que solo puedan existir ya por código directamente 517 00:24:19,039 --> 00:24:21,359 objetos de este tipo, si previamente 518 00:24:21,359 --> 00:24:23,220 existen de este, que eso puede tener 519 00:24:23,220 --> 00:24:24,799 un sentido, ahora diseñar la aplicación 520 00:24:24,799 --> 00:24:26,940 porque estás de nuevo protegiendo 521 00:24:26,940 --> 00:24:29,279 que se instancien objetos cuando no hacen falta 522 00:24:29,279 --> 00:24:30,900 o no es necesario, pueden crear problemas 523 00:24:30,900 --> 00:24:32,400 esa es la primera ventaja 524 00:24:32,400 --> 00:24:34,259 que ya pones una restricción 525 00:24:34,259 --> 00:24:37,380 entonces poner restricciones a nivel de código 526 00:24:37,380 --> 00:24:38,880 viene bien 527 00:24:38,880 --> 00:24:41,220 porque te aseguras que luego en tiempo 528 00:24:41,220 --> 00:24:43,140 de ejecución seguramente salgan 529 00:24:43,140 --> 00:24:45,099 menos errores, cuantas más restricciones 530 00:24:45,099 --> 00:24:46,279 pongas a nivel de código 531 00:24:46,279 --> 00:24:48,579 menos errores 532 00:24:48,579 --> 00:24:51,000 incontrolados vas a tener tiempo de ejecución 533 00:24:51,000 --> 00:24:53,079 a cambios más rollos 534 00:24:53,079 --> 00:24:55,460 que el código, porque tienes que satisfacer esas restricciones 535 00:24:55,460 --> 00:24:57,299 es como el diseño de bases de datos 536 00:24:57,299 --> 00:24:59,400 las bases aprobacionales son muy restrictivas 537 00:24:59,400 --> 00:25:01,599 tienes que poner las claves primarias 538 00:25:01,599 --> 00:25:03,200 claves ajenas para ti y para la tarea 539 00:25:03,200 --> 00:25:05,160 pero una vez que has hecho un diseño bueno 540 00:25:05,160 --> 00:25:07,240 cuando ya haces las consultas 541 00:25:07,240 --> 00:25:07,920 en SQL 542 00:25:07,920 --> 00:25:11,200 si satisfaces 543 00:25:11,200 --> 00:25:12,440 esas restricciones 544 00:25:12,440 --> 00:25:15,599 los resultados van a ser consistentes 545 00:25:15,599 --> 00:25:19,960 si hiciéramos diseños de bases de datos abiertos 546 00:25:19,960 --> 00:25:22,099 tú harías las consultas 547 00:25:22,099 --> 00:25:23,019 que te dieran la gana 548 00:25:23,019 --> 00:25:25,480 y luego los resultados podrían ser consistentes o no 549 00:25:25,480 --> 00:25:27,039 porque como has podido hacer cualquier cosa 550 00:25:27,039 --> 00:25:28,759 pues esta es la misma idea 551 00:25:28,759 --> 00:25:30,660 la primera ventaja es esa 552 00:25:30,660 --> 00:25:33,279 que a nivel de escritura de código 553 00:25:33,279 --> 00:25:35,440 de compilación estás poniendo ya una restricción 554 00:25:35,440 --> 00:25:36,839 y eso seguramente 555 00:25:36,839 --> 00:25:39,619 te haga pensar mejor la aplicación 556 00:25:39,619 --> 00:25:41,339 y evitar que luego en tiempo de ejecución 557 00:25:41,339 --> 00:25:43,119 digas, uy que cosa mala me está haciendo esto 558 00:25:43,119 --> 00:25:45,240 esa es la primera, y la segunda 559 00:25:45,240 --> 00:25:46,980 que es la que nos interesa a nosotros 560 00:25:46,980 --> 00:25:49,140 ahora, la segunda 561 00:25:49,140 --> 00:25:51,299 es que desde la clase 562 00:25:51,299 --> 00:25:53,559 interna hay visibilidad 563 00:25:53,559 --> 00:25:55,099 directa tal cual 564 00:25:55,099 --> 00:25:57,279 a las variables de la clase que la 565 00:25:57,279 --> 00:25:59,359 contiene, es decir 566 00:25:59,359 --> 00:26:00,619 desde estos métodos 567 00:26:00,619 --> 00:26:03,420 si a mi me da 568 00:26:03,420 --> 00:26:05,079 la gana desde estos métodos 569 00:26:05,079 --> 00:26:07,500 imagínate que tengo aquí un método cualquiera 570 00:26:07,500 --> 00:26:09,559 desde estos métodos 571 00:26:09,559 --> 00:26:11,500 yo puedo acceder a las variables 572 00:26:11,500 --> 00:26:13,420 de la clase, por supuesto, puedo acceder a estas 573 00:26:13,420 --> 00:26:19,240 variables como siempre pero también puedo acceder a estas propiedades a 574 00:26:19,240 --> 00:26:26,339 éstas es decir desde esta clase interna tengo visibilidad de las propiedades de 575 00:26:26,339 --> 00:26:32,740 la clase externa o lo que es lo mismo desde este objeto 2 puedo modificar las 576 00:26:32,740 --> 00:26:37,319 propiedades de éste esa es la ventaja 577 00:26:37,319 --> 00:26:42,240 este objeto 2 se convierte en dependiente su existencia depende de que 578 00:26:42,240 --> 00:26:42,960 exista este, 579 00:26:44,359 --> 00:26:46,279 su existencia depende de que exista este, 580 00:26:46,359 --> 00:26:48,480 no puede ser independiente, no puedo crearle por libre, 581 00:26:48,960 --> 00:26:50,319 no puedo hacer un new v sin que 582 00:26:50,319 --> 00:26:51,380 exista este, no puedo, 583 00:26:52,140 --> 00:26:54,299 su existencia depende de que 584 00:26:54,299 --> 00:26:56,599 exista este, y a cambio 585 00:26:56,599 --> 00:26:58,279 a través de él y de sus 586 00:26:58,279 --> 00:27:00,680 métodos podemos modificar propiedades 587 00:27:00,680 --> 00:27:01,759 de aquel del que depende. 588 00:27:02,759 --> 00:27:04,400 ¿Vale? No es una herramienta más 589 00:27:04,400 --> 00:27:06,279 para diseñar aplicaciones, que nos puede 590 00:27:06,279 --> 00:27:08,640 venir muy bien y puede encajar perfectamente 591 00:27:08,640 --> 00:27:09,480 en lo que queremos hacer. 592 00:27:09,480 --> 00:27:12,559 y si encaja perfectamente lo que queremos hacer 593 00:27:12,559 --> 00:27:14,180 aparte de que el programa 594 00:27:14,180 --> 00:27:16,180 se va a entender mejor, seguramente nos 595 00:27:16,180 --> 00:27:18,099 vayan a salir luego en ejecución menos cosas 596 00:27:18,099 --> 00:27:19,500 raras que no sabemos por qué salen 597 00:27:19,500 --> 00:27:22,359 porque el diseño se ha adaptado de partida 598 00:27:22,359 --> 00:27:23,000 a lo que queremos 599 00:27:23,000 --> 00:27:26,259 bueno, pues esto es un poquito por encima 600 00:27:26,259 --> 00:27:28,380 el concepto de clase interna, que es útil 601 00:27:28,380 --> 00:27:30,500 efectivamente para diseños 602 00:27:30,500 --> 00:27:31,799 en los cuales esto nos interesa 603 00:27:31,799 --> 00:27:34,259 pues justo a nosotros nos 604 00:27:34,259 --> 00:27:36,339 interesa esto, porque teníamos dos 605 00:27:36,339 --> 00:27:36,740 clases 606 00:27:36,740 --> 00:27:40,160 esta tenéis que verla como la frame 607 00:27:40,160 --> 00:27:44,210 y esta como la capturadora 608 00:27:44,210 --> 00:27:45,150 en la acción listener 609 00:27:45,150 --> 00:27:47,670 ¿qué problema teníamos? que desde esta 610 00:27:47,670 --> 00:27:50,190 queríamos poder acceder a las propiedades de esta 611 00:27:50,190 --> 00:27:54,250 y no podíamos, teníamos que pasárselo por parámetro 612 00:27:54,250 --> 00:27:55,970 al constructor, lo cual es un rollo 613 00:27:55,970 --> 00:27:57,349 sobre todo si tengo que pasar mucho 614 00:27:57,349 --> 00:28:00,250 anda, pues meto esta dentro de la otra 615 00:28:00,250 --> 00:28:01,869 y ya he solucionado mi problema 616 00:28:01,869 --> 00:28:03,769 que es acceder 617 00:28:03,769 --> 00:28:07,549 desde la capturadora, que es esta 618 00:28:07,549 --> 00:28:10,750 desde el Action Listener a todas las del frame que son estas. 619 00:28:11,309 --> 00:28:12,710 He solucionado de golpe ese problema. 620 00:28:13,690 --> 00:28:16,730 La siguiente pregunta sería, hombre, ¿pero tiene sentido 621 00:28:16,730 --> 00:28:20,809 que esta realmente depende de su existencia de la otra 622 00:28:20,809 --> 00:28:21,670 o es independiente? 623 00:28:21,750 --> 00:28:22,589 Hombre, claro que depende. 624 00:28:23,109 --> 00:28:25,789 ¿Qué sentido tiene que haya una capturadora de componentes 625 00:28:25,789 --> 00:28:27,470 de un frame si el frame no existe? 626 00:28:28,230 --> 00:28:29,130 No tiene ningún sentido. 627 00:28:29,730 --> 00:28:31,089 Luego se adapta perfectamente. 628 00:28:31,670 --> 00:28:34,730 La existencia de esta está condicionada, 629 00:28:34,869 --> 00:28:36,289 solo me interesa a mí si hay un frame. 630 00:28:36,289 --> 00:28:38,170 Si no hay un frame, ¿a quién quiero yo escuchar? 631 00:28:38,269 --> 00:28:39,450 No quiero yo escuchar a nadie 632 00:28:39,450 --> 00:28:42,190 Luego se adapta a la perfección 633 00:28:42,190 --> 00:28:43,930 Lo de las clases internas 634 00:28:43,930 --> 00:28:46,569 Porque la capturadora 635 00:28:46,569 --> 00:28:47,890 Su existencia 636 00:28:47,890 --> 00:28:50,390 Solo tiene sentido si existe un frame 637 00:28:50,390 --> 00:28:52,529 Y al meterla adentro 638 00:28:52,529 --> 00:28:53,769 Tengo acceso automático 639 00:28:53,769 --> 00:28:56,210 A todas las propiedades 640 00:28:56,210 --> 00:28:59,059 ¿Vale? 641 00:29:00,539 --> 00:29:01,220 Pues 642 00:29:01,220 --> 00:29:03,559 ¿Cómo sería entonces? 643 00:29:03,559 --> 00:29:51,589 Vale, pues para no 644 00:29:51,589 --> 00:29:53,609 Romper esta 645 00:29:53,609 --> 00:29:57,410 Me voy a hacer otro paquete 646 00:29:57,410 --> 00:29:58,289 Vista 2 647 00:29:58,289 --> 00:29:59,410 Y en ese otro paquete 648 00:29:59,410 --> 00:29:59,890 Vista 2 649 00:29:59,890 --> 00:30:00,710 Pongo este frame 650 00:30:00,710 --> 00:30:01,829 Pero con la captura dentro 651 00:30:01,829 --> 00:30:02,369 Etcétera 652 00:30:02,369 --> 00:30:15,480 Vale, pues voy a copiar 653 00:30:15,480 --> 00:30:16,680 La ventana visiesto 654 00:30:16,680 --> 00:30:17,279 Que tenía 655 00:30:17,279 --> 00:30:19,400 La voy a copiar 656 00:30:19,400 --> 00:30:19,960 Esa misma 657 00:30:19,960 --> 00:30:20,839 En vista 2 658 00:30:20,839 --> 00:30:30,930 Vale, pues esta es 659 00:30:30,930 --> 00:30:31,670 Le voy a quitar 660 00:30:31,670 --> 00:30:32,890 Todo esto verde 661 00:30:32,890 --> 00:30:33,849 Que está en la otra 662 00:30:33,849 --> 00:30:35,089 Ya escrito 663 00:30:35,089 --> 00:30:40,869 ¿Vale? Para que se vea mejor 664 00:30:40,869 --> 00:30:41,930 Entonces en el constructor 665 00:30:41,930 --> 00:30:44,309 Pongo el gestor de ubicación 666 00:30:44,309 --> 00:30:46,650 Todos estos comentarios están en la otra 667 00:30:46,650 --> 00:30:48,609 Así que da igual, asocio el gestor al panel 668 00:30:48,609 --> 00:30:51,230 Añado los componentes al panel 669 00:30:51,230 --> 00:30:56,130 Uy 670 00:30:56,130 --> 00:31:00,559 ¿Vale? 671 00:31:03,779 --> 00:31:05,720 Y ahora esto 672 00:31:05,720 --> 00:31:08,019 Lo vamos a quitar 673 00:31:08,019 --> 00:31:11,740 ¿Vale? 674 00:31:13,220 --> 00:31:14,980 Entonces he añadido los componentes 675 00:31:14,980 --> 00:31:16,660 Pero mi 676 00:31:16,660 --> 00:31:18,859 Botón todavía no tiene añadida 677 00:31:18,859 --> 00:31:21,440 Ninguna clase, ningún objeto de ninguna clase capturadora 678 00:31:21,440 --> 00:31:23,700 Vale, ¿por dónde vamos a poner esa clase? 679 00:31:24,759 --> 00:31:25,160 ¿Vale? 680 00:31:25,839 --> 00:31:27,839 Vamos a ponerla aquí dentro 681 00:31:27,839 --> 00:31:31,029 ¿Vale? Vamos a ponerla aquí dentro 682 00:31:31,029 --> 00:31:32,750 Esa clase, entonces voy a copiar y pegar 683 00:31:32,750 --> 00:31:38,569 Toda esta clase enterita 684 00:31:38,569 --> 00:31:41,900 Aquí 685 00:31:41,900 --> 00:31:44,240 La clase 686 00:31:44,240 --> 00:31:54,019 La voy a copiar 687 00:31:54,019 --> 00:31:55,660 Aquí dentro, ¿vale? 688 00:31:55,720 --> 00:31:57,559 Entonces como veis no me da ningún problema 689 00:31:57,559 --> 00:32:00,140 Es una clase interna, me ha dejado ponerla dentro 690 00:32:00,140 --> 00:32:01,279 Sin errores y sin nada 691 00:32:01,279 --> 00:32:04,119 ¿Vale? Entonces voy a quitarle 692 00:32:04,119 --> 00:32:04,640 Esto 693 00:32:04,640 --> 00:32:07,980 Que es lo que quería ahorrarme 694 00:32:07,980 --> 00:32:09,900 Haciéndolo como clase interna, el tener que pasárselo 695 00:32:09,900 --> 00:32:11,960 Por constructor, o sea el constructor 696 00:32:11,960 --> 00:32:12,980 Enterito, fuera 697 00:32:12,980 --> 00:32:15,400 Solo quiero ActionPerformance, este 698 00:32:15,400 --> 00:32:17,140 Solo quiero este 699 00:32:17,140 --> 00:32:18,960 ¿Vale? 700 00:32:20,259 --> 00:32:21,319 Entonces, ahora 701 00:32:21,319 --> 00:32:23,940 Esta clase interna 702 00:32:23,940 --> 00:32:26,000 De aquí, puede acceder 703 00:32:26,000 --> 00:32:27,980 A todas las propiedades 704 00:32:27,980 --> 00:32:29,880 A todas de VentanaVisiesto 705 00:32:29,880 --> 00:32:31,039 ¿Vale? A todas 706 00:32:31,039 --> 00:32:34,099 entonces, ¿cuál es la solución 707 00:32:34,099 --> 00:32:35,039 aquí, la estructura aquí? 708 00:32:35,819 --> 00:32:38,000 todos mis componentes, en lugar de 709 00:32:38,000 --> 00:32:40,019 declararlos aquí, voy a declararlos 710 00:32:40,019 --> 00:32:41,920 fuera, ya está 711 00:32:41,920 --> 00:32:44,059 en lugar de locales, y aquí ya los 712 00:32:44,059 --> 00:32:45,519 coloco, hago con ellos lo que quiera 713 00:32:45,519 --> 00:32:47,960 entonces, simplemente la etiqueta 714 00:32:47,960 --> 00:32:49,859 y con su 715 00:32:49,859 --> 00:32:51,900 inicialización si quiero, aquí 716 00:32:51,900 --> 00:32:59,069 fuera, ¿cuál más tenía? 717 00:33:00,250 --> 00:33:01,150 bueno, la puedo quitar 718 00:33:01,150 --> 00:33:01,950 ya de aquí, claro 719 00:33:01,950 --> 00:33:04,710 bueno, la etiqueta, ¿cuál más? 720 00:33:04,710 --> 00:33:05,529 Este, el dato 721 00:33:05,529 --> 00:33:08,329 Control X, aquí 722 00:33:08,329 --> 00:33:09,890 Ahí está 723 00:33:09,890 --> 00:33:11,910 ¿Cuál más? 724 00:33:12,910 --> 00:33:14,529 Así ya me queda más cortito 725 00:33:14,529 --> 00:33:16,809 El resultado, la etiqueta esta 726 00:33:16,809 --> 00:33:21,720 Aquí fuera 727 00:33:21,720 --> 00:33:26,089 Y el botón 728 00:33:26,089 --> 00:33:33,190 Aquí fuera 729 00:33:33,190 --> 00:33:35,809 Vale, entonces ahora me queda una estructura 730 00:33:35,809 --> 00:33:38,210 Un poco más, un constructor más cortito 731 00:33:38,210 --> 00:33:41,700 Ya se empieza 732 00:33:41,700 --> 00:33:43,779 Esto ya es más fácil un poquito de entender 733 00:33:43,779 --> 00:33:45,259 Vale, entonces yo tengo 734 00:33:45,259 --> 00:33:47,420 Este es mi frame 735 00:33:47,420 --> 00:33:49,160 En mi frame 736 00:33:49,160 --> 00:33:50,579 ¿Qué componentes quiero? 737 00:33:50,859 --> 00:33:53,519 Yo los he decidido, pues estos son mis componentes 738 00:33:53,519 --> 00:33:54,039 Pa, pa, pa 739 00:33:54,039 --> 00:33:57,640 Además, los puedo inicializar 740 00:33:57,640 --> 00:33:59,019 Ahí si quiero, si no da igual 741 00:33:59,019 --> 00:34:00,019 Los inicializo ahí dentro 742 00:34:00,019 --> 00:34:02,920 Si los puedo inicializar aquí, pues mira, eso que me quito 743 00:34:02,920 --> 00:34:05,240 ¿Vale? Mi listado de componentes 744 00:34:05,240 --> 00:34:07,500 Ahí, pa, pa, pa, esos son tu listado de componentes 745 00:34:07,500 --> 00:34:08,300 Ahora, el constructor 746 00:34:08,300 --> 00:34:11,159 El constructor, pues hace ya lo que tenga que hacer 747 00:34:11,159 --> 00:34:13,460 Hace el gestor de ubicación 748 00:34:13,460 --> 00:34:14,320 Lo asocia al panel 749 00:34:14,320 --> 00:34:16,760 Pega los componentes al panel 750 00:34:16,760 --> 00:34:18,920 ¿Y qué es lo único que le falta? 751 00:34:19,659 --> 00:34:21,280 Lo único que le falta es 752 00:34:21,280 --> 00:34:23,119 Al botón 753 00:34:23,119 --> 00:34:24,760 Añadirle 754 00:34:24,760 --> 00:34:27,380 Añadirle 755 00:34:27,380 --> 00:34:34,000 Añadirle un objeto 756 00:34:34,000 --> 00:34:35,760 De esta clase de aquí 757 00:34:35,760 --> 00:34:37,800 Un objeto de esa clase 758 00:34:37,800 --> 00:34:38,920 ¿Vale? 759 00:34:39,780 --> 00:34:41,639 Vale, pues vengamos a añadírselo 760 00:34:41,639 --> 00:34:53,719 Y ya está 761 00:34:53,719 --> 00:34:56,480 Le añado un objeto de esa clase 762 00:34:56,480 --> 00:34:58,500 Aunque el nombre real de la clase 763 00:34:58,500 --> 00:35:00,300 y ahora vamos a comprobar, de capturar 764 00:35:00,300 --> 00:35:02,099 pulsar botón, será en realidad 765 00:35:02,099 --> 00:35:04,400 ventana visiesto, captura, pulsar botón 766 00:35:04,400 --> 00:35:06,219 como aquí lo estoy instanciando 767 00:35:06,219 --> 00:35:08,579 desde dentro de esta, no hace falta ponerlo 768 00:35:08,579 --> 00:35:10,159 si yo lo instanciara en otra parte 769 00:35:10,159 --> 00:35:12,239 sí tendría que ponerlo, pero eso no lo vamos a hacer 770 00:35:12,239 --> 00:35:14,260 nosotros, no, quiero que 771 00:35:14,260 --> 00:35:16,159 nos liemos ahora con clases internas 772 00:35:16,159 --> 00:35:20,929 vale, entonces ahora ya 773 00:35:20,929 --> 00:35:22,969 le añado un objeto de esta clase que 774 00:35:22,969 --> 00:35:23,570 está dentro 775 00:35:23,570 --> 00:35:26,929 entonces la ventaja al estar dentro 776 00:35:26,929 --> 00:35:28,710 es que solo necesito la acción performance 777 00:35:28,710 --> 00:35:29,269 solo 778 00:35:29,269 --> 00:35:33,130 y en la acción performance accedo a lo que me dé la gana 779 00:35:33,130 --> 00:35:34,610 a todo lo del frame 780 00:35:34,610 --> 00:35:36,869 accedo a todo, siempre y cuando lo del frame 781 00:35:36,869 --> 00:35:37,769 esté declarado fuera 782 00:35:37,769 --> 00:35:42,440 y esta ya es la estructura habitual 783 00:35:42,440 --> 00:35:42,920 de swing 784 00:35:42,920 --> 00:35:46,119 el siguiente salto, pero eso ya lo veremos con el builder 785 00:35:46,119 --> 00:35:48,300 es que esta clase además de interna sea anónima 786 00:35:48,300 --> 00:35:50,639 pero eso ya sería el siguiente salto 787 00:35:50,639 --> 00:35:51,599 es otra cosa 788 00:35:51,599 --> 00:35:54,019 lo importante es que entendáis esta 789 00:35:54,019 --> 00:35:56,119 esta estructura 790 00:35:56,119 --> 00:35:58,380 si nos vamos de hecho 791 00:35:58,380 --> 00:36:00,159 para que veáis que son dos clases diferentes 792 00:36:00,159 --> 00:36:04,199 si nos fuéramos aquí 793 00:36:04,199 --> 00:36:14,510 a ver lo que ha generado 794 00:36:14,510 --> 00:36:16,030 en Vista 2 795 00:36:16,030 --> 00:36:25,199 fijaos que hay dos clases 796 00:36:25,199 --> 00:36:28,039 en el paquete Vista 2 797 00:36:28,039 --> 00:36:30,099 está VentanaVis y esto con la otra dentro 798 00:36:30,099 --> 00:36:31,239 con la otra dentro 799 00:36:31,239 --> 00:36:32,719 y yo he dicho, oye, que este dentro 800 00:36:32,719 --> 00:36:35,739 no significa que no sean dos clases independientes 801 00:36:35,739 --> 00:36:37,579 claro que lo son, son dos clases independientes 802 00:36:37,579 --> 00:36:39,880 esta es una y esta es la interna 803 00:36:39,880 --> 00:36:41,920 que en punto clas se llama 804 00:36:41,920 --> 00:36:42,900 con un dólar dentro 805 00:36:42,900 --> 00:36:45,199 Son dos clases separadas 806 00:36:45,199 --> 00:36:47,519 Y yo puedo instanciar las dos por separado 807 00:36:47,519 --> 00:36:50,239 Esta la instanciaré con new ventana bisiesto 808 00:36:50,239 --> 00:36:52,719 Y esta la instanciaré con new ventana bisiesto 809 00:36:52,719 --> 00:36:53,300 Punto 810 00:36:53,300 --> 00:36:55,219 Captura pulsar botón 811 00:36:55,219 --> 00:36:56,320 Para la instancia desde código 812 00:36:56,320 --> 00:36:57,659 Si quiero instanciarla afuera 813 00:36:57,659 --> 00:37:00,420 Ahora es que la estaba instanciando dentro 814 00:37:00,420 --> 00:37:02,159 Entonces al instanciarla dentro de esta 815 00:37:02,159 --> 00:37:06,380 Puedo instanciarla directamente con su nombre interno 816 00:37:06,380 --> 00:37:12,059 Pero son dos clases independientes 817 00:37:12,059 --> 00:37:18,769 bueno independientes en el sentido de que se pueden instanciar 818 00:37:18,769 --> 00:37:20,210 por separado pero 819 00:37:20,210 --> 00:37:22,769 esta para existir tiene que 820 00:37:22,769 --> 00:37:24,170 existir un objeto de esta otra 821 00:37:24,170 --> 00:37:26,710 vale entonces si ejecutamos 822 00:37:26,710 --> 00:37:28,590 esta ahora 823 00:37:28,590 --> 00:37:29,389 nuestro main 824 00:37:29,389 --> 00:37:33,469 un momento ya nos vamos 825 00:37:33,469 --> 00:37:35,329 vamos a nuestro main 826 00:37:35,329 --> 00:37:35,690 aquí 827 00:37:35,690 --> 00:37:43,130 nuestro main en lugar de ventana 828 00:37:43,130 --> 00:37:45,469 si esto vamos a hacerla de vista 829 00:37:45,469 --> 00:37:45,829 dos 830 00:37:45,829 --> 00:37:49,030 Vista 2, la otra que he hecho 831 00:37:49,030 --> 00:37:53,719 Vale 832 00:37:53,719 --> 00:37:56,119 Le pongo su nombre real 833 00:37:56,119 --> 00:37:57,699 Con el prefijo delante 834 00:37:57,699 --> 00:37:59,679 Para que no use la que tiene el import, que es esta 835 00:37:59,679 --> 00:38:01,920 Esta es la nueva que he hecho 836 00:38:01,920 --> 00:38:02,940 Con la clase interna 837 00:38:02,940 --> 00:38:06,199 Si no se nos ha escapado nada, debería funcionar igual 838 00:38:06,199 --> 00:38:08,159 Este main, con la nueva que hemos hecho 839 00:38:08,159 --> 00:38:17,010 Y sí, funciona igual 840 00:38:17,010 --> 00:38:17,730 Vale 841 00:38:17,730 --> 00:38:20,809 Pues venga, vamos a parar aquí entonces