Saltar navegación

Clase 26-04-24 - 1 - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 6 de mayo de 2024 por Raquel G.

9 visualizaciones

Descargar la transcripción

El 5 es el primero en el cual se incorpora la necesidad de investigar un componente nuevo. 00:00:01
Claro, pero es que componentes posibles de swing hay tropecientos mil. 00:00:06
Entonces continuamente uno puede necesitar investigar un componente nuevo para incorporarlo. 00:00:10
Y ya está. 00:00:15
Pues este es un componente nuevo a investigar que uno busca. 00:00:16
¿Y este cuál es? ¿Este swing cómo lo llama? 00:00:18
Ah, vale, este es el combo box, que es el desplegable de toda la vida. 00:00:20
Pues una vez que uno identifica, ah, es así, pues ya estudia un poquito cómo funciona. 00:00:24
que siempre será, lo integro en mi aplicación 00:00:28
lo añado 00:00:31
a mi panel 00:00:33
veo los métodos que tiene 00:00:33
para hacer las cosas 00:00:36
que a mí me interesan 00:00:39
en este caso el desplegable tendrá métodos 00:00:40
de añadir al desplegable 00:00:43
eliminar del desplegable 00:00:45
coger lo que esté seleccionado 00:00:46
pues veo los métodos que tiene 00:00:48
y luego en el caso de que quiera capturar un evento 00:00:50
sobre él, pues sería 00:00:53
voy a probar el ActionListener, cómo funciona 00:00:55
o si no voy a ver 00:00:57
que otro evento se adapta, si el de hacer clic 00:00:59
con el mouse, listener 00:01:01
esa es la dinámica, bueno pues en este caso 00:01:03
si uno hace esto así de corrido 00:01:06
así a lo bestia 00:01:11
pues lo que habréis hecho habrá sido lo de siempre 00:01:12
esto 00:01:20
heredando 00:01:22
del JFrame 00:01:23
y un constructor 00:01:26
y ahora en este 00:01:27
pues todavía vamos a poner todos los componentes 00:01:34
uno detrás de otro con un gestor de ubicación 00:01:36
normal y corriente 00:01:38
vale, y ahora añadimos los componentes 00:01:40
entonces 00:02:08
importamos el frame 00:02:09
vale, componentes 00:02:12
vamos a decidir cuáles 00:02:15
dos áreas de texto, dos etiquetas 00:02:16
y un botón 00:02:18
y un componente de estos 00:02:20
que tenemos que averiguar cuál es 00:02:22
una vez que uno lo averigua lo pone 00:02:23
¿dónde ponemos los componentes? 00:02:25
bueno, pues tenemos dos posibilidades 00:02:28
o aquí fuera como propiedades de la clase 00:02:29
o dentro como variables locales 00:02:32
del constructor 00:02:34
si vamos a tener 00:02:35
que acceder a esos 00:02:38
componentes desde clases 00:02:40
internas, desde aquí 00:02:42
que aquí pondremos las clases 00:02:44
internas que son los capturadores 00:02:46
si vamos a tener que acceder a esos componentes 00:02:48
el sitio para ponerlos 00:02:50
es ahí, para tener acceso 00:02:52
a las clases internas 00:02:54
si no vamos a tener que acceder a ellos, pues los puedo declarar 00:02:55
dentro, entonces en este caso 00:02:58
uno podría pensar, vamos a ver 00:03:00
esto 00:03:02
¿cómo va a funcionar? 00:03:04
bueno pues, ¿cuáles 00:03:07
de estos elementos van a tener 00:03:08
que ser capturados 00:03:10
o evento? el botón 00:03:12
porque cuando demos al botón algo va a tener 00:03:14
que pasar, cuando demos al botón 00:03:16
va a tener que pasar, que cojamos 00:03:18
lo que hay en este área de texto, cojamos lo que 00:03:20
hay en este área de texto y lo guardemos 00:03:22
en algún sitio 00:03:24
para tenerlo ahí 00:03:25
para cuando haya que tirar de él 00:03:27
y luego además que se actualice aquí 00:03:28
luego 00:03:30
este área de texto 00:03:32
este área de texto 00:03:35
y este combo box tienen que ser accesibles 00:03:36
desde las clases internas 00:03:39
que están fuera del 00:03:41
constructor, que están fuera 00:03:42
luego esas tres áreas de texto 00:03:44
como mínimo tienen que estar fuera 00:03:46
esas tres áreas de texto como mínimo 00:03:48
tienen que estar fuera 00:03:50
pues entonces las ponemos fuera 00:03:51
vale, ahí va a estar el área de texto de título 00:03:53
que la declararíamos ya 00:03:57
con el tamaño que nos diera la gana 00:04:04
el tamaño visible 00:04:05
no el que cabe, el que cabe, cabe mucho más 00:04:07
el visible, el otro 00:04:10
y hemos dicho que como 00:04:22
este elemento también tiene que estar 00:04:28
visible desde 00:04:30
Daniel, tiene que estar visible 00:04:32
desde las clases 00:04:34
capturadoras que están 00:04:36
fuera del constructor 00:04:38
también tiene que estar visible, tenemos que ponerlo 00:04:40
también aquí, entonces 00:04:42
después de hacer la fase de ver, oye y este desplegable 00:04:44
¿cuál es? swing, ¿cómo lo llama? 00:04:46
ah, es el jcombo box, pues nada 00:04:48
me pongo ahí 00:04:50
un jcombo box 00:04:52
y ya de paso, pues lo instancio 00:04:53
¿vale? 00:05:01
entonces 00:05:12
vale 00:05:13
ahí, vale 00:05:27
entonces aquí ya 00:05:29
ya se, me salta una pequeña 00:05:30
una pequeña alarma que es que 00:05:33
me dice un aviso amarillo, no un error 00:05:35
me dice, combo box 00:05:37
en una clase genérica, deberías parametrizarla 00:05:39
bueno, entonces yo esa 00:05:41
alarma por ahora me la dejo ahí 00:05:43
registrada como diciendo, en algún momento 00:05:45
entenderé a qué se refiere 00:05:47
por ahora voy a seguir tirando 00:05:48
porque bueno, ese elemento se llama combo box 00:05:51
yo lo he instanciado, me ha dejado y lo voy a añadir 00:05:53
vale 00:05:56
y ese aviso pues me lo dejo 00:05:56
ahí registrado como, uy voy a tener que volver 00:06:00
a sobre esto seguramente en algún momento 00:06:02
cuando tenga mi aplicación más avanzada 00:06:04
y la esté probando, seguramente haya que volver. 00:06:06
Vale, pues por ahora no lo dejamos ahí, ese proceso. 00:06:08
Vale, entonces, ¿el resto de componentes es necesario que vayan fuera? 00:06:12
Bueno, las etiquetas no, las etiquetas se ponen ahí 00:06:18
y ninguna clase interna las toca para hacer nada. 00:06:21
La aplicación va funcionando y las etiquetas están ahí inamovibles, 00:06:24
las de tu director, están ahí que no se mueven. 00:06:27
Nadie las tiene que tocar, pues las puedo declarar dentro del constructo 00:06:30
y las dejo como locales, por ejemplo. 00:06:33
el botón 00:06:34
hay que añadir el evento 00:06:36
pero el botón se toca, se cambia 00:06:38
se le cambia el nombre, se hace algo con él 00:06:41
pues no, el botón no se le toca 00:06:43
tampoco, está ahí inamovible 00:06:45
entonces puede declarar localmente a la aplicación 00:06:46
en principio, venga pues lo declaro 00:06:49
dentro, todo lo que uno declare local 00:06:51
si puede, mejor 00:06:53
porque todo lo local 00:06:55
al estar más escondido 00:06:57
es más fácil que no de problemas al resto de la aplicación 00:06:58
que no genere 00:07:02
ambigüedades, entonces todo lo que sea local 00:07:02
pues local, bueno pues 00:07:05
lo que es local es lo que me falta 00:07:07
la etiqueta de título 00:07:09
y ya le vamos a poner en el constructor lo que queremos 00:07:10
que figure en ella 00:07:20
la etiqueta en la que pone 00:07:22
director 00:07:33
me he adelantado al siguiente paso 00:07:34
esta es la etiqueta sin más 00:07:44
que no se va a tocar, nadie más la va a 00:07:49
tocar una vez puesta en la 00:07:52
una vez puesta en la interfaz 00:07:53
entonces la declaramos local y mejor 00:07:55
y el botón, el botón también 00:07:57
una vez pegado en la interfaz 00:08:02
el programa ya no lo toca más 00:08:03
no lo tiene que tocar más para nada 00:08:06
lo toca el usuario cuando hace click 00:08:08
pero el programa ya no lo vuelve a tocar 00:08:09
pues entonces local ahí 00:08:11
vale, pues ahora ya lo único que falta es añadirlos 00:08:13
lo ideal sería pues trabajar 00:08:41
con un gestor de ubicación 00:08:43
absoluta, con un gestor grid layer 00:08:45
lo que fuera para colocarlo yo como yo lo quisiera 00:08:46
pero nosotros toda esa parte de jugar con los gestores 00:08:48
de ubicación directamente por código 00:08:51
la dejamos, la tenéis muy bien documentada 00:08:52
en la API de Java 00:08:56
en los libros, donde sea 00:08:58
pues vamos a añadirlos al menos 00:08:59
por orden para que se entienda, primero vamos a añadir 00:09:02
al panel 00:09:04
vamos a añadir 00:09:05
la etiqueta de título 00:09:10
añadimos 00:09:12
la etiqueta de título 00:09:15
luego vamos a añadir el área de texto 00:09:17
para el título 00:09:20
vamos a añadir el área de texto para el título 00:09:21
que es este 00:09:32
Luego vamos a añadir la etiqueta 00:09:33
Para el director 00:09:37
Luego vamos a añadir 00:09:41
El área de texto para el director 00:09:44
Que era este 00:09:50
Luego vamos a ponerle el botón 00:09:51
Para que al menos tenga un poquito de orden 00:09:53
Le vamos a añadir el botón 00:09:55
Y luego le vamos a añadir ya 00:09:57
El desplegable 00:10:01
Vale, mi interfaz está 00:10:02
Le vamos a dar 00:10:13
tamaño aquí mismo 00:10:14
dis.setSize 00:10:16
o setSize, como lo queréis llamar, le vamos a dar 00:10:20
pues yo que sé, 200 00:10:22
200, a ver como sale 00:10:24
y le vamos a hacer 00:10:25
visible 00:10:28
ya dentro del constructor directamente 00:10:28
bueno, pues mi constructor 00:10:32
ya lo hace todo, mete los componentes 00:10:36
en el panel 00:10:38
hace visible, esto es como poner 00:10:40
dis, obviamente, ¿no? 00:10:42
a este frame, a este, fíjale este tamaño 00:10:44
pero como el dis es opcional 00:10:46
Vale, y ahora nos falta un main 00:10:47
Vale, y ahora nos falta un main 00:10:52
Para poder lanzar la aplicación 00:11:01
Vamos a meter el main aquí mismo 00:11:02
Y así no nos tenemos que hacer una clase aparte 00:11:04
Para hacer las pruebas 00:11:07
Esto solamente para facilitar la fase de pruebas 00:11:09
Lo normal en una aplicación 00:11:14
Es que el arrancable 00:11:17
Estaría en otro sitio 00:11:19
Vale, pues aquí creamos la ventana 00:11:19
Y ya está 00:11:23
Es que ya, como aquí 00:11:23
Ni voy a hacer el Vset visible y nada 00:11:30
Porque lo he hecho aquí 00:11:32
Es que ni siquiera tengo por qué guardar la referencia 00:11:33
Ya, si no me da la gana 00:11:36
¿Para qué voy a guardar la referencia? 00:11:37
No me hace ninguna falta 00:11:39
Porque este Main no hace más que esto 00:11:40
No hace más 00:11:42
Vale 00:11:44
Entonces, la vista estaría 00:11:44
Vamos a probarla 00:11:47
Luego falta el comportamiento 00:11:48
La vista está, vamos a probar 00:11:50
si es como la que queremos 00:11:53
va a estar fea porque va a estar todo seguido 00:11:55
ah bueno, es que no he fijado el gesto de ubicación 00:11:58
pues obviamente estaba muy fea 00:12:01
entonces al panel 00:12:03
al panel hay que fijarle 00:12:05
el layout 00:12:09
este de aquí, ala, ya está 00:12:10
fija el panel, volvemos a hacer la prueba 00:12:13
vale, siempre 00:12:14
hay que hacer 00:12:17
las pruebas primero de la 00:12:18
vista, antes de meterse 00:12:21
con el comportamiento 00:12:23
Bueno, pues hombre 00:12:23
Pues joder, he acertado con el tamaño 00:12:26
Porque es que me queda 00:12:28
De casualidad, porque queda bien 00:12:28
Título, abajo el título, director 00:12:31
Abajo el director, añado película 00:12:33
Y aquí el desplegable que además no tiene nada 00:12:35
Está vacío 00:12:37
Vale, pues muy bonita mi interfaz 00:12:38
Es la justo la que quería 00:12:42
Pues ahora ya voy a dar comportamiento 00:12:43
A los eventos que lo tengan 00:12:46
A los componentes que lo tengan 00:12:47
¿Qué dos componentes? 00:12:49
Cada vez que yo le dé al botón 00:12:51
hay que coger el título que hay aquí 00:12:52
y el director que hay aquí 00:12:55
y guardarlo 00:12:57
idealmente en una base de datos 00:12:59
que no tenemos, pero guardarlo 00:13:01
vale, y luego además 00:13:03
este combo box 00:13:07
se va a tener que actualizar de tal manera 00:13:08
que registre que tenga 00:13:11
todos los títulos que están guardados 00:13:13
vale, entonces 00:13:15
este tiene que recoger un evento 00:13:18
y ahora, ¿qué más hace la aplicación? 00:13:20
pues cuando tú despliegas el combo box y haces clic 00:13:22
en un título 00:13:24
te aparecerá aquí el director de la película 00:13:25
luego dos funcionalidades 00:13:28
añadir película a mi 00:13:30
almacén de películas 00:13:32
y ahora cuando en el 00:13:34
combo box selecciono un título 00:13:36
me aparecerán los datos de esa peli 00:13:38
que en este caso es el director solo 00:13:40
pero podría haber aquí 00:13:41
muchos más textfield con título, director, año 00:13:44
intérpretes, bla bla bla 00:13:46
podría yo guardar todo eso 00:13:47
extendido y cuando yo selecciono aquí el título 00:13:49
pues que me aparezcan todos 00:13:52
Entonces he puesto solo director para no perder el tiempo 00:13:54
Haciendo lo mismo una y otra vez 00:13:57
Pero sería lo mismo 00:13:58
Vale 00:13:59
Los testfields he puesto 20 00:14:00
Pero vamos, que lo he hecho todo 00:14:06
De pura casualidad 00:14:09
Y ha encajado en un aspecto más o menos normal 00:14:10
Porque 00:14:13
Ahora lo estiro 00:14:16
Pues me queda así, que no queda mal tampoco 00:14:18
Vale 00:14:20
Entonces este tamaño 00:14:22
Si pudiera pillarlo 00:14:26
Y dejarlo 00:14:27
Este estaría mejor 00:14:29
Pero este tamaño igual es 00:14:30
400 por 00:14:33
Única prueba que hago, no voy a perder el tiempo con esto 00:14:36
Voy a probar 00:14:39
A ver si 00:14:50
400, bueno 00:14:51
Una prueba más solo, 600 00:14:58
A ver si 600 queda mejor 00:15:00
Lo de 75 un poco corto 00:15:03
120 00:15:16
Y ya está 00:15:18
Ya lo dejo 00:15:20
no ha quedado mal, para ser un flow layout 00:15:21
no ha quedado mal 00:15:34
vale 00:15:36
pues entonces ahora vamos con el comportamiento 00:15:36
vamos a hacer una capturadora 00:15:39
para este y otro capturadora 00:15:42
para este 00:15:44
a ver, podríamos meterlo en la misma capturadora y decir 00:15:44
si el objeto que causó el evento 00:15:48
equals este 00:15:50
jbutton, pues entonces 00:15:51
no sé qué, y si no 00:15:53
es que será este otro 00:15:56
si lo hago así, con un 00:15:57
if y un else, lo único que cambia es que entonces 00:15:59
desde ese evento sí que necesito 00:16:01
el acceso al botón 00:16:03
entonces tendría que sacarlo fuera 00:16:06
tendría que sacar la declaración 00:16:07
de esto fuera 00:16:10
pero en este caso 00:16:10
lo que se hace en el if y en el else 00:16:13
son dos cosas muy distintas 00:16:16
son dos códigos muy distintos 00:16:17
entonces siempre por principio 00:16:19
no hagamos métodos largos 00:16:21
¿para qué? es mucho mejor 00:16:23
tener un montón de clases pequeñas 00:16:26
que una única clase muy larga 00:16:28
es mejor tener un montón de métodos pequeños 00:16:29
que un único método muy grande 00:16:33
esos son principios de programación básicos 00:16:34
vamos a atomizar todo lo que podamos 00:16:37
y luego ya tú vas llamando a lo que te haga falta 00:16:39
pero es mucho más fácil 00:16:41
seguir una cadena de llamadas a métodos 00:16:42
porque el propio nombre del método 00:16:44
te informa de lo que está pasando 00:16:46
entonces es más fácil seguir una llamada 00:16:48
añade no sé qué 00:16:50
borra esto, borra no sé cuántos 00:16:52
es más fácil seguir una línea de llamada de métodos 00:16:54
que seguir un código con sentencias 00:16:56
java así de largo que te hace todo eso 00:16:58
entonces 00:17:01
en este caso, ¿qué es lo que quiero decir? 00:17:02
¿para qué hacer dos clases? 00:17:05
¿para qué hacer una única clase capturadora? 00:17:06
para aglutinar los dos 00:17:08
cuando lo que se hace con el botón 00:17:10
es muy diferente a lo que se hace con el combo box 00:17:12
entonces dentro de la capturadora tendrás 00:17:14
if es el botón, pa pa pa, un chorizo 00:17:16
else, pa pa pa, otro chorizo, pues no, para eso te haces 00:17:18
dos clases y lo separas en dos clases 00:17:20
¿vale? 00:17:23
bueno, pues entonces vamos a hacernos primero 00:17:24
la clase que va a atender 00:17:26
al botón este de aquí 00:17:28
pues esa clase 00:17:29
si la hacemos como clase interna por comodidad 00:17:32
pues 00:17:36
será la clase para el botoncito 00:17:37
y tiene que 00:17:39
implementar ActionListener 00:17:41
porque el evento que debemos capturar es hacer clic 00:17:43
si fuera otro evento 00:17:45
relacionado con el ratón, con el teclado 00:17:46
con que el botón gane el foco o no lo gane 00:17:50
pues sería MouseListener, KeyListener 00:17:52
FocusListener 00:17:54
pero este es el por defecto, hacer clic 00:17:55
pues entonces ActionListener 00:17:57
sin complicaciones 00:17:59
vale, y ahora 00:18:02
si implementamos ActionListener 00:18:05
pues ya sabemos que 00:18:07
tenemos que implementar 00:18:08
este evento, y este evento 00:18:11
justo es lo que queremos que pase 00:18:13
cuando 00:18:15
cuando se dé al botón 00:18:16
vale, pues cuando se dé al botón entonces 00:18:19
¿qué queremos que ocurra? cuando se dé al botón 00:18:21
queremos que se cojan 00:18:23
los datos de una película 00:18:25
en este caso serían solo título y director 00:18:27
pero podrían ser más 00:18:29
y esa película quede guardada 00:18:31
entonces ahí ya tengo que empezar a hacer una primera 00:18:33
decisión que esta ya sí que es importante 00:18:35
porque lo que hemos hecho hasta ahora 00:18:37
es el front que se llama 00:18:38
me echo mi aspecto, eso es una tontería 00:18:40
eso es decido, arrastro 00:18:43
y pego, nada más 00:18:45
ese es el front 00:18:47
ahora viene el back, esas son ya las decisiones que cuenta 00:18:48
las que definen 00:18:52
cómo funciona tu aplicación, etc 00:18:53
vale, pues entonces aquí tenemos 00:18:55
la primera decisión de Bach, interesante 00:18:57
que es, vale, yo voy a tener que guardar películas 00:18:59
como lo hago, que diseño 00:19:01
hago, hombre, pues mira 00:19:03
vamos a hacer una clase película para guardarlo 00:19:05
porque si no, ¿qué hago? 00:19:07
guardo los títulos en un list de títulos 00:19:09
los directores en un list de directores 00:19:10
bueno, en este caso, como salen dos campos, podríamos 00:19:13
hacer un map que guarde 00:19:15
la clave, el título 00:19:17
el director, el valor 00:19:18
pero entonces no puede haber dos películas 00:19:20
que se llamen igual, o sea, dos directores 00:19:23
no podrían hacer dos películas con el mismo nombre 00:19:25
claro, si no va a ser ese el caso 00:19:27
pues no hay ningún problema 00:19:31
y por otro lado 00:19:33
si vamos a tener, si esta aplicación 00:19:36
se extiende, llega un momento en que me dicen 00:19:37
oye que extiende la aplicación 00:19:39
pero ahora quiero que de la película me guardes 00:19:41
año, intérpretes, patatín 00:19:43
pues entonces ya tengo que 00:19:45
rehacer mucho la aplicación, ya el map se me 00:19:47
descoloca, muchísimo mejor si me hago una clase 00:19:49
película, me hago una clase película 00:19:51
y así si la aplicación la extiendo le añado una propiedad 00:19:53
a la clase y ya está 00:19:55
pero ese muchísimo mejor 00:19:57
lo digo entre comillas y con matices 00:19:59
son decisiones de diseño 00:20:02
que dependen de todo el 00:20:03
contexto en el que esté trabajando 00:20:06
uno y con quien esté trabajando y quien lo vaya a usar 00:20:08
son muchísimo mejor a coger con pinzas 00:20:10
¿vale? pero bueno 00:20:12
en general, vamos a guardar datos de películas 00:20:14
pues parece de cajón 00:20:16
hacer una clase película 00:20:18
¿no? pues venga 00:20:20
vamos a hacer una clase película 00:20:22
entonces yo aquí lo estoy metiendo en el mismo paquete 00:20:23
porque los estoy separando por ejercicio 1, 2, 3 00:20:29
o lo que sea para luego subirlo 00:20:31
pero idealmente iría en otro paquete 00:20:33
en un paquete iría la vista, en otro iría 00:20:35
los métodos a los que llaman los capturadores, etc 00:20:36
vale, pero nos hacemos 00:20:39
una clase película 00:20:43
con dos propiedades 00:20:46
el título 00:20:48
y el director, bueno, como vamos van a ser string 00:20:56
Por ahora son las únicas dos propiedades 00:21:06
Pero esto ya se podría extender a más 00:21:10
Sin un momento dado la aplicación 00:21:12
Hay que escalarla a que las películas 00:21:13
Tengan más datos 00:21:15
Pues nada, los dos constructores 00:21:16
Para facilitarnos 00:21:21
El trabajo 00:21:22
Y GetDeset 00:21:24
Vale, bueno pues ya la clase película está 00:21:38
Entonces ahora 00:21:56
Volvemos a nuestra aplicación 00:21:57
Porque estábamos en el evento 00:21:59
Del botón 00:22:01
que es 00:22:02
este elemento del botón 00:22:04
y que hacíamos aquí 00:22:06
crear una película nueva 00:22:07
con los datos de la aplicación 00:22:10
y ahora habrá que decidir esa peli 00:22:12
donde la guardamos 00:22:14
pero ya crear la película lo podemos hacer 00:22:16
entonces 00:22:19
pues lo primero 00:22:20
que ocurra cuando 00:22:23
le demos al botón 00:22:24
será crear el objeto película 00:22:27
con los datos 00:22:29
que están en las áreas de texto 00:22:32
pues 00:22:33
título era el área de texto 00:22:36
punto gettest 00:22:38
y director punto gettest 00:22:40
vale, entonces 00:22:45
he cogido directamente 00:22:48
lo que hay en las áreas de texto con el gettest 00:22:50
como título 00:22:52
está declarada fuera 00:22:55
del constructor 00:22:58
está declarado fuera, es variable de clase 00:23:00
como está declarado fuera 00:23:02
puedo acceder aquí sin problema a él 00:23:03
si estuviera declarado local al constructor 00:23:06
no podría, pero lo he declarado 00:23:09
fuera precisamente porque iba a necesitar 00:23:11
acceder desde la capturadora 00:23:14
ah, ya tengo mi película 00:23:15
ahora, siguiente decisión 00:23:17
bueno, pues tengo que resolver 00:23:19
dónde van esas películas porque 00:23:21
tienen que estar ahí almacenadas durante todo 00:23:23
el tiempo de vida de la aplicación, porque la aplicación 00:23:25
trabaja con ellas, las consulta 00:23:27
a través del combo box, tienen que 00:23:30
estar en algún lado 00:23:31
lo ideal pues sería, la enchufo 00:23:32
una base de datos, pero claro, no sabemos enchufar 00:23:35
una base de datos, pero sí podemos 00:23:37
habilitar una colección para que se guarden 00:23:39
las películas. Bueno, pues 00:23:41
una colección, la más 00:23:43
sencilla que se nos ocurre para que se guarden las películas 00:23:45
pues podría ser una 00:23:48
lista, ¿vale? Una lista de películas 00:23:49
y si no, podría ser un set 00:23:52
entonces 00:23:53
¿qué nos hace decidir si es una lista 00:23:54
o un conjunto? 00:23:57
Los duplicados, ¿verdad? 00:24:00
Si queremos que haya duplicados o no queremos que haya 00:24:02
duplicados 00:24:05
porque si yo no voy a meter 00:24:05
nunca una misma película 00:24:08
dos veces, pues entonces puedo usar 00:24:09
un set, que el set 00:24:12
la complejidad interna de uso 00:24:13
para Java es mejor 00:24:16
entonces es más eficiente 00:24:18
para nosotros es lo mismo, es hacer 00:24:19
un add a la colección 00:24:22
un remove, es lo mismo, nos da igual 00:24:23
a efectos de programación, nos da igual un list que un set 00:24:25
porque se usan igual 00:24:28
pero las implicaciones 00:24:29
que tienen a nivel computacional 00:24:32
pues el set es más eficiente, pero a cambio 00:24:34
no puedo meter duplicados 00:24:36
entonces 00:24:37
ahora entraríamos a la siguiente pregunta 00:24:39
¿qué significa duplicados? 00:24:41
¿cuál es mi clave primaria de las pelis? 00:24:44
esto de nuevo son decisiones que no es que tengan 00:24:45
una respuesta universal 00:24:48
tienen una respuesta en el contexto 00:24:50
de la aplicación y para cada aplicación 00:24:52
tendrán una, entonces yo en la aplicación 00:24:54
en la que estoy, con el que me la ha pedido me dice 00:24:56
a ver 00:24:58
¿puede haber dos pelis con el mismo título? 00:24:58
pues sí 00:25:02
Puede haber dos directores que hayan hecho dos pelis 00:25:03
Que se llaman igual, no pasa nada 00:25:07
Puede haber dos directores que hayan hecho dos pelis que se llaman igual 00:25:08
¿Puede haber un director que pueda hacer dos pelis? 00:25:11
Pues sí, un director puede hacer dos pelis 00:25:16
Entonces en función de lo que nos responda 00:25:18
Si nos responde eso 00:25:19
La clave primaria de las películas sería doble 00:25:22
La clave primaria sería doble 00:25:28
Sería la combinación de título y director 00:25:31
¿Vale? 00:25:33
Entonces eso es lo que también estáis trabajando 00:25:36
En bases de datos 00:25:38
Hay que decidir cuál es la clave primaria 00:25:38
Que mejor representa 00:25:42
Un modelo de datos 00:25:44
Entonces aquí habría que aclararlo 00:25:45
Con el que nos lo dijera 00:25:48
Oye, para ti la unicidad de las pelis 00:25:49
¿Cuál es? 00:25:52
El título, el director 00:25:53
La combinación de ambos 00:25:56
La del director no tiene sentido 00:25:58
pero lo normal es que un director haga varias películas 00:25:59
la del título 00:26:01
podría tenerlo, pero hombre 00:26:03
habría que aclarar, oye, a ver 00:26:05
¿pueden dos directores repetir peli? 00:26:07
repetir título, perdón 00:26:10
bueno, en función de lo que nos diga, decimos 00:26:11
la clave primaria 00:26:13
¿vale? 00:26:14
pero aquí, ¿qué ocurre en esta aplicación? 00:26:17
que si el tío me dice, no, no, claro que pueden dos 00:26:19
directores hacer una peli al mismo título 00:26:21
pues entonces nos ha planteado 00:26:23
la aplicación muy mal 00:26:25
porque entonces nosotros que estamos analizándola 00:26:26
y no se nos escapa ningún detalle 00:26:29
porque el que nos pide la aplicación se le escapan 00:26:31
mil detalles, porque él quiere algo 00:26:33
y lo normal es que nunca tenga las ideas claras 00:26:35
y te dice, yo quiero que me hagas esto, que haga no sé qué 00:26:37
entonces, el trabajo 00:26:39
del desarrollador 00:26:41
es poner en orden 00:26:43
las ideas confusas que tiene esa persona 00:26:45
que te está pidiendo el software y que seguramente 00:26:47
te está diciendo cosas incoherentes, por ejemplo 00:26:49
aquí rápidamente diríamos, a ver, vamos a ver 00:26:51
si aquí van a ir 00:26:53
los títulos y por título 00:26:55
yo voy a poder seleccionar peli para ver director 00:26:57
no me puedes decir 00:27:00
que dos directores 00:27:01
puedan hacer una peli con el mismo nombre 00:27:04
entonces cuando yo selecciono aquí Harry Potter 00:27:05
si dos directores han hecho una peli que se llama Harry Potter 00:27:07
¿a cuál te pongo aquí? 00:27:10
entonces ahí ya no sé 00:27:13
habría estado dando un requisito mal 00:27:14
que es lo habitual 00:27:15
bueno pues entonces o se cambia la aplicación 00:27:16
para que sea director 00:27:20
es que lo han hecho, lo vamos a hacer 00:27:21
entonces la clave primaria tiene que ser 00:27:22
el título 00:27:25
¿verdad? entonces ese análisis 00:27:26
ese análisis ya habría avanzado 00:27:29
un poco para dar forma a la aplicación 00:27:31
que nos han pedido 00:27:33
bueno, entonces lo que de alguna manera quiero deciros 00:27:34
es que hay que pensar mucho 00:27:37
antes de escribir, antes de poner 00:27:39
soluciones, antes de... porque hay que tener muy muy 00:27:41
claro qué se quiere hacer 00:27:43
y sobre todo cuáles son 00:27:45
los requisitos, las condiciones de trabajo 00:27:47
bueno, pues todo esto venía 00:27:49
a cuento de qué decidir, si una lista 00:27:51
y un conjunto, vale 00:27:53
ya hemos dado un paso grande 00:27:55
que es decidir cuál es la clave primaria 00:27:56
de la aplicación, películas 00:27:59
título, perdón, y ahora 00:28:01
vamos a admitir meter la misma 00:28:02
película varias veces 00:28:05
si la aplicación lo necesita 00:28:06
no nos queda más remedio que una lista 00:28:11
pero hombre, esta aplicación 00:28:13
en principio no lo necesitas para meter películas 00:28:15
y según yo las tengo metidas, pues ya van ahí 00:28:17
a la colección y ya está, y una vez que he metido una peli 00:28:19
no la tengo que meter una segunda vez 00:28:21
No parece que sea necesario que una peli esté dos veces metida, ¿no? La misma peli esté dos veces en posiciones distintas de la lista. No parece necesario. Podría serlo en otra aplicación que pidiera otras cosas, pero en esta no lo parece. Bueno, pues podríamos meterlo en un set. Ya está. 00:28:23
pues todo esto es para tomar una decisión 00:28:41
que parece trivial y en una aplicación 00:28:43
pequeña como esta, uno la puede tomar 00:28:46
rápidamente, pero en una aplicación 00:28:47
grande, uno no la toma rápidamente 00:28:49
estas decisiones, las tiene que tomar 00:28:51
muy concienzudamente, porque si no 00:28:53
la aplicación va a ir bien 00:28:56
o va a ir fallando de manera 00:28:57
que no sabes por qué y al final tienes que rehacer 00:28:59
de cero desde el principio 00:29:01
bueno, pues en nuestro caso si hemos hecho el análisis 00:29:02
más o menos con sentido, hemos decidido 00:29:05
que un set, vale, pues esta peli va a ir a un set 00:29:07
ese set, ¿dónde lo ponemos? 00:29:09
pues tiene que ir a un sitio que sea accesible 00:29:12
desde aquí, lógicamente 00:29:14
desde aquí y desde 00:29:15
seguramente más sitios 00:29:18
entonces, hombre, pues podríamos 00:29:20
poner el set aquí 00:29:22
vale, lo que pasa es que eso es feo 00:29:23
lo podemos poner ahí, ya está 00:29:26
pero bueno, eso es feo a nivel 00:29:27
de diseño porque en realidad 00:29:30
esta clase es mi vista 00:29:32
esta clase se refiere a 00:29:33
toda la parte de código que me construye 00:29:35
que entonces poner aquí 00:29:38
el set, bueno, lo ideal sería 00:29:40
que todo relacionado con los datos vaya en una clase 00:29:42
aparte, pues venga, vamos a 00:29:44
hacerlo un poquito mejor 00:29:46
vamos a hacer aquí una clase 00:29:48
que se llame datos 00:29:50
y aquí van a ir los 00:29:52
datos 00:29:56
pues venga, hemos 00:29:56
dicho que en un set, pues en un set 00:30:01
ya de paso lo instanciamos 00:30:03
pues venga, ¿qué tipo de set? 00:30:10
bueno, vamos a 00:30:11
nos viene bien que cuando 00:30:12
yo itere por las pelis aparezcan ordenadas 00:30:15
alfabéticamente o de alguna manera 00:30:17
pues si 00:30:19
nos da igual, un haset 00:30:21
si nos viene bien que aparezcan ordenadas 00:30:23
cuando yo itero un triset 00:30:25
¿vale? porque recordad 00:30:27
que el triset en la iteración 00:30:29
te lo monta por orden alfabético 00:30:31
el haset, la iteración 00:30:33
te la va sacando 00:30:35
por criterios 00:30:36
que no tienen por qué ser el orden 00:30:39
de los objetos 00:30:40
Vale, pues un headset 00:30:43
Suele ser una opción habitual 00:30:46
Para trabajar con conjuntos 00:30:48
Vale, pues ahora aquí ya 00:30:51
En mi este de aquí 00:30:56
Ya podemos añadir 00:30:57
A los datos 00:30:59
La película 00:31:03
Datos.ad 00:31:05
Película 00:31:11
Uy, que susto que te habías dado 00:31:15
Vale 00:31:18
Uy, datos.ad 00:31:23
Película, que hago yo 00:31:27
datos.peliculas 00:31:28
se llama 00:31:31
.adpelicula 00:31:32
vale, este es mi set 00:31:37
de pelis, variable estática 00:31:40
de la clase, accesible desde cualquier lado 00:31:43
añado la película 00:31:44
vale, esta parte está hecha 00:31:45
¿hasta aquí vamos bien? 00:31:49
¿quién ha dicho sí? 00:31:52
¿tú has dicho sí, Diego? 00:31:56
pues vamos fatal 00:31:57
vamos muy mal 00:31:59
pero admirable que al menos 00:32:01
contestes 00:32:04
eso te lo reconozco 00:32:05
vamos fatalísimo porque estamos 00:32:07
metiendo en un hash set 00:32:10
un objeto 00:32:12
de una clase 00:32:14
que ni hasco, ni igual, ni la madre 00:32:15
que lo trajo, con lo cual ya vamos mal 00:32:18
¿vale? 00:32:20
entonces desde el momento en el que hemos decidido 00:32:21
que las pelis 00:32:24
las pelis van a ir a un hash set 00:32:25
para que 00:32:28
los métodos que llama el hash set 00:32:30
funcionen correctamente por dentro 00:32:32
película tiene que tener el jasco de equals 00:32:34
porque si no 00:32:36
eso de igualdad de pelis por título 00:32:37
que hemos dicho, eso no 00:32:40
se va a dar, no va a haber 00:32:42
ni una sola película igual a otra, porque la igualdad 00:32:44
va a ser por dirección de memoria 00:32:46
entonces que queremos eliminar una peli 00:32:47
esta aplicación no tiene la misma 00:32:50
la funcionalidad de eliminar películas 00:32:52
pero podría tener un botoncito aquí abajo 00:32:54
que fuera eliminar peli 00:32:56
entonces si yo le doy a eliminar 00:32:57
y no tengo el jasco de equals, pues se me complica 00:32:59
la vida porque no puedo usar el remove 00:33:02
voy a tener que iterar, voy a tener que hacer 00:33:03
una movida, no puedo hacer el remove 00:33:06
entonces vamos mal 00:33:07
si no ponemos el jasco de equals en película 00:33:09
pues venga, y aquí es donde 00:33:12
viene la pregunta, en la fase de análisis 00:33:18
acordamos y acordamos bien 00:33:20
y con criterio, no a lo tonto 00:33:22
¿cuál era nuestra clave primaria? 00:33:24
sí, la acordamos muy bien, era el título 00:33:26
vale, y la acordamos 00:33:28
porque si no 00:33:30
la interfaz no tenía sentido, si había un combo box 00:33:31
en el que yo podía solucionar por título 00:33:34
no tenía sentido que la clave primaria no fuera 00:33:36
solo el título 00:33:38
pues ahora nos hacemos el jasco de equals 00:33:39
con esa clave primaria que habíamos decidido 00:33:42
venga, ya está 00:33:44
ahora ya 00:33:47
así que vamos bien 00:33:49
vale, ya hemos añadido la película 00:33:50
pero nos falta 00:33:52
nos falta que hemos dicho 00:33:55
que además de añadir película 00:34:00
yo, ala, ahora ya está añadida 00:34:02
pero nos falta que el combo box 00:34:07
se actualice recibiendo ese nuevo título 00:34:09
esto nos falta 00:34:11
bueno, pues entonces ahora es cuando 00:34:12
buscamos en los métodos de ese objeto 00:34:15
que yo he buscado, el combo box 00:34:17
buscamos en los métodos a ver si hay alguno 00:34:19
que por nombre me suene 00:34:21
a incorporar un nuevo elemento 00:34:23
o busco en los 00:34:25
métodos a ver que me suena 00:34:27
o me voy directamente a la documentación 00:34:28
y lo busco, que siempre sería lo más seguro, claro 00:34:31
vosotros en vuestro caso, pues se lo preguntaríais 00:34:33
a HGPT, pero 00:34:37
así no aprenderíais 00:34:38
Vale, pues venga 00:34:40
El combo box, ¿cómo se llamaba? 00:34:43
Se llamaba 00:34:45
Se llamaba lista películas 00:34:45
Pues venga, lista películas 00:34:51
Lista películas 00:34:56
Vamos a ver qué puedo hacer yo con un combo box 00:35:06
Qué puedo hacer 00:35:08
Añadir un componente 00:35:09
Pero add, bueno, add 00:35:12
Sí, add se parece a lo que yo quiero 00:35:14
Pero es añadir componente 00:35:16
Esto es medio raro 00:35:18
entonces 00:35:19
la única en la que en realidad 00:35:21
me aparece añadir un objeto cualquiera 00:35:28
es add item 00:35:30
entonces hombre, aquí lo normal es que 00:35:32
uff, no tengo yo muy claro 00:35:34
cuál será 00:35:36
uno lo busca en la ayuda, lo busca y en medio 00:35:37
segundo dice, ah, lo que yo estoy buscando es 00:35:40
add item 00:35:42
¿vale? pues venga 00:35:43
añade un nuevo item 00:35:46
a tu desplegable 00:35:48
Vamos a añadir un nuevo ítem 00:35:49
Y que 00:35:51
A ver, vamos a cerrar esto 00:35:53
Y que quiero añadir yo aquí 00:35:56
Quiero añadir el título de la película 00:35:59
Porque eso es lo que quiero 00:36:00
Que me aparezca en 00:36:01
Película.getTítulo 00:36:02
Eso es lo que quiero que me aparezca 00:36:05
Vale 00:36:07
Vale, aquí de nuevo 00:36:08
Me aparece esto en amarillo 00:36:11
Eso de nuevo es una especie de 00:36:12
Cosa que me dejo ahí apuntada 00:36:16
Esto que me dice 00:36:17
Igual tendría que tenerlo en cuenta 00:36:19
Me dice que ComboBox 00:36:20
Mejor si la parametrizo 00:36:21
Ahora volvemos sobre ello 00:36:23
Por ahora vamos nosotros resolviendo 00:36:25
Sobreviviendo a la aplicación 00:36:27
A ver 00:36:28
Vale, vamos a ver si esta parte del botón 00:36:29
Ya hace lo que tiene que hacer 00:36:33
Eso es lo siguiente 00:36:35
La parte del botón yo creo que ya está toda 00:36:35
Vamos a ver si la parte del botón 00:36:37
Hace lo que tenía que hacer 00:36:39
Entonces 00:36:43
Pues venga, esta es mi aplicación 00:36:45
Venga, vamos a añadir una película 00:36:56
Pepito que dirigió 00:36:58
La luna 00:37:01
Añadir peli 00:37:03
Pues aquí no ha añadido la película 00:37:05
¿Vale? 00:37:08
¿Qué puede habernos pasado? 00:37:11
Para haber cometido este fallo que digo 00:37:12
Pero como puede ser, si yo lo he hecho todo bien 00:37:14
¿Qué nos puede haber pasado? 00:37:16
¿Vale? 00:37:18
Os voy a repasar el código de espacio de arriba a abajo 00:37:19
Yo tengo aquí mi constructor 00:37:22
Ahí está construida la interfaz 00:37:24
Tengo aquí la capturadora 00:37:27
No era asociar el evento al botón 00:37:29
Efectivamente 00:37:36
¿Vale? 00:37:38
Entonces 00:37:43
Botón 00:37:43
Toda esta serie de 00:37:44
Despistes y cosas 00:37:47
Que se hacen continuamente 00:37:49
Que no se hagan perder el tiempo 00:37:51
Que no se hagan ya rápidamente 00:37:53
La primera vez que uno lo comete ya lo automatiza 00:37:55
Pero tenéis que automatizarlo para que no se hagan perder el tiempo 00:37:58
Sobre todo un examen 00:38:00
Pues nada 00:38:02
al botoncito, le añadimos el ActionListener 00:38:03
New 00:38:06
y se llama Captura Botón 00:38:06
vamos a volver a probar 00:38:09
vale, pues venga 00:38:20
vamos a ver si Pepito que dirigió 00:38:33
lo estoy haciendo al revés, la luna 00:38:35
que la dirigió Pepito 00:38:37
se me añade 00:38:39
vale, ya tengo ahí una peli 00:38:42
venga, y vamos a ver 00:38:44
si esta otra peli 00:38:47
Que dirigió Juanito 00:38:48
Pues sí, vale, ahí está 00:38:51
Añadida 00:38:53
Vale, entonces uno ya podría 00:38:55
Jugar con esto, hacer mil cosas 00:38:57
Decidir en qué orden aparecen 00:38:59
Ahí, bueno, mil historias 00:39:01
Pero todo esto ya es investigación 00:39:03
Vale, bueno, pues esta parte ya está 00:39:05
¿Qué parte nos falta? Este 00:39:06
Bueno, le he dado aquí tantas veces que me ha aparecido 00:39:09
Tropecientas mil veces en el 00:39:11
Combo Box, con lo cual aquí 00:39:15
Aquí he tenido 00:39:16
Esto es un error de la aplicación, ¿verdad? 00:39:20
O sea, esto cuando uno hace la prueba 00:39:22
Esto a lo mejor lo ha hecho uno y lo pasa a la fase de pruebas 00:39:23
Y cuando uno hace la prueba me dice 00:39:25
Eh, oye, ¿no habíamos quedado que el sol era clave primaria? 00:39:27
Perdona, pues no añadas al combo box 00:39:32
Un título que ya está 00:39:34
Entonces yo esto lo he hecho muy alegremente 00:39:35
Entonces esto sería un bug 00:39:37
Que hay que arreglar, ¿verdad? 00:39:39
Esto es algo que saldría en la fase de pruebas 00:39:41
Cuidado, que yo lo estoy dando aquí 00:39:43
entonces 00:39:45
este 00:39:48
add item de aquí 00:39:55
este add item de aquí 00:39:58
no tiene que ser 00:40:00
incondicional 00:40:01
tiene que ser 00:40:04
añade esta película al combo box 00:40:06
si no está previamente 00:40:09
si no está previamente 00:40:10
¿vale? entonces 00:40:12
esto lo dejo aquí 00:40:14
para que sea un problema que resolváis 00:40:21
vosotros 00:40:23
si no metemos el mismo título la aplicación funciona igual 00:40:24
funciona bien, lo dejo aquí para que 00:40:27
sea un problema que se os quede planteado a vosotros 00:40:29
como resolveríais, vale 00:40:31
y ahora resuelto ese problema 00:40:32
de mal funcionamiento de la aplicación 00:40:34
nos quedaría el evento 00:40:37
de el combo box 00:40:38
vamos a parar un momentito y lo 00:40:40
hacemos luego 00:40:42
Subido por:
Raquel G.
Licencia:
Todos los derechos reservados
Visualizaciones:
9
Fecha:
6 de mayo de 2024 - 19:35
Visibilidad:
Clave
Centro:
IES ROSA CHACEL
Duración:
40′ 48″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
172.13 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid