1 00:00:02,740 --> 00:00:08,400 Y listos. ¿Queréis alguna cosilla que comentemos antes de arrancar? 2 00:00:08,679 --> 00:00:11,400 La última clase antes de la semana que viene. 3 00:00:11,460 --> 00:00:16,140 La semana que viene estáis metidos en plena faena de exámenes, ya desde el viernes creo. 4 00:00:16,140 --> 00:00:20,859 No sé si tendréis vosotros en particular algún examen el viernes, pero ya empiezan. 5 00:00:21,899 --> 00:00:26,260 Y luego toda la semana que viene, no sé si hasta el jueves siguen los exámenes, 6 00:00:26,339 --> 00:00:29,140 con lo cual la semana que viene se suspenden las clases normales. 7 00:00:29,140 --> 00:00:34,020 y ya el siguiente lunes, como ya habréis hecho 8 00:00:34,020 --> 00:00:38,479 el examen de la ordinaria, no sé exactamente 9 00:00:38,479 --> 00:00:42,039 qué día nos pondrán las juntas de evaluación. Si nos ponen juntas de evaluación el lunes 10 00:00:42,039 --> 00:00:45,899 no podría estar claro en los dos sitios, pero no sé qué día nos lo van a poner. Os iré 11 00:00:45,899 --> 00:00:50,460 comunicando si estoy disponible o no en función 12 00:00:50,460 --> 00:00:54,479 de las tareas que nos vayan poniendo aquí en el centro para la tutoría 13 00:00:54,479 --> 00:00:58,259 no de la semana que viene, sino de la siguiente. Y en cualquier 14 00:00:58,259 --> 00:01:00,439 claso probablemente lo que haríamos sería 15 00:01:00,439 --> 00:01:02,200 pues habilitar la posibilidad de que 16 00:01:02,200 --> 00:01:03,979 vengáis a ver el examen por aquí por 17 00:01:03,979 --> 00:01:05,560 el centro para ese lunes 18 00:01:05,560 --> 00:01:09,750 y para hoy pues un poquito 19 00:01:09,750 --> 00:01:11,769 si tenéis alguna duda intentamos 20 00:01:11,769 --> 00:01:13,049 abordarla en primer lugar 21 00:01:13,049 --> 00:01:15,709 y si no pues os cuento un poquito 22 00:01:15,709 --> 00:01:17,609 pues como hacer algunas cositas con 23 00:01:17,609 --> 00:01:19,030 interfaz gráfico que es 24 00:01:19,030 --> 00:01:21,510 de los dos temas últimos temas que tenemos 25 00:01:21,510 --> 00:01:23,609 abiertos quizás el que 26 00:01:23,609 --> 00:01:25,670 bueno pues el que nos pilla 27 00:01:25,670 --> 00:01:27,650 un poco más a mano para poder contarlo algo 28 00:01:27,650 --> 00:01:29,870 y nada os comentaba 29 00:01:29,870 --> 00:01:33,310 también en tutorías anteriores de cara al examen 30 00:01:33,310 --> 00:01:38,129 que los contenidos de estos dos últimos temas, interfaz gráfica y base de datos 31 00:01:38,129 --> 00:01:40,989 pues no se puede decir que no entren porque ahí están en la asignatura 32 00:01:40,989 --> 00:01:45,650 pero su presencia en el examen es escasa, vamos 33 00:01:45,650 --> 00:01:48,969 que no tiene prácticamente trascendencia en lo que es la nota 34 00:01:48,969 --> 00:01:53,609 ni consecuencias en otros ejercicios que se tengan que apoyar 35 00:01:53,609 --> 00:01:56,969 en algo que tuvierais que hacer y que os bloquee el poder hacerlo 36 00:01:56,969 --> 00:02:11,169 Así que en ese aspecto no os preocupéis. Si lo leéis, si tenéis la oportunidad de leer los temas, pues bien, por esa mínima puntuación que pueda aparecer en el examen, por si la cogéis y si no, pues nada, no os preocupéis tampoco en exceso. 37 00:02:11,770 --> 00:02:18,729 Si no tenéis tiempo y lo tenéis que dedicar al resto de asignaturas o al resto de contenidos de esta asignatura. 38 00:02:18,729 --> 00:02:24,009 y bueno, lo que me digáis un poco, no sé si queréis que comentemos alguna cosa 39 00:02:24,009 --> 00:02:37,919 o como es habitual, me pongo a contaros 40 00:02:37,919 --> 00:02:42,780 si no me decís lo contrario, me seguís escuchando bien, ¿verdad? 41 00:02:44,240 --> 00:02:46,000 pues me pongo manos a la obra 42 00:02:46,000 --> 00:02:49,759 ¿me oís verdad? 43 00:02:49,759 --> 00:02:52,759 no me he quedado... 44 00:02:52,759 --> 00:02:55,840 si, vale, bien, bien, por perfecto 45 00:02:55,840 --> 00:02:59,439 pues nada, os cuento, hacemos alguna cosita con interfaz gráfico 46 00:02:59,439 --> 00:03:06,360 para que veáis cómo funciona, y así cerramos un poco la asignatura con esto. 47 00:03:08,560 --> 00:03:17,699 Mirad, en Java, es un lenguaje que tiene mucha más presencia en el entorno web 48 00:03:17,699 --> 00:03:23,560 que en el entorno de escritorio, aquí en esta asignatura no vemos nada de entorno web, 49 00:03:23,740 --> 00:03:27,280 digamos que lo que pretende es sentar las bases de la programación orientada a objetos, 50 00:03:27,280 --> 00:03:31,199 esta asignatura y como hay que apoyarse en algún lenguaje en particular 51 00:03:31,199 --> 00:03:35,180 para ir desarrollándolo, se ha elegido Java, que aparte de que es un lenguaje 52 00:03:35,180 --> 00:03:39,199 con mucha presencia en el entorno productivo 53 00:03:39,199 --> 00:03:42,819 se entiende que es un lenguaje bastante didáctico 54 00:03:42,819 --> 00:03:47,219 es una buena herramienta para entender los conceptos de programación orientada a objetos 55 00:03:47,219 --> 00:03:51,080 Una vez que coges las bases de esta 56 00:03:51,080 --> 00:03:55,080 metodología de programación y empiezas a coger 57 00:03:55,080 --> 00:03:58,699 un poco el rollo a lo que es la algoritmia, trasladarte a otros lenguajes 58 00:03:58,699 --> 00:04:03,020 es bastante sencillo, porque lo difícil de verdad a la hora de programar 59 00:04:03,020 --> 00:04:06,159 es caer en la cuenta de cómo desarrollar los programas, 60 00:04:06,460 --> 00:04:10,599 la mayor parte de los programas siguen esquemas muy parecidos 61 00:04:10,599 --> 00:04:15,120 y es verdad que tiene una sintaxis un poquito distinta a la que hay que acoplarse 62 00:04:15,120 --> 00:04:19,420 cada vez, pero es mucho más sencillo acoplarte a la sintaxis que aprender la algoritmia. 63 00:04:20,879 --> 00:04:22,519 Esto va a servir de entrenamiento 64 00:04:22,519 --> 00:04:26,180 importante para el lenguaje 65 00:04:26,180 --> 00:04:28,720 que vayáis a utilizar luego en un futuro donde 66 00:04:28,720 --> 00:04:29,699 os toque ir. 67 00:04:31,540 --> 00:04:35,019 Las ventanas, bueno, siguen una filosofía 68 00:04:35,019 --> 00:04:37,939 una pizca, ya os digo, vamos a hacer 69 00:04:37,939 --> 00:04:40,860 interfaz gráfico para aplicaciones 70 00:04:40,860 --> 00:04:44,060 de escritorio, es decir, sin descarga vía navegador ni nada 71 00:04:44,060 --> 00:04:46,939 y el interfaz gráfico, bueno, pues 72 00:04:46,939 --> 00:04:50,240 tiene, digamos, la programación un poco guiada por eventos 73 00:04:50,240 --> 00:04:53,560 ¿Esto qué significa? Cuando hasta ahora estamos trabajando 74 00:04:53,560 --> 00:04:56,660 con un programa, pues típicamente empieza en el main 75 00:04:56,660 --> 00:04:59,699 y seguimos una secuencia de instrucciones 76 00:04:59,699 --> 00:05:02,180 digamos de arriba a abajo, si llamamos una función 77 00:05:02,180 --> 00:05:05,399 a un método, ejecuta lo de ese método y luego vuelve 78 00:05:05,399 --> 00:05:07,660 pero tiene una secuencia muy directa. 79 00:05:09,300 --> 00:05:11,480 El año que viene trabajaréis con 80 00:05:11,480 --> 00:05:14,959 multi-hilo, aplicaciones multi-hilo que permitirán 81 00:05:14,959 --> 00:05:18,540 la ejecución de la misma aplicación 82 00:05:18,540 --> 00:05:21,339 en diferentes hilos, diferentes líneas de ejecución 83 00:05:21,339 --> 00:05:24,459 de la misma aplicación, pero también 84 00:05:24,459 --> 00:05:27,399 se tendrá una idea como muy lineal 85 00:05:27,399 --> 00:05:30,279 a la hora de ejecutarse. ¿Qué sucede con 86 00:05:30,279 --> 00:05:33,480 la programación esta que se basa 87 00:05:33,480 --> 00:05:36,540 un poco en eventos? Pues que cuando pasan cosas 88 00:05:36,540 --> 00:05:39,339 se ejecutan trocitos de código. Eclipse 89 00:05:39,339 --> 00:05:42,279 mismo, pues en realidad nosotros tenemos aquí 90 00:05:42,279 --> 00:05:44,980 Eclipse y tendrá 91 00:05:44,980 --> 00:05:47,959 en ejecución el código que corresponda. 92 00:05:47,959 --> 00:05:50,519 pues en este momento estará ahí a la espera de que hagamos cosas. 93 00:05:51,079 --> 00:05:56,199 Y es hacer cosas, es que bien con el ratón pinchemos sobre alguna de sus secciones 94 00:05:56,199 --> 00:05:59,199 o bien con el teclado nos pongamos a escribir cosas. 95 00:06:00,779 --> 00:06:06,000 ¿Sigue una secuencia totalmente lineal, única y exclusivamente esta aplicación? 96 00:06:06,079 --> 00:06:09,800 Pues no, porque si de repente yo pulso sobre la opción de menú run, 97 00:06:10,060 --> 00:06:16,060 pues me salta este menú emergente por aquí para ofrecernos hacer cosas. 98 00:06:16,060 --> 00:06:40,560 Es decir, se ha ejecutado un trocito de código en respuesta al evento producido con un clic del ratón sobre la opción run. De la misma forma, en cualquiera de las opciones o si estamos creando un proyecto, pues sobre esta ventana ahora habrá un evento que detectará que pulso unas teclas en el teclado, que pulso unas letras aquí, el nombre del proyecto que estoy creando. 99 00:06:40,560 --> 00:07:07,589 Y, claro, cuando estoy haciendo esto, para que me lo escriba aquí y para que ahora al pulsar Finish pase algo, interfaz gráfico no me deja por aquí, no sé por qué ahora mismo no me deja, a ver, lo doy de nuevo. 100 00:07:07,990 --> 00:07:15,970 Bueno, pues evidentemente se produce un evento a la hora de escribir que me generará, que ejecutará una parte de código. 101 00:07:15,970 --> 00:07:18,730 pues bueno, vamos a ver cómo conseguimos hacer esto. 102 00:07:19,290 --> 00:07:21,529 Vamos a crear el proyecto de nuevo, no sé a qué había dado antes. 103 00:07:24,360 --> 00:07:26,379 Interfaz gráfico, Finish, Crear proyecto. 104 00:07:32,069 --> 00:07:36,910 En la programación orientada en Java, todo, todo, todo, todo son clases. 105 00:07:37,350 --> 00:07:42,750 Incluso cuando dibujemos ahora una ventana o pongamos un botón o cualquier componente, 106 00:07:43,189 --> 00:07:45,730 siempre es una clase. Todo, todo son clases. 107 00:07:45,730 --> 00:07:50,730 en el aula virtual nos habla de que 108 00:07:50,730 --> 00:07:54,629 Eclipse o NetBeans nos da la opción de pintar ventanas a través de un 109 00:07:54,629 --> 00:07:58,430 interfaz gráfico. Esto por detrás lo que hace es de forma automática generarnos 110 00:07:58,430 --> 00:08:02,689 clases de código porque al final todo se tiene 111 00:08:02,689 --> 00:08:06,449 que ejecutar a través de clases. Aquí lo que os voy a enseñar yo 112 00:08:06,449 --> 00:08:10,610 va a ser, ignorando un poco esta herramienta que nos ofrecen 113 00:08:10,610 --> 00:08:14,470 los interfaces gráficos, vamos a crear las aplicaciones 114 00:08:14,470 --> 00:08:17,769 con ventanitas directamente a través de código. 115 00:08:19,009 --> 00:08:23,389 Para facilitarnos el trabajo, como sucede con otras cosas, 116 00:08:23,550 --> 00:08:28,350 en las colecciones, acordaros que teníamos clases que eran los conjuntos, 117 00:08:28,449 --> 00:08:32,429 que eran las listas, unas implementadas, unas cosas que estaban repetidas 118 00:08:32,429 --> 00:08:36,129 y no estaban repetidas, y nos apoyábamos en librerías, 119 00:08:36,309 --> 00:08:39,370 clases que teníamos en librerías de Java, pues para este cometido 120 00:08:39,370 --> 00:08:43,610 también tenemos clases disponibles que podemos incorporar a nuestros proyectos, 121 00:08:43,610 --> 00:08:47,929 que nos facilitan tremendamente la posibilidad de crear este tipo de aplicaciones. 122 00:08:48,529 --> 00:08:52,950 ¿Qué dos clases son las que se utilizan tradicionalmente? 123 00:08:53,070 --> 00:08:59,590 Pues la AWT, que ciertamente cayó ya en desuso un poco hace tiempo, 124 00:08:59,690 --> 00:09:02,970 aunque mantiene estructuras en las que se apoya la siguiente librería, 125 00:09:03,409 --> 00:09:07,250 y sobre todo la SWIM, para hacer estas aplicaciones de escritorio. 126 00:09:08,610 --> 00:09:13,409 ¿Qué aproximaciones hacemos utilizando estas librerías para hacer nuestros ejercicios? 127 00:09:13,610 --> 00:09:28,909 Lo primero que hacemos es hacer el dibujo de la ventana de escritorio sobre la que trabajamos y luego a continuación darle funcionalidad a cada uno de los eventos que se pueden producir al ir trabajando con ello. 128 00:09:29,490 --> 00:09:32,210 Vamos a ponernos manos a la obra y lo vamos contando según lo vamos haciendo. 129 00:09:32,429 --> 00:09:42,940 Vamos a crear una primera clase, como os digo, aquí, que la vamos a llamar, por ejemplo, BenPrint. 130 00:09:42,940 --> 00:09:46,279 como de ventana principal. 131 00:09:47,440 --> 00:09:49,740 Nuestro proyecto Java, pues nos aparece aquí 132 00:09:49,740 --> 00:09:53,700 la clase BenPrim. Para utilizar, 133 00:09:54,240 --> 00:09:57,059 para que los objetos de la clase BenPrim tengan, 134 00:09:58,220 --> 00:10:01,039 vamos a crear, de hecho, también una, 135 00:10:04,370 --> 00:10:08,629 no sé si crear directamente también una clase, 136 00:10:08,669 --> 00:10:12,490 vamos a crear una clase para que nos llame a las ventanas. En lugar de poner el main aquí, 137 00:10:12,490 --> 00:10:16,889 vamos a crear una clase que sea gráfico 138 00:10:16,889 --> 00:10:19,409 o interfaz gráfico, int graph 139 00:10:19,409 --> 00:10:26,860 y en esta, que es para arrancar el programa, vamos a poner el método main 140 00:10:26,860 --> 00:10:30,539 public void, public static 141 00:10:30,539 --> 00:10:43,679 void main, mirad aquí, en esta clase 142 00:10:43,679 --> 00:10:47,700 vamos a meter el main y en esta otra ya va a ser una ventana, para que tenga 143 00:10:47,700 --> 00:10:51,860 el comportamiento, aquí, como cualquier otra clase con la que trabajamos habitualmente 144 00:10:51,860 --> 00:11:11,049 Podremos definir nuestros métodos y nuestros atributos, pero para que tenga características de clase, vamos a decir que herede Stents de Frame, de la clase JFrame, para que sea de Swim, de la librería Swim. 145 00:11:11,049 --> 00:11:21,889 tenemos las librerías, la librería AWT normalmente tiene componentes o elementos que aparecen pintados 146 00:11:21,889 --> 00:11:30,529 que no incluyen esta J, pues frame, si veis un objeto de la clase frame, normalmente va a venir de objetos 147 00:11:30,529 --> 00:11:40,750 de la clase AWT. Cuando se hizo la librería swing, pues prácticamente mantiene los mismos componentes 148 00:11:40,750 --> 00:11:46,509 que tenía w me parece que menos uno cuenta por ahí en la teoría pero para identificar que es de esa 149 00:11:46,509 --> 00:11:50,950 librería lo que hacen es poner en la jota entonces cuando aparece una jota en algo típicamente va a 150 00:11:50,950 --> 00:11:59,769 ser de la librería swing vamos a importarlo le ofrecemos y fijaros como dice importa jota frame 151 00:11:59,769 --> 00:12:07,590 desde java swing efectiva entonces esto ya va a tener la posibilidad de va a tener por herencia 152 00:12:07,590 --> 00:12:12,690 vent print una serie de métodos y propiedades que están definidos en jota frame y que son los que 153 00:12:12,690 --> 00:12:21,659 nos permiten hacer dibujos de ventanitas propias en ahora continuamos por aquí 154 00:12:23,559 --> 00:12:30,559 normalmente digamos que en lo que se respecta a ventanas tenemos dos bloques de tipos de ventanas 155 00:12:30,559 --> 00:12:36,639 en java en estas librerías disponibles las que vienen de jota frame que son ventanas que vamos 156 00:12:36,639 --> 00:12:43,639 a ir dibujando nosotros con botones con radio buttons con diferentes elementos de los que 157 00:12:43,639 --> 00:12:47,000 típicamente nos aparecen por aquí en las aplicaciones de escritorio 158 00:12:47,000 --> 00:12:49,580 y luego están los j 159 00:12:49,580 --> 00:12:52,480 option pane 160 00:12:52,480 --> 00:12:55,000 que, bueno, pues 161 00:12:55,000 --> 00:12:58,919 completando este tipo de objetos de clase 162 00:12:58,919 --> 00:13:01,039 son las típicas ventanas que nos 163 00:13:01,039 --> 00:13:04,620 aparecen porque nos muestran un mensajito de estas ventanas 164 00:13:04,620 --> 00:13:07,639 emergentes o cuando nos ofrecen 165 00:13:07,639 --> 00:13:09,879 dig si no o cancelar 166 00:13:09,879 --> 00:13:14,340 o cancelar o cosas de estas suelen ser este otro tipo, este otro 167 00:13:14,340 --> 00:13:18,019 grupo, digamos, de ventanas. Durante la clase sacamos 168 00:13:18,019 --> 00:13:21,659 alguna de estas también. Ahora lo que estamos diciendo es que 169 00:13:21,659 --> 00:13:25,960 VentPrint es un JFrame, con lo cual va a ser una ventana que vamos a dibujar 170 00:13:25,960 --> 00:13:32,009 nosotros. Mirad, la ventana, o sea, 171 00:13:32,009 --> 00:13:36,350 esta clase ahora va a tener una serie de propiedades y métodos 172 00:13:36,350 --> 00:13:39,090 heredador de JFrame, más los que pongamos nosotros aquí. 173 00:13:39,090 --> 00:13:44,320 pues podemos hacer, por ejemplo, un constructor aquí, 174 00:13:44,480 --> 00:13:53,250 vent, print, constructor de esta clase, y bueno, vamos a llamar 175 00:13:53,250 --> 00:13:55,750 a otro método que sea iniciarVentana. 176 00:13:56,889 --> 00:14:00,889 Podríamos directamente lo que ponemos aquí en iniciarVentana ponerlo aquí en el constructor, 177 00:14:01,629 --> 00:14:05,190 pero bueno, el ejemplo que tengo más o menos que estuve 178 00:14:05,190 --> 00:14:09,230 organizando para enseñaros lo hacía con esta distribución, vamos a mantenerla. 179 00:14:10,350 --> 00:14:13,129 Y aquí vamos a definir el método, public void 180 00:14:13,129 --> 00:14:23,389 init ventana. Entonces si empezamos a 181 00:14:23,389 --> 00:14:27,549 trabajar sobre esto como una ventana, si ponemos el 182 00:14:27,549 --> 00:14:31,549 dis, aquí podríamos poner los métodos directamente, pero no me ayuda el IDE, 183 00:14:32,190 --> 00:14:35,590 pero si ponemos el dis, me ayuda a la hora de ir mostrándolos. 184 00:14:35,710 --> 00:14:39,269 Luego si queréis quitamos el is, para que me salga esta ayuda aquí en el IDE, 185 00:14:39,269 --> 00:14:43,169 estoy poniendo este dis, que es yo mismo, pero si lo quitamos, pues nos 186 00:14:43,169 --> 00:14:47,190 valdría de igual forma. Pues mirad, alguno de los métodos que tiene típicamente 187 00:14:47,190 --> 00:14:52,090 pues el setSize. El setSize nos permite definir con un ancho y un alto 188 00:14:52,090 --> 00:14:56,450 las dimensiones que va a tener esta ventana. Vamos a definir, por ejemplo, 189 00:14:56,529 --> 00:15:08,159 una ventana de un tamaño de 300 y 300. Método que aplica con this 190 00:15:08,159 --> 00:15:13,220 a los objetos que definamos de esta clase, que está disponible gracias 191 00:15:13,220 --> 00:15:18,440 a la herencia del DJFrame. Y está aplicando, bueno, pues como nos sugiere 192 00:15:18,440 --> 00:15:27,320 el nombre del método está aplicando un tamaño y la sed se titel para poner un título el título 193 00:15:27,320 --> 00:15:32,960 por lo que nos aparece aquí igual que en estos de clic se pone aquí en este de él en este poner 194 00:15:32,960 --> 00:15:39,019 debian 12 6 particular de virtual voz o esta de crisis que pone crisis workspace interfaz gráfico 195 00:15:39,019 --> 00:15:45,259 pues aquí ponemos el título que queremos que tenga esa ventana luego cuando la mostremos vamos a 196 00:15:45,259 --> 00:15:53,379 poner aquí por ejemplo ventana 1 o sea numerarlas porque en el ejercicio según vayamos desarrollando 197 00:15:53,379 --> 00:16:02,909 pues os enseño alguna alguna ventana más se locación esto lo que el se locación lo que 198 00:16:02,909 --> 00:16:07,970 nos indica es la posición dentro de toda la ventana donde en el momento de mostrarse por 199 00:16:07,970 --> 00:16:13,129 primera vez va a aparecer la vez va a aparecer nuestra dentro de la pantalla va a aparecer 200 00:16:13,129 --> 00:16:22,889 nuestra ventana. Entonces, a ver, set location y le podemos decir, por ejemplo, que aparezca en la 201 00:16:22,889 --> 00:16:32,570 posición 100, 100. Bueno, cualquiera. Otra de las características que tiene es set resizable, es decir, 202 00:16:32,690 --> 00:16:38,809 si nos permite, cogiéndola del borde, que se haga más grande o más pequeña. Entonces aquí le vamos a poner, 203 00:16:38,809 --> 00:16:42,690 por ejemplo, false. Cada una de todas estas opciones podríamos poner 204 00:16:42,690 --> 00:16:46,889 algunos otros datos. Si ponemos aquí this, fijaros que 205 00:16:46,889 --> 00:16:50,570 tiene un montón de opciones por aquí. 206 00:16:50,970 --> 00:16:54,730 Algunas más vamos a ir viendo, que en cada 207 00:16:54,730 --> 00:16:58,750 caso podríais ir utilizando unas u otras. De momento no vamos 208 00:16:58,750 --> 00:17:02,169 a dar por satisfechos con esto. Fijaros, frame 209 00:17:02,169 --> 00:17:06,809 está este objeto, en realidad lo que nos está marcando 210 00:17:06,809 --> 00:17:10,910 cómo se construyen las ventanas en Java. 211 00:17:11,089 --> 00:17:13,250 Pues tienen un frame, que vendría a ser un borde, 212 00:17:13,789 --> 00:17:14,809 el frame es el borde, 213 00:17:15,910 --> 00:17:18,349 y dentro de ese borde lo que hacemos es 214 00:17:18,349 --> 00:17:20,890 adjuntarle paneles, un panel. 215 00:17:21,109 --> 00:17:23,910 Digamos que sería como si estuviéramos dibujando un cuadro, 216 00:17:24,150 --> 00:17:25,269 el marco del cuadro, 217 00:17:25,869 --> 00:17:27,970 y el panel sería el lienzo 218 00:17:27,970 --> 00:17:30,690 sobre el que nos pondríamos a pintar nuestro cuadro. 219 00:17:31,190 --> 00:17:34,769 Pues el panel es aquel elemento 220 00:17:34,769 --> 00:17:41,089 sobre el que vamos a ir poniendo los diferentes controles, botones, radio buttons, lo que corresponda. 221 00:17:42,920 --> 00:17:50,140 Todo frame normalmente trae por defecto un panel, aunque aquí vamos a crear un objeto de la clase JPanel 222 00:17:50,779 --> 00:17:55,160 para asociárselo a este frame, que va a sustituir el que trae por defecto en realidad, 223 00:17:55,420 --> 00:18:01,779 o sea que ya dispondría de uno, pero vamos a crear un panel para hacerlo. 224 00:18:01,779 --> 00:18:05,140 Entonces utilizamos el objeto de la clase JPanel, 225 00:18:06,339 --> 00:18:11,700 lo llamamos por ejemplo miPanel, igual a new, JPanel. 226 00:18:14,349 --> 00:18:16,950 Este panel es el que vamos a, digamos, 227 00:18:18,269 --> 00:18:22,390 enganchar al marco que va a tener nuestra ventana, 228 00:18:22,390 --> 00:18:25,529 que viene el marco definido por el JFrame. 229 00:18:29,329 --> 00:18:32,569 Importamos el JPanel también para que me compile 230 00:18:32,569 --> 00:18:48,829 y ya tenemos aquí un panel. A la hora de asociar este nuevo panel a la ventana, lo que vamos a hacer es utilizar el método this.setContentPanel 231 00:18:48,829 --> 00:18:58,230 y le decimos que queremos que al marco de esta ventana, de la ventana principal, se le asocie este panel. 232 00:18:58,230 --> 00:19:19,170 Fijaros, podríamos definir aquí diferentes paneles y durante la ejecución del programa ir poniendo diferentes lienzos, como si tuviéramos un marco de un cuadro en el cual ponemos un lienzo que hemos pintado con una bodega y tenemos otro lienzo por ahí que hemos pintado con una escena en el campo, 233 00:19:19,170 --> 00:19:24,730 dando un paseo a un par de personas, pues al marco, al JFrame 234 00:19:24,730 --> 00:19:28,009 le podríamos ir poniendo diferentes paneles, con lo cual 235 00:19:28,009 --> 00:19:32,789 es el mismo objeto de esta ventana con diferentes paneles, si los tuviéramos 236 00:19:32,789 --> 00:19:35,789 iría mostrando diferentes contenidos en cada momento 237 00:19:35,789 --> 00:19:40,549 en particular ahora de momento vamos a trabajar con un panel solo, este 238 00:19:40,549 --> 00:19:44,509 que acabamos de definir aquí, dejo por aquí hueco porque nos va a interesar 239 00:19:44,509 --> 00:19:50,720 ir haciendo cosas por aquí entre medias, después de asociar 240 00:19:50,720 --> 00:19:54,480 el panel este, una de las cosas que podríamos hacer es 241 00:19:54,480 --> 00:19:58,700 indicar que queremos que esté visible 242 00:19:58,700 --> 00:20:02,519 podemos tener una ventana creada, fijaros, un objeto 243 00:20:02,519 --> 00:20:05,799 creado, cuando hagamos un new de un objeto de esta ventana 244 00:20:05,799 --> 00:20:10,480 en memoria RAM tendremos la ventana, pero podrá estar 245 00:20:10,480 --> 00:20:16,160 a la vista en la pantalla o podrá estar oculta. Entonces eso lo podemos 246 00:20:16,160 --> 00:20:19,700 manejar con el método set visible del 247 00:20:19,700 --> 00:20:23,319 JFrame, se ve visible, vamos a ponerle aquí true, queremos que se vea 248 00:20:23,319 --> 00:20:29,799 y de momento vamos a hacer una primera ejecución con esto 249 00:20:29,799 --> 00:20:35,690 esta ventana, cuando hagamos el new, llamará al constructor 250 00:20:35,690 --> 00:20:39,769 hará una inicialización de la ventana, dará un tamaño 251 00:20:39,769 --> 00:20:43,329 un título, dirá posiciona en la pantalla en un determinado sitio 252 00:20:43,329 --> 00:20:48,089 no permitas que se pueda modificar su tamaño 253 00:20:48,089 --> 00:20:51,869 al marco de esta ventana, aplícale 254 00:20:51,869 --> 00:20:58,309 este lienzo este panel que hemos definido por aquí y a lo que esté visible desde aquí que 255 00:20:58,309 --> 00:21:06,890 tenemos el main lo que vamos a hacer es como hemos hecho siempre durante el curso vamos a 256 00:21:06,890 --> 00:21:13,549 crear un objeto que vamos a llamar mi ventana 1 por ejemplo de la clase ven print que tendrá 257 00:21:13,549 --> 00:21:19,710 las características de todo lo definido aquí más todo el heredador de jota frame cuando hagamos 258 00:21:19,710 --> 00:21:30,579 ahora el new, se hará su reserva en memoria y llamaremos a la ejecución del constructor y el 259 00:21:30,579 --> 00:21:36,200 constructor llama este método init ventana y este init ventana hace esto, da estos valores y 260 00:21:36,200 --> 00:21:45,619 finalmente la pone visible. Entonces si cogemos y damos aquí una ejecución al programa, pues fijaros 261 00:21:45,619 --> 00:21:53,960 cómo me ha salido la ventanita, la veis aquí, en esta ventanita tenemos que tiene un tamaño de 300 262 00:21:53,960 --> 00:21:58,160 por 300, bueno, pues nos creemos que es 300 por 300, es cuadradita, eso sí que es 263 00:21:58,160 --> 00:22:02,079 cierto. Inicialmente me ha salido como por aquí, que es el 100-100 este 264 00:22:02,079 --> 00:22:06,240 con un título ventana 1 y fijaros 265 00:22:06,240 --> 00:22:10,380 que aunque me venga aquí con el ratón, no me da la opción de redimensionarla 266 00:22:10,380 --> 00:22:13,940 y por aquí, por aquí tampoco, también lo tiene 267 00:22:13,940 --> 00:22:18,059 deshabilitado, veis, en el que se haga mayor o menor y con el 268 00:22:18,059 --> 00:22:22,180 ser visible true, pues se ha mostrado. Al marco 269 00:22:22,180 --> 00:22:29,319 del frame aplicado un panel el lienzo que ha sido mi panel que en principio lógicamente se genera 270 00:22:29,319 --> 00:22:37,150 sin ningún contenido con lo cual tenemos una ventanita que por aquí está en blanco para la 271 00:22:37,150 --> 00:22:43,890 aplicación para seguir metiendo cosas si tenéis dudas me va a ir diciendo como siempre vamos a 272 00:22:43,890 --> 00:22:52,180 vamos a añadir alguna cosita aquí a la ventana entonces lo que haremos será fijaros vamos a 273 00:22:52,180 --> 00:22:58,079 construir como os digo en java todo todo todo son clases y dentro de los componentes que habréis 274 00:22:58,079 --> 00:23:04,220 podido ver en el tema pues hay botones hay bueno pues hay un montón de ello vamos a trabajar hoy 275 00:23:04,220 --> 00:23:09,420 con tres o cuatro para ver la filosofía y luego cada uno tendrá alguna característica un poquito 276 00:23:09,420 --> 00:23:15,099 particular que con más clases lo desarrollaremos más y si os veis en la necesidad como no vamos a 277 00:23:15,099 --> 00:23:20,599 tener más clases pues os tocará investigarlas pero un poco vamos a sentar cómo funcionan en 278 00:23:20,599 --> 00:23:26,240 general todos los componentes y las pautas que hay que ir dando para ponerlo en marcha. Uno de los 279 00:23:26,240 --> 00:23:32,579 componentes más típicos son los botones. Entonces vamos a poner JButton. Vamos a crear un botón. 280 00:23:34,099 --> 00:23:44,200 Botón, por ejemplo, vamos a llamarlo botón saludar. Vamos a poner aquí. Vamos a crear como 281 00:23:44,200 --> 00:23:53,259 atributo de clase un botón. Fijaros que como es J será de la librería Swim y vamos a importarlo. 282 00:23:55,500 --> 00:24:16,700 Aquí vamos a poner un comentario botones. Insisto, fijaros cómo estamos definiendo una referencia, no hemos hecho el new, lo podríamos hacer aquí o lo podemos hacer abajo en el código para un objeto de la clase JButton que pertenece, como veis aquí, JButton a la librería Swing. 283 00:24:16,700 --> 00:24:25,119 pues vamos a ver que tenemos que hacer para que este botón termina apareciendo en el JFrame 284 00:24:25,119 --> 00:24:29,940 vamos a poner aquí botones, entonces lo primero que vamos a hacer va a ser 285 00:24:29,940 --> 00:24:40,420 hacer el new, vamos a hacer un new para esta referencia, esto lo podríamos haber hecho también aquí 286 00:24:40,420 --> 00:24:46,380 lo podemos poner aquí y los botones permiten varios constructores 287 00:24:46,380 --> 00:24:51,059 uno que está vacío y luego permite también poner constructores 288 00:24:51,059 --> 00:24:55,019 un constructor sobrecargado con un string, donde pongamos aquí 289 00:24:55,019 --> 00:24:59,140 un texto del string y es el contenido que va a aparecer luego en el botón. 290 00:25:00,319 --> 00:25:01,900 Entonces damos de aquí de alta el botón. 291 00:25:10,490 --> 00:25:13,609 Bien, otra cosa, contaros otra cosa, cuando 292 00:25:13,609 --> 00:25:17,690 vamos a dibujar una ventana, 293 00:25:18,309 --> 00:25:21,089 una nueva ventana, como la que estamos haciendo ahora, 294 00:25:21,829 --> 00:25:24,690 existe la posibilidad de que tenga diferentes layout. 295 00:25:24,690 --> 00:25:31,630 esto qué significa que según vayamos añadiendo componentes botones por ejemplo diferentes 296 00:25:31,630 --> 00:25:36,690 elementos en la ventana por defecto se vayan colocando de una determinada manera entonces 297 00:25:36,690 --> 00:25:42,670 hay unos cuantos layout yo de verdad que no conozco muchos hay uno que permite situar las 298 00:25:42,670 --> 00:25:49,390 cosas según posiciones en la ventana entonces te define un espacio norte un espacio es este 299 00:25:49,390 --> 00:25:54,230 un espacio este un espacio sur y un espacio central y los componentes que pones en cada 300 00:25:54,230 --> 00:25:58,410 unos espacios se van poniendo en esa zona. Si tú dices, quiero que me crees un botón 301 00:25:58,410 --> 00:26:01,769 y ponlo en la zona sur, pues coge y ese botón cuando lo añades 302 00:26:01,769 --> 00:26:05,990 te lo pone por aquí abajito. Dices, pónmelo en la zona norte y te lo pone aquí. 303 00:26:06,430 --> 00:26:09,990 Pónmelo en la zona centro y te lo pone aquí. Hay otros layouts 304 00:26:09,990 --> 00:26:14,289 que lo que hacen es ir poniéndote de forma secuencial de izquierda 305 00:26:14,289 --> 00:26:18,009 a derecha como si estuviéramos escribiendo en un cuaderno y dices, el primer botón 306 00:26:18,009 --> 00:26:21,809 te lo pone justo a la izquierda aquí y el siguiente te lo pone a continuación 307 00:26:21,809 --> 00:26:23,789 como si estuviéramos, ya os digo, escribiendo aquí. 308 00:26:24,190 --> 00:26:25,910 Si pones otro botón. Y si ahora pones un combo 309 00:26:25,910 --> 00:26:27,910 vos, te lo pondría aquí. Y si ahora 310 00:26:27,910 --> 00:26:28,849 pones otra cosa, aquí. 311 00:26:29,650 --> 00:26:31,950 Y cuando se completa esto, te salte y te empieza a poner 312 00:26:31,950 --> 00:26:33,809 como en otra línea, componentes 313 00:26:33,809 --> 00:26:34,269 por aquí. 314 00:26:35,869 --> 00:26:37,849 Según el diseño de cada una de las ventanas, te puede 315 00:26:37,849 --> 00:26:39,829 interesar uno u otro porque te resulte más 316 00:26:39,829 --> 00:26:40,250 cómodo. 317 00:26:41,710 --> 00:26:43,730 Yo casi tengo la costumbre de decir, 318 00:26:43,890 --> 00:26:45,690 mira, quiero total libertad para 319 00:26:45,690 --> 00:26:47,890 colocar los componentes. Luego, si nos da tiempo, 320 00:26:47,990 --> 00:26:49,670 utilizamos un ejemplo, por ejemplo, 321 00:26:49,670 --> 00:26:51,529 del layout este que ofrece 322 00:26:51,529 --> 00:26:56,930 la posibilidad de norte, sureste, oeste y centro, pero este primer ejemplo, estos primeros ejemplos, 323 00:26:56,990 --> 00:27:02,130 por lo menos lo voy a hacer con total libertad. Entonces, para eso, lo que hacemos en la ventana 324 00:27:02,130 --> 00:27:12,309 es decirle, no recuerdo si es en la ventana o es en el panel, quizás sea en el panel, creo que es 325 00:27:12,309 --> 00:27:18,269 en el panel, entonces vamos a decir que el panel tenga un set layout, aquí definimos el tipo de 326 00:27:18,269 --> 00:27:25,869 layout y según lo que pongamos aquí, creo que en la teoría os habla de diferentes layouts, se comportaría 327 00:27:25,869 --> 00:27:31,109 de una forma norte, sureste, oeste, uno secuencial uno detrás de otro, pero si le ponemos la opción 328 00:27:31,109 --> 00:27:36,130 null, es decir, ninguno, lo que estamos diciendo es no consideres por defecto ningún layout que voy a ir 329 00:27:36,130 --> 00:27:42,829 colocando yo las cosas a mano. Vamos a hacer este ejercicio así, totalmente con el control total de 330 00:27:42,829 --> 00:27:48,150 dónde ir situando los diferentes controles, en este caso por ejemplo un botón dentro del panel 331 00:27:48,150 --> 00:27:51,329 que a su vez el panel está metido en el marco 332 00:27:51,329 --> 00:27:54,809 con lo cual será como van a aparecer distribuidos los 333 00:27:54,809 --> 00:28:00,049 componentes en nuestra ventana. Y para hacerlo con toda libertad 334 00:28:00,049 --> 00:28:04,289 lo hacemos de esta forma. Si lo hacemos de esta forma, ahora este botón 335 00:28:04,289 --> 00:28:08,130 podría ir en cualquier sitio. ¿Y ese cualquier sitio cómo lo 336 00:28:08,130 --> 00:28:12,109 definimos? Pues lo que decimos es que el objeto de botón 337 00:28:12,109 --> 00:28:15,369 saludar y le decimos set bones 338 00:28:15,369 --> 00:28:35,369 Y este nos permite poner un objeto de la clase rectángulo, fijaros, o está sobrecargado y nos permite decir en qué posición X e Y está el punto, en este caso el botón, de arriba a la izquierda, qué ancho tiene y qué alto tiene, con cuatro parámetros. 339 00:28:35,369 --> 00:28:41,279 parámetros. Entonces, por ejemplo, para este botón vamos a decirle que esté 340 00:28:41,279 --> 00:28:45,700 en X en la posición 10, en Y 341 00:28:45,700 --> 00:28:49,799 en la posición 20, que tenga un ancho de 100, 342 00:28:50,799 --> 00:28:53,599 esto ya dependería del diseño que tengáis en vuestra 343 00:28:53,599 --> 00:28:57,859 ventana, y de 20. Decimos, este botón, cuando se coloque, 344 00:28:57,859 --> 00:29:01,579 que se coloque en estas posiciones. Si el layout del panel 345 00:29:01,579 --> 00:29:05,819 es uno de los otros, seguramente ignore el 346 00:29:05,819 --> 00:29:09,839 setBounce este. Pero si es nulo, es decir, no está obligando 347 00:29:09,839 --> 00:29:13,779 mi panel a una distribución de los componentes en particular, sino que le he dicho 348 00:29:13,779 --> 00:29:17,839 nulo porque quiero tener yo el control, este botón, ¿en qué posición se va a colocar en el 349 00:29:17,839 --> 00:29:22,180 layout? En el panel, en estas. Considerando 350 00:29:22,180 --> 00:29:25,859 este como punto de arriba a la izquierda, en el 351 00:29:25,859 --> 00:29:33,970 botón, el ancho y el alto. Y luego lo que hacemos es 352 00:29:33,970 --> 00:29:40,150 hemos definido un panel, este panel se lo 353 00:29:40,150 --> 00:29:47,470 añadido al frame hemos definido un botón y antes os decía podríamos tener diferentes paneles y 354 00:29:47,470 --> 00:29:53,809 luego ir aplicando diferentes paneles al mismo frame al mismo a la misma ventana entonces este 355 00:29:53,809 --> 00:29:58,529 botón si tuviéramos diferentes paneles en cuál de todos los paneles aparecería si tuviéramos 356 00:29:58,529 --> 00:30:03,549 distintos aquí parece que estamos tenemos tendencia que vaya a estar en este no porque 357 00:30:03,549 --> 00:30:08,829 es el nuevo que hemos definido pero en cuál de todos ellos si tuviéramos varios que posteriormente 358 00:30:08,829 --> 00:30:14,650 iríamos poniendo unos otros en el jota frame pues para indicar en qué panel va lo que hacemos es 359 00:30:14,650 --> 00:30:23,170 indicarlo de esta forma decimos mi panel que es el panel este punto adb añádeme fijaros que aquí 360 00:30:23,170 --> 00:30:31,170 me dice añádeme un componente un componente que va a ser en este caso quien el botón saludar entonces 361 00:30:31,170 --> 00:30:37,549 este botón que hemos definido aquí una referencia del cual hemos hecho aquí un new que tenga el 362 00:30:37,549 --> 00:30:44,650 texto saludar digo cómo se va a posicionar en un layout el cual hemos indicado en un panel que 363 00:30:44,650 --> 00:30:50,769 hemos indicado que su layout sea nul y ahora decimos que lo añada. Fijaros cómo ahora si cojo y ejecuto 364 00:30:50,769 --> 00:31:02,259 la aplicación, me aparece ya el botoncito este, ahí tenemos el botón, botón con texto saludar en la 365 00:31:02,259 --> 00:31:12,019 posición 10x20i con un ancho de 100 y un alto de 20 y hemos añadido este botón a este panel y este 366 00:31:12,019 --> 00:31:16,880 panel a este frame con lo cual dentro del frame que contiene el panel que será esto que está aquí 367 00:31:16,880 --> 00:31:25,519 en gris aparece el botón saludar todo lo que estamos haciendo hasta ahora es estético si 368 00:31:25,519 --> 00:31:31,819 nosotros pulsamos el botón que sucede no sucede nada veis bueno sucede que da la sensación de 369 00:31:31,819 --> 00:31:38,720 estarse pulsando pero en realidad no tiene ninguna consecuencia sobre sobre nada pues una vez que 370 00:31:38,720 --> 00:31:46,160 hemos trabajado sobre la parte diseño gráfico de un componente de los diferentes componentes que 371 00:31:46,160 --> 00:31:50,059 iremos poniendo por aquí en particular hemos empezado con un botón ahora vamos a hacer que 372 00:31:50,059 --> 00:31:57,880 esto tenga sentido y como os decía la jugada se divide entre dibujo y comportamiento cómo hacer 373 00:31:57,880 --> 00:32:00,680 las cosas. Para definir 374 00:32:00,680 --> 00:32:03,799 y nuevamente continuamos con 375 00:32:03,799 --> 00:32:06,720 el trabajo siempre en clases, porque en Java 376 00:32:06,720 --> 00:32:09,680 todos son clases. Entonces, lo que decimos aquí 377 00:32:09,680 --> 00:32:12,880 ahora para el botón este, decimos el botón saludar, decimos 378 00:32:12,880 --> 00:32:15,539 add, action listener 379 00:32:15,539 --> 00:32:20,900 hay muchas alternativas para hacer cosas 380 00:32:20,900 --> 00:32:22,279 pero esta es la típica en un botón 381 00:32:22,279 --> 00:32:26,079 aquí lo que estamos diciendo es, mira 382 00:32:26,079 --> 00:32:29,480 para este objeto, que es un botón 383 00:32:29,480 --> 00:32:32,880 vamos a activar un escuchador 384 00:32:32,880 --> 00:32:35,900 para cuando suceda un evento, es decir 385 00:32:35,900 --> 00:32:38,680 lo que decía antes de Eclipse, cuando suceda y con el ratón 386 00:32:38,680 --> 00:32:41,700 yo le doy aquí a run, pues sucede un evento 387 00:32:41,700 --> 00:32:44,779 pues ponte que la aplicación esté dándose cuenta 388 00:32:44,779 --> 00:32:47,900 si con el ratón pulso este run, como opción de menú 389 00:32:47,900 --> 00:32:50,980 en particular estamos añadiendo, poniéndolo a la escucha 390 00:32:50,980 --> 00:32:54,000 para que cuando se produzca 391 00:32:54,000 --> 00:32:56,960 tenga un escuchador, una orejita ahí puesta 392 00:32:56,960 --> 00:32:59,759 para cuando se produzca una acción. ¿Sobre quién? Sobre este elemento. 393 00:33:00,940 --> 00:33:03,960 Y aquí nos dice, aparece un nulo ahora por defecto. 394 00:33:05,140 --> 00:33:10,700 Aquí lo que vamos a indicar va a ser la clase donde vamos a poner el código 395 00:33:10,700 --> 00:33:17,559 que se tiene que ejecutar cuando se produzca una acción sobre este botón. 396 00:33:18,039 --> 00:33:26,019 Entonces aquí podríamos, a ver qué tiempo nos va permitiendo hacer cosas. 397 00:33:26,019 --> 00:33:48,420 Luego podemos crear una clase diferente. Otra opción que tenemos es decir que el código para atender este botón sea esta misma clase. Si ponemos aquí this, esto lo que quiere decir es que esta misma clase, BenPrint, tendrá el código para atender aquellas acciones que hay que ejecutar cuando se produzca una acción sobre el botón pulsar. 398 00:33:48,420 --> 00:34:04,880 Bueno, aquí se me queja, ¿verdad? Dice que he metido esto. ¿Qué es lo que sucede? Que esta clase no está preparada para hacer esto. 399 00:34:04,880 --> 00:34:32,320 Entonces, lo que tenemos que hacer aquí es implementar, ponemos un implement, un interfaz, que es el interfaz ActionListener. Fijaros, he dicho, añade ActionListener al botón saludar y esperamos que la clase que lo atienda sea esta misma. 400 00:34:32,320 --> 00:34:35,280 y ahora lo que decimos es que esta clase 401 00:34:35,280 --> 00:34:40,159 que precisa implementar los métodos de ActionListener 402 00:34:40,159 --> 00:34:43,320 porque hemos dicho aquí this, le ponemos aquí implements 403 00:34:43,320 --> 00:34:45,219 ponerlo por aquí, me dice 404 00:34:45,219 --> 00:34:51,119 que importe el JavaEventActionListener 405 00:34:51,119 --> 00:34:55,340 y ahora como hemos implementado, hemos puesto aquí un interfaz 406 00:34:55,340 --> 00:34:58,599 me deja de compilar porque no tengo los métodos necesarios 407 00:34:58,599 --> 00:35:00,619 a los que me obliga esta interfaz 408 00:35:00,619 --> 00:35:06,119 escojo y digo ahora añádeme los métodos no implementados 409 00:35:06,119 --> 00:35:10,679 y fijaros que me ha añadido este método, el ActionPerformance 410 00:35:10,679 --> 00:35:14,619 ActionPerformance es el método al que me obliga el ActionList 411 00:35:14,619 --> 00:35:20,110 tener este. ¿Qué sucede? Con esto que habíamos 412 00:35:20,110 --> 00:35:24,030 puesto antes, habíamos conseguido, voy a bajar esto abajo 413 00:35:24,030 --> 00:35:27,610 pintar el botón y ahora estamos 414 00:35:27,610 --> 00:35:31,909 buscando la técnica que Java nos permite para que cuando 415 00:35:31,909 --> 00:35:35,409 pase algo sobre el botón, porque hemos dicho, oye, pon una orejita 416 00:35:35,409 --> 00:35:40,010 con el listener para cuando pase algo en este botón y que el código 417 00:35:40,010 --> 00:35:42,449 que lo considere esté en esta clase, 418 00:35:44,289 --> 00:35:48,130 como es ActionListener que estamos añadiendo, metemos el interfaz 419 00:35:48,130 --> 00:35:51,530 e incluir esta interfaz me obliga a tener 420 00:35:51,530 --> 00:35:55,650 este método. Entonces fijaros, si ponemos aquí un 421 00:35:55,650 --> 00:36:03,599 system.out.println pulsando 422 00:36:03,599 --> 00:36:07,559 un botón y ahora ejecutamos 423 00:36:07,559 --> 00:36:11,639 System.out, escritura por consola, nos escribirá aquí 424 00:36:11,639 --> 00:36:17,949 y ahora ejecutamos. Mirad como al pulsar el botón 425 00:36:17,949 --> 00:36:21,630 nada más arrancar, hemos puesto 426 00:36:21,630 --> 00:36:25,590 una acción listener, pues estará algo dentro del programa, la escucha 427 00:36:25,590 --> 00:36:29,349 a ver si pasa algo en este botón. Cuando hagamos un clic 428 00:36:29,349 --> 00:36:34,010 con el ratón en el botón, es de esperar que se ejecute 429 00:36:34,010 --> 00:36:37,210 ese método, entonces damos aquí, veis como me saca aquí pulsando botón 430 00:36:37,210 --> 00:36:40,170 el dibujo gráfico del botón ya lo hemos 431 00:36:40,170 --> 00:36:42,949 asociado con una zona de código donde podremos poner 432 00:36:42,949 --> 00:36:45,750 lo que tenga que pasar cuando pulsemos este botón 433 00:36:45,750 --> 00:36:49,090 en un programa será escribir en un fichero, en otro será 434 00:36:49,090 --> 00:37:01,199 lo que vaya tocando, vamos a poner un segundo botón 435 00:37:01,199 --> 00:37:06,469 lo hago así un poquito rápido porque esto ya es 436 00:37:06,469 --> 00:37:09,469 un poco complicado, hacemos botón saludar 2 437 00:37:09,469 --> 00:37:11,670 entonces aquí en la zona de botones 438 00:37:11,670 --> 00:37:14,510 voy a copiar todo esto 439 00:37:14,510 --> 00:37:21,630 digo botón saludar, le cambio aquí el texto, 2 440 00:37:21,630 --> 00:37:25,289 este otro botón pues lo vamos a colocar un poco desplazado 441 00:37:25,289 --> 00:37:29,429 entonces por ejemplo cambiamos la X, decimos que se posicione 442 00:37:29,429 --> 00:37:33,329 en X150 con la misma Y 443 00:37:33,329 --> 00:37:35,530 estará a la misma altura, mismo ancho y mismo alto 444 00:37:35,530 --> 00:37:41,110 decimos sal 2, aquí decimos que estamos trabajando sobre el botón 2 445 00:37:41,110 --> 00:37:44,909 este botón ahora mismo no está asociado a ningún panel 446 00:37:44,909 --> 00:37:48,630 no aparecería en ningún sitio, pero le decimos mi panel add2 447 00:37:48,630 --> 00:37:50,889 y también queremos que tenga 448 00:37:50,889 --> 00:37:56,630 que se ponga a la escucha de cuando pase algo en este botón, con lo cual 449 00:37:56,630 --> 00:38:00,389 le decimos botón2, addActionListener y la clase donde 450 00:38:00,389 --> 00:38:04,690 se va a gestionar, donde va a estar el código, donde se va 451 00:38:04,690 --> 00:38:08,750 a gestionar el clic sobre este botón 452 00:38:08,750 --> 00:38:12,530 si le damos aquí y volvemos a ejecutar 453 00:38:12,530 --> 00:38:16,010 fijaros ahora nos aparecen ya dos botones 454 00:38:16,010 --> 00:38:17,510 si damos saludar 455 00:38:17,510 --> 00:38:19,070 nos dice pulsando botón, si damos 456 00:38:19,070 --> 00:38:21,570 sal 2, también nos sale 457 00:38:21,570 --> 00:38:26,389 ¿qué le hemos dicho al programa? 458 00:38:28,090 --> 00:38:29,829 le hemos dicho que en ambos casos 459 00:38:29,829 --> 00:38:32,650 pongo un ActionListener y este ActionListener 460 00:38:32,650 --> 00:38:34,929 se ha asociado con el ActionPerformat 461 00:38:34,929 --> 00:38:36,630 y en este hemos dicho que 462 00:38:36,630 --> 00:38:38,849 muestre por pantalla pulsando 463 00:38:38,849 --> 00:38:40,889 botón, con lo cual los dos nos muestran 464 00:38:40,889 --> 00:38:42,650 pulsando botón 465 00:38:42,650 --> 00:38:46,340 en consola 466 00:38:46,340 --> 00:39:07,340 Pero claro, en una aplicación normal nos interesaría que pulsar un botón hiciera unas cosas y pulsar otro botón hiciese otras. Ambos dos están ejecutando este método, con lo cual no sé distinguir si este pulsando botón que me ha escrito es porque he dado clic al botón saludar o al botón saldos. 467 00:39:07,340 --> 00:39:29,780 ¿Cómo podemos gestionar esto? Pues mirad, aquí podríamos coger, fijaros cómo este método aquí coge, recibe un objeto y este objeto nos da información, contiene información del momento en el que se lanza el evento, en el momento en el que en este caso pulsamos los botones. 468 00:39:29,780 --> 00:39:33,039 entonces aquí lo que podríamos hacer es 469 00:39:33,039 --> 00:39:34,320 si ponemos if 470 00:39:34,320 --> 00:39:38,820 fijaros que estamos programando en java 471 00:39:38,820 --> 00:39:41,440 como hemos hecho durante todo el curso 472 00:39:41,440 --> 00:39:45,260 en sus métodos considerando conceptos como interfaces 473 00:39:45,260 --> 00:39:47,139 que hemos añadido métodos 474 00:39:47,139 --> 00:39:49,860 la clase la hemos definido como una clase 475 00:39:49,860 --> 00:39:53,019 la hemos seleccionado de jframe para que tenga 476 00:39:53,019 --> 00:39:57,079 todas las funciones de comportamiento como una ventana 477 00:39:57,079 --> 00:39:59,019 de escritorio 478 00:39:59,019 --> 00:40:26,750 entonces ponemos aquí if e get source, aquí me indica la fuente de quien ha ejecutado este evento, si decimos que este es igual, si ha sido el botón, botón saludar, de esta forma me permite diferenciar entre un botón y otro, aquí ponemos un else if por ejemplo, si en lugar de botón saludar ha sido el botón saludar 2, 479 00:40:26,750 --> 00:40:42,530 Y ahora aquí ya podríamos poner código que nos diese respuesta a pulsar uno de los botones, escribir un fichero en no sé qué, abrir otra ventana, lo que correspondiese, simplemente para ver su funcionamiento. 480 00:40:42,530 --> 00:41:14,539 Vamos a poner un system out, botón saldos aquí y aquí botón saludar. Fijaros ahora si pulso el botón saludar, efectivamente dice pulsando saludar, se ha dado cuenta con el guest source que es este botón, aunque los dos hacen que se ejecute el mismo método, con ese if ya se ejecuta el código asociado al pulsado de este botón. 481 00:41:14,539 --> 00:41:32,940 Si pulsamos Sal 2, el mensaje que nos muestra aquí abajo ya es pulsando Sal 2. Aunque en ambos casos utilizamos el mismo Listener, que es el ActionListener, podemos diferenciar si el método se ha ejecutado desde una fuente o desde otra. 482 00:41:32,940 --> 00:41:41,559 diferente con el getSource. Aquí tenemos con nuestro diseño, nuestro programa, 483 00:41:41,820 --> 00:41:47,039 necesitaríamos uno, dos, tres, veinte botones, pues podríamos colocar 484 00:41:47,039 --> 00:41:51,599 tanto como fueran necesarios de esta forma, cada uno de ellos con un objeto 485 00:41:51,599 --> 00:41:56,659 de una clase JButton. En este caso todos ellos lo podríamos asociar a este 486 00:41:56,659 --> 00:42:02,159 listener, hay más listeners, ahora veremos alguno más. Este listener al implementar 487 00:42:02,159 --> 00:42:07,320 interfaz nos obliga a añadir este método solamente uno en la acción performance 488 00:42:07,320 --> 00:42:12,360 que es el que se ejecuta cuando pasan cosas sobre una acción listener y con el 489 00:42:12,360 --> 00:42:22,619 guest source podemos diferenciar entre unos y otros otro componente típico que 490 00:42:22,619 --> 00:42:28,260 aparece en prácticamente todas las ventanas son este menú principal pues 491 00:42:28,260 --> 00:42:35,699 este menú principal se también lo vamos a crear a partir de objetos de 492 00:42:35,699 --> 00:42:44,179 objetos de clases que tenemos en la librería suene vamos a poner aquí menú y vamos a ponernos a la 493 00:42:44,179 --> 00:42:53,159 marcha con él mira pues vamos a definir los menús se estructuran en jota menú bar un objeto de este 494 00:42:53,159 --> 00:43:00,719 de este tipo que vendría a ser el elemento que nos permite tener un menú aquí arriba y ahora 495 00:43:00,719 --> 00:43:08,639 vamos a añadiendo elementos a este menor por ejemplo llamamos barra menos vamos a importarlo 496 00:43:08,639 --> 00:43:12,440 de Swing, como empieza por J 497 00:43:12,440 --> 00:43:14,940 ya teníamos la sospecha de que iba a ser de la librería 498 00:43:14,940 --> 00:43:19,280 Swing, al menú 499 00:43:19,280 --> 00:43:23,059 digamos que eso es la barra 500 00:43:23,059 --> 00:43:24,840 cada uno de los elementos 501 00:43:24,840 --> 00:43:27,059 principales que tiene aquí, File, Edit 502 00:43:27,059 --> 00:43:28,800 Source, cada uno de estos serían 503 00:43:28,800 --> 00:43:31,320 objetos de la clase JMenu 504 00:43:31,320 --> 00:43:33,260 entonces por ejemplo 505 00:43:33,260 --> 00:43:34,619 podemos definir una 506 00:43:34,619 --> 00:43:37,519 un 507 00:43:37,519 --> 00:43:39,599 elemento que sea 508 00:43:39,599 --> 00:43:40,900 MenúArchivo 509 00:43:40,900 --> 00:43:46,130 o el que aquí pone File, pues MenúArchivo 510 00:43:46,130 --> 00:44:00,170 Hemos definido el JBar, que sería el conjunto, digamos, una estructura que nos permite definir un menú y ahora un JMenu, que sería uno de estos. File, pues lo vamos a llamar menú archivo de ese objeto. Lo importamos también. 511 00:44:00,170 --> 00:44:35,420 Y ahora al pulsar sobre File nos aparecen diferentes opciones, aquí veis, en Edit también, pues cada una de estas opciones en Java las podemos definir como JMenuItem y por ejemplo vamos a definir el ítem Salir, todos ellos de la librería Swing que tenemos en Java. 512 00:44:35,420 --> 00:44:40,719 vamos a poner aquí, que es lo primero que tenemos que hacer si son referencias a objetos de clase 513 00:44:40,719 --> 00:44:45,559 podríamos haberlo hecho aquí, pero lo podemos hacer directamente aquí también 514 00:44:45,559 --> 00:44:50,960 pues vamos a hacer el new, entonces tenemos aquí, le decimos igual a new 515 00:44:50,960 --> 00:45:03,289 y vamos a su constructor, el jmenu, le hacemos el new 516 00:45:03,289 --> 00:45:14,099 y por aquí el jmenu tiene la opción de constructor vacío o constructor en el cual 517 00:45:14,099 --> 00:45:17,280 igual que en los botones podemos incluir ya el texto este 518 00:45:17,280 --> 00:45:21,239 está sobrecargado con un string, entonces podemos poner aquí 519 00:45:21,239 --> 00:45:26,329 archivo, y en el jMenuItem vamos a hacer la misma jugada 520 00:45:26,329 --> 00:45:35,250 y el jMenuItem también está sobrecargado y podemos 521 00:45:35,250 --> 00:45:39,869 recordar, los jMenuItem son los que aparecen por aquí, en una opción de menú 522 00:45:39,869 --> 00:45:43,690 colgando, y también tienen, están sobrecargados, está sobrecargado 523 00:45:43,690 --> 00:45:47,389 el método constructor y nos permite con un string meter el nombre 524 00:45:47,389 --> 00:45:51,710 entonces este como lo hemos llamado itemSalir, vamos a ponerle aquí salir 525 00:45:51,710 --> 00:46:32,150 Vale, pues para seguir construyéndolo esto, lo que decimos es que esta ventana, este frame, lo tenemos definido por ventana principal, decimos this, asocia a este frame setJMenu, una barra de menú y le identificamos qué barra de menú queremos añadirle. 526 00:46:32,150 --> 00:46:44,239 Con lo cual esta barra de menú está asociado ya a esta ventana, pero estos objetos no están asociados por el momento a esta barra de menú, pues vamos a hacerlo. 527 00:46:44,239 --> 00:47:00,250 lo que decimos es que el menú archivo.add, añádelo y se lo añadimos a la barra de menú. 528 00:47:01,429 --> 00:47:08,389 Estamos diciendo que este elemento, este jMenu, se lo estamos añadiendo a esta barra 529 00:47:08,389 --> 00:47:12,889 y esta barra se lo estamos añadiendo como menú a la ventana. 530 00:47:12,889 --> 00:47:33,800 Entonces, archivo lo hemos añadido a la barra de menú que se lo hemos puesto a la ventana, pero el menú archivo tiene un ítem, que es los que van a colgar por aquí, que también tenemos que asociarlo. 531 00:47:33,800 --> 00:47:58,380 Fijaros cómo vamos pasito a pasito metiéndolo. Entonces ponemos aquí menú, creo que lo he puesto mal el de arriba, ahora ADD, al menú archivo, lo he puesto mal el de arriba, ahora lo cambio, al menú archivo lo que hacemos es añadirle el ítem. 532 00:47:58,380 --> 00:48:21,230 Y en verdad, digamos, tenemos la barra, el JMenu y el JMenuItem. A la barra tenemos que añadir el JMenu, entonces este es que a la barra menú le añado el JMenu. 533 00:48:21,230 --> 00:48:25,769 la barra en sí se la añado 534 00:48:25,769 --> 00:48:29,949 al frame, a la barra le añado 535 00:48:29,949 --> 00:48:33,429 el jMenu y a la jMenu le meto el jMenuItem 536 00:48:33,429 --> 00:48:40,039 si hacemos ahora una ejecución, vamos a ver si nos sale 537 00:48:40,039 --> 00:48:43,199 fijaros, ha añadido la barra 538 00:48:43,199 --> 00:48:48,340 el jMenuBar, que es todo esto, fijaros como aparece un poquito más en gris 539 00:48:48,340 --> 00:48:52,019 y un poquito sobrepuesto, a la barra le hemos metido 540 00:48:52,019 --> 00:48:56,179 un JMenu que es archivo y al JMenu le he movido un JMenuItem 541 00:48:56,179 --> 00:49:00,099 que es el salir. ¿Qué sucede si ahora pulso 542 00:49:00,099 --> 00:49:04,199 y aquí salir? No parece que esté sucediendo nada. ¿Por qué? 543 00:49:04,380 --> 00:49:08,059 Pues porque nos está pasando exactamente lo mismo que cuando hemos puesto los botones. 544 00:49:08,820 --> 00:49:12,019 Lo que hemos hecho hasta ahora ha sido dibujar el 545 00:49:12,019 --> 00:49:15,780 componente dentro del frame, pero dentro del panel 546 00:49:15,780 --> 00:49:19,739 y como consecuencia en el frame, pero sin poner ningún listeners 547 00:49:19,739 --> 00:49:23,880 y sin decir que suceda nada en particular cuando estemos trabajando 548 00:49:23,880 --> 00:49:27,900 con ello. Pues para eso tenemos que hacer como con los 549 00:49:27,900 --> 00:49:37,179 botones y en particular la opción 550 00:49:37,179 --> 00:49:40,559 ítem, es decir, la de salir es a la que le queremos añadir algo. 551 00:49:42,519 --> 00:49:45,019 Entonces ponemos, igual que hemos hecho antes aquí, 552 00:49:46,179 --> 00:49:49,079 las opciones de menú también utilizan el ActionListener, hay 553 00:49:49,079 --> 00:49:52,800 más Listener, ahora por lo menos otro más veremos ahora. 554 00:49:52,800 --> 00:50:07,280 Entonces le decimos que al JMenuItem le añade un AddActionListener y aquí, como antes, tenemos que decirle qué clase es la que va a atender ese ActionListener. Decimos que sea esta misma. 555 00:50:07,280 --> 00:50:35,079 Entonces, ahora nos venimos aquí. Fijaros que es el mismo, es el ActionListener, es el mismo que en estos casos que hemos incorporado a través del interfaz. Cuando le hemos dicho métodos necesarios para ese interfaz, nos ha metido el ActionPerformat, con lo cual este nuevo elemento que estamos metiendo también va a lanzar la ejecución de este ActionPerformat. 556 00:50:35,079 --> 00:50:39,619 como es una casuística diferente a pulsar el botón saludar o saludar 2 557 00:50:39,619 --> 00:50:43,519 pues aquí lo que vamos a hacer va a ser diferenciarlo 558 00:50:43,519 --> 00:50:47,400 también, decíamos cuando pulsemos el botón saludar, botón saludar 2 559 00:50:47,400 --> 00:50:49,699 pues aquí cuando pulsemos 560 00:50:49,699 --> 00:51:05,630 el ítem salir, pulsando salir, ejecutamos 561 00:51:05,630 --> 00:51:09,429 y ahora si voy a salir, fijaros como ya me sale aquí 562 00:51:09,429 --> 00:51:13,690 pulsando salir, hemos capturado el evento de pulsar con el ratón salir 563 00:51:13,690 --> 00:51:17,710 se va al método 564 00:51:17,710 --> 00:51:21,070 que está definido para atender ese evento 565 00:51:21,070 --> 00:51:25,610 y hace lo que hemos puesto por código. En este caso es pulsando, hemos dicho 566 00:51:25,610 --> 00:51:35,309 que haga un system of println de pulsando salir. Vamos a 567 00:51:35,309 --> 00:51:39,289 hacer algo que sea un poco más real, que no sea pulsar salir de lo que 568 00:51:39,289 --> 00:51:43,550 suele pasar cuando hacemos estas cosas. Podríamos poner 569 00:51:43,550 --> 00:51:47,429 si queréis un primer mensaje, antes decía, tenemos en las librerías 570 00:51:47,429 --> 00:51:51,289 de Java, los JFrame y otras ventanas que suelen ser informativas 571 00:51:51,289 --> 00:51:55,530 o para capturar información, vamos a poner aquí una informativa, podemos poner 572 00:51:55,530 --> 00:51:58,909 JOptionPane 573 00:51:58,909 --> 00:52:03,090 una clase que está disponible en la librería de Java 574 00:52:03,090 --> 00:52:06,989 y fijaros, tiene un montón de cosas por aquí 575 00:52:06,989 --> 00:52:13,079 muchas alternativas, una de ellas es muestra un mensaje 576 00:52:13,079 --> 00:52:16,800 por ejemplo, MessageDialog, muestra un dialog, vendría a ser una ventana con 577 00:52:16,800 --> 00:52:26,130 un mensaje, me pide aquí dos parámetros, este primer parámetro sería el contenido 578 00:52:26,130 --> 00:52:30,989 de este mensaje, quieres que se asocie a alguna ventana en particular que ya exista 579 00:52:30,989 --> 00:52:36,510 en el proyecto, si pones null te crea una nueva y aquí podemos poner el mensaje, entonces 580 00:52:36,510 --> 00:52:48,550 por ejemplo como mensaje podríamos poner pulsado el botón salir del menú, en lugar 581 00:52:48,550 --> 00:52:52,250 de un System.out, vamos a hacer que nos muestre un mensajito al pulsar 582 00:52:52,250 --> 00:52:56,590 salir. Entonces, si ejecutamos ahora, vamos aquí 583 00:52:56,590 --> 00:52:59,050 y fijaros cómo me sale aquí una ventanita. 584 00:53:00,789 --> 00:53:04,230 Bueno, tampoco es lo habitual que nos salga una ventana informativa 585 00:53:04,230 --> 00:53:08,590 pulsando el botón salir del menú, sino que se salga de la aplicación o de la ventana 586 00:53:08,590 --> 00:53:12,750 como poco. Pero bueno, así vemos por si necesitamos 587 00:53:12,750 --> 00:53:16,690 sacar un mensajito en algún momento, pues con un Joption Paints o un 588 00:53:16,690 --> 00:53:22,769 messageDialog, somos capaces de mostrar una ventanita. Si lo que queremos 589 00:53:22,769 --> 00:53:26,789 es acabar la aplicación, pues tenemos al menos 590 00:53:26,789 --> 00:53:30,210 dos alternativas. Una que es llamar al mento dispose. 591 00:53:32,679 --> 00:53:41,980 Este método te acaba la aplicación. Yo si ahora voy a salir, 592 00:53:42,360 --> 00:53:46,480 fijaros, como se me acaba, ha desaparecido y se me ha ido aquí el botoncito rojo. 593 00:53:49,570 --> 00:53:52,030 Bueno, y otra alternativa también es 594 00:53:52,030 --> 00:53:58,130 a través de un system.exit. 595 00:53:58,530 --> 00:54:14,889 System.exit y aquí podríamos meter un valor numérico, que bueno, si esta aplicación fuese lanzada por otra, podría llegar a capturar este valor y gestionar esa aplicación que ha arrancado esta, pero bueno, es algo que veréis en otro momento. 596 00:54:14,889 --> 00:54:28,349 Consiste en exit, podemos acabar la aplicación también, entonces le damos aquí un archivo salir, fijaros como también acaba la ventanita, se apaga aquí el rojo y se cierra la ventana. 597 00:54:30,360 --> 00:54:52,980 Bueno, pues opción de menú, si aquí tenemos archivo, edit, source, refactor, en esta, si quisiéramos tener más elementos aquí, sobre esta barra, tendríamos que definir un mayor número de elementos de JMenus, para que no solamente fuera archivo, y cada uno de estos los tendríamos que añadir al barra menú, como hemos hecho aquí. 598 00:54:52,980 --> 00:54:58,480 mirad como al barra menú le hemos añadido el jMenu 599 00:54:58,480 --> 00:55:03,000 el único que tenemos en la aplicación, pues tendríamos que tener más veces el barra menú 600 00:55:03,000 --> 00:55:06,599 add y te iría poniendo uno detrás de otro, y cada uno de estos 601 00:55:06,599 --> 00:55:11,019 jMenu tendrían una serie de jMenuItems, en este caso 602 00:55:11,019 --> 00:55:14,760 hemos puesto uno solo, de momento, ahora si acaso a lo mejor ponemos alguno más 603 00:55:14,760 --> 00:55:19,039 pues en cada jMenu podría tener sus jMenuItems, como aquí 604 00:55:19,039 --> 00:55:35,090 veis otro elemento que podemos poner pues los radio button ahí están hay mil opciones muy 605 00:55:35,090 --> 00:55:42,610 bueno muchas no tenemos campos de texto tenemos áreas de texto tenemos radio button con bobos 606 00:55:42,610 --> 00:55:50,389 vamos a meter un radio button cada uno tiene alguna característica un poco diferente lógicamente no 607 00:55:50,389 --> 00:55:56,369 dar tiempo a ver todos pues los que nos dé tiempo los vemos y la idea todo el rato va siendo la 608 00:55:56,369 --> 00:56:07,179 misma con pequeños matices de unos u otros pero la idea es la misma lo dibujamos y una vez que 609 00:56:07,179 --> 00:56:14,139 lo hemos dibujado pues tenemos que decirle por dónde podemos actuar sobre ellos 610 00:56:20,699 --> 00:56:27,219 imaginaos antes de meter los radio button vamos a hacer una cosa diferente para meter un listener 611 00:56:27,219 --> 00:56:35,739 diferente imaginaos que es una ventana que cuando le demos salir queremos tener la opción de decir 612 00:56:35,739 --> 00:56:42,320 oye mira es verdad le hemos dado salir pero quiero comprobar si efectivamente o quiero sacar una 613 00:56:42,320 --> 00:56:52,530 ventana de confirmación preguntando si de verdad quiero salirme o no quiero salirme por ejemplo 614 00:56:52,530 --> 00:56:58,670 si no venimos aquí le pulsamos a la equis se sale fijaros que no se ha terminado ni siquiera el 615 00:56:58,670 --> 00:57:05,750 programa, veis que sigue aquí, es decir, ha escondido esa ventana pero el programa no ha terminado, no ha 616 00:57:05,750 --> 00:57:13,730 ejecutado el pulsar la X un Dispose o un System Exit como hemos puesto aquí, si vamos por la opción 617 00:57:13,730 --> 00:57:18,809 de menú, sí que hemos puesto el Dispose o el System Exit, pero en ese caso no, ha cerrado la ventana 618 00:57:18,809 --> 00:57:25,909 pero la aplicación, veis aquí en rojito que está arrancada, pues si doy aquí a la cruz, se va la 619 00:57:25,909 --> 00:57:29,909 ventana, es cierto, pero no acaba el programa. El programa se iría 620 00:57:29,909 --> 00:57:34,010 por ahí en ejecución. Esa ventana ha desaparecido, no ha considerado que termine 621 00:57:34,010 --> 00:57:37,289 el programa, para lo cual es necesaria alguna de estas instrucciones. 622 00:57:40,940 --> 00:57:44,719 ¿Somos capaces de alguna forma de tener un espacio de código 623 00:57:44,719 --> 00:57:48,460 donde poner nosotros lo que queramos que pase cuando 624 00:57:48,460 --> 00:57:52,820 pulsemos la X o a través de aquí, creo que también nos da la opción 625 00:57:52,820 --> 00:57:56,739 cerrar. Pues sí que lo tenemos. Vamos a ver cómo lo podemos hacer. 626 00:57:56,739 --> 00:58:07,019 la opción esta, en lugar de ser de un botón 627 00:58:07,019 --> 00:58:10,260 o de una opción de menú, es una acción que tiene que ver 628 00:58:10,260 --> 00:58:14,639 con la ventana en sí. Entonces lo que podemos poner 629 00:58:14,639 --> 00:58:19,500 igual que aquí, al botón 630 00:58:19,500 --> 00:58:23,579 para que tuviera comportamiento, le hemos metido una acción listener 631 00:58:23,579 --> 00:58:28,460 al elemento, el ítem del menú o al botón 632 00:58:28,460 --> 00:58:34,079 podemos poner this, this es el propio objeto 633 00:58:34,079 --> 00:58:35,840 de la clase BenPrint 634 00:58:35,840 --> 00:58:42,719 addWindows 635 00:58:42,719 --> 00:58:48,719 fijaros aquí tenemos diferentes opciones que nos presenta 636 00:58:48,719 --> 00:58:52,159 aquí, addWindowsFocusListener cuando saltará 637 00:58:52,159 --> 00:58:55,599 una zona de código si añadimos 638 00:58:55,599 --> 00:58:58,940 este listener cuando la ventana coja el foco 639 00:58:58,940 --> 00:59:05,000 WillListener, no sé exactamente, pues el WillListener tiene pinta de ser 640 00:59:05,000 --> 00:59:07,619 en el ratón si pulsas ahí la ruedecilla, ¿no? 641 00:59:08,880 --> 00:59:12,840 Probablemente salte una zona de código para si pulsas sobre la ventana la ruedecilla 642 00:59:12,840 --> 00:59:15,280 tengas control de poder hacer ciertas cosas. 643 00:59:16,980 --> 00:59:21,159 Una un poco más general de toda la ventana es el AddWindowListener 644 00:59:21,159 --> 00:59:24,980 que es diferente al AddActionListener sobre el botón. Entonces vamos a 645 00:59:24,980 --> 00:59:28,539 añadir este Listener aquí a la ventana. 646 00:59:28,539 --> 00:59:32,039 y que nos ofrece aquí la posibilidad de identificar en qué clase 647 00:59:32,039 --> 00:59:34,219 se gestiona ese código. 648 00:59:37,579 --> 00:59:38,760 Perdón, me ha atascado. 649 00:59:39,599 --> 00:59:41,760 Entonces, si le decimos this, lo que estamos diciendo es 650 00:59:41,760 --> 00:59:44,760 la clase donde queremos que se gestionen 651 00:59:44,760 --> 00:59:47,760 los eventos que se produjan sobre la ventana 652 00:59:47,760 --> 00:59:50,400 porque estamos añadiendo al window 653 00:59:50,400 --> 00:59:54,300 este listener, aquí podemos decir qué objeto queremos que sea 654 00:59:54,300 --> 00:59:57,000 y, por ejemplo, podemos decir que sea este objeto. 655 00:59:57,000 --> 01:00:02,000 Ahora después también cambiamos para demostrar cómo poner algo diferente de este dis. 656 01:00:03,159 --> 01:00:07,699 Como estamos diciendo que esta clase tiene que atender esto, se ha empezado a quejar. 657 01:00:07,860 --> 01:00:12,000 ¿Por qué? Porque para esta clase no tenemos el código necesario para atenderlo. 658 01:00:12,679 --> 01:00:14,159 ¿Qué vamos a hacer? Pues lo mismo que antes. 659 01:00:14,800 --> 01:00:20,360 Vamos a hacer que implemente el interfaz WindowsListener, esta clase. 660 01:00:21,719 --> 01:00:24,639 Venimos aquí y junto a este le ponemos aquí una coma. 661 01:00:24,639 --> 01:00:27,219 decimos, oye, también tienes que atender 662 01:00:27,219 --> 01:00:33,239 hacer el listener de una ventana, que por aquí lo han añadido 663 01:00:33,239 --> 01:00:40,440 y han dicho que es esta clase la que lo atiende. Entonces, cojo 664 01:00:40,440 --> 01:00:44,000 por aquí y digo que me incorpore, que me importe esto 665 01:00:44,000 --> 01:00:48,480 y ahora, por aquí, le digo, añádeme los métodos 666 01:00:48,480 --> 01:00:51,900 que no están implementados a los que me estoy obligando al firmar 667 01:00:51,900 --> 01:00:56,360 un contrato, contrato entrecomillado, con la interfaz acción listener 668 01:00:56,360 --> 01:01:00,260 para esta clase, entonces cojo y digo 669 01:01:00,260 --> 01:01:04,199 méteme los métodos no implementados, y fijaros como aquí 670 01:01:04,199 --> 01:01:08,519 me ha puesto una serie de métodos, si el ActionListener me metía 671 01:01:08,519 --> 01:01:12,440 un método solo, esa interfaz me obligaba a considerar 672 01:01:12,440 --> 01:01:16,500 este método, pues el WindowsListener me obliga a tener implementados todos estos 673 01:01:16,500 --> 01:01:20,480 que fijaros es WindowsOpened, cuando se abre la ventana, cuando se está 674 01:01:20,480 --> 01:01:25,719 cerrando, cuando se ha cerrado, bueno pues más cosas 675 01:01:25,719 --> 01:02:03,420 Si queréis, tenemos un poquito curiosidad de lo que pasa en cada una de ellas, podemos poner aquí un system out para ver cuándo se producen, ponemos aquí pasando por y así vemos cuándo se producen esos eventos, vamos a pegarlo en todos y ahora lo cambiamos, un montón de métodos ha metido aquí esta interfaz, todos ellos relativos a window, porque todos ellos tienen que ver con el listener de window, 676 01:02:03,420 --> 01:02:06,599 veis, por aquí, entonces 677 01:02:06,599 --> 01:02:08,900 para ver cuando se ejecuta cada uno de ellos vamos a 678 01:02:08,900 --> 01:02:10,219 modificar los system out 679 01:02:10,219 --> 01:02:12,639 vamos a poner pasando por y el 680 01:02:12,639 --> 01:02:14,920 nombre del método en el system 681 01:02:14,920 --> 01:02:26,559 out, println, bueno pues ahí los 682 01:02:26,559 --> 01:02:28,619 tenemos y ahora si ejecutamos por aquí 683 01:02:28,619 --> 01:02:31,869 mirad, el arranque y el 684 01:02:31,869 --> 01:02:33,809 mostrar la ventana ha pasado ya 685 01:02:33,809 --> 01:02:36,010 el window listener me ha 686 01:02:36,010 --> 01:02:38,170 ejecutado porque estaba la escucha 687 01:02:38,170 --> 01:02:39,750 de cosas que pudieran pasar en esta ventana 688 01:02:39,750 --> 01:02:42,110 los métodos pasando 689 01:02:42,110 --> 01:02:43,889 por windows opened y por 690 01:02:43,889 --> 01:02:44,929 windows activated 691 01:02:44,929 --> 01:03:08,050 ¿Qué sucede si ha pasado por estos? Que ahí podríamos nosotros poner cierto código que en nuestro diseño de la aplicación fuera necesario en el momento en el que esta ventana se está abriendo. Escribir en una base de datos, no sé qué, enviar tal o inicializar no sé qué variable, en el momento que esto pasa, pues ya sabemos que cuando arranca esta ventana, estos dos métodos, fijaros, se han ejecutado. 692 01:03:08,050 --> 01:03:10,050 porque nos ha sacado los System of Printed Learning. 693 01:03:11,309 --> 01:03:18,670 Mira, si yo pulso aquí, a la hora de cerrar, sobre el ASPA, se me ha cerrado, el programa nos ha cerrado. 694 01:03:18,969 --> 01:03:24,210 Antes no parecía que tuviéramos posibilidad de hacer cosas, pero fijaros que se me han ejecutado estos dos métodos, 695 01:03:24,389 --> 01:03:25,869 pasando por Windows Closing. 696 01:03:30,179 --> 01:03:37,619 Bueno, pues ahí tenemos la posibilidad de meter código sobre algo que pase cuando pulsemos la cruz. 697 01:03:37,619 --> 01:03:59,789 En cualquier caso, además de ejecutarse el Windows Closing y Windows Closed, la ventana se ha cerrado. El comportamiento que puede tener la ventana cuando pulsamos la cruz se lo podemos preestablecer también con una opción aquí. 698 01:03:59,789 --> 01:04:18,230 Si decimos this, la ventana, punto, set default close operation, quiero que hagas por defecto cuando te cierres esto, si ponemos aquí un this nos da algunas alternativas. 699 01:04:18,230 --> 01:04:49,670 fijaros, podemos poner dispose on close, desaparece cuando te cierres, también podemos decir un do nothing on close, no hagas nada cuando te cierres, podemos poner un hide on close, que yo creo es la que debe tener por defecto, es decir, se esconde, si es dispose, liberaría la memoria RAM de las tres que hemos visto, se cerraría la ventana, liberaría la memoria RAM asociada al objeto S que tiene que ver con la ventana, 700 01:04:50,369 --> 01:04:54,369 un hide on close, lo que haría sería poner un set visible a false, pero la ventana 701 01:04:54,369 --> 01:04:58,369 seguiría existiendo, y un do nothing on close, 702 01:04:58,610 --> 01:05:02,369 pues no haría nada. Entonces, vamos a seleccionar, yo creo, no sé por 703 01:05:02,369 --> 01:05:06,210 defecto si estará el dispose o el hide on close, 704 01:05:06,530 --> 01:05:10,369 pero si ponemos un do nothing on close como comportamiento por defecto cuando la ventana 705 01:05:10,369 --> 01:05:16,119 se cierre, si ahora ejecutamos, fijaros 706 01:05:16,119 --> 01:05:19,960 que al pulsar sobre la cruz, me pasa por el 707 01:05:19,960 --> 01:05:25,559 Windows Close It, tengo una zona de código que sí que salta el evento 708 01:05:25,559 --> 01:05:28,119 porque he hecho esto, pero la ventana no se cierra. 709 01:05:30,119 --> 01:05:36,760 ¿Qué posibilidades tengo con esto? Pues mirad, como ya no se cierra 710 01:05:36,760 --> 01:05:42,579 la ventana y sigue activa y me está pasando por aquí, yo aquí voy 711 01:05:42,579 --> 01:05:46,480 a poder poner, por ejemplo, una ventanita diciendo, oye, ¿estás seguro 712 01:05:46,480 --> 01:05:51,820 que quieres cerrar la aplicación? O imaginaros que tuviera ciertos 713 01:05:51,820 --> 01:05:54,139 campos que estamos introduciendo datos 714 01:05:54,139 --> 01:05:56,079 me he creado una variable 715 01:05:56,079 --> 01:05:57,820 donde si se produce 716 01:05:57,820 --> 01:05:59,480 algún cambio, la pongo a true 717 01:05:59,480 --> 01:06:01,820 y ahora podría decir, si se ha producido 718 01:06:01,820 --> 01:06:03,579 algún cambio, ¿quieres salvarlos 719 01:06:03,579 --> 01:06:04,820 antes de cerrar la ventana? 720 01:06:05,199 --> 01:06:07,500 si, no, cancelar, es decir, me da opciones 721 01:06:07,500 --> 01:06:09,400 en el momento en el que se está cerrando la ventana 722 01:06:09,400 --> 01:06:11,199 de hacer cosas, aquí 723 01:06:11,199 --> 01:06:15,559 vamos a poner una ventanita 724 01:06:15,559 --> 01:06:17,340 de mensaje para decirle, oye 725 01:06:17,340 --> 01:06:19,719 ¿seguro que quieres que se cierre 726 01:06:19,719 --> 01:06:20,719 o no? 727 01:06:21,320 --> 01:06:23,739 entonces, igual que antes hemos puesto una J 728 01:06:23,739 --> 01:06:31,139 option pane por aquí, mostrando un mensaje, un show message dialog, pues ahora vamos a 729 01:06:31,139 --> 01:06:40,980 mostrar un j, option pane, punto, y lo que vamos a hacer en lugar de mostrar un mensaje, 730 01:06:41,079 --> 01:06:51,079 lo que vamos a hacer va a ser mostrar un show confirm dialog, que fijaros ahí está sobrescrito 731 01:06:51,079 --> 01:07:02,869 con muchas alternativas. Aquí me ofrece de primeras una con dos valores. Vamos a utilizar una que permite 732 01:07:02,869 --> 01:07:10,250 cuatro parámetros. Ahora después ponemos unos strings que tengan sentido con esto que estamos poniendo aquí. 733 01:07:10,349 --> 01:07:14,449 Vamos a poner de momento esto para ver dónde se nos dibujan las as y las ver dentro de la ventana. 734 01:07:14,449 --> 01:07:37,789 Y aquí podemos coger y poner J, Option, Paint. Fijaros, es la misma clase que esta, que tiene una serie de métodos, pero también tiene una serie de atributos. Y aquí podemos seleccionar esta ventanita que Opciones nos muestre. Por ejemplo, que simplemente tenga la opción de Cancelar, Default, Options. 735 01:07:37,789 --> 01:08:04,469 Y una de ellas, por ejemplo, es la Yes, No. Esta nos da, ofrece dos botones. Dice sí o no. Quieres cerrar sí o no. Esta nos ofrece tres botones. Los botones sí, no y cancelar. Esta solamente la sí. Vamos a poner la sí, no opción. Y vamos a ejecutar. Un momento. Luego seguimos desarrollándolo más. 736 01:08:04,469 --> 01:08:17,770 si yo pulso ahora aquí, fijaros, me sale esta ventanita que me dice BBBB, veis aquí, pues para poner un índice aquí arriba y aquí un mensajito en las as 737 01:08:17,770 --> 01:08:27,609 y como hemos dicho que la opción que queremos es las yes no option, me ofrece la posibilidad de yes y no, pulso igual que dar dos cosas y no pasa gran cosa 738 01:08:27,609 --> 01:08:34,689 ahora vemos cómo lo manejamos, si me vengo por aquí, como tenemos el dispose, sí que acaba la aplicación 739 01:08:34,689 --> 01:08:43,550 entonces aquí decidiríamos seguro que quieres cerrar y aquí ponemos 740 01:08:46,310 --> 01:08:58,560 msg cierre y esta ventana con las opciones sino la idea es que podamos capturar información de 741 01:08:58,560 --> 01:09:04,039 si queremos cerrar o no mirad entonces este método no se va a estar devolviendo un entero 742 01:09:04,039 --> 01:09:12,539 que vamos a mostrar aquí por pantalla, vamos a poner un system.out.println 743 01:09:12,539 --> 01:09:22,850 lo que estoy metiendo es un system.out.println lo que nos devuelve 744 01:09:22,850 --> 01:09:29,590 la ventanita esta, lanzará la ventana, cuando le demos así o no 745 01:09:29,590 --> 01:09:34,829 el método devolverá un valor entero y lo estamos mostrando por pantalla 746 01:09:34,829 --> 01:09:39,710 podremos buscar la información o podemos de esta forma ver que nos devuelve en cada caso 747 01:09:39,710 --> 01:09:42,850 si le doy a ejecutar 748 01:09:42,850 --> 01:09:44,689 pulso aquí 749 01:09:44,689 --> 01:09:47,609 mirad, me ha sacado aquí los eventos 750 01:09:47,609 --> 01:09:48,289 si pulso sí 751 01:09:48,289 --> 01:09:50,210 me devuelve un 0, ¿veis? 752 01:09:52,390 --> 01:09:54,569 y si pulso no, me devuelve un 1 753 01:09:54,569 --> 01:09:58,729 no, un 1, sí un 0 754 01:09:58,729 --> 01:09:59,649 ¿seguro que quiere cerrar? 755 01:10:00,449 --> 01:10:02,369 pues entonces, fijaros, a ver 756 01:10:02,369 --> 01:10:06,539 aquí que podría hacer en el Windows 757 01:10:06,539 --> 01:10:08,340 Closing, pues podría decir if 758 01:10:08,340 --> 01:10:18,710 voy a capturar esto en un entero 759 01:10:18,710 --> 01:10:20,630 int if val 760 01:10:20,630 --> 01:10:22,430 devuelto 761 01:10:22,430 --> 01:11:00,460 digo, esto que estoy, el sí y el no, que me volvió un cero y uno que mostraba por pantalla, ahora lo estoy cargando aquí en esta variable, entonces digo, sí, lo que me ha devuelto es un cero, pues entiendo que me ha devuelto que sí, quiere cerrar, entonces con un sí quiere cerrar, qué código hemos puesto aquí para que se cerrara la ventana antes, fijaros, teníamos el dispose o el system.exe cero, aquí podemos poner esto, 762 01:11:00,460 --> 01:11:02,220 else 763 01:11:02,220 --> 01:11:04,220 bueno 764 01:11:04,220 --> 01:11:05,039 pues 765 01:11:05,039 --> 01:11:08,420 pues nada, pues en realidad no queremos 766 01:11:08,420 --> 01:11:10,060 hacer nada, porque no queremos que se cierre 767 01:11:10,060 --> 01:11:12,180 si queréis que completemos aquí podemos 768 01:11:12,180 --> 01:11:13,699 poner un system.ln 769 01:11:13,699 --> 01:11:17,189 y ponemos aquí 770 01:11:17,189 --> 01:11:21,800 cancelado proceso 771 01:11:21,800 --> 01:11:29,060 de cierre, me he arrepentido 772 01:11:29,060 --> 01:11:30,920 de cerrar, le doy aquí 773 01:11:30,920 --> 01:11:32,800 dices 774 01:11:32,800 --> 01:11:35,020 no, no se cierra la ventana 775 01:11:35,020 --> 01:11:36,659 y fijaros como dice 776 01:11:36,659 --> 01:11:39,439 cancelado, repuesto, cancelado, proceso de cierre. 777 01:11:39,819 --> 01:11:43,300 Y si ahora doy aquí, por aquí también, yo resalto ese mismo evento 778 01:11:43,300 --> 01:11:46,720 y digo, yes, sí, pues la ventana se cierra. 779 01:11:46,920 --> 01:11:49,300 ¿Por qué? Porque en ese caso ha entrado por aquí, por el system exit. 780 01:11:49,439 --> 01:11:51,039 Se ha cerrado la aplicación entera en sí. 781 01:11:54,500 --> 01:11:57,979 Diferentes componentes, en este caso el componente ventana, 782 01:11:58,539 --> 01:12:00,760 trabaja con un listener un poquito distinto, 783 01:12:00,899 --> 01:12:03,520 que te mete una serie de métodos. 784 01:12:03,960 --> 01:12:05,220 ¿Por qué mete estos métodos? 785 01:12:05,560 --> 01:12:08,220 Porque son los que hemos acordado para esta interfaz. 786 01:12:08,220 --> 01:12:14,189 para este WindowsListener, ahí los tenéis todos 787 01:12:14,189 --> 01:12:19,310 y luego en función de cuando queramos que pasen cosas 788 01:12:19,310 --> 01:12:23,130 en cada uno de estos métodos metemos código, en este caso 789 01:12:23,130 --> 01:12:27,289 nos ha interesado cuando se producía el método WindowsClosing 790 01:12:27,289 --> 01:12:31,270 por defecto la ventana seguro que se cierra 791 01:12:31,270 --> 01:12:35,430 no sé si hace un dispose o un hide, no sé si se esconde o libera toda la memoria RAM 792 01:12:35,430 --> 01:12:39,109 que tenía esa ventana, pero el programa no se cerraba en sí, si queremos 793 01:12:39,109 --> 01:12:43,430 que la ventana no se cierre para tener cierto control aquí de, antes de que se cierre 794 01:12:43,430 --> 01:12:47,149 que pasen algunas cosas, tenemos la posibilidad de indicar 795 01:12:47,149 --> 01:12:50,970 el comportamiento que va a tener este objeto 796 01:12:50,970 --> 01:12:55,649 que este objeto, recordad que es el JFrame, cuando se cierre 797 01:12:55,649 --> 01:12:59,390 que en este caso hemos indicado que sea this do nothing on close, no hagas nada 798 01:12:59,390 --> 01:13:03,609 cuando se cierre, pero, no hagas nada, pero saca los eventos 799 01:13:03,609 --> 01:13:07,649 los eventos si que se lanzan, zona de código donde podemos trabajar nosotros 800 01:13:07,649 --> 01:13:18,810 hay tantas cosas que contar con las ventanas 801 01:13:18,810 --> 01:13:21,710 pero bueno, un poco como para que os dé pistas 802 01:13:21,710 --> 01:13:23,489 luego todos se van comportando de formas 803 01:13:23,489 --> 01:13:26,729 más o menos parecidas 804 01:13:26,729 --> 01:13:31,029 conceptualmente, otra cosita que os comentaba 805 01:13:31,029 --> 01:13:32,890 todo el rato, estamos metiendo los listener 806 01:13:32,890 --> 01:13:36,029 en this, es como this, es esta clase 807 01:13:36,029 --> 01:13:38,590 en esta misma clase estamos poniendo 808 01:13:38,590 --> 01:13:41,829 esto es decir, en esta clase estamos definiendo 809 01:13:41,829 --> 01:13:46,229 el dibujo de la ventana y estamos definiendo el comportamiento 810 01:13:46,229 --> 01:13:50,310 que tienen sus componentes. Pero bueno, por diseño también podríamos decir 811 01:13:50,310 --> 01:13:53,970 pues mira, quiero dedicar unas cosas al dibujo y otras cosas 812 01:13:53,970 --> 01:13:58,170 una clase al dibujo y otra clase diferente al comportamiento 813 01:13:58,170 --> 01:14:02,090 de tal forma que si luego tengo que hacer una actualización en mi proyecto 814 01:14:02,090 --> 01:14:06,170 si lo que quiero es que un componente me salga con otro color o más 815 01:14:06,170 --> 01:14:09,090 desplazado a la derecha o a la izquierda, pues me voy a 816 01:14:09,090 --> 01:14:13,449 tengo muy localizado cómo trabajar eso en la clase 817 01:14:13,449 --> 01:14:17,390 donde lo estoy dibujando. En cambio, si lo que quiero es 818 01:14:17,390 --> 01:14:21,350 que antes guardaba cierta información al pulsar un botón, la guardaba en un fichero 819 01:14:21,350 --> 01:14:25,270 y ahora, además de en el fichero, tengo que escribir una base de datos o solo en la base de datos 820 01:14:25,270 --> 01:14:29,189 o no escribir o cambiar el formato de lo que escribo, no quiero 821 01:14:29,189 --> 01:14:33,369 arriesgarme a tocar la clase donde lo estoy dibujando, no es así que empiece a 822 01:14:33,369 --> 01:14:37,189 mezclar cosas por ahí y se me descuadre todo. Quiero tener bien separadito 823 01:14:37,189 --> 01:14:40,829 el comportamiento del dibujo. Pues eso, ¿cómo lo podemos hacer? 824 01:14:42,130 --> 01:14:44,909 Pues fijaros, para cualquiera de ellos, me da igual, 825 01:14:45,050 --> 01:14:49,829 para el botón 2, vamos a decir que se defina en otra clase. 826 01:14:51,250 --> 01:14:53,789 Fijaros que el botón 2, teníamos aquí puesto el dis, 827 01:14:54,130 --> 01:14:57,250 para que fuese en esta clase. Entonces, aquí lo que vamos a hacer 828 01:14:57,250 --> 01:14:59,750 en nuestro proyecto es crear una nueva clase, 829 01:14:59,750 --> 01:15:04,449 que sea, la llamamos como sea, vamos a llamarla 830 01:15:04,449 --> 01:15:09,569 compor botón 2 831 01:15:09,569 --> 01:15:18,939 aquí cogemos y decimos que creamos un objeto de esta clase 832 01:15:18,939 --> 01:15:39,199 y ahora el botón 2 cuando se produzca 833 01:15:39,199 --> 01:15:43,180 una acción sobre este botón en lugar de decir que 834 01:15:43,180 --> 01:15:47,760 lo capture esta ventana principal lo que vamos a decir 835 01:15:47,760 --> 01:15:51,359 va a ser que el botón 2 lo capture este otro objeto 836 01:15:51,359 --> 01:15:58,489 cuando se produzca una acción sobre este botón ya no se va 837 01:15:58,489 --> 01:16:06,289 a venir al método ActionPerformance y lo que he pulsado ha sido el botón 2, porque no estoy 838 01:16:06,289 --> 01:16:10,909 diciendo que sea esta clase lo que haga, sino que se va a ir a un ActionPerformance que tendrá que 839 01:16:10,909 --> 01:16:15,869 estar definido en este botón 2. ¿Por qué no me compila? Pues porque botón 2 no está implementando 840 01:16:15,869 --> 01:16:21,289 ese Listener. Entonces, si no venimos aquí, hacer copy-pega para que sea más rápido, digo 841 01:16:21,289 --> 01:16:32,500 implementame ese Listener y ahora digo, mete los métodos no implementados, me pone este aquí el 842 01:16:32,500 --> 01:16:50,069 acción performance, si pongo ya aquí un system.out.println, botón 2 pulsado, en, vamos a ponerlo aquí 843 01:16:50,069 --> 01:17:01,250 para que quede claro que es ahí, si yo ahora ejecuto y pulso el botón 2, fijaros como me dice botón 2 844 01:17:01,250 --> 01:17:10,510 pulsado en comport botón 2, donde he derivado el comportamiento de los componentes 845 01:17:10,510 --> 01:17:20,800 No, en particular este componente, cuando se produce un evento sobre él, lo he derivado a este objeto en lugar de a dis. 846 01:17:20,960 --> 01:17:24,460 Antes era a dis en todos los casos, por eso lo implementábamos en esta misma clase. 847 01:17:24,880 --> 01:17:31,399 Bueno, ahora hay una clase encargada de gestionar el comportamiento del botón 2 cuando se ha pulsado. 848 01:17:31,399 --> 01:17:35,239 Por eso al ActionListener le he dicho que sea este objeto, que es un objeto de la clase. 849 01:17:35,239 --> 01:17:56,949 con por si no se ve decirme a ver si tengo por aquí anotar alguna anotación otra cosilla que 850 01:17:56,949 --> 01:18:05,170 os iba a contar porque es que esto el aparte de añadir los listener también se puede meter otro 851 01:18:05,170 --> 01:18:14,909 hacer que hereden las clases de una acción performance si localizó si localizó donde 852 01:18:14,909 --> 01:18:16,850 tengo alguna anotación por aquí de esto 853 01:18:16,850 --> 01:18:20,689 si no lo intentamos hacer en cualquier caso 854 01:18:20,689 --> 01:18:21,750 bueno 855 01:18:21,750 --> 01:18:26,560 sí 856 01:18:26,560 --> 01:18:36,939 bueno, en línea 857 01:18:36,939 --> 01:18:39,100 general es que yo os diría 858 01:18:39,100 --> 01:18:40,279 que un poco 859 01:18:40,279 --> 01:18:41,220 o sea 860 01:18:41,220 --> 01:18:46,380 bueno, yo que sé un poco, a ver 861 01:18:46,380 --> 01:18:49,020 alguna cosa de colecciones, pues alguna cosa 862 01:18:49,020 --> 01:18:51,380 de colecciones, pues caerá 863 01:18:51,380 --> 01:18:53,159 seguramente, alguna cosa de 864 01:18:53,159 --> 01:18:55,319 algún ficherito para escribir o leer 865 01:18:55,319 --> 01:18:57,279 pues también, caer alguna cosa de esas 866 01:18:57,279 --> 01:18:58,420 y 867 01:18:58,420 --> 01:19:01,119 de estos últimos dos temas 868 01:19:01,119 --> 01:19:03,520 pues como os decía, si andáis 869 01:19:03,520 --> 01:19:05,220 muy sobrados de tiempo 870 01:19:05,220 --> 01:19:07,000 pues miradlos 871 01:19:07,000 --> 01:19:09,340 y si no andáis sobrados de tiempo 872 01:19:09,340 --> 01:19:11,060 tampoco lo miréis mucho porque será 873 01:19:11,060 --> 01:19:12,619 muy poco 874 01:19:12,619 --> 01:19:15,819 el peso que tendrá en el examen 875 01:19:15,819 --> 01:19:17,159 y luego 876 01:19:17,159 --> 01:19:18,760 bueno, pues todo lo demás al final 877 01:19:18,760 --> 01:19:20,000 si es que hace falta para todo 878 01:19:20,000 --> 01:19:23,140 que si los bucles, que si los arraes 879 01:19:23,140 --> 01:19:25,140 al final todo más o menos 880 01:19:25,319 --> 01:19:28,340 hasta el momento en el que hemos llegado 881 01:19:28,340 --> 01:19:29,680 a colecciones 882 01:19:29,680 --> 01:19:32,779 bueno, también están las excepciones 883 01:19:32,779 --> 01:19:34,600 las excepciones quizás 884 01:19:34,600 --> 01:19:36,239 no tengan tanta 885 01:19:36,239 --> 01:19:38,159 trascendencia como quizás las colecciones 886 01:19:38,159 --> 01:19:40,220 o los ficheros, pero hasta el momento que 887 01:19:40,220 --> 01:19:41,079 hemos llegado a esto 888 01:19:41,079 --> 01:19:44,260 es que todo es imprescindible para cualquier 889 01:19:44,260 --> 01:19:46,340 programa, manejar los bucles 890 01:19:46,340 --> 01:19:47,840 un poco, manejar 891 01:19:47,840 --> 01:19:50,399 los condicionales 892 01:19:50,399 --> 01:19:53,779 el examen está estructurado 893 01:19:53,779 --> 01:19:57,140 pues en línea general es un poco como el de febrero 894 01:19:57,140 --> 01:20:00,560 tiene algunas preguntas así iniciales 895 01:20:00,560 --> 01:20:02,180 que tipo T es 896 01:20:02,180 --> 01:20:06,000 os acordáis también que en febrero también lo teníamos así 897 01:20:06,000 --> 01:20:09,239 y luego pues se hace un planteamiento 898 01:20:09,239 --> 01:20:11,659 así un poco general de un ejercicio 899 01:20:11,659 --> 01:20:15,260 y sobre ese ejercicio pues se preguntan 900 01:20:15,260 --> 01:20:18,199 pequeñas parcelas, ¿cómo harías esto? ¿cómo harías esto otro? 901 01:20:19,260 --> 01:20:21,340 y entonces pues para hacer esas cosas pues tendréis 902 01:20:21,340 --> 01:20:24,659 que en algún caso hacer alguna colección 903 01:20:24,659 --> 01:20:27,079 o escribir en algún fichero. 904 01:20:28,539 --> 01:20:29,180 Un poquito esto. 905 01:20:33,260 --> 01:20:36,859 Quizás es un poco genérico y no te preciso mucho, 906 01:20:36,979 --> 01:20:38,100 pero es que es un poco esto. 907 01:20:40,760 --> 01:20:43,300 O no sé si tienes alguna duda así particular. 908 01:20:44,739 --> 01:20:45,619 Bueno, un poco la idea. 909 01:20:46,060 --> 01:20:50,039 Ya te digo, tendrá una pequeña parte ahí con preguntas tipo test 910 01:20:50,039 --> 01:20:55,159 y luego para que escribáis ahí un poco en el código 911 01:20:55,159 --> 01:21:10,260 Os daremos también el chuletario, el mismo que tuvimos en el examen de febrero y que para los que no hayáis venido al examen de febrero, aunque no lo tenéis que traer porque os lo daremos, pero está colgado en el aula virtual para que os familiaricéis un poco con él. 912 01:21:10,260 --> 01:21:17,140 aquel chuletario de febrero incluía estas cosas de las colecciones 913 01:21:17,140 --> 01:21:20,420 si echáis alguna cosa en el chuletario muy en falta 914 01:21:20,420 --> 01:21:22,659 pues decírmelo a ver si nos da tiempo de incorporarlo 915 01:21:22,659 --> 01:21:24,619 de aquí al próximo día 916 01:21:24,619 --> 01:21:28,880 pero bueno, ese mismo chuletario lo venimos usando desde hace años 917 01:21:28,880 --> 01:21:32,300 y en principio yo creo que es un buen resumen 918 01:21:32,300 --> 01:21:36,220 para no tener que acordarse de toda la sintaxis de las cosas 919 01:21:36,220 --> 01:21:38,659 y bueno, pues un poco 920 01:21:38,659 --> 01:21:40,720 esto os puedo contar 921 01:21:40,720 --> 01:21:48,939 no, pero bueno, esto 922 01:21:48,939 --> 01:21:51,220 yo qué sé, sí, más o menos 923 01:21:51,220 --> 01:21:52,159 esto, no sé 924 01:21:52,159 --> 01:21:58,109 sí, y 925 01:21:58,109 --> 01:22:00,090 nada, bueno, pues eso, para el examen 926 01:22:00,090 --> 01:22:01,689 ya os pondré un mensajillo 927 01:22:01,689 --> 01:22:03,489 también un poco recordando, pero bueno 928 01:22:03,489 --> 01:22:05,449 las cosas un poco lógicas, acordaros 929 01:22:05,449 --> 01:22:07,430 de traeros algo que os identifique 930 01:22:07,430 --> 01:22:09,050 porque como tenemos que pasar lista 931 01:22:09,050 --> 01:22:11,050 y bueno, los bolis y poco más 932 01:22:11,050 --> 01:22:13,250 y mucho ánimo 933 01:22:13,250 --> 01:22:35,590 En el examen, si no os quedáis con preguntas, esto siempre os lo digo, si hay cosas que no estáis entendiendo en el examen, preguntadme. Yo valoraré ya si la pregunta sobrepasa un poco lo que os puedo contar o no, pero a lo mejor sí que lo que me estáis preguntando es algo de que os puedo aclarar alguna cosilla y os permite tirar en el examen. 934 01:22:35,590 --> 01:22:53,930 O sea, que no os quedéis con la duda en el cuerpo, que para, como cuando sales por ahí a dar una vuelta, él no siempre lo tiene, ¿no? Pues ya está, pues pregunta si os puedo contar algo de la duda que tengáis, os la aclaro y si me parece que ya no, pues ya os digo, pues no hombre, eso yo creo que lo tendrías que saber, pero vamos, que no se quede la duda ahí pendiente. 935 01:22:53,930 --> 01:23:06,979 y no sé del examen poco a poco más como yo creo que os puedo contar con incluyendo los nuevos 936 01:23:06,979 --> 01:23:14,359 contenidos pues un examen en cuanto a esquema muy muy parecido al de al de febrero en cuanto 937 01:23:14,359 --> 01:23:19,359 a la estructura y esto claro incluyendo ya por las nuevas partes que hemos visto desde entonces 938 01:23:19,359 --> 01:23:33,609 bueno mirad os meto métodos si os parece lo de la acción performance a ver si nos funciona 939 01:23:33,609 --> 01:23:36,989 y tampoco damos muchas más vueltas porque 940 01:23:36,989 --> 01:23:41,729 luego podemos añadir mucho más incluyendo 941 01:23:41,729 --> 01:23:45,029 nuevos componentes por aquí 942 01:23:45,029 --> 01:23:49,250 pero que más o menos, ya os digo, la idea es 943 01:23:49,250 --> 01:23:52,050 con una sintaxis un poco distinta que se puede buscar por ahí 944 01:23:52,050 --> 01:23:57,529 añades el dibujo, le metes un listener, lo metes para el comportamiento 945 01:23:57,529 --> 01:24:01,590 y luego cada vez que actuemos sobre él se ejecuta una zona de código 946 01:24:01,590 --> 01:24:12,460 que es donde metemos el código en particular. Lo que os decía es que también nos da la posibilidad 947 01:24:12,460 --> 01:24:19,520 es en lugar de poner un implement action listener, vamos a hacerlo para la ventana. 948 01:24:23,479 --> 01:24:27,479 Fijaros, hemos metido aquí el implement action listener que nos ha obligado a meter todo esto 949 01:24:27,479 --> 01:24:40,409 y la ventana le hemos dicho un dis, entonces aquí a la ventana donde le hemos dicho aquí el dis, 950 01:24:40,409 --> 01:24:46,909 vamos a decir que también sea este mismo objeto el que tenga en consideración los eventos de la 951 01:24:46,909 --> 01:24:53,069 ventana, es decir que en lugar de saltar estas zonas de código cuando hagamos algo sobre la 952 01:24:53,069 --> 01:24:59,069 ventana salte en la zona de código en este objeto. ¿Qué tendríamos que hacer? Pues nos vendríamos 953 01:24:59,069 --> 01:25:06,630 aquí poner el Implements Window Listener pero en las librerías de Java aparte de los Listener 954 01:25:06,630 --> 01:25:14,590 estos como interfaces tenemos la posibilidad de en lugar de utilizar eso hacer que herede de 955 01:25:14,590 --> 01:25:27,529 windows adapter en lugar de listener windows adapter fijaros que ahora ya no implementamos 956 01:25:27,529 --> 01:25:39,399 sino que heredamos y ahora fijaros que incluso quitando esto me compila o no me compila bueno 957 01:25:39,399 --> 01:25:43,220 no, porque este era de este, vale. El que acabo de borrar era del 958 01:25:43,220 --> 01:25:46,720 listener, no del adapter. Fijaros que el WindowsListener aquí 959 01:25:46,720 --> 01:25:51,079 me había obligado para que compilase a meter todos estos métodos. 960 01:25:53,409 --> 01:25:57,189 En cambio, aquí lo que hemos hecho ha sido un stents, una herencia. 961 01:25:57,710 --> 01:26:00,930 Entonces, todos esos métodos vacíos están ya aquí 962 01:26:00,930 --> 01:26:03,989 disponibles en el adaptador. De tal forma que 963 01:26:03,989 --> 01:26:08,510 ya existen en esta clase todos los métodos 964 01:26:08,510 --> 01:26:10,670 que aquí teníamos 965 01:26:10,670 --> 01:26:14,310 definidos con el 966 01:26:14,310 --> 01:26:16,569 Windows Listener 967 01:26:16,569 --> 01:26:19,890 como interfaz, pero están vacíos. 968 01:26:20,449 --> 01:26:23,109 ¿Qué necesitamos hacer? Lo que necesitamos hacer es 969 01:26:23,109 --> 01:26:26,350 que para que todos esos 970 01:26:26,350 --> 01:26:28,670 métodos tengan algún sentido, sobrescribirlos. 971 01:26:28,670 --> 01:26:31,829 Esta clase los tiene disponibles vacíos y aquí los podemos 972 01:26:31,829 --> 01:26:35,069 sobrescribir. Pero si solamente 973 01:26:35,069 --> 01:26:37,210 estamos utilizando el Windows Closing 974 01:26:37,210 --> 01:26:42,550 en lugar de sobrescribir todos, que en realidad 975 01:26:42,550 --> 01:26:47,350 con el interfaz me ha obligado a ponerlos pero vacíos, el único que sobrescribo 976 01:26:47,350 --> 01:26:52,539 es este. Entonces se va a comportar cuando hagamos un Windows Closing 977 01:26:52,539 --> 01:26:55,159 según esto y los demás no los tengo que escribir. 978 01:26:56,380 --> 01:27:00,079 El Windows Listener, como es un interfaz, me obliga a meter todos dentro de esta clase 979 01:27:00,079 --> 01:27:04,579 porque en realidad son abstractos esos métodos en el interfaz 980 01:27:04,579 --> 01:27:10,189 pero el Windows Adapter es una clase que los tiene 981 01:27:10,189 --> 01:27:14,430 desarrollados, pero vacíos. Todos ya existen, me compila, pero no 982 01:27:14,430 --> 01:27:18,229 hacen nada. Si quiero que haga algo, alguno de ellos, en este método 983 01:27:18,229 --> 01:27:22,189 tengo que sobrescribirlo. Y todos los demás vacíos no los tengo que sobrescribir y tienen 984 01:27:22,189 --> 01:27:25,470 su comportamiento vacíos, igual que aquí los tenía este. 985 01:27:31,819 --> 01:27:34,420 Entonces, para tener claro que está pasando por aquí, 986 01:27:36,420 --> 01:27:40,100 porque se lo hemos dicho aquí al incluir 987 01:27:40,100 --> 01:27:43,819 el AddWindowListener, hemos dicho 988 01:27:43,819 --> 01:27:45,720 que sea este objeto y no di ya a quien 989 01:27:45,720 --> 01:27:47,680 capture 990 01:27:47,680 --> 01:27:49,720 los eventos relacionados con la 991 01:27:49,720 --> 01:27:51,699 ventana, para 992 01:27:51,699 --> 01:27:53,659 tener claro que pasa por aquí, en lugar de pasando 993 01:27:53,659 --> 01:27:55,579 por Windows Closing, vamos a poner pasando por 994 01:27:55,579 --> 01:27:58,060 Windows Closing de la clase 995 01:27:58,060 --> 01:27:59,979 con por botón 996 01:27:59,979 --> 01:28:01,420 2, en lugar de 997 01:28:01,420 --> 01:28:03,840 el que nos salía antes, que sería 998 01:28:03,840 --> 01:28:05,600 este, pasando por 999 01:28:05,600 --> 01:28:07,640 Windows Closing, pues ahora para tener certeza 1000 01:28:07,640 --> 01:28:09,640 que es por este, ponemos pasando por 1001 01:28:09,640 --> 01:28:11,760 Windows Closing con por botón 1002 01:28:11,760 --> 01:28:17,159 2, entonces damos aquí 1003 01:28:17,500 --> 01:28:23,260 veis y ya me dice pasando por windows cruz en con por botón 2 que es que es vamos en lo 1004 01:28:23,260 --> 01:28:28,779 previsible que tiene que pasar porque lo que le hemos dicho aquí que es esta clase ahora la que 1005 01:28:28,779 --> 01:28:44,560 se encarga de los eventos relacionados con la ventana donde lo tenemos y bueno por aquí tenía 1006 01:28:44,560 --> 01:28:50,920 un montón de controles más para mostraros pero pero yo creo que no voy a arrancar ya porque ya 1007 01:28:50,920 --> 01:29:00,979 nos falta poco rato y no nos va a dar tiempo a meter muchos más queréis que de aquí de esto de 1008 01:29:00,979 --> 01:29:07,600 las ventanas o de el resto de los contenidos del curso alguna duda así seria que queréis que 1009 01:29:07,600 --> 01:29:19,189 comentemos o algo de eso cualquier caso estoy pendiente estos días también de de los foros 1010 01:29:19,189 --> 01:29:26,010 por si acaso me queréis preguntar alguna cosita diferente y os pongo un mensaje antes de del 1011 01:29:26,010 --> 01:29:33,289 examen que no recuerdo si es el miércoles cuando lo tenemos pues os pongo un mensajillo también 1012 01:29:33,289 --> 01:29:35,770 recordando un poco las diferentes cosas 1013 01:29:35,770 --> 01:29:43,670 para el día del examen. ¿Alguna cosita 1014 01:29:43,670 --> 01:29:45,090 más? ¿Os parece 1015 01:29:45,090 --> 01:29:47,630 que vayamos cerrando entonces por hoy? 1016 01:29:53,109 --> 01:29:54,350 Bueno, si no, me decís 1017 01:29:54,350 --> 01:29:54,850 nada nuevo. 1018 01:29:56,109 --> 01:29:58,130 Que tengáis mucha suerte esta semana 1019 01:29:58,130 --> 01:29:59,869 de exámenes y a ver si os quitáis 1020 01:29:59,869 --> 01:30:02,369 todas o la mayor parte de ellas. 1021 01:30:03,750 --> 01:30:04,130 Y nada, 1022 01:30:04,390 --> 01:30:06,189 nos mantenemos en contacto estos días. 1023 01:30:10,020 --> 01:30:10,979 Venga, pues nada. 1024 01:30:10,979 --> 01:30:12,140 Buena tarde a todos. 1025 01:30:14,159 --> 01:30:14,920 Os dejo 1026 01:30:14,920 --> 01:30:16,439 también colgada esta clase 1027 01:30:16,439 --> 01:30:19,279 ahí en el curso de Lola Virtual. 1028 01:30:20,159 --> 01:30:20,899 Venga, hasta luego. 1029 01:30:21,000 --> 01:30:21,340 Buena tarde. 1030 01:30:21,539 --> 01:30:21,739 Chao.