1 00:00:02,480 --> 00:00:09,339 Bueno, ya estoy grabando. Si alguno de vosotros habla y demás, me da permiso para que se grabe. 2 00:00:10,580 --> 00:00:18,019 Y nada, el otro día, bueno, estos últimos días os habéis estado haciendo ejercicios, 3 00:00:18,260 --> 00:00:22,359 hemos estado viendo algo de teoría y sobre todo habéis visto eventos, 4 00:00:23,500 --> 00:00:27,539 lo que son los listeners y sé que estáis todos encantados con esto, 5 00:00:27,539 --> 00:00:31,100 tanto como que hoy habéis estado viéndolo en Javascript. 6 00:00:31,100 --> 00:00:53,500 Y bueno, no sé qué os gusta más o qué os interesa más, si Javascript o manejar los eventos con Java, pero bueno, al final, como estáis comprobando, se trata todo el rato de poder hacer acciones con los componentes que nos ofrecen las interfaces gráficas de estos lenguajes. 7 00:00:53,500 --> 00:01:16,379 Entonces, bueno, aquí, aunque ya he visto que algunos los estuvisteis manejando, lo que voy a explicar ahora, los estuvisteis manejando algunos, también un poco por recomendación de Estefano, y bueno, pues hasta ahora hemos estado trabajando con el Action Perform, es decir, con el Action Listener, con la interfaz. 8 00:01:16,379 --> 00:01:27,219 siempre lo hemos enfocado a un botón de un tipo, a un botón en concreto o a otro componente diferente 9 00:01:27,219 --> 00:01:32,120 en este caso lo que quiero que veáis es que también se puede hacer de una forma genérica 10 00:01:32,120 --> 00:01:39,579 es decir, vamos a poner un ejemplo en el cual independientemente del botón que tengamos 11 00:01:39,579 --> 00:01:48,760 se puede hacer una acción, es decir, se puede controlar simplemente por el tipo de componente, ¿no? 12 00:01:49,579 --> 00:02:03,739 Entonces, abriríamos aquí, a ver, new, other, JFrame, ¿vale? 13 00:02:03,739 --> 00:02:40,319 Y le daríamos, aquí tendríamos una pantalla, lo que es un JFrame y vamos a añadirle un par de botones, ¿vale? Un botón mismamente, con un botón sería suficiente, pero bueno, vamos a darle en par. 14 00:02:40,319 --> 00:02:48,060 Primero recordar, siempre teníamos el flow layout de lo que es el panel 15 00:02:48,060 --> 00:02:53,919 Lo vamos a poner genérico para poder mover nuestros botones 16 00:02:53,919 --> 00:03:12,000 Vamos a copiar 17 00:03:12,000 --> 00:03:29,819 Recordar siempre esto 18 00:03:29,819 --> 00:03:34,159 Aquí ya lo va poniendo, se van actualizando los nombres 19 00:03:34,159 --> 00:03:54,000 aquí en este caso no bueno lo cambiamos como os fijáis bueno si os fijáis en estos días cuando 20 00:03:54,000 --> 00:03:58,680 nos vamos al código obviamente ya se han creado por aquí los botones perdonar que esto está muy 21 00:03:58,680 --> 00:04:04,099 grande y yo me cuesta un poquito manejarme pero si no lo veis a ver si lo veo aquí tenemos el 22 00:04:04,099 --> 00:04:13,000 botón aceptar y el botón cancelar entonces para recordar que para poder utilizar el lo que son 23 00:04:13,000 --> 00:04:18,439 los eventos de esos mismos se ven de esos mismos componentes podríamos hacer dos cosas una hacer 24 00:04:18,439 --> 00:04:27,779 doble clic en él en dichos en dichos componentes y que nos muestre lo que es el propio método ya 25 00:04:27,779 --> 00:04:36,279 de la interfaz dentro de nuestro código es decir si apretamos a aceptar vale ya nos crea aquí el 26 00:04:36,279 --> 00:04:42,920 el AddActionListener con el ActionPerform, que es donde vamos a meter la acción que queremos. 27 00:04:43,079 --> 00:04:47,540 Pero queremos manejarlo todo de forma genérica y como recordaréis, 28 00:04:48,220 --> 00:04:55,800 habíamos hablado de hacerlo a través de implementar directamente 29 00:04:55,800 --> 00:04:58,240 lo que era la interfaz ActionListener. 30 00:04:58,240 --> 00:05:28,750 Vale. Si os fijáis, lo que os explicaba ayer a algunos, que parecía que no lo teníais muy claro, lo recuerdo ahora un poco, era el tema de que, bueno, ActionListener, en este caso, que es el, bueno, pues el escuchador con el que vamos a poder trabajar con nuestros eventos, digamos que esto es una interfaz. 31 00:05:28,750 --> 00:05:36,990 y como buena interfaz, pues tiene una serie de métodos obligatorios que tenemos que implementar en nuestro código. 32 00:05:37,829 --> 00:05:43,750 Obviamente aquí nos está dando un error, que si nos colocamos encima vamos a poder ver que efectivamente 33 00:05:43,750 --> 00:05:51,110 nos está dando un mensaje diciendo que obviamente faltan estos métodos. 34 00:05:51,110 --> 00:06:16,949 Entonces los añadimos aquí y entonces aquí abajo vamos a tener ya lo que sería el action perform, que es donde vamos a poder meter o donde vamos a poder incluir todas las acciones o todo el, bueno, todo el procesamiento que queremos hacer cuando recojamos el evento de nuestro componente, ¿vale? 35 00:06:16,949 --> 00:06:43,680 Entonces, para poder llamar nosotros a dicha interfaz, tendríamos que, obviamente, añadirle, perdonad que es que me manejo fatal con este, aquí tenemos la opción del Add Action Listener y como lo estamos llamando desde nosotros mismos y va a afectar a nosotros mismos, le ponemos el Dish, ¿vale? 36 00:06:43,680 --> 00:06:45,279 Es decir, al botón aceptar. 37 00:06:46,040 --> 00:06:48,259 Y lo mismo vamos a hacer con el botón cancelar. 38 00:06:54,490 --> 00:06:55,050 Cancelar. 39 00:06:55,970 --> 00:06:56,490 Punto. 40 00:06:58,230 --> 00:06:58,790 Add. 41 00:07:00,410 --> 00:07:01,370 Action listener. 42 00:07:02,889 --> 00:07:05,449 Y le ponemos el this. 43 00:07:07,209 --> 00:07:07,769 Perfecto. 44 00:07:09,370 --> 00:07:11,410 Entonces, ahora con esto, ¿qué hacemos? 45 00:07:11,550 --> 00:07:15,050 Cuando realmente nosotros estamos haciendo un click o cualquier evento sobre, 46 00:07:15,050 --> 00:07:19,870 Vamos a poner que es otro tipo de componente, que no es un botón. 47 00:07:20,850 --> 00:07:26,829 Bueno, pues cuando se hace un clic, realmente lo que estamos haciendo al hacer esta llamada 48 00:07:26,829 --> 00:07:33,889 es, digamos, implementar directamente lo que es la interfaz del ActionListener, 49 00:07:33,949 --> 00:07:37,870 de tal modo que nos va a llevar a su método ActionPerform. 50 00:07:37,870 --> 00:07:58,790 ¿Ok? Entonces aquí nosotros, si veis aquí, bueno, vamos a controlar ahora los dos tipos de botón. Acordaros también, aquí este parámetro en el action event, si os fijáis aquí le estamos pasando el dis de parámetro, es decir, le estamos pasando un botón cancelar un tipo botón, ¿vale? 51 00:07:58,790 --> 00:08:32,309 Entonces, aquí, este sería, digamos, el botón que le vamos a pasar a nuestro evento. Entonces, para controlar, vamos a ver, recordar que lo hacíamos de tal modo que, equals, y le damos, por ejemplo, botón aceptar. 52 00:08:32,309 --> 00:09:07,789 Vale, sí. Vale, entonces, ¿con esto qué estamos haciendo? Estamos haciendo realmente que nos esté preguntando, digamos, antes de empezar a hacer nada, nos está preguntando si realmente lo que le estamos mandando es un botón y si es el botón aceptar, ¿vale? 53 00:09:07,789 --> 00:09:14,269 entonces aquí estamos viendo que nos está dando un error como bien os disteis cuenta algunos el 54 00:09:14,269 --> 00:09:20,750 otro día nos tenemos que dar cuenta que nosotros cuando lo hemos creado automáticamente se nos ha 55 00:09:20,750 --> 00:09:29,370 generado estos botones dentro del constructor ejemplo genérico por lo tanto habría que tenerlo 56 00:09:29,370 --> 00:10:34,629 aquí abajo, tendríamos que tener inicializados lo que son tanto el botón cancelar como el aceptar, aquí ya lo tendríamos creado y aquí ya no nos da el error, ahora haríamos un save y haríamos lo mismo con el botón cancelar, perfecto. 57 00:10:34,629 --> 00:10:44,230 también estuvimos hablando de que podíamos pintar o bien por consola o bien pintar en algún otro tipo de componente 58 00:10:44,230 --> 00:10:46,889 de tipo texto o label o alguna historia así. 59 00:10:46,889 --> 00:10:56,870 Vamos a ponerle, por ejemplo, yo en el ejemplo le había puesto un textarea, pues bueno, vamos a ponerle un textarea 60 00:10:56,870 --> 00:11:03,590 o un campo de texto, el que más rabia nos dé. 61 00:11:03,669 --> 00:11:08,990 Mira, vamos a ponerlo en JTextField y se lo vamos a poner aquí. 62 00:11:09,190 --> 00:11:14,509 Vamos a poner aquí, recordar siempre darle vuestro propio nombre 63 00:11:14,509 --> 00:11:19,470 con el prefijo del componente que vayáis a utilizar. 64 00:11:20,090 --> 00:11:23,230 Esto os va a ser muy útil, sobre todo cuando estéis trabajando, 65 00:11:23,370 --> 00:11:26,250 como decía Estefano, cuando sois unos profesionales de la programación 66 00:11:26,250 --> 00:11:31,669 Y obviamente tengáis un formulario con 200 campos 67 00:11:31,669 --> 00:11:33,269 Entonces si no, nos vais a enterar 68 00:11:33,269 --> 00:11:37,210 Entonces siempre está bien ponerle un campo 69 00:11:37,210 --> 00:11:44,049 Entonces, aquí se nos ha creado el texto resultado 70 00:11:44,049 --> 00:11:59,090 Acordaros siempre también que 71 00:11:59,090 --> 00:12:13,190 Este mensaje que no dice absolutamente nada 72 00:12:13,190 --> 00:12:15,009 Pero nos vale 73 00:12:15,009 --> 00:12:50,929 Y aquí inicio, y aquí cancelar. Hasta aquí, esto es un poco todo lo que hemos visto y aquí controlaríamos cuál es el tipo de botón. De hecho, vamos a pulsarle, debería funcionar, cuando pulsamos aquí, bueno, he hecho muy pequeño la caja de texto, cuando le damos aquí, cancelar pulsado, aquí aceptar, bueno. 74 00:12:50,929 --> 00:13:08,980 Es decir, esto quedaría, pero nosotros ahora lo que vamos a querer es, por ejemplo, que siempre, que cualquiera de los dos botones, nos da igual cual sea, siempre que se pulse, que quede desactivado, por ejemplo. 75 00:13:08,980 --> 00:13:49,720 ¿Vale? Entonces para ello, si os fijáis aquí, bueno, hemos generado un código, que vais a ver ahora, le vamos a llamar click button, ¿vale? Y aquí lo que le vamos a decir es que cuando el elemento, es decir, el componente que está llamando a la interfaz sea de tipo JButton, es decir, 76 00:13:49,720 --> 00:14:53,009 Ah, por el A, perdón. Es que parece mentira, pero con tenerlo tan grande me cuesta bastante más verlo que si lo tuviera más pequeño. Vale. Y entonces, a este click, uy, a este click button, le podemos poner la setEnable, con el poniéndole la propiedad Enable a false, lo que estamos haciendo es que se quede desactivado, ¿vale? 77 00:14:53,250 --> 00:15:17,889 Entonces, ahora si lo generamos, cuando a nosotros le damos al botón aceptar, efectivamente nos hace toda esta funcionalidad independiente, pero luego de forma genérica, simplemente por el hecho de ser un botón, se nos deshabilita. 78 00:15:17,889 --> 00:15:37,730 Y lo mismo nos va a pasar con el cancelar, cuando le damos se nos deshabilita, si os fijáis no lo estamos metiendo dentro de la condición sino después, es decir, de una forma genérica, lo que estamos afrontando es el tipo de botón, o sea, el tipo de componente que le estamos pasando. 79 00:15:37,730 --> 00:15:45,590 vale tener en cuenta que claro siempre el tipo que va a tener un tipo de propiedades x que nos 80 00:15:45,590 --> 00:15:51,009 van a salir a cuenta es decir en este caso tenemos el set en ablett que esto pertenece 81 00:15:51,009 --> 00:16:06,629 a los componentes jota button vale alguna duda con eso más o menos luego en los ejercicios que 82 00:16:06,629 --> 00:16:11,529 hagamos podéis aplicarlo que lo vais a tener todavía esta parte creo que no está subida 83 00:16:11,529 --> 00:16:18,429 los apuntes o lo voy a subir luego al aula virtual para que podáis tenerlo y cuando estáis haciendo 84 00:16:18,429 --> 00:16:24,409 luego ejercicios podáis seguirlo y aplicarlo o bien me lo preguntáis amigo estefano vale 85 00:16:26,210 --> 00:16:27,190 papá 86 00:16:32,279 --> 00:16:36,480 simplemente el interfaz de ese modo se pueden implementar diferentes 87 00:16:36,480 --> 00:16:43,659 diferentes componentes y se ordenan las clases de tal modo que unas bueno esto lo que queremos 88 00:16:43,659 --> 00:16:48,960 decir es que se pueden crear hasta ahora hemos creado todo el tiempo 89 00:16:51,600 --> 00:16:58,659 como decirlo clases en una misma clase hemos incluido lo que era la interfaz hemos metido 90 00:16:58,659 --> 00:17:05,119 el listener y hemos pintado por pantalla es decir hemos hecho todo todo en una misma en 91 00:17:05,119 --> 00:17:11,119 una misma clase pero al igual que habéis hecho con otros proyectos hasta ahora se puede hacer 92 00:17:11,119 --> 00:17:16,640 en diferentes en diferentes clases unas que manejen lo que sería el evento y otras que 93 00:17:16,640 --> 00:17:25,180 pinten pues lo puesto todo lo que hayamos procesado no vamos a ver por ejemplo aquí 94 00:17:25,180 --> 00:17:31,160 Y vamos a hacer un ejemplo listener y un ejemplo normal, ¿vale? 95 00:17:33,160 --> 00:17:51,099 Entonces, vamos a ver, aquí vamos a meter, por ejemplo, en el, vamos a hacer un ejemplo, ¿cómo le llamamos? 96 00:17:51,099 --> 00:17:58,000 Soy malísimo poniendo nombres 97 00:17:58,000 --> 00:18:02,359 Si a alguien se le ocurre alguno un poquito mejor 98 00:18:02,359 --> 00:18:04,400 Que lo diga y lo pongo, ¿vale? 99 00:18:05,019 --> 00:18:17,349 Para nuestro ejemplo 100 00:18:17,349 --> 00:18:23,700 Vamos a añadir simplemente un botón, ¿vale? 101 00:18:24,519 --> 00:18:25,200 De momento 102 00:18:25,200 --> 00:18:32,119 Volvemos a utilizar el 103 00:18:32,119 --> 00:18:35,660 Volvemos a poner dentro de lo que es el panel 104 00:18:35,660 --> 00:18:52,849 el layout en absoluto vamos a colocar un botón por llamarlo de alguna manera no os penséis que 105 00:18:52,849 --> 00:19:19,180 voy a hacer un juego y ahora nos vamos a hacer una clase ejemplo listener 2 vale que va a ser 106 00:19:21,779 --> 00:19:24,559 bueno es que no sé si llamarlo así venga si lo vamos a llamar así 107 00:19:24,559 --> 00:19:40,809 Sé que no es un gran nombre, pero no me habéis dado más ayuda, pues le llamamos ejemplo Listener 2. 108 00:19:40,809 --> 00:19:50,599 Si os fijáis en el ejemplo Listener 2 109 00:19:50,599 --> 00:19:55,539 Le vamos a hacer una implementación al ActionListener 110 00:19:55,539 --> 00:19:58,140 A lo que sería la interfaz de la que hablábamos 111 00:19:58,140 --> 00:20:00,480 Para que se nos genere el ActionPerform 112 00:20:00,480 --> 00:20:02,200 Y ahí poder ejecutar todo 113 00:20:02,200 --> 00:20:09,789 Entonces vamos a hacerle 114 00:20:09,789 --> 00:20:17,160 El ImplementsActionListener 115 00:20:17,160 --> 00:20:55,559 ¿Qué estoy poniendo yo mal? Ahora, le añadimos los métodos que necesita implementar, por lo que hablábamos antes, de que es una interfaz, se nos genera aquí abajo, no lo veo, aquí, y aquí vamos a hacer el mismo caso del botón deshabilitado, ¿vale? 116 00:20:55,559 --> 00:21:55,539 un botón vamos a aquí importar el botón que no tiene vale y entonces tenemos un punto 117 00:21:57,660 --> 00:21:58,759 se tenable 118 00:22:05,500 --> 00:22:19,410 ya tendríamos lo que tal y como lo hemos enseñado antes pero distribuido en dos en dos en dos clases 119 00:22:19,410 --> 00:22:30,150 una que recoge y otra que digamos procesa todo pero si nos damos cuenta no tenemos la llamada 120 00:22:30,150 --> 00:22:36,930 del botón que hemos creado en la pantalla que pinta no tenemos no hemos hecho ninguna llamada 121 00:22:36,930 --> 00:22:54,069 todavía al listener que está en la otra clase entonces para ello un juego acción listener y 122 00:22:54,069 --> 00:22:58,170 Y entonces le vamos a llamar el ejemplo listener2, que es este de aquí. 123 00:23:04,460 --> 00:23:08,819 Vamos a llamarle aquí a este, si no me equivoco. 124 00:23:10,440 --> 00:23:11,180 Ta, ta, ta, ta. 125 00:23:11,339 --> 00:23:12,259 ¿Veis? Aquí lo tenemos. 126 00:23:12,480 --> 00:23:14,460 Uy, lo tenemos aquí, ¿vale? 127 00:23:14,640 --> 00:23:16,480 Le vamos a hacer una interfaz aquí. 128 00:23:16,480 --> 00:23:21,839 Aquí nos está dando error. 129 00:23:28,859 --> 00:23:36,920 Entonces, en un principio, debería funcionar de tal manera que cuando pulsamos se nos deshabilita. 130 00:23:37,599 --> 00:23:49,960 ¿Vale? Es decir, lo mismo que hemos hecho antes con una misma clase, estaría, vamos, sí que es conveniente poder dividirlo en diferentes clases. 131 00:23:50,319 --> 00:23:58,880 ¿Por qué? Pues porque siempre va a quedar de una forma más organizada, incluso puede haber listeners que nos sirvan para diferentes formularios. 132 00:23:58,880 --> 00:24:14,500 Es decir, nosotros podemos tener una funcionalidad que en nuestro programa tengamos tres formularios a los que accede el usuario, pero siempre que apretamos ese botón va a ser que recoja esos datos y que los guarde. 133 00:24:14,500 --> 00:24:31,859 Bueno, pues eso tendríamos una clase listener que cogería todos esos datos de los diferentes formularios, bueno, del formulario que le llame y del componente en concreto del formulario y lo procesaría para cada uno de ellos, ¿vale? 134 00:24:32,859 --> 00:24:41,640 Y, vale, y entonces, no os preocupéis que la teoría ya va prácticamente a terminar, ¿vale? Aquí, bueno, os pongo un ejemplo que es el mismo que hemos hecho. 135 00:24:41,640 --> 00:24:54,720 Vale, hasta ahora hemos estado viendo el ActionListener y como bien decíamos es una interfaz 136 00:24:54,720 --> 00:25:03,359 Y todas las interfaces tienen una serie de métodos obligatorios, que eso ya sé que lo sabéis todos 137 00:25:03,359 --> 00:25:09,059 Y entonces tienen una serie de métodos obligatorios que hay que implementar sí o sí, ¿vale? 138 00:25:09,059 --> 00:25:29,059 Entonces, por ejemplo, en este caso tenemos el escuchador WindowListener, que esto lo que hace referencia es a una serie de métodos con las que podemos trabajar, por ejemplo, con la ventana, es decir, con todos los elementos que tengamos en la ventana. 139 00:25:29,059 --> 00:25:43,099 Si os fijáis, tenemos el método WindowClosing, el Opened, el Closed, el Iconified, el de Iconified, Activated y de Activated, ¿vale? 140 00:25:43,920 --> 00:25:53,740 Con esto lo que quiero decir es que no solo está el ActionListener, hay muchos tipos de Listener, es decir, en el caso de los botones y demás, pues sí, utilizamos el Action, 141 00:25:53,740 --> 00:25:59,180 Pero, en el caso de las ventanas, por ejemplo, pues vamos a manejar el Windows Listener. 142 00:26:00,819 --> 00:26:09,960 Vale, vamos a poner un ejemplo, si os parece, del Windows Listener, cómo se implementa y, bueno, meter una pequeña funcionalidad. 143 00:26:11,319 --> 00:26:40,059 Entonces, aquí tendríamos, ejemplo, Windows Listener, pa, pa, pa, pa. 144 00:26:41,480 --> 00:26:50,130 Vale, ta, ta, tam, vale, entonces. 145 00:26:51,970 --> 00:26:53,609 si encuentro donde estamos 146 00:26:56,329 --> 00:27:08,130 aquí en este ejemplo que os he puesto nosotros se supone que hemos generado un proyecto tipo 147 00:27:08,130 --> 00:27:16,089 es decir una clase que no es tipo frame que es mi caso vale aquí lo hemos hecho creo que 148 00:27:16,089 --> 00:27:21,670 creo que se llama windows cuando vamos a abrir una por ejemplo cuando vamos aquí y queremos crear una 149 00:27:21,670 --> 00:27:27,250 cuando le damos al other cuando tenemos el swing designer podemos hacerle una aplicación windows 150 00:27:27,250 --> 00:27:32,430 o un jota frame en mi caso yo he abierto directamente un jota frame vale esto qué 151 00:27:32,430 --> 00:27:38,950 quiere decir pues que aquí en el código si os fijáis cuando lo abrís como como una acción 152 00:27:38,950 --> 00:27:44,589 windows se llama acción windows y creo que sí pues tenemos que declarar también la ventana 153 00:27:44,589 --> 00:27:49,990 etcétera cuando lo hacemos de la forma en la que estamos ya se supone que estamos partiendo 154 00:27:49,990 --> 00:27:55,549 de la ventana es decir las propiedades ya funcionarían es decir aquí si no me equivoco 155 00:27:57,430 --> 00:27:57,970 window 156 00:28:01,109 --> 00:28:02,069 debería ser así 157 00:28:17,900 --> 00:28:20,039 vamos a importar el windows listener 158 00:28:31,160 --> 00:28:32,079 porque no me dejas 159 00:28:45,700 --> 00:28:58,789 en un instante obviamente esto va a ser 160 00:29:19,960 --> 00:29:30,000 Create a frame 161 00:29:30,000 --> 00:29:38,009 Set content panel 162 00:29:38,009 --> 00:29:46,480 ¿Se te ocurre, Estefano, por qué puede ser esto? 163 00:29:47,700 --> 00:29:49,180 ¿Por qué no me está permitiendo? 164 00:29:53,079 --> 00:29:53,359 ¿Él? 165 00:29:56,490 --> 00:29:56,750 Sí 166 00:29:56,750 --> 00:29:58,150 Así es que 167 00:29:58,150 --> 00:30:01,970 No, pero esto se supone que es aquí 168 00:30:01,970 --> 00:30:06,140 A ver, ta, ta, ta, ta 169 00:30:06,140 --> 00:30:07,579 Vale, pa, pa, pa, pa 170 00:30:07,579 --> 00:30:08,759 Sí, efectivamente 171 00:30:08,759 --> 00:30:11,380 Este es así 172 00:30:11,380 --> 00:30:16,769 El paréntesis de abajo es este 173 00:30:16,769 --> 00:30:33,150 vale, porque no hemos implementado los métodos, vale, esto era lo que quería, perdona que estoy yo un poquito dormido hoy 174 00:30:33,150 --> 00:30:42,890 bueno, como hablábamos antes, si os fijáis, aquí anteriormente teníamos todos estos métodos 175 00:30:42,890 --> 00:30:46,470 que son los que implementa la interfaz Windows Listener, ¿vale? 176 00:30:46,470 --> 00:30:55,089 Antes teníamos acción Listener, ahora Windows Listener y nos obliga a implementar todos estos eventos, ¿vale? 177 00:30:55,089 --> 00:31:04,269 En un principio no tenemos por qué generar ningún tipo de acción en todos los métodos, 178 00:31:04,309 --> 00:31:09,529 es decir, simplemente los que nos vayan a servir. 179 00:31:09,529 --> 00:31:25,930 Por ejemplo, vamos a hacer un ejemplo con el window closing, ¿vale? Entonces, aquí, ¿veis? Aquí os explicamos, siempre se implementa la interfaz window listening y se incluyen los métodos obligatorios que requiere. 180 00:31:25,930 --> 00:31:36,319 vale y entonces aquí en el windows closing vamos a añadirle por ejemplo 181 00:31:42,170 --> 00:31:44,190 ventana una ventana nueva 182 00:31:59,170 --> 00:32:04,829 si os fijáis aquí también tenemos el get source igual que lo teníamos en él en él 183 00:32:04,829 --> 00:32:16,619 en el acción listener con él con el acción proceed pues se le pasa siempre el componente 184 00:32:16,619 --> 00:32:23,920 por aquí y para obtener el el componente en sí lo hacemos con el que todos aquí lo 185 00:32:23,920 --> 00:32:26,960 castigamos para que se quede común de este tipo 186 00:32:30,779 --> 00:32:42,359 y aquí vamos a ver algo que de momento no hemos visto que se trata de los option pane bueno yo 187 00:32:42,359 --> 00:32:46,819 creo que alguien sí que ha estado utilizando estos días alguna opción pane tuvo en el bus 188 00:32:46,819 --> 00:32:53,940 caminas no lo utilizaste o alguien alguien de bueno me sonaba que alguien había había 189 00:33:05,839 --> 00:33:26,700 aquí le vamos a dar su opción vale su opción bueno el jota opción pane y el show opción 190 00:33:26,700 --> 00:33:33,960 dayal o a lo que hacen referencia realmente bueno es un tipo de componente en el cual nosotros vamos 191 00:33:33,960 --> 00:33:41,940 a poderle mostrar mensajes al usuario en función de lo que vayamos haciendo son ventanitas que se 192 00:33:41,940 --> 00:33:47,819 le van a se le van a abrir y entonces pues le van a dar diferentes opciones pues quieres hacer no 193 00:33:47,819 --> 00:33:55,440 sé qué aceptar no cancelar y en función de las elecciones que hagamos de y en función de cómo 194 00:33:55,440 --> 00:34:04,200 lo configuremos pues vamos a tener la posibilidad de llevar nuestro código de una manera o de otra 195 00:34:04,200 --> 00:34:10,760 para que bueno pues para hacer diferentes acciones en función de lo que se haya seleccionado vale si 196 00:34:10,760 --> 00:34:19,719 os fijáis tiene un montón de un montón de parámetros y bueno vamos a ir viendo los 197 00:34:19,719 --> 00:34:26,679 diferentes vale aquí por ejemplo el primer parámetro es el option panel sobre qué elemento 198 00:34:26,679 --> 00:34:33,239 sobre la ventana, que es el JFrame de tipo ventana que hemos creado antes, ¿vale? 199 00:34:34,440 --> 00:34:38,900 Luego le vamos a poner el mensaje, por ejemplo, seguro que quieres salir, 200 00:34:39,300 --> 00:34:59,159 pues le vamos a poner aquí en el segundo parámetro, como podéis ver soy súper original 201 00:34:59,159 --> 00:35:03,849 con el tema de los mensajes, ¿vale? 202 00:35:06,989 --> 00:35:11,150 Le vamos a poner cuadro de confirmación, esto es un texto que nos va a venir arriba, 203 00:35:11,150 --> 00:36:12,730 lo encuentro que se me ha ido por aquí, aquí en el get title le vamos a poner, luego a continuación le vamos a dar en el joption panel tiene diferentes, bueno igual que con los paneles y los contenedores, teníamos los layouts y en función del tipo de layout si le poníamos un grid no salía tipo tabla o bueno en fin, o el flow layout que salía todo seguido, 204 00:36:12,730 --> 00:36:54,190 aquí podemos utilizar el yes no option por ejemplo y entonces nos va a dar la opción de sí o no directamente, entonces para esto, ponemos aquí, como era, con el jOptionPanel, veis aquí tenemos diferentes opciones, por ejemplo, yes no option, yes option, yes no cancel option, en este caso le vamos a dar a yes no, vale, 205 00:36:54,190 --> 00:37:06,889 Luego le vamos a dar el question message, que es como que le va a aparecer, bueno, es otro tipo de, bueno, de plantilla que tiene para poder mostrar la pregunta. 206 00:37:06,889 --> 00:37:48,969 Question Message, aquí está, os fijáis, antes de darle a Question Message, aquí tenemos un montón de opciones, Cancel Option, Closed, Default, un mensaje de error, bueno, un mensaje de warning, bueno, podéis, o sea, tenéis infinidad de plantillas y de opciones. 207 00:37:48,989 --> 00:37:59,440 vale cuando está seleccionado cuando no en fin ahí hay un montón de hay un montón de opciones 208 00:37:59,440 --> 00:38:13,780 que al final no la he puesto y hemos dicho que era cuestión meses en la cuestión meses y luego 209 00:38:13,780 --> 00:38:23,619 los últimos campos los vamos a poner a null vale porque no nos van a hacer falta los últimos 210 00:38:23,619 --> 00:38:48,659 parámetros a ver que se me ha vuelto a mover entonces ahora nosotros vamos a vamos a manejar 211 00:38:48,659 --> 00:38:56,820 este jota opción panel vale lo vamos a lo vamos a manejar y vamos a poder controlar las diferentes 212 00:38:56,820 --> 00:39:03,519 acciones que queramos en este caso lo que vamos a querer es cerrar la pantalla vale entonces 213 00:39:03,519 --> 00:39:26,400 hemos dicho que le dábamos al 10 opción 214 00:39:26,400 --> 00:39:59,349 y no, System.exe 215 00:39:59,349 --> 00:40:10,210 vale, ahora si le damos a funcionar 216 00:40:10,210 --> 00:40:16,550 pues vale, hay algo que nos está dando error, vamos a ver 217 00:40:16,550 --> 00:40:32,000 ¿dónde? ¿aquí? no, porque es que incluye el este 218 00:40:32,000 --> 00:40:35,719 no, aquí no sería, no, no, porque entonces nos falla 219 00:40:35,719 --> 00:40:39,699 no, está diciendo que le faltan los 220 00:40:39,699 --> 00:40:44,400 que le falta implementar los métodos, pero claro, si le doy 221 00:40:44,400 --> 00:40:48,400 me va a implementar todos otra vez, vamos a ver si es que tenemos algo aquí mal 222 00:40:48,400 --> 00:40:51,659 como no veo todo bien 223 00:40:51,659 --> 00:40:58,619 vale, vamos a ver si está dando ningún error 224 00:40:58,619 --> 00:41:07,079 aquí, ah vale, ahora sí 225 00:41:07,079 --> 00:41:10,920 ahora ya debería cogerlo bien 226 00:41:10,920 --> 00:41:14,260 gracias, de todas maneras, pero 227 00:41:14,260 --> 00:41:41,849 Vale, vamos a ver si no nos da error ahora, vale, entonces si nosotros le damos aquí, veis, nos aparece este mensaje, seguro que quiere salir, si le damos al yes, nos cierra el programa, vale, es decir, los Jpanel son muy, bueno, son muy importantes y demás, 228 00:41:41,849 --> 00:41:55,829 pero al final, o sea, los Joption, pero realmente aquí lo que quiero que veáis es que estamos manejando otro tipo de listener, ¿vale? 229 00:41:56,010 --> 00:41:59,769 De otro tipo de interfaz, que es el WindowListener, ¿vale? 230 00:42:00,710 --> 00:42:10,989 Entonces, además del WindowListener, la cosa se puede poner un poquito más complicada y tenéis diferentes tipos, hay multitud, ¿vale? 231 00:42:10,989 --> 00:42:19,449 hay multitud de listeners para poder manejar diferentes diferentes componentes esto obviamente 232 00:42:19,449 --> 00:42:24,429 en este curso no los vais a estudiar no vais a tal pero sí estaría bien que cuando os toque 233 00:42:24,429 --> 00:42:30,849 manejar alguno tengáis siempre en cuenta una cuestión una cuestión cualquiera de ellos es 234 00:42:30,849 --> 00:42:35,650 igual que la acción listener o como el windows que acabamos de ver y eso se trata de interfaces 235 00:42:35,650 --> 00:42:53,409 Y todos implementan una serie de eventos que vais a poder utilizar, o sea, una serie de métodos obligatorios con los cuales vais a poder hacer un montón de cosas. Es decir, esto os abre multitud de opciones. 236 00:42:53,409 --> 00:43:09,349 Por ejemplo, el KeyListener. El KeyListener es, ayer alguien me preguntó, cuando una caja de texto, cuando nos ponemos encima de una caja de texto y alguien le da al Enter, ¿cómo registramos ese evento? ¿Cómo se puede hacer algo? 237 00:43:09,349 --> 00:43:28,050 Bueno, pues eso sería con el KeyListener, ¿vale? De hecho, la persona que me lo preguntó, no sé quién fue, nadie, nadie, yo es que tengo muy mala memoria, tal vez no recuerdo, pero bueno, le invito a que lo pruebe hoy con alguno de los ejercicios que hagamos a continuación. 238 00:43:28,050 --> 00:43:45,730 Y luego, por ejemplo, también tenéis el mouse listener, que pues esto es para poder manejar todos los eventos que puede generar o que se pueden llevar a cabo con un ratón, ¿vale? 239 00:43:46,269 --> 00:43:55,250 Y luego aquí abajo hay una nota que es importante y es que el mismo componente gráfico puede implementar varios listeners, varios diferentes tipos de listeners, ¿vale? 240 00:43:55,250 --> 00:44:22,820 Vale, ¿qué sucede? Como hemos visto aquí, aquí cuando hemos creado el WindowListener, de repente tener que implementar todos estos métodos, pues sí, está muy bien, es estupendo, es una interfaz, nos obliga, 241 00:44:22,820 --> 00:44:45,840 Pero si no vamos a utilizar el Window Day con Needify o el Window Activated y demás y solamente vamos a utilizar el Window Closing, ¿para qué vamos a tener el resto? Bueno, pues para poder ahorrarnos en código y no tener todo este código que al final lo único que genera es basura visual. 242 00:44:45,840 --> 00:45:05,219 porque daros cuenta que cuando estéis trabajando, bueno, cuando estéis trabajando, cuando estéis haciendo un examen, cuando estéis haciendo cualquier proyecto de esto que estamos haciendo, es muy importante que el código esté medianamente ordenado, que no haya código redundante, que los elementos estén llamados correctamente, ¿por qué? 243 00:45:05,219 --> 00:45:20,320 Porque con eso enseguida cuando os dé un fallo vuestro programa, ya sea porque el usuario os ha puesto una pistola en la cabeza o bien porque tenéis que entregar algo y no os da tiempo, pues con esto os vais a ahorrar muchísimo tiempo porque va a ser muy claro. 244 00:45:20,320 --> 00:45:47,360 Es decir, cuanto más claro sea el código, mejor para todos. Cuando digo para todos, quiero decir que cuando estéis trabajando, seguramente vuestro código no será vuestro código, ya va a pertenecer a un equipo y seguramente vosotros estéis en ese proyecto, a lo mejor vamos a poner tres meses y a los cinco meses aparezca otro chaval que acaba de salir del DAO y llegue y le diga, venga, tienes que mejorar este código. 245 00:45:47,360 --> 00:46:08,659 Pues si no se lo habéis dejado muy claro, le estáis haciendo la puñeta al chaval. Al igual que si cuando vosotros empecéis a trabajar, cuando lleguéis a un proyecto y accedáis a un código, si está hecho de forma poco clara, pues os va a tocar pelearos con entender qué coño quería hacer la persona o no. 246 00:46:08,659 --> 00:46:31,360 Al igual que eso también os recomiendo siempre utilizar muchos comentarios, muchos comentarios, de hecho, bueno esto ya va aparte de esta clase, ya aprovecho deciros que por lo general casi todos los proyectos actuales tienen que pasar unos sistemas de calidad bastante fuertes 247 00:46:31,360 --> 00:46:45,739 Y eso que quiere decir que vuestro código va a tener que estar formateado de una manera, X, que se va a exigir, pero aparte siempre os va a pedir el comentar todas las funcionalidades de una manera. 248 00:46:45,739 --> 00:47:03,639 Al igual que lo vais a tener que comentar, lo vais a tener que documentar en documentos de Word y en manuales de usuario. Es decir, el 60% de vuestro trabajo va a ser que contéis qué está haciendo realmente vuestro programa. 249 00:47:03,639 --> 00:47:16,719 el otro 40 va a ser un 15 pensar cómo se hace un 25 el hacerlo y un 60 al contárselo a o bien a 250 00:47:16,719 --> 00:47:23,019 través de comentarios o bien a través de manuales de usuario que os va a tocar vale pero bueno eso 251 00:47:23,019 --> 00:47:29,559 no tiene nada que ver con la clase de hoy ya os lo digo yo porque se me ha bueno para ahorrar 252 00:47:29,559 --> 00:47:35,079 estábamos diciendo que para ahorrarnos tener que implementar todos los métodos que a lo mejor no 253 00:47:35,079 --> 00:47:44,920 vamos a utilizar hay un hay unas clases que son los adapters vale adaptadores entonces todos los 254 00:47:44,920 --> 00:47:53,099 todos los listeners tienen un tipo windows adapter vale aquí si os fijáis tenemos él 255 00:47:53,099 --> 00:48:02,300 perdona que me quedo sin voz y no tengo mucha por ejemplo para el window listener pues tenemos 256 00:48:02,300 --> 00:48:09,039 el window aparte adapter para el key listener tenemos el key adapter para el mouse listener 257 00:48:09,039 --> 00:48:17,239 el mouse adapter vale es decir esto es de mucha de mucha utilidad aquí vamos a ver un ejemplo 258 00:48:17,239 --> 00:48:31,079 entonces lo que vamos a hacer con el ejemplo que teníamos antes vamos a quedar con el window 259 00:48:31,079 --> 00:48:37,059 closing y vamos a quitar todo esto nos dará unos cuantos casques ves ya nos está ya nos está 260 00:48:37,059 --> 00:48:46,139 diciendo que le faltan que le faltan métodos obligatorios vale vamos a eliminar todos los 261 00:48:46,139 --> 00:48:53,929 que tenemos por aquí que no nos interesan y nos vamos a quedar con el que hemos generado antes 262 00:48:53,929 --> 00:48:58,829 que este sí que hemos dicho que queríamos que nos mostrará la ventanita cuando cerramos etcétera 263 00:48:58,829 --> 00:49:05,349 etcétera entonces para que no nos dé este error y para que simplemente podamos utilizar este vamos 264 00:49:05,349 --> 00:49:36,079 a utilizar el adapter si os fijáis aquí y entonces le damos a window adapter y le metemos la clase 265 00:49:36,079 --> 00:49:49,460 y por qué no nos está cogiendo el window adapter que nos dice que no hemos hecho en la importación 266 00:49:49,460 --> 00:50:08,019 Bueno, si os fijáis, ahora estamos utilizando el mismo Windows Listener, pero en lugar de tener que pintar en nuestro código todos los métodos que se supone que la interfaz nos obliga, 267 00:50:08,019 --> 00:50:19,420 simplemente al darle con su adapter, al utilizar su adapter, nos va a aparecer, o sea vamos a poder simplemente utilizar uno de ellos 268 00:50:19,420 --> 00:50:30,659 en este caso el window closing, vamos a ver si funciona, crucemos los dedos, si le damos aquí, seguro que quiere salir 269 00:50:30,659 --> 00:50:38,900 funciona exactamente igual y sin embargo nos hemos ahorrado unas 30 líneas de código 270 00:50:38,900 --> 00:50:47,840 pues siempre es interesante el poder utilizar un adapter. Igual que el adapter, podríamos utilizar cualquiera de los otros métodos. 271 00:50:50,659 --> 00:51:02,940 Y hasta aquí leeríamos, vamos, sería un poco la teoría aplicada con el tema de las interfaces gráficas. 272 00:51:02,940 --> 00:51:07,400 luego ahora a partir de ahora, ahora me preguntáis si hay alguna duda y demás 273 00:51:07,400 --> 00:51:11,920 pero bueno ahora a partir de ahora los ejercicios 274 00:51:11,920 --> 00:51:16,179 bueno ya sabéis cómo funcionan las interfaces gráficas 275 00:51:16,179 --> 00:51:18,679 entonces vamos a hacer una serie de ejercicios si os parece 276 00:51:18,679 --> 00:51:27,019 y los vamos a ir mezclando ya un poco con esa parte que os gustó tanto 277 00:51:27,019 --> 00:51:29,280 que es la de las estructuras dinámicas 278 00:51:29,280 --> 00:51:33,840 con las listas, los hash maps y todo esto, ¿vale? 279 00:51:34,780 --> 00:51:40,820 Así es que, así es que, bueno, pues vamos hasta aquí 280 00:51:40,820 --> 00:51:45,239 para ver si os parece la clase de teoría. 281 00:51:46,079 --> 00:51:50,380 ¿Alguien tiene alguna pregunta, alguna duda con respecto a esto? 282 00:51:52,840 --> 00:51:56,159 ¿No? Bueno, yo voy a subir, el otro día subí una versión 283 00:51:56,159 --> 00:51:58,119 de los apuntes, pero estaba sin terminar. 284 00:51:58,119 --> 00:52:05,719 voy a subir esta versión al Moodle y entonces si ahora estos días estáis haciendo los ejercicios 285 00:52:05,719 --> 00:52:14,739 os recomiendo que tengáis estos ejemplos para que podáis ver un poco cómo llevarlos a cabo, ¿vale? 286 00:52:18,820 --> 00:52:22,019 Paro la grabación...