1 00:00:00,620 --> 00:00:09,619 Bueno, estoy empezando la grabación y si habláis en clase me estáis autorizando a que quede recogido en dicha grabación. 2 00:00:10,900 --> 00:00:12,140 Bueno, vamos a ver. 3 00:00:14,560 --> 00:00:21,620 Bueno, el otro día empezamos hablando de que efectivamente hasta ahora todas las aplicaciones que estáis haciendo 4 00:00:21,620 --> 00:00:30,179 y todos los programas y bueno, pues todo el código lo estáis enfocando a que los usuarios, pues os haré decir, 5 00:00:30,239 --> 00:00:39,759 a la hora de interactuar con el usuario lo hagáis a través de un texto en una consola y bueno, pues eso puede ser eficiente 6 00:00:39,759 --> 00:00:48,820 según qué proyectos, pero por lo general nosotros siempre vamos a intentar que el usuario pues tenga, bueno, 7 00:00:48,820 --> 00:00:56,780 pues unos componentes y haya un diseño un poco más agradable y sobre todo más intuitivo para ellos 8 00:00:56,780 --> 00:01:01,299 y que sea también más funcional, es decir, que puedan interactuar con nuestra aplicación 9 00:01:01,299 --> 00:01:06,379 pues para meter datos, para mostrárselos, para ordenar la información, etc. 10 00:01:06,739 --> 00:01:09,680 Entonces para eso pues hay una serie de formularios que suelen, 11 00:01:09,680 --> 00:01:21,019 Porque casi todos los programas suelen estar con, o sea, suelen constar de formularios y de pantallas que tienen diferentes elementos, ¿no? 12 00:01:21,019 --> 00:01:26,299 Que nos van o bien a mostrar o bien a recoger toda la información. 13 00:01:26,299 --> 00:01:51,379 Sí. Bueno, y como os estaba contando, pues eso, hay una serie de elementos con los que, bueno, pues a través de la GUI, que, bueno, pues los usuarios van a poder interactuar con vuestro programa y vosotros también con ellos. Es una forma de comunicarnos mucho más accesible. 14 00:01:51,379 --> 00:01:54,900 Bueno, estos son los objetivos de la unidad 15 00:01:54,900 --> 00:01:57,000 Como bien decía antes 16 00:01:57,000 --> 00:01:57,620 Estefano 17 00:01:57,620 --> 00:02:00,959 GUI quiere decir Graphical User Interface 18 00:02:00,959 --> 00:02:01,760 O 19 00:02:01,760 --> 00:02:05,280 Interfaz de gráfica de usuario 20 00:02:05,280 --> 00:02:06,760 Y bueno 21 00:02:06,760 --> 00:02:10,580 Se supone que 22 00:02:10,580 --> 00:02:12,659 Una de las ventajas es que es más intuitiva 23 00:02:12,659 --> 00:02:13,919 Y accesible, como decía 24 00:02:13,919 --> 00:02:16,520 Utiliza elementos gráficos como 25 00:02:16,520 --> 00:02:18,879 Ventanas, botones y menús 26 00:02:18,879 --> 00:02:20,080 Y 27 00:02:20,080 --> 00:02:31,620 Y están diseñadas para tareas interactivas y visuales. Interactivas quiere decir entre el usuario y la aplicación y el código que les demos. 28 00:02:32,680 --> 00:02:48,300 Algunas de las desventajas es que obviamente es mucho más pesada y consume más memoria y el desarrollo es un poquito más complejo ya que hay que configurar también todo lo que es el diseño gráfico, que hasta ahora no lo hemos tenido que realizar. 29 00:02:50,080 --> 00:03:10,719 Bueno, hablábamos de, bueno, recordad que estuvimos instalando, creo que lo tenéis todos instalado, el plugin Window Builder. ¿Tú lo tienes? Ah, lo instalaste ya. Ah, muy bien. Pues muchas gracias por instalárselo, porque así no perdemos tiempo ahora instalándolo. 30 00:03:10,719 --> 00:03:35,400 Entonces, bueno, pues esto es un plugin con el que tenemos una serie de paquetes en el cual podemos diseñar interfaces gráficas y esto qué quiere decir, pues que tenemos un montón de elementos gráficos que se pueden ir arrastrando y soltando en nuestras plantillas y poder configurarlos. 31 00:03:35,400 --> 00:03:54,740 Y bueno, se va a utilizar la biblioteca Swin, comentábamos que hay algunas más nuevas, más modernas, como JavaFX, pero estuvimos hablando de que Swin para el tema del aprendizaje era bastante más interesante, 32 00:03:54,740 --> 00:04:03,139 ya que vais a poder, bueno, con ello vais a poder asimilar los conceptos de una manera mucho más clara 33 00:04:03,139 --> 00:04:12,500 y luego os vais a poder adaptar a cualquier otra biblioteca, ya sea JavaFX o alguna que venga en un futuro próximo. 34 00:04:14,000 --> 00:04:20,079 Luego, pues lo que decía, instalamos Windows Builder, recordad que algunos tuvieron, bueno, tuvieron, no tuvimos, 35 00:04:20,079 --> 00:04:43,019 porque aquí no pudimos instalarlo, fue un rollo porque las versiones estaban, bueno, teníamos una versión antigua y entonces pues no encajaba bien el Windows Builder y bueno, hablamos también un poco de algunas de las clases y de los elementos que tiene Java Swing y con los que vamos a trabajar. 36 00:04:43,019 --> 00:05:01,980 Uno era el JLabel, que sería como el label en el lenguaje de marcas, es decir, en HTML y demás, JButton, JTextField, que serían los campos de texto, el JTextArea, el JCheckBox, el JRadioButton, 37 00:05:01,980 --> 00:05:19,220 De hecho, luego pusimos algún ejemplo con RadioButton en el que algunos consiguieron poder capturar, bueno, poder replicar lo que es la funcionalidad de hacer tan solo una selección de todos los elementos que mostremos en el RadioButton. 38 00:05:19,980 --> 00:05:27,620 El JList, que son las listas donde vamos a poder mostrar un montón de elementos. 39 00:05:28,319 --> 00:05:30,899 Y el JScrollBar, que serían las barras de desplazamiento. 40 00:05:30,899 --> 00:05:47,899 Al igual que hay estas, hay muchísimas más. Hicimos un ejemplo automático con Jpanel y bueno, no sé si normalmente en los repasos abrís el... 41 00:05:47,899 --> 00:06:41,629 Sí, lo tengo por aquí. Y aquí yo creo que tuvimos los ejemplos. Sí, bueno, pues aquí teníamos algunos ejemplos y bueno, pues aquí en la presentación podéis ver que hay un código en el cual, bueno, pues está explicado un poquito, bueno, pues como aquí, por ejemplo, creamos la clase ventana del tipo JFrame. 42 00:06:41,629 --> 00:07:02,910 Para eso, recordad que lo que teníamos que hacer era irnos, por ejemplo, aquí, le dábamos a New y una vez ya le teníamos instalado el Window Builder, le dábamos a Other y aquí teníamos diferentes opciones, ¿vale? Podíamos abrirlo con el Application Window y el JFrame. 43 00:07:02,910 --> 00:07:18,550 Yo os recomiendo que normalmente lo abráis con JFrame porque ya directamente hereda de ahí y ya, bueno, pues es directamente abrir una, lo que sería una ventana. Los JFrames son ventanas, ¿vale? Y, bueno, pues, por ejemplo, podríamos crear uno para que se vea. 44 00:07:18,550 --> 00:07:45,569 Como podéis ver, se nos ha creado el ejercicio 1, el ejemplo 1, extiende de JFrame y nos crea un main y un constructor de lo que es el ejemplo número 1 de lo que hemos creado. 45 00:07:46,129 --> 00:07:55,810 Aquí, si os fijáis, se crea la ventana frame como nueva ventana, etcétera, etcétera, etcétera, dentro de lo que es el main. 46 00:07:55,810 --> 00:08:08,029 El constructor sería este, en el cual viene los setbounds, que aquí lo podéis ver. Setbounds hacía referencia, si recordáis, un poco al posicionamiento de los elementos. 47 00:08:08,029 --> 00:08:23,589 Siempre, cada vez que colocamos un botón, una ventana, un panel, una lista, cualquiera de los elementos van a tener unas coordenadas dentro de lo que es el contenedor donde lo pongamos. 48 00:08:23,589 --> 00:08:34,409 Entonces el primer número haría referencia a la coordenada X, el segundo a la coordenada Y, el tercero al alto y el cuarto al ancho. 49 00:08:34,409 --> 00:08:58,509 Vale, como bien os comentaba antes, la parte de fuera, lo que sería la ventana, sería el JFrame y luego dentro se crea un JPanel, que es el contenedor donde nosotros vamos a trabajar y donde vamos a poner todos los elementos. 50 00:08:58,509 --> 00:09:05,009 recordad que en todo momento yo a veces me refería al panel principal o al contenedor 51 00:09:05,009 --> 00:09:11,590 principal es indiferente es decir tanto uno como otro son terminologías que se aplican a los dos 52 00:09:11,590 --> 00:09:18,850 y es digamos nuestra bueno pues como si tuviéramos un corcho en la pared donde vamos poniéndole cosas 53 00:09:18,850 --> 00:09:24,509 no pues sería el corcho digamos y el jota frame igual sería la pared entonces nosotros para poner 54 00:09:24,509 --> 00:09:32,730 una nota no lo vamos a poner en la pared con una chincheta lo pondremos en el corcho no pues el 55 00:09:32,730 --> 00:09:42,649 corcho es nuestro contenedor o nuestro panel vale cuando intentamos añadir cualquier elemento al 56 00:09:42,649 --> 00:09:50,129 panel principal nos dábamos cuenta que ya estaba conformado con una estructura un tanto extraña 57 00:09:50,129 --> 00:10:00,830 que se trata de, bueno, que realmente esa estructura es lo que se llama layout o lo que entenderíamos en castellano como plantilla, ¿vale? 58 00:10:00,830 --> 00:10:11,259 Entonces, para quitarlo y poder tenerlo de una manera más liberada, vamos a abrir el diseño, vale. 59 00:10:11,259 --> 00:10:33,039 Si tenemos aquí el panel, el Jpanel, siempre un inciso, siempre que pulsamos sobre alguno de los elementos que tenemos aquí, aquí a la izquierda, a continuación tenemos el properties y entonces aquí hay una serie de propiedades que siempre se van a poder modificar. 60 00:10:33,039 --> 00:10:58,279 O bien a través de esta paleta de propiedades, properties, o bien a través del código. Pero es muy útil el poder utilizar estas propiedades para cambiar. Como bien os decía antes y os mostraba en la presentación, cada vez que vamos a intentar colocar algún elemento, nos va a aparecer esta estructura, ¿vale? 61 00:10:58,279 --> 00:11:36,539 que es la que viene por defecto, que sería el flow layout, entonces si vamos a ir por ejemplo a poner un botón, a la hora de ir a soltarlo y ponerlo, nosotros si lo ponemos, pues se ha quedado, vale, porque lo tengo yo así puesto, disculpad que esto supone que está el flow layout, a ver, un segundito, pues debería estar mostrándome todo el, el, 62 00:11:39,450 --> 00:11:40,730 Vamos a añadir otro. 63 00:11:45,210 --> 00:11:46,990 Ah, vale, porque está puesto como flow layout. 64 00:11:47,889 --> 00:12:01,509 Y el que tenía que estar por defecto era el border layout, 65 00:12:01,610 --> 00:12:05,529 yo creo, el que estaba puesto ayer por... 66 00:12:05,529 --> 00:12:05,970 Ah, sí. 67 00:12:06,409 --> 00:12:07,590 Entonces ahora ya sí vamos con... 68 00:12:07,590 --> 00:12:08,690 Ah, esto es lo que os comentaba. 69 00:12:09,250 --> 00:12:12,730 Entonces está normalmente ayer la que nos salía por defecto. 70 00:12:12,809 --> 00:12:15,090 No sé por qué hoy está saliendo el border layout. 71 00:12:15,090 --> 00:12:18,289 O sea, está saliendo el flow layout cuando ayer nos mostraba 72 00:12:18,289 --> 00:12:21,769 el border layout, da igual 73 00:12:21,769 --> 00:12:26,490 la cuestión es que siempre vais a tener una serie de plantillas 74 00:12:26,490 --> 00:12:30,789 y son como plantillas ya preestablecidas 75 00:12:30,789 --> 00:12:34,169 para que coloquéis los elementos 76 00:12:34,169 --> 00:12:37,990 recordad que estuvimos mirando el grid layout, que era como tablas 77 00:12:37,990 --> 00:12:42,330 para poder colocar todos los elementos, incluso estuvisteis 78 00:12:42,330 --> 00:12:43,190 metiendo botones 79 00:12:43,190 --> 00:12:54,110 en las celdas de la misma tabla del grid y bueno pues el recordar siempre que podemos poner el 80 00:12:54,110 --> 00:13:00,370 absolute y entonces esto nos permite nos permite poder moverlo por donde queramos 81 00:13:05,519 --> 00:13:12,460 y podemos poner un combo box y lo ponemos aquí podemos colocar donde queramos vale 82 00:13:12,460 --> 00:13:29,460 Es decir, los elementos ahora se pueden mover a donde queramos. Si os fijáis aquí, cuando ponemos el combo box, aquí salen también otra serie de propiedades que son completamente diferentes a las que tiene NewButton. 83 00:13:29,460 --> 00:13:45,759 Bueno, habrá una en común y otras que no, pero cada elemento es un objeto y cada objeto, pues como bien sabéis, es un objeto de una clase y tiene una serie de propiedades que le hacen ser único e individual. 84 00:13:45,759 --> 00:14:00,679 Entonces, vamos a pasar aquí y continuamos. Hablábamos de colocar la plantilla en absolute para poder ser libres, que es lo que os acabo de contar. 85 00:14:00,679 --> 00:14:12,259 hablábamos también de que automáticamente cuando hemos cambiado antes al layout en absolute si nos 86 00:14:12,259 --> 00:14:19,799 vamos al código aquí va aquí porque con con esto tan grande yo no lo veo bien a ver dónde estás 87 00:14:19,799 --> 00:14:43,080 A ver, a ver, a ver, ¿dónde estás? Aquí podemos ver que el content panel, que es el contenedor, el panel principal que tenemos, nos pone el layout a null. Este es el absoluto. Si lo cambiáramos a otro tipo, comentábamos que ahí automáticamente se actualiza. 88 00:14:43,080 --> 00:15:07,159 Es decir, si lo ponemos en FlowLayout, nos vamos ahora al código y aquí tenemos SetLayout y es un New FlowLayout, ¿de acuerdo? Y nos viene con una serie de propiedades ya establecidas, si modificáramos en el diseño esas propiedades, automáticamente se va a modificar en el código, ¿vale? 89 00:15:07,159 --> 00:15:25,960 Al igual que nos pasa esto con el panel, tener siempre claro que esto nos pasa cuando modificamos cualquier botón, cuando añadimos cualquier cosa, cuando le cambiamos una propiedad, un nombre, un tamaño, una ubicación, automáticamente se va a actualizar en el código. 90 00:15:25,960 --> 00:15:38,820 Eso nos pone las cosas muy fáciles porque al final no tenemos que andar nosotros codificando toda esa información que a veces es muy complicado. Sobre todo el tema de coordenadas y demás. 91 00:15:38,820 --> 00:15:53,100 Mira, aquí de lo que estábamos hablando es eso 92 00:15:53,100 --> 00:15:56,519 Aquí no tenemos, aquí si quitamos el botón 93 00:15:56,519 --> 00:15:59,899 Obviamente cuando lo añadimos 94 00:15:59,899 --> 00:16:03,259 Aquí, vale, nos vamos al código 95 00:16:03,259 --> 00:16:06,100 Y aquí tenemos el botón 96 00:16:06,100 --> 00:16:11,539 Ya nos han hecho directamente la instancia del nuevo botón 97 00:16:11,539 --> 00:16:18,220 y nos lo ha incluido dentro del content panel, es decir, dentro del panel principal, ¿vale? 98 00:16:18,220 --> 00:16:21,919 Es decir, lo que vamos haciendo en diseño se va haciendo siempre, que se os quede esa idea, 99 00:16:22,059 --> 00:16:25,299 se va haciendo paralelo en el código. 100 00:16:25,840 --> 00:16:29,659 También hay que tener siempre mucho, o sea, hay que tenerlo muy en cuenta 101 00:16:29,659 --> 00:16:34,200 para que nuestro código, si lo escribimos a mano, no se contradiga con cosas 102 00:16:34,200 --> 00:16:38,779 que estamos configurando con la parte de diseño. 103 00:16:38,779 --> 00:16:51,539 añadíamos un container secundario o un panel secundario también en uno de los ejemplos y en 104 00:16:51,539 --> 00:16:59,440 este en este panel bueno aquí veíamos que se creaba y demás y añadíamos un elemento a ese 105 00:16:59,440 --> 00:17:07,599 panel bueno cuando nosotros añadíamos ese elemento a ese panel secundario realmente se estaba añadiendo 106 00:17:07,599 --> 00:17:11,539 al panel secundario en el código, no se estaba añadiendo al panel principal. 107 00:17:12,279 --> 00:17:16,940 Es decir, se crea como una especie de herencia de tenemos el, es como si en el corcho 108 00:17:16,940 --> 00:17:21,960 que estábamos poniendo antes como ejemplo, ponemos otro corcho dentro 109 00:17:21,960 --> 00:17:23,839 y entonces pinchamos dentro de ese corcho. 110 00:17:23,839 --> 00:17:30,220 Es decir, en función de la posición en la que estén, van a pertenecer a un panel o a otro. 111 00:17:30,220 --> 00:17:45,339 Esto es importante sobre todo para agrupar los componentes y los elementos que añadamos a nuestro formulario por el significado que puedan tener o el sentido que puedan tener para el usuario. 112 00:17:45,339 --> 00:18:02,079 Es decir, puede ser por un lado datos de usuario en el cual tenemos nombre, apellidos, DNI, bla, bla, bla, bla, fecha de nacimiento y en otra podemos tener otro panel en el que venga una lista con gustos musicales o aficiones o lo que sea. 113 00:18:02,079 --> 00:18:26,099 Y otra con, bueno, no sé, pues unos datos de matrícula, por ejemplo, ¿no? Entonces, podríamos dividir un mismo container principal, pues a lo mejor en tres zonas. Uno, aficiones, datos personales y datos de matrícula, ¿vale? Es decir, esa es un poco la gracia de poder agrupar todo en paneles y en zonas diferentes. 114 00:18:26,099 --> 00:19:01,940 Vale, vale, vale, vale, hablábamos también de que para recoger el, bueno, con algunas propiedades, algunos métodos de los elementos se pueden recoger algunos datos, por ejemplo, hablábamos del text field, que para recoger el contenido de lo que haya escrito el usuario, pues simplemente con un set text, pues ya, o sea, con un get text, 115 00:19:01,940 --> 00:19:17,480 ya lo obtendríamos. Aquí lo tenemos, ¿ves? Con el GetText. Voy a poner un ejemplo. Si, por ejemplo, ponemos un JTextField, ¿vale? 116 00:19:17,480 --> 00:19:32,460 Y vamos a poner un JTextField. Y entonces, perdón, si nosotros queremos recoger el contenido del JTextField, aquí lo tenemos, 117 00:19:32,460 --> 00:19:48,740 simplemente creando una, hablábamos de que, vamos a ver, este que le llama así, se llama, nuestra caja de texto se llama text field, 118 00:19:49,480 --> 00:20:03,279 tenemos una propiedad que es get text y aquí nos podemos fijar que lo que nos va a dar es un string, lo que va a coger de esa caja de texto. 119 00:20:03,279 --> 00:20:09,839 Entonces, por ejemplo, esto lo podríamos recoger con una variable de triple string. 120 00:20:10,960 --> 00:20:12,099 Por ejemplo, nombre. 121 00:20:16,569 --> 00:20:18,589 Vale, con esto podríamos recoger el nombre. 122 00:20:18,730 --> 00:20:24,390 Esto va a ser útil, sobre todo este tipo de cosas, con el getText, setText, etc. 123 00:20:24,990 --> 00:20:31,029 Con los eventos, que va a ser algo que vamos a empezar a ver ahora 124 00:20:31,029 --> 00:20:34,549 y que es realmente la funcionalidad potente de todo esto. 125 00:20:34,549 --> 00:20:40,930 porque el tener una serie de elementos con los que puede interactuar el usuario está muy bien, 126 00:20:41,109 --> 00:20:46,049 pero si el usuario no interactúa realmente con ese formulario, no nos vale absolutamente para nada. 127 00:20:46,210 --> 00:20:50,250 Entonces, es un poco lo que vamos a ver ahora a continuación. 128 00:20:51,430 --> 00:20:56,009 Veíamos un poco la jerarquía de clases también, en la cual, pues como siempre, hereda de object, 129 00:20:56,009 --> 00:21:03,630 y luego dentro de container pues podríamos encontrar tanto j component que son todos los 130 00:21:03,630 --> 00:21:11,069 elementos que podemos añadir a un panel como el window que serían los frames y los diálogos es 131 00:21:11,069 --> 00:21:18,009 decir los lugares donde podemos ubicar los recordar que el jota frame son las ventanas 132 00:21:18,009 --> 00:21:25,970 Es decir, sería JFrame siempre son estas, estos principales, la parte de fuera. 133 00:21:27,230 --> 00:21:32,750 Y si os fijáis, esto va por un lado y no tiene nada que ver con los componentes que ya estarían dentro. 134 00:21:33,250 --> 00:21:38,470 De hecho, tenemos aquí el JPanel que a su vez puede recoger JTex, JComboBox, etc. 135 00:21:41,109 --> 00:21:47,869 Hablamos también de los layouts. Estuvimos mirando que las plantillas pueden ser diferentes. 136 00:21:48,009 --> 00:21:58,809 Como os decía antes, puede ser tipo FlowLayout, que nos pone todos los botones o todos los elementos, nos los pone en fila, o sea, todos seguidos. 137 00:21:59,450 --> 00:22:11,670 Puede ser en modo Grid, el GridLayout, que lo que nos hace es colocar una tabla con diferentes celdas y entonces dentro se ubican todos los elementos. 138 00:22:11,670 --> 00:22:28,869 Y, bueno, pues hasta aquí un poco el repaso. No sé si hay alguna duda así a priori que surgiera el otro día con los ejemplos que vimos. ¿Me dais permiso para continuar con los eventos? 139 00:22:28,869 --> 00:22:41,890 Bueno, pues bueno, como podréis imaginar, los eventos es un poco, se trata de la interacción que va a tener el usuario con respecto al programa 140 00:22:41,890 --> 00:22:46,089 que le estamos mostrando y que le hemos desarrollado, ¿no? 141 00:22:46,730 --> 00:22:55,970 Entonces, tened en cuenta que siempre el usuario va a tener que o bien obtener información o bien aportársela a nuestro programa 142 00:22:55,970 --> 00:23:03,930 para que toda esa información se pueda luego procesar. 143 00:23:04,450 --> 00:23:14,869 Todo esto, como ellos tienen una serie de elementos con los que pueden interactuar, 144 00:23:15,750 --> 00:23:19,410 pues todos esos elementos se van a manejar con eventos. 145 00:23:19,410 --> 00:23:25,490 Es decir, nosotros si pulsa un botón tenemos que controlar esa pulsación del botón. 146 00:23:25,970 --> 00:23:49,329 Y a esto le vamos a llamar evento. Entonces, bueno, como bien decía, pues eso, el usuario realiza las acciones que generaría este evento. Esto podría ser pulsar un botón, por ejemplo, o seleccionar un objeto de una lista o seleccionar un radio button, marcar unos checks. 147 00:23:49,329 --> 00:23:54,329 Es decir, en función de lo que queramos hacer, el evento será de una manera o de otra. 148 00:23:55,630 --> 00:24:03,029 Todos estos componentes han de permanecer atentos o estar a la espera. 149 00:24:03,170 --> 00:24:06,349 Es decir, esto, ¿qué quiere decir realmente? 150 00:24:06,650 --> 00:24:15,829 Pues quiere decir que nosotros ya lo tenemos configurado esperando, o sea, es decir, si ponemos un botón, efectivamente tendremos que ponerle una serie de acciones. 151 00:24:15,829 --> 00:24:22,930 se van a tener que realizar una serie de acciones una vez nosotros pulsemos ese botón 152 00:24:22,930 --> 00:24:29,650 pues el preparar el programa para que eso suceda 153 00:24:29,650 --> 00:24:35,549 es por eso que queremos llamarlo permanecer atento o estar a la espera 154 00:24:35,549 --> 00:24:40,329 es decir, prepararlo para que cuando ese botón se pulse 155 00:24:40,329 --> 00:24:49,869 efectivamente todo ese todo ese código se pueda procesar y pueda funcionar y luego una vez ya se 156 00:24:49,869 --> 00:24:57,910 ha procesado pues lo suyo es que le mandemos alguna respuesta al usuario pues eso con el 157 00:24:57,910 --> 00:25:04,869 resultado de su acción pues si un botón directamente lo que hace es guardarnos un 158 00:25:04,869 --> 00:25:09,529 elemento en una lista pues a lo mejor mandarle un mensaje de elemento guardado en la lista 159 00:25:10,329 --> 00:25:24,650 Por ejemplo, cuando hacéis una compra en internet y añadís un elemento al carrito de la compra, normalmente el carrito de la compra se actualiza y pone un número o pone un dos para que podáis pulsar y podáis ver. 160 00:25:24,650 --> 00:25:52,089 Bueno, pues eso sería el evento de pulsar en el producto que queréis, por detrás va a recoger esa petición de ese elemento, lo va a tratar, lo va a meter en la lista del carrito de la compra y la respuesta a ese procesamiento va a ser que va a aparecer al usuario, le va a aparecer el carrito de la compra con el 1, el 2 o los productos que se hayan añadido. 161 00:25:56,990 --> 00:26:14,930 Bueno, para recibirlos y para controlar, cuando hablamos de recibir y de escuchar, para controlar todos los eventos que se producen en estos elementos, tenemos una serie de interfaces que se llaman Listener, ¿vale? 162 00:26:14,930 --> 00:26:24,730 Todos los elementos, si queremos trabajar con ellos, con lo que son las acciones que pueden hacer, siempre lo vamos a tener que hacer a través de un Listener. 163 00:26:24,730 --> 00:26:32,630 Bueno, están incluidas en el paquete Java AVT Event 164 00:26:32,630 --> 00:26:36,829 Y bueno, hay que importar el paquete 165 00:26:36,829 --> 00:26:40,190 Import Java AVT Event 166 00:26:40,190 --> 00:26:48,029 Tenemos la interfaz ActionListener 167 00:26:48,029 --> 00:26:52,130 Que va a ser la que nosotros podemos implementar también en nuestra 168 00:26:52,130 --> 00:26:57,150 O sea, la que vamos a tener que implementar en nuestro código y en nuestras clases 169 00:26:57,150 --> 00:27:02,250 para que podamos recoger todos estos eventos. 170 00:27:02,430 --> 00:27:04,529 Ahora vamos a ver un ejemplito y lo vais a ver más claro, 171 00:27:04,670 --> 00:27:08,029 aunque suene así todo un poco abstracto y un poco raro. 172 00:27:08,029 --> 00:27:12,289 Y cuando hacemos referencia al ActionListener, 173 00:27:12,930 --> 00:27:20,589 automáticamente se nos va a crear el método ActionPerform. 174 00:27:23,410 --> 00:27:25,029 Dentro de este ActionPerform, 175 00:27:25,029 --> 00:27:37,890 perform, que querría decir algo así como la acción ejecutada o algo así, pues ahí es donde nosotros vamos a trabajar con lo que se hace una vez se ha recogido 176 00:27:37,890 --> 00:27:54,769 esa acción por parte del usuario. Vamos a ver un ejemplito. Por ejemplo, si nosotros ahora mismo, vamos a quitar esto de aquí, si nosotros por ejemplo 177 00:27:54,769 --> 00:28:17,150 Añadimos un botón. Si nosotros hacemos doble clic sobre el botón, automáticamente se nos ha generado, si os fijáis, dentro del New Button que teníamos nosotros, 178 00:28:17,150 --> 00:28:34,279 Nos ha añadido el ActionListener, con sustancia, y se nos genera el propio método ActionPerform, ¿ok? 179 00:28:34,279 --> 00:29:36,720 Entonces, si nosotros, muchas gracias por el apunto, la verdad que me viene muy bien, yo si todo lo que queráis aportar, igual que ha hecho el alumno Estefano, vuestro compañero, pues podéis aportar todo lo que queráis, ¿vale? 180 00:29:36,720 --> 00:29:54,940 Entonces, por ejemplo, hemos dicho que aquí dentro de lo que era la acción perform es donde nosotros realmente vamos a poder, bueno, pues recoger cualquier tipo de acción, ¿vale? 181 00:29:54,940 --> 00:30:09,240 Por ejemplo, si queremos que cuando pulsemos al botón, aquí en el ejemplo lo he puesto como aquí, por ejemplo, le vamos a poner al botón, le vamos a llamar aceptar. 182 00:30:12,980 --> 00:30:20,099 Vais a ver que al cambiar estas propiedades se cambian automáticamente en nuestro código, ¿vale? 183 00:30:20,099 --> 00:30:27,680 Ahora lo vais a ver, ¿vale? 184 00:30:29,180 --> 00:30:30,619 Entonces ya se queda como tal. 185 00:30:30,619 --> 00:30:38,759 Entonces, si os fijáis, ahora ya el botón es el botón aceptar 186 00:30:38,759 --> 00:30:46,460 Nos ha cambiado en todas partes, es decir, directamente hace lo que sería el refactor y el rename 187 00:30:46,460 --> 00:30:49,579 Cuando hemos cambiado, es decir, lo hace automáticamente, no tendríamos que 188 00:30:49,579 --> 00:30:56,019 Es decir, cuando queréis cambiar el nombre de un elemento, el código lo va a actualizar 189 00:30:56,019 --> 00:31:22,180 Y, por ejemplo, vamos a hacer que, uy, vale, y aquí porque no sale, ah, vale, que es SISO, ¿cómo es el, eh, system? A ver, ¿me lo recordáis alguno que mando yo siempre .out, .println? 190 00:31:22,180 --> 00:32:00,509 Y aquí, por ejemplo, vamos a poner como, vale, aceptar, ¿vale? Entonces, si ejecutamos, si le damos al aceptar, automáticamente nos está mostrando el mensaje de aceptar pulsado, ¿vale? 191 00:32:00,509 --> 00:32:32,619 Entonces, a ver, a ver, voy a parar un momentito. Ahora, por ejemplo, vamos a añadir otro botón y vamos a hacer exactamente lo mismo, ¿vale? Si podéis ir haciéndolo conmigo también, ir añadiendolo y le vais a poner el nombre de cancelar, el nombre de cancelar, ¿vale? Al botón. 192 00:32:32,619 --> 00:33:18,480 Ahora una vez ya lo tenéis creado el botón, le hacéis doble clic y efectivamente se os ha generado el mismo código con la clase anónima y con el action perform dentro. 193 00:33:18,480 --> 00:33:45,150 entonces vamos a coger el mensaje de antes, lo vamos a poner aquí, pero con cancelar pulsado, vale, lo ejecutamos y entonces cuando pulsamos aceptar aparece aceptar pulsado 194 00:33:45,150 --> 00:34:10,059 y cuando pulsamos cancelar, aparece cancelar pulsado, ¿vale? Estos mismos, si os fijáis, aquí los tenéis los dos, los que hemos creado, tanto el de aceptar y el de cancelar, ¿vale? 195 00:34:10,059 --> 00:34:25,199 Y ahora lo que vamos a hacer, para no tener que andar, porque vamos a poner que tenemos muchísimos elementos dentro de nuestro formulario. 196 00:34:25,199 --> 00:34:48,380 Y nosotros realmente, ¿qué queremos? Queremos, como decir, que cada evento se recoja con un método o tener un método que en función del tipo de elemento y demás, pues nos vaya mostrando diferentes opciones. 197 00:34:48,380 --> 00:35:15,639 Pues vamos a hacerlo de la siguiente manera. Como bien hablábamos antes, oye, estaba comentando, estaba comentando Estefano, nosotros directamente podemos extender lo que es el, nuestra clase, la podemos extender directamente al, al, o sea, podemos, pero oye, esto yo, podemos implementar la interfaz ActionListener, ¿ok? 198 00:35:15,639 --> 00:35:24,329 Entonces, con esto, si la implementamos, vamos a poder... 199 00:35:24,329 --> 00:35:49,329 Si os fijáis, aquí nos está dando un error. 200 00:35:49,329 --> 00:36:11,900 Entonces cuando nos ponemos está diciendo que le hacen falta unos métodos que no están implementados todavía. Entonces le vamos a dar a implementar y como veis ya no nos muestra el error y aquí abajo nos ha generado un action perform. 201 00:36:11,900 --> 00:36:24,780 ¿Vale? Que si recordáis, nosotros aquí por cada elemento, cuando lo hemos pulsado, hemos hecho doble clic, nos ha generado esta clase anónima con el action perform dentro, ¿vale? 202 00:36:25,340 --> 00:36:39,190 Entonces ahora esto ya, esto lo vamos a copiar por tenerlo, ¿vale? Lo voy a dejar aquí de momento para luego tenerlo, pero digamos que esto ya no nos va a servir de momento. 203 00:36:39,190 --> 00:36:49,650 Ahora lo que queremos es controlar cuándo estamos manejando el evento del botón aceptar o cuándo estamos manejando el evento del botón cancelar, ¿verdad? 204 00:36:50,530 --> 00:36:55,489 Entonces, lo que vamos a hacer es eliminar el cancelar. 205 00:36:56,170 --> 00:36:57,190 Estoy eliminando... 206 00:36:58,010 --> 00:36:59,590 Este no, aquí. 207 00:37:00,849 --> 00:37:03,210 Cancelamos el código que nos ha generado antes. 208 00:37:06,869 --> 00:37:08,090 Está aquí al inicio. 209 00:37:08,909 --> 00:37:11,690 Perdona que voy un poquito mal con este teclado, que no lo conozco. 210 00:37:11,849 --> 00:37:32,059 Y aquí igual. Del botón aceptar, el código que se nos ha generado, lo eliminamos. Si os fijáis, ¿ves? Hay que eliminarlo, que bueno, lo he puesto en los apuntes un poco para que sigáis ese procedimiento, ¿vale? 211 00:37:32,059 --> 00:37:41,480 vale entonces como estábamos hablando se nos implementa este este método abstracto de que 212 00:37:41,480 --> 00:37:56,969 se llama acción perform vale para nos segundo nosotros ahora dentro de lo que son cada botón 213 00:37:56,969 --> 00:38:03,889 es decir para nosotros relacionar este botón aceptar y este botón cancelar con el acción 214 00:38:03,889 --> 00:38:24,599 perform con este de aquí vamos a tener que hacer lo siguiente fijáis aquí le hemos dado al ad 215 00:38:24,599 --> 00:38:40,159 acción listener entonces entonces que le estamos diciendo que le estamos diciendo que utilice un 216 00:38:40,159 --> 00:38:46,239 un ActionListener, ¿vale? Y que acuda al ActionPerform. 217 00:38:46,599 --> 00:38:53,960 Entonces, aquí en este null, lo que le marcamos, es decir, los parámetros del ActionListener, 218 00:38:54,019 --> 00:38:56,780 lo que le tenemos que marcar es el elemento que queremos mandarle. 219 00:38:56,780 --> 00:39:02,300 En este caso, es el propio botón aceptar. Entonces, le haríamos un Dish, ¿de acuerdo? 220 00:39:02,300 --> 00:39:17,179 De hecho, si nosotros queremos hacer algo así y le ponemos aquí aceptar, ya con este código debería funcionar. 221 00:39:18,340 --> 00:39:23,800 Si nosotros le damos a aceptar, nos viene el aceptar pulsado, es decir, ya está funcionando, ¿vale? 222 00:39:24,039 --> 00:39:32,280 Pero nosotros hemos dicho que lo que queríamos realmente era controlar cuando pulsamos el aceptar y cuando pulsamos el cancelar, ¿no? 223 00:39:32,280 --> 00:39:38,460 y que todo esté funcionando dentro de la acción perform muy bien pues para eso tendríamos que lo 224 00:39:38,460 --> 00:39:53,000 primero darle aquí al botón cancelar hacer lo mismo hacerle acción listener igual le vamos a 225 00:39:53,000 --> 00:40:01,039 poner el dis porque queremos que sea el evento de este mismo de este mismo botón el que nosotros 226 00:40:01,039 --> 00:40:09,440 estemos mandando al perform ok entonces una vez tenemos esto nosotros ahora tenemos que 227 00:40:09,440 --> 00:40:18,039 aprender a distinguir cuando estamos llamando a un botón oa otro botón entonces para ello si 228 00:40:18,039 --> 00:40:34,650 os fijáis aquí donde lo tengo hemos utilizado esta podemos obtener el get source del evento 229 00:40:34,650 --> 00:40:42,690 es decir, del objeto que está del tipo action event, es decir, el evento, de qué tipo de objeto es. 230 00:40:43,329 --> 00:41:06,500 Y entonces nosotros aquí le ponemos source y aquí le podemos poner, por ejemplo, el botón, o sea, no, aquí sería el equals y le ponemos el botón. 231 00:41:06,500 --> 00:41:31,210 ¿Vale? Aquí nos está dando un error, que ahora veremos por qué es, y a ver si alguien sabe por qué está dando este error. ¿Vale? ¿De acuerdo? Cerramos paréntesis, pero sigue dando error. ¿Por qué? 232 00:41:31,210 --> 00:41:50,059 efectivamente es decir nosotros el botón aceptar cuando lo tenemos aquí creado lo tenemos como lo 233 00:41:50,059 --> 00:41:57,199 tenemos aquí en jota button pero es el es del constructor pero no está fuera entonces tendríamos 234 00:41:57,199 --> 00:42:08,989 que aquí arriba donde tenemos private jota panel puedes crearlo ahí vale estamos aquí le quitaríamos 235 00:42:08,989 --> 00:42:22,639 el tipo aceptar y aquí al botón cancelar igual vale entonces lo vamos a crear aquí 236 00:42:28,980 --> 00:42:34,480 un botón y hemos dicho que era vete 237 00:42:34,480 --> 00:43:06,440 n aceptar y aquí cancelar, vale, entonces ahora si os fijáis aquí abajo ya nos lo permite, vale, 238 00:43:07,800 --> 00:43:17,599 entonces aquí por ejemplo lo que estamos queriendo decir es que efectivamente si el evento que está llegando 239 00:43:17,599 --> 00:43:22,480 es de este tipo, del tipo botón, botón aceptar 240 00:43:22,480 --> 00:43:25,639 que le hemos dado antes, entonces, haznos lo siguiente, y si no 241 00:43:25,639 --> 00:43:39,250 save, source, punto equals 242 00:43:39,250 --> 00:43:43,599 y botón cancelar 243 00:43:43,599 --> 00:44:07,510 vale, y le ponemos 244 00:44:07,510 --> 00:44:17,760 cancelar pulsado, bueno, pues con esto, más o menos se entiende este código 245 00:44:17,760 --> 00:44:20,800 ¿sí? vale, pues 246 00:44:20,800 --> 00:44:22,820 cuando lo generamos 247 00:44:22,820 --> 00:44:27,260 vale, si pulsamos aceptar 248 00:44:27,260 --> 00:44:28,619 nos pone aceptar pulsado 249 00:44:28,619 --> 00:44:30,820 y si pulsamos cancelar 250 00:44:30,820 --> 00:44:33,179 nos mostraría 251 00:44:33,179 --> 00:44:35,059 el mensaje de cancelar pulsado 252 00:44:35,059 --> 00:44:37,099 vale, entonces esto está muy bien 253 00:44:37,099 --> 00:44:37,880 que nos muestre 254 00:44:37,880 --> 00:44:41,099 todo este tipo de resultados, que nos lo muestre 255 00:44:41,099 --> 00:44:42,900 por consola, pero 256 00:44:42,900 --> 00:44:45,000 estaremos de acuerdo que para el usuario es un poco 257 00:44:45,000 --> 00:44:47,219 cutre, no, esto no es 258 00:44:47,219 --> 00:44:48,579 no sé 259 00:44:48,579 --> 00:44:50,880 decirle has comprado esto 260 00:44:50,880 --> 00:44:51,980 y ponérselo ahí en un texto 261 00:44:51,980 --> 00:44:57,860 estaría bien poder actualizar o poder hacerlo a través de otro elemento 262 00:44:57,860 --> 00:45:00,440 que tengamos en nuestro formulario, por ejemplo un label 263 00:45:00,440 --> 00:45:02,599 y que muestre ese mismo mensajito 264 00:45:02,599 --> 00:45:05,079 entonces si os parece vamos a ponerle un label 265 00:45:05,079 --> 00:45:11,139 esto lo voy a dejar porque es bastante sencillo 266 00:45:11,139 --> 00:45:16,139 entonces lo que quiero es que ahora mismo pongáis un label aquí 267 00:45:16,139 --> 00:45:23,019 y en lugar de mostrarme el código, donde tengo yo el código, aquí 268 00:45:23,019 --> 00:45:37,559 en lugar de mostrármelo con el System.out.println, quiero que me lo pongáis en la propiedad text del label, ¿vale? 269 00:45:38,500 --> 00:45:43,039 Así es que nada, pegaros un poquito con esto que es muy sencillito, y ahora lo vemos si queréis.