20250306 GUI_3 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Recordáis la arquitectura general de una aplicación con interfaz gráfica swing, ¿verdad?
00:00:00
Que era, tenemos que tener un marco, un frame.
00:00:07
Un frame hay que tener, que es el punto de partida, ¿vale?
00:00:12
El frame general lo que hacemos es personalizarlo mediante la herencia, ¿vale?
00:00:18
Lo personalizamos mediante la herencia y ¿cómo lo personalizamos?
00:00:24
pues en el momento en el que se construye
00:00:27
que es en el constructor
00:00:29
en el momento en el que se construye
00:00:31
pues le metemos cosas
00:00:33
vale, pues en el momento en el que se construye
00:00:34
le metemos cosas como por ejemplo
00:00:37
un comportamiento
00:00:39
de que se cierre el proceso cuando le damos
00:00:40
a la X, que eso lo hacíamos con esta línea
00:00:43
le asociamos
00:00:46
unos componentes
00:00:50
que hemos creado
00:00:53
todo esto lo hacemos en el constructor
00:00:54
el construir la interfaz, la construimos en el constructor
00:00:56
que es el momento en el que se instancia el objeto
00:01:00
pues le pegamos unos componentes
00:01:02
los que hemos decidido previamente en toda esa primera parte
00:01:06
enorme de construcción de prototipos
00:01:09
que nos interesan, pero estos componentes
00:01:11
no se pegan nunca al frame, el frame es una especie
00:01:16
de raíz, de marco general
00:01:18
donde ponemos contenedores o paneles
00:01:21
Bueno, hay más tipos de contenedores
00:01:25
No solo los paneles
00:01:27
El panel es el más habitual
00:01:28
Al marco le ponemos contenedores
00:01:30
Siendo el panel el más habitual
00:01:33
Y ya a esos contenedores
00:01:35
Le ponemos los componentes
00:01:36
Bueno, pues
00:01:38
Un frame cualquiera siempre trae
00:01:39
Un panel por defecto
00:01:42
Pegado a él
00:01:45
Cuyo tamaño es el mismo tamaño del frame
00:01:46
Siempre lo trae
00:01:49
Los de atrás, Rodrigo y compañía
00:01:49
Y todos que se callen
00:01:53
Entonces ese panel por defecto lo extraemos con este método
00:01:54
De nuestro frame extraemos ese panel por defecto
00:02:00
Y a ese panel por defecto es el que le ponemos los componentes
00:02:03
En nuestro caso que es nuestra primera interfaz sencilla sin complicarnos la vida
00:02:07
Entonces esos componentes si los ponemos sin más
00:02:10
Ya vimos que se ponen unos encima de otros
00:02:16
Y además con el tamaño agrandado al tamaño del panel
00:02:19
Ese aspecto no nos gusta
00:02:22
pues entonces tenemos que decirle al panel
00:02:23
oye, voy a crear un gestor de ubicación
00:02:28
un gestor de ubicación que te va a ti
00:02:32
a indicar cómo los tienes que colocar
00:02:35
bueno, pues gestores de ubicación hay de muchos tipos
00:02:37
este era el más sencillo
00:02:40
que es un gestor de ubicación en filita
00:02:42
entonces el gestor de ubicación en filita
00:02:45
que es el flow layout
00:02:48
pues le ordena al panel
00:02:49
panel cuando se le asocia, que con el set layout se lo asociábamos, este gestor de ubicación se lo
00:02:52
asociábamos al panel con el set layout, pues desde el momento en el que se le asocia ya le dice todo
00:02:59
lo que llegue a ti en fila, todo lo que llegue a ti en fila, todo. Pues ahora ya texto saluda y despide,
00:03:05
todo en filita. Por eso se llama flow layout. Hay más gestores como el grid layout que es para
00:03:10
colocar en una rejilla, bueno
00:03:16
los actores de ubicación
00:03:18
que le indican al panel
00:03:19
al panel, no al frame
00:03:22
al panel, porque el panel es el que tiene los componentes
00:03:24
cómo se van a colocar
00:03:26
bueno, pues hicimos este pequeño ejemplo
00:03:28
el panel grande
00:03:30
sí, sí, sí, porque estamos usando
00:03:30
solamente el panel grande que viene de serie
00:03:34
para todo ahora mismo
00:03:36
que sería el equivalente al bot
00:03:37
sí, supongo
00:03:39
sí, pero luego en el bot
00:03:42
tú puedes poner diferentes contenedores
00:03:45
pequeñitos, diferentes cosas.
00:03:47
Pues sería el equivalente a ese, sí.
00:03:49
Vale.
00:03:52
Bueno, pues entonces
00:03:53
la interfaz se quedaba
00:03:54
construida, pero teníamos luego
00:03:57
que resolver el problema
00:03:59
ahora ya de la respuesta
00:04:01
a los eventos del usuario.
00:04:03
La respuesta a los eventos.
00:04:05
Entonces la respuesta a los eventos sigue este modelo.
00:04:06
Tiene que existir
00:04:10
un objeto creado
00:04:11
en mi aplicación, tiene que existir un objeto
00:04:12
creado que sea capaz
00:04:15
de darse cuenta de que algo ha pasado a la interfaz.
00:04:17
Eso no es fácil, porque tiene que ser capaz de darse cuenta
00:04:21
de que ha habido un evento en el teclado.
00:04:23
Tiene que ser capaz de darse cuenta.
00:04:26
Bueno, pues los objetos que son capaces de darse cuenta
00:04:28
de que algo ha pasado, asincronamente, de repente,
00:04:30
asincronamente de que algo ha pasado,
00:04:33
son los objetos en general listener, los que se llaman listener.
00:04:35
Y se llaman listener porque son objetos que heredan
00:04:39
de interfaces Listener
00:04:42
o implementa interfaces Listener
00:04:45
que hay muchas interfaces Listener
00:04:47
ya veremos
00:04:49
pero la más general
00:04:49
es la ActionListener
00:04:51
exacto
00:04:54
entonces cada Listener
00:04:56
cada clase Listener está especializada
00:04:58
en un tipo de eventos
00:05:00
¿vale?
00:05:03
la interfaz ActionListener
00:05:04
está especializada
00:05:07
en los eventos por defecto
00:05:09
que se llaman
00:05:10
que es en lo que habitualmente
00:05:11
se hace en cada componente
00:05:13
en un botón que es lo que habitualmente
00:05:15
se hace, hacerle click
00:05:17
pero en un área de texto en la que tú
00:05:18
metes texto, ¿cuál es el evento
00:05:21
por defecto? darle al enter
00:05:23
tú metes texto, das al enter
00:05:25
pues el ActionListener escucharía el enter
00:05:27
de un área de texto, o sea el ActionListener
00:05:29
no es que sea siempre click
00:05:31
el ActionListener es el capaz de escuchar
00:05:32
el evento más habitual
00:05:35
o el evento por defecto
00:05:37
de cada componente, que cada uno tiene
00:05:39
el suyo. Y hay algunos que no tienen.
00:05:41
No tienen evento por defecto. Con lo cual, la acción
00:05:43
listener nunca sería capaz de escuchar nada
00:05:45
sobre ellos. Hay componentes que no tienen evento por defecto.
00:05:47
Vale.
00:05:50
Bueno, pues, entonces, si yo
00:05:51
quiero crear un objeto que sea
00:05:53
capaz de escuchar
00:05:55
el evento por defecto del componente
00:05:56
que sea, sí,
00:05:59
pero así un poquito más humildemente.
00:06:04
Pasa, pasa.
00:06:07
Y con más celeridad.
00:06:14
Bueno.
00:06:22
tenemos, si queremos
00:06:22
que la interfaz sea capaz
00:06:25
de espabilar cuando activamos
00:06:26
el evento por defecto del componente
00:06:29
Buenas, ¿qué tienes que decirnos?
00:06:30
¿Puedo pasar, por favor?
00:06:40
Eso desde la puerta
00:06:42
Llamas primero
00:06:43
Es que hay que enseñárselo todo a estos fríos
00:06:49
Sí
00:06:51
¿qué ha ocurrido? porque llegas tarde
00:06:52
no te he dicho que puedas pasar todavía
00:06:55
¿qué ha ocurrido? porque llegas tarde
00:06:57
en fin, seguimos
00:07:00
para tener un objeto ahí
00:07:03
que sea capaz de despertarse y espabilar
00:07:08
cuando ocurre el evento
00:07:10
por defecto del componente que sea
00:07:12
lo que tenemos que hacer es
00:07:14
crear una clase que implemente
00:07:15
de ese listener
00:07:18
que es el tipo de listener que es capaz
00:07:19
de escuchar los eventos por defecto,
00:07:22
creamos una clase y luego ya instanciamos un objeto
00:07:24
de esa clase. ¿Por qué no
00:07:26
instanciamos directamente una acción listener?
00:07:28
Por dos cosas.
00:07:31
Una, porque es una interfaz.
00:07:32
No se instancian las interfaces, ya lo sabemos.
00:07:34
Y otra, porque el objeto
00:07:36
que instanciamos, ese que tiene que ser capaz de
00:07:38
escuchar, tiene que estar personalizado
00:07:40
para tener
00:07:42
dentro el código concreto
00:07:44
con el que queremos que responda
00:07:46
cuando ese evento ha ocurrido. Entonces, tiene que ser
00:07:48
un objeto personalizado con el
00:07:50
código concreto que queremos
00:07:52
que ocurra cuando se dé ese evento
00:07:53
vale, pues entonces
00:07:56
hacemos la clase que implemente
00:07:57
ActionListener para darle la capacidad
00:08:00
de escuchar eventos
00:08:02
por defecto de los componentes
00:08:04
y ahora ya
00:08:05
personalizamos este método
00:08:07
que en ActionListener está vacío, lo personalizamos
00:08:09
dándole el código
00:08:12
que queremos que
00:08:13
se ejecute cuando pase
00:08:15
ese evento por defecto
00:08:18
en este caso le pusimos simplemente que muestre
00:08:19
por consola una cosa
00:08:22
vale, bueno pues
00:08:23
entonces, ahora esta clase está hecha
00:08:31
ahora ya podemos instanciar un objeto de esta clase
00:08:33
entonces este objeto se instancia
00:08:35
muy bien, se instancia
00:08:37
y está aquí instanciado
00:08:39
práctica habitual, se crea un objeto
00:08:40
para cada elemento que lo va a llamar
00:08:45
ahora nos vamos a meter en eso
00:08:46
porque vamos a empezar a resolver el problema de
00:08:49
cómo pasar los parámetros, ahora lo vamos a ir
00:08:51
resolviendo, vale
00:08:53
entonces
00:08:55
aunque la respuesta
00:08:56
última y más real sería depende
00:08:59
como siempre, pero en cualquier caso vamos a
00:09:01
volver ahora a eso
00:09:03
es que de verdad, la vida son
00:09:04
muchos dependes, así que
00:09:07
mentalizados, entonces
00:09:09
lo importante
00:09:11
uno no tiene que tener
00:09:13
conocimientos, uno tiene que tener
00:09:15
desarrollar capacidad de tomar decisiones
00:09:17
tiene que tener recursos para tomar
00:09:19
decisiones correctas
00:09:21
de ahí la importancia
00:09:23
de asumir que todo depende, claro
00:09:25
bueno, pues entonces, nosotros ya hemos
00:09:27
instanciado este objeto
00:09:29
este objeto ya es capaz
00:09:30
de escuchar eventos por defecto, porque es una acción
00:09:32
listener, y además tiene un
00:09:35
código dentro con el que podría responder
00:09:37
magnífico
00:09:39
y ahora nos pregunta, si ya, yo soy capaz de escuchar
00:09:40
eventos por defecto, ¿de quién?
00:09:43
de este área de texto, del panel
00:09:45
del scroll bar que me habías
00:09:47
puesto, ¿de quién escucho yo? no puedo escucharlos
00:09:49
a todos, tengo que escuchar a uno
00:09:51
¿a quién? vale, pues
00:09:53
ahora es cuando, al componente
00:09:55
que diga, no, no, escucha ese
00:09:57
pues se lo añadimos
00:09:59
con el método de AddAttionListener, le decimos
00:10:00
tu objeto escucha saludar
00:10:02
escucha, estate pendiente
00:10:04
estate enganchado a este componente
00:10:06
estate enganchado a este
00:10:09
y cuando salte el evento por defecto
00:10:10
cuando detectes que se ha hecho
00:10:13
el evento por defecto en ese componente
00:10:15
y ahora ya te despiertas y ejecutas tu código
00:10:16
¿vale?
00:10:18
pero instanciar el objeto simplemente
00:10:20
no hacemos nada, le tenemos ahí instancia de memoria
00:10:22
pero no está enganchado a ningún componente, ¿vale?
00:10:25
Le podemos enganchar a más de uno,
00:10:28
no tiene por qué estar escuchando solo a uno,
00:10:30
como fue el ejemplo del otro día.
00:10:31
Le pusimos a la escucha de dos,
00:10:33
tanto del botón de saludar como el de despedir.
00:10:35
Con lo cual, cualquiera de los dos que recibiera el evento por defecto,
00:10:38
este objeto iba a saltar e iba a despertarse, ¿vale?
00:10:42
Iba a saltar e iba a despertarse, con lo cual iba a llegar aquí.
00:10:45
Despertarse significa, pum, entrar en esta zona, ¿vale?
00:10:48
Entonces, aquí efectivamente, como este objeto podía haber despertado por dos fuentes distintas, pues si queríamos que respondiera de forma distinta a las dos fuentes, teníamos que distinguir dentro de alguna manera.
00:10:53
Entonces, ¿cómo podemos distinguir dentro quién fue el que recibió el evento? ¿Quién es el que te ha despertado de los dos botones? ¿Quién te ha despertado? Pues el que me ha despertado está aquí metido.
00:11:06
porque cuando este objeto se despierta
00:11:16
la máquina virtual le pasa un objetito
00:11:19
a Action Event con toda
00:11:22
la información del componente
00:11:24
que recibió el evento
00:11:25
de la hora en la que se produjo
00:11:27
un montón de cosas relacionadas
00:11:29
con ese evento
00:11:32
de ese montón de cosas que podemos sacar
00:11:32
información relacionada con el evento
00:11:35
una de las que podemos sacar
00:11:38
es que objeto
00:11:39
fue, si es que queremos
00:11:41
sacarlo porque este evento está asociado
00:11:43
a muchos. Si está asociado a muchos, pues vamos a
00:11:45
tratar de sacarlo. Bueno, pues con este
00:11:47
método sacábamos el object.
00:11:49
El objeto object que
00:11:51
nos dio el evento.
00:11:53
En nuestro caso, como sabíamos que
00:11:55
cualquiera de los dos iban a ser botones,
00:11:57
pues hacíamos el casting
00:12:00
directamente. Entonces,
00:12:01
este es el botón
00:12:03
que causó el evento.
00:12:05
Y ya lo usábamos de esta manera.
00:12:07
Si el botón que causó el evento,
00:12:09
el texto que tiene puesto encima
00:12:11
es saludar, pues hace esto.
00:12:13
Si el botón que causó el evento
00:12:14
Que es este, el texto que tiene puesto encima
00:12:17
No es saludar
00:12:19
Pues entonces haces otro
00:12:20
¿Vale? Y ahí nos quedamos
00:12:22
Dime
00:12:24
El ruidito
00:12:25
No hay más derecho
00:12:31
No lo sé
00:12:36
Igual es porque has llegado tarde
00:12:42
Y no te ha dado tiempo a
00:12:44
Claro, no te ha dado tiempo a corregirlo
00:12:46
en el rato este, por haber llegado tarde
00:12:50
es normal, pasa a menudo
00:12:52
bueno, entonces ya tenemos nuestro
00:12:53
frame personalizado, nuestra aplicación es un main
00:12:56
nuestra aplicación es un main
00:12:58
pues ya está, nuestra aplicación lo único que hace es
00:12:59
instanciar el frame
00:13:02
al instanciar el frame
00:13:03
llama al constructor, lógicamente, el constructor
00:13:05
construye la interfaz, hace todo lo que hemos visto
00:13:08
bla bla bla, todo en el constructor
00:13:10
porque es en el momento en el que se crea
00:13:11
y luego además este frame
00:13:14
que ya está hecho, podemos hacer
00:13:16
cosas con él, como darle un tamaño
00:13:18
hacerle visible, no hacerle visible
00:13:20
y algunas cosas que podríamos hacer en general con el tema
00:13:21
pues estar en la arquitectura
00:13:24
básica, construir
00:13:26
la interfaz mediante
00:13:28
un frame personalizado
00:13:29
y luego crear tantos listeners
00:13:31
como necesitemos
00:13:34
y asociarlos a los componentes
00:13:35
a los que tienen que estar ahí escuchando
00:13:38
y ya está, y luego instancia el frame y se acabó
00:13:40
esto muy en general
00:13:44
estás deseando preguntar pero estás diciendo
00:13:45
bueno voy a esperar un rato
00:13:49
¿No es eso lo que te está ocurriendo?
00:13:51
A ver
00:13:53
Vale
00:13:53
Bueno, pregunta
00:13:55
Hay tres veces que te diga depende, que te diga espera
00:13:58
O que te responda, pregunta
00:14:01
¿El ser visible
00:14:02
No sería mejor meterlo en el constructor
00:14:04
De base que sea tú?
00:14:06
Depende, ya
00:14:09
Sí, no, a ver, efectivamente
00:14:10
Esto ya sí que es una cuestión de gustos
00:14:13
Pero como por ver la generalidad
00:14:15
Claro, en este caso
00:14:16
Pues tú lo puedes poner aquí
00:14:17
Y listo
00:14:21
Vale
00:14:23
Estamos en el método
00:14:24
Set visible
00:14:28
Ah, claro, ya decía yo por qué me lo pones rojo
00:14:32
Vale, lo podemos poner ahí
00:14:34
No hace falta que pongamos el dis
00:14:36
Ya lo sabéis, estamos en el propio frame
00:14:38
Eh
00:14:40
Sí, pero por qué llegas tarde
00:14:43
Bueno, adelante
00:14:45
Pero no entréis así alegremente
00:14:49
Que lo he dicho ya tres veces
00:14:51
Tenéis que llamar, preguntar si se puede
00:14:52
En realidad todos están sufriendo por culpa de Ángel
00:14:54
Que es el que ha entrado aquí como
00:15:01
Vale, pues aquí el disk
00:15:02
No hace falta ponerlo, como bien sabéis
00:15:08
Porque se refiere al propio frame
00:15:10
¿Vale? Si lo ponemos aquí
00:15:12
Pues aquí obviamente nos sobraría, lógicamente
00:15:14
Y el size también
00:15:17
El size también lo podríamos fijar aquí dentro
00:15:18
Y aquí de hecho
00:15:21
Podríamos ajustarlo
00:15:22
Porque tenemos la información de todos los
00:15:24
componentes que hay
00:15:27
¿podrías sacar el tamaño de la pantalla
00:15:28
de la que estás llamando?
00:15:31
¿de alguna manera? ¿podrías llamar algún tipo de método?
00:15:33
sí, seguramente haya un
00:15:35
getSize o algo así
00:15:37
si es que esto tiene
00:15:38
hay un getSize que te da el objeto de dimensiones
00:15:39
con el tamaño que tiene el frame
00:15:43
el panel también tendrá un getSize
00:15:45
o sea, puedes jugar un montón con
00:15:47
¿vale?
00:15:48
entonces aquí podríamos hacer también el setSize
00:15:51
y
00:15:53
¿y para el monitor?
00:15:54
para que se saque el tamaño del monitor?
00:15:56
No lo sé.
00:15:58
Pregúntese a la HGPT.
00:15:59
Seguro que sí.
00:16:00
Seguro.
00:16:01
A ver, hay millones de métodos,
00:16:02
millones de clases,
00:16:03
millones de todos.
00:16:04
Ya te digo que hay libros
00:16:05
de miles de páginas
00:16:07
solo de estas cosas.
00:16:08
Si hay métodos de sacar ahora
00:16:09
del sistema,
00:16:10
hay métodos de sacar.
00:16:10
Claro,
00:16:11
habrá métodos para todo,
00:16:12
supongo.
00:16:13
Vale, pues,
00:16:16
por ejemplo,
00:16:18
lo podemos poner aquí
00:16:18
y ya está.
00:16:19
Y si lo ponemos aquí,
00:16:21
pues ya no lo pondríamos aquí.
00:16:23
Bueno, detalles.
00:16:24
Vale, pero ahora
00:16:26
Vámonos a programar
00:16:27
Ahora que es lo que nos interesa
00:16:31
Porque todo esto de Swing
00:16:32
Sobre todo es interesante
00:16:33
Porque nos sigue ayudando
00:16:36
A aprender a programar
00:16:38
Esa es la parte más interesante
00:16:39
¿Vale?
00:16:41
Porque en sí con Swing es difícil que trabajéis
00:16:43
Con JavaFX puede que sí
00:16:45
Y creo que os lo vamos a contar
00:16:47
¿Vale? Un poquito
00:16:49
Vale, pues a ver
00:16:51
Entonces
00:16:56
Está todo claro en lo que estamos
00:16:57
¿Verdad? ¿Qué sueño tenemos?
00:17:00
Si hubieras acostado antes
00:17:03
En vez de estar jugando hasta las tantas
00:17:03
Tendrías menos sueño
00:17:05
¿Eh?
00:17:13
¿Cómo?
00:17:16
Ay, no te he entendido nada
00:17:18
¿Por qué se lo dices así de la nada?
00:17:20
Porque se está durmiendo
00:17:23
¿Qué explicación puede tener eso?
00:17:24
Porque no es porque yo soy muy aburrida
00:17:27
¿Verdad que no?
00:17:28
Bueno, pues entonces la otra explicación es que está
00:17:30
Que ha estado toda la noche jugando
00:17:32
Claro
00:17:34
Oye, tú haz el favor
00:17:36
Bueno
00:17:38
Vale, pues entonces ya estamos todos situados
00:17:40
Ahora, pregunta
00:17:43
No, más que pregunta
00:17:45
Problema
00:17:46
esta interfaz no tiene ningún sentido,
00:17:48
que queramos una interfaz para que nos salude
00:17:50
y que el saludito lo saque por la consola,
00:17:51
porque la consola no va a estar disponible,
00:17:54
no lo vamos a ver.
00:17:57
De hecho, nosotros habíamos hecho aquí una etiqueta,
00:17:58
un label, para poner el texto
00:18:02
y que aparezca en la interfaz.
00:18:04
Entonces, lo que queremos aquí es,
00:18:06
en lugar de esto, esto no lo queremos,
00:18:09
queremos poder acceder desde aquí,
00:18:12
queremos poder acceder desde aquí
00:18:14
al JLabel
00:18:18
que está aquí dentro
00:18:19
de este método local
00:18:21
movida, pero es lo que necesitamos
00:18:22
es lo que queremos
00:18:25
ahora como programadores
00:18:26
que ahora ya si sabéis, el programador no es solo el que sabe
00:18:31
hacer if y while
00:18:33
eso hace falta, si no es el que tiene
00:18:34
una visión
00:18:37
del mundo de los objetos
00:18:39
a ver, que se os ocurre
00:18:40
para poder acceder desde aquí
00:18:43
¿qué cambio? ¿qué podemos hacer?
00:18:48
porque nuestro problema es que
00:18:49
lo acabo de decir, que no queremos mostrar por consola
00:18:50
es absurdo, queremos mostrar la interfaz gráfica
00:18:53
el saludo, para eso habíamos hecho este label
00:18:55
entonces yo quiero
00:18:57
desde aquí acceder a ese label
00:18:59
quiero desde aquí acceder
00:19:01
y ponerle ahí el texto
00:19:03
pero
00:19:04
si ya
00:19:12
El problema es cómo accedo a la etiqueta
00:19:14
No el método
00:19:18
Mi etiqueta es una variable local de aquí
00:19:18
De este método construye interfaz
00:19:21
Es una variable local de aquí
00:19:23
¿Cómo la toqueteo desde aquí?
00:19:24
¿Qué tipo de etiqueta es eso?
00:19:27
¿Se te llama ese tipo de etiqueta?
00:19:34
Es que no te ha llamado ese tipo de etiqueta
00:19:35
Te ha llamado un botón
00:19:37
Claro, te ha llamado un botón
00:19:37
Tú aquí en el GetSource no puedes sacar la etiqueta
00:19:39
En ningún sitio
00:19:42
¿Qué podéis cambiar?
00:19:43
¿Cómo sales de aquí?
00:19:48
¿Cómo accedes desde aquí? ¿Qué puedes cambiar?
00:20:00
¿Qué puedes cambiar en general, en conjunto?
00:20:02
¿Qué podemos añadir? ¿Qué podemos hacer?
00:20:04
Claro, lo ideal
00:20:06
sería, si yo pudiera
00:20:07
pasarle aquí la etiqueta
00:20:10
Si yo le pudiera
00:20:11
pasar aquí la etiqueta
00:20:14
Qué suerte, ¿no?
00:20:15
Si le paso la etiqueta, sí
00:20:18
Pero obviamente no puedo tocar este método
00:20:20
Este método es el método que estoy
00:20:22
Silvia, cállate
00:20:25
Y los de atrás igual
00:20:25
Pero obviamente este método no le puedo tocar
00:20:28
Porque este método está sobrescribiendo
00:20:31
El de acción listener
00:20:33
Este método no le puedo tocar
00:20:34
Con lo cual no puedo usarlo para pasar por parámetro
00:20:37
Nada
00:20:39
Y sin embargo, desde aquí tengo que acceder al
00:20:40
JLabel del otro sitio
00:20:43
¿Un estés? ¿Dónde?
00:20:44
Yo crearía otro método que te saque
00:20:50
A ver
00:20:53
Podría hacer un estés, sacar el JLabel
00:20:56
haciendo un estés no gano nada
00:21:02
mientras esta sigue siendo variable local
00:21:03
de construyente, no gano nada
00:21:05
En todo caso, si la saco fuera
00:21:07
la pongo como protected
00:21:09
pero es que tampoco estaría accediendo
00:21:11
a la label de la de arriba
00:21:13
del objeto de arriba
00:21:15
el extend significa que tú tienes
00:21:16
tus propias propiedades
00:21:19
esas, que sí, que tienen el mismo nombre
00:21:21
que no tienes que escribir código
00:21:24
pero no significa que sean las propiedades del objeto
00:21:25
de arriba del que heredas, no, el objeto
00:21:27
de arriba es uno, el de abajo es otro, que aún no
00:21:29
son sus propiedades
00:21:31
otra cosa que se os ocurre, sacar la etiqueta
00:21:32
y ponerla estática como aquí arriba
00:21:40
ponerla estática
00:21:42
y acceder como variable estática
00:21:44
de esta, mi ventana
00:21:45
a ver, como poder se puede
00:21:47
eso lo podríamos hacer
00:21:49
como solución de programación
00:21:51
pues hombre, a ver
00:21:57
eso es una cosa que podríamos
00:21:58
hacer, esto
00:22:01
lo sacamos aquí
00:22:02
lo ponemos como
00:22:05
estática, vale
00:22:07
pero, ahora que pasa
00:22:11
que sois muy listos vosotros
00:22:13
si lo ponemos como estático
00:22:15
que ya no podemos
00:22:17
acceder a ella
00:22:19
desde el constructor y desde el método
00:22:21
porque si es estática
00:22:24
solo podemos acceder desde métodos estáticos
00:22:25
con lo cual la hemos cagado
00:22:27
¿vale? si es estática
00:22:29
solo podemos acceder desde métodos estáticos
00:22:32
luego no puedo acceder
00:22:34
desde el constructor que es imposible
00:22:36
no le puedo hacer estático al constructor por razones obvias
00:22:37
¿puedo construir algo que
00:22:39
no ha funcionado bien
00:22:42
para que se vea en nave
00:22:44
dártelo en la función
00:22:45
de construir interfaz
00:22:48
y se ve
00:22:49
armazenando una variable
00:22:50
y luego pasarle esta variable
00:22:52
a escuchasaludar
00:22:54
pasárselo
00:22:55
vale, puedes hacerte un get
00:23:00
o sacarla fuera, muy bien
00:23:03
y el siguiente paso que me has dicho, ¿cuál es?
00:23:04
una vez lo tienes fuera
00:23:07
pasárselo a escuchasaludar
00:23:09
¿pero cómo? ¿por dónde?
00:23:10
y luego que haces
00:23:11
o sea por ejemplo
00:23:24
te haces aquí un método
00:23:25
¿no?
00:23:26
vale
00:23:28
este método
00:23:29
por ejemplo
00:23:30
¿cómo le quieres llamar?
00:23:30
no igual que el de arriba
00:23:33
no puede ser
00:23:35
claro para que si le pasas
00:23:37
el parámetro de etiqueta
00:23:38
también
00:23:39
no pero es que este
00:23:40
no no no no
00:23:42
sobre escribirlo
00:23:42
no o sea
00:23:43
yo tengo que hacer otro método distinto
00:23:44
entonces, ¿para qué lo voy a llamar igual que el de arriba?
00:23:46
es que si le paso aquí otro parámetro
00:23:48
ya es un método distinto
00:23:50
no tiene sentido, vale
00:23:51
en cualquier caso no vais mal
00:23:53
pero yo creo que no
00:23:55
vale, me estáis diciendo
00:23:57
le ponemos aquí un método, pero con la idea de llamarlo
00:23:59
desde aquí, porque
00:24:02
de lo que no podemos escaparnos
00:24:03
es que cuando el evento
00:24:06
salte, al método que se va
00:24:08
a llamar es a este, es el de partida
00:24:10
De ahí no podemos sacar
00:24:12
Entonces este método podría llamar a otro
00:24:13
Que si es al que se le ha pasado
00:24:16
La esa, ¿no?
00:24:18
Ya, vale, pero ¿y cómo se le ha pasado
00:24:21
A ese otro método
00:24:22
Esa propiedad? ¿Cómo se le ha pasado?
00:24:24
Estamos en las mismas
00:24:25
¿Cómo le llega a este método?
00:24:26
El método que sea
00:24:30
No, no
00:24:32
No, no, no, no
00:24:34
Efectivamente
00:24:35
Tú quieres esto, ¿no?
00:24:38
J, label, texto
00:24:39
un método y aquí ya trabajar
00:24:41
con la JLabel haciendo lo que fuera
00:24:44
haciendo lo que fuera, pues por ejemplo
00:24:46
texto.sectest
00:24:50
hola
00:24:54
por ejemplo
00:24:55
lo que fuera que quisiéramos hacer
00:24:57
y tú quieres
00:25:00
llamar a recibe
00:25:02
desde aquí, por ejemplo, ya, claro
00:25:04
pero este texto que le tienes que pasar
00:25:06
¿cómo se lo pasas? estamos en las mismas
00:25:08
Podríamos pasarle el objeto entero, ¿no?
00:25:10
Le puede pasar el...
00:25:11
¿Pero desde dónde?
00:25:12
Ese objeto tiene que ser el otro.
00:25:14
Desde el main, ¿no?
00:25:16
¿Desde el main cómo?
00:25:18
Pasarle el objeto entero.
00:25:20
¿Pasárselo dónde y en qué momento?
00:25:21
Porque aquí no estamos llamando a ningún método.
00:25:24
Aquí lo único que estamos haciendo es instanciarlo.
00:25:26
Sí, pues claro, ahí habría que añadirlo.
00:25:30
El texto de lo que pone en el propio botón
00:25:36
sí se puede pasar con el método.
00:25:40
O sea, por ejemplo, lo que estáis diciendo es, escucha, saludar y aquí ¿qué quieres hacer?
00:25:41
Pues aquí no vas a llamar al método porque tú aquí no quieres que salte el evento en este momento.
00:25:55
El evento no salta por programa.
00:25:59
El evento salta asíncronamente cuando le das al botón.
00:26:01
Pero a ver, en realidad vais bien.
00:26:05
Está casi, casi.
00:26:07
el asunto es
00:26:09
desde aquí
00:26:11
a lo que sí que estamos llamando
00:26:13
es al constructor
00:26:15
al constructor sí
00:26:16
pues pasémosle al constructor
00:26:18
hagamos un constructor
00:26:21
que admita parámetros
00:26:22
yo puedo hacer aquí con todos los constructores
00:26:25
que me den la gana, si yo quiero
00:26:27
hagamos un constructor
00:26:29
que reciba los componentes que yo quiero
00:26:30
y que esos componentes inicialicen
00:26:33
propiedades de escucha saludar
00:26:35
Y desde el momento en que están aquí esas propiedades,
00:26:36
ahora este ya accede a ellas sin problema.
00:26:39
¿Vale?
00:26:43
Es decir, lo que me estabais diciendo de
00:26:44
ahora llamo a un método para
00:26:46
inicializar, sí, tendría sentido
00:26:48
si ese método es para
00:26:50
inicializar propiedades que están aquí fuera.
00:26:52
Pero no para
00:26:55
lanzar ya el evento. El evento no se
00:26:56
lanza llamando a ningún, por
00:26:58
código. Es decir, la idea
00:27:00
sería, ¿qué
00:27:02
problema tenía yo aquí? Que yo
00:27:04
aquí necesito, en lugar de hacer
00:27:06
Necesito acceder a esta etiqueta
00:27:08
Y ponerle esto
00:27:11
Sextest hola
00:27:12
Y aquí necesito
00:27:15
Poner esto
00:27:17
Sextest
00:27:19
Adiós
00:27:23
Claro, entonces mi problema es
00:27:29
Ya, y texto
00:27:32
¿Cómo coge valor texto?
00:27:33
¿Cómo coge valor?
00:27:35
Vamos a hacer una cosa
00:27:36
Para que texto sea accesible desde aquí
00:27:37
Sin ningún problema
00:27:40
vamos a hacer que sea una variable de clase
00:27:41
pues que sea una variable de clase, ¿por qué no?
00:27:43
si esto es una clase, le pongo todas las variables que yo quiera
00:27:45
no es una interfaz
00:27:47
pues venga, esto que sea una variable de clase
00:27:48
y ahora
00:27:51
a mí me interesa que esta variable
00:27:56
texto se cargue
00:27:58
se cargue con la etiqueta
00:28:00
del main en el momento
00:28:02
en el cual creo
00:28:04
el objeto
00:28:06
¿vale? bueno pues entonces
00:28:07
estupendamente me hago un constructor
00:28:10
o sería más fácil con el constructor
00:28:12
pero ya que estabais apuntando con este método
00:28:16
pues podríais, a lo mejor así lo veis más claro
00:28:18
porque estabais en esta línea
00:28:21
pues hacéis esto
00:28:22
dis.texto
00:28:24
igual a
00:28:27
texto
00:28:28
es decir, este método
00:28:30
sería solo
00:28:32
sería solo para inicializar
00:28:36
esta variable texto
00:28:40
de clase, inicializarla con la label
00:28:42
que yo le dé, con la que a mí me dé la gana.
00:28:44
¿Vale? Sería solo para eso.
00:28:47
Y aquí
00:28:50
me falta el punto y coma.
00:28:50
Sería solo para eso, ya está, no para saltar el evento.
00:28:52
Entonces, llamando a este método,
00:28:55
yo inicializo esta variable de clase,
00:28:56
esta variable, con la JLabel
00:28:59
que a mí me dé la gana, llamando a este método.
00:29:00
Y ya está, y se queda inicializada.
00:29:02
Y ahora ya, cada vez que salte la acción
00:29:04
perform, cada vez que salte,
00:29:06
¿a quién va a estar accediendo?
00:29:08
A esta.
00:29:10
y esta ya se inicializó
00:29:10
en su momento con la que me interesa
00:29:13
entonces que tendríamos que hacer
00:29:16
aquí en mi ventana
00:29:18
pues después de haber instanciado
00:29:20
el objeto, después de haberlo instanciado
00:29:22
decirle oye tú, objeto
00:29:24
recibe a esta
00:29:25
recibe a esta de aquí
00:29:27
recibe a esa
00:29:29
¿vale? entonces
00:29:33
creamos este objeto
00:29:35
inicializamos su variable
00:29:37
una variable suya
00:29:40
con esta JLabel
00:29:41
digamos que le terminamos
00:29:43
de personalizar
00:29:46
y ya está
00:29:47
y el objeto se queda ahí
00:29:49
y luego lo asociamos aquí
00:29:50
¿vale?
00:29:51
entonces
00:29:53
habremos instanciado el objeto
00:29:54
al hacer el recibe texto
00:29:55
pues
00:29:58
le habremos pasado
00:29:59
la label que nos interesa
00:30:01
del frame
00:30:02
se la habremos pasado
00:30:02
y la habrá usado
00:30:03
para inicializar
00:30:05
su variable local
00:30:06
y ya está
00:30:07
y ahora el método
00:30:08
de acción perform
00:30:09
le accede ahí tranquilamente
00:30:10
entonces nuestro problema de partida era
00:30:11
que este action performance tenía que acceder
00:30:14
a una variable
00:30:17
que no podía recibir por parámetro
00:30:18
ese era el problema de partida
00:30:21
luego, si no la puedes recibir por parámetro
00:30:22
no hay tutía
00:30:25
hay que ponerla como variable de clase
00:30:26
no hay tutía, o la recibes por parámetro
00:30:28
o es una variable de clase
00:30:30
vale, desde el momento en que hemos decidido
00:30:31
que es una variable de clase porque por parámetro
00:30:34
no puedes recibirla, tienes que decir
00:30:36
y ahora esa variable de clase
00:30:38
cómo le doy yo el valor
00:30:40
que me interesa, que es el label del frame
00:30:42
cómo se lo doy yo
00:30:44
bueno, pues venga, me hago un método
00:30:45
en el cual
00:30:47
es como un set
00:30:49
en el cual
00:30:50
de hecho, igual hasta se ve
00:30:54
más claro, si la llamamos
00:30:56
como un set
00:30:58
me hago un set
00:30:59
de esta variable
00:31:03
y ahora ya mi action
00:31:04
performance tranquilamente va a acceder a ese
00:31:08
me hago un set de esta variable y ya está
00:31:10
y ahora en mi frame
00:31:12
construyo
00:31:15
el objeto listener
00:31:17
y le digo, oye tú
00:31:18
tu propiedad
00:31:20
texto, la JLabel
00:31:24
que sea esta
00:31:26
genial, pues ya está
00:31:27
entonces ahora ya este escuchador
00:31:29
está asociado
00:31:36
a estos botones
00:31:38
y cuando este escuchador salte
00:31:39
la etiqueta con la que está trabajando
00:31:41
es esta, porque es la que le hemos pasado a parámetro
00:31:44
es esa
00:31:46
y así podríamos
00:31:46
y así podríamos
00:31:52
hacer que esta interfaz trabajara con muchas
00:31:54
más cosas, si yo quiero que no solo trabaje con la etiqueta
00:31:56
sino que trabaje con un montón de
00:31:59
cosas de la interfaz, además de la etiqueta
00:32:00
pues me cambie el texto de los
00:32:02
botones, por ejemplo
00:32:04
que me los intercambie
00:32:06
por ejemplo
00:32:13
pues entonces si yo, si queremos
00:32:14
que cuando salte el evento, además
00:32:22
de saludar nos intercambie
00:32:24
el texto entre los botones
00:32:26
pues necesita acceder también a esas dos
00:32:27
propiedades, necesita acceder también a ellas
00:32:30
pues en la acción performe entonces
00:32:31
va a necesitar tener estas tres propiedades de clase
00:32:34
pues vamos a hacerle los
00:32:36
tres set
00:32:38
hago solamente el
00:32:38
donde
00:32:48
donde está aquí para que se lo sea, ah aquí
00:32:51
vale, quiero solamente
00:32:54
el set
00:32:56
y
00:32:58
ah, vale, vale, vale
00:33:01
select setters, vale
00:33:03
y
00:33:04
en el texto ya lo tengo
00:33:06
así que eso es una tontería, por eso me lo ha quitado
00:33:09
vale
00:33:11
vale, pues ya tengo
00:33:11
los tres sets
00:33:14
entonces lo que me
00:33:15
falta ahora en mi main es después de haber
00:33:19
creado el objeto, pues
00:33:21
pasarle
00:33:22
escucha
00:33:23
saludar.setDespide
00:33:26
con el botón de despide
00:33:30
y escucha saludar.setSaluda
00:33:31
con el botón de saluda.
00:33:40
Vale, entonces mi ActionListener ya puede trabajar con estas tres cosas tranquilamente
00:33:42
porque se las he pasado.
00:33:46
Entonces al haberse las pasado en el set
00:33:49
pues ya las tiene aquí dentro y ya la acción
00:33:51
Performed hace con ellas lo que quiera. Por ejemplo, hemos dicho
00:33:54
que cambiar el texto de los botones
00:33:58
entonces
00:34:00
si estábamos en el if aparte de poner hola
00:34:01
pues entonces
00:34:04
al botón de saluda
00:34:06
tendríamos que intercambiarlos
00:34:08
entonces
00:34:12
saluda
00:34:13
ya no sabemos lo que tendrá
00:34:16
pues entonces aquí podremos hacer
00:34:17
si saluda.gettext
00:34:19
.equals
00:34:23
Saludar y despedir
00:34:26
Eran las dos
00:34:29
Claro
00:34:29
Es saludar
00:34:31
Pues entonces te vamos a poner a ti
00:34:34
Saluda.getTest
00:34:36
No, perdón, setTest
00:34:40
Despedir
00:34:44
Y
00:34:50
Y lo mismo
00:34:53
Y si no es saludar
00:35:01
Entonces saluda.setTest
00:35:02
si no es saludar es que la despedir
00:35:06
entonces le ponemos saludar
00:35:13
bueno y esto lo sacamos
00:35:15
del if de arriba porque se va a hacer en ambos casos
00:35:18
entonces esto lo podemos
00:35:20
sacar de aquí
00:35:21
una vez que hemos hecho lo del saludito
00:35:23
pues ya hacemos el intercambio
00:35:25
entonces y esto lo tendremos que hacer con el otro botón
00:35:27
seguro que lo podemos
00:35:32
hacer con mejor código y menos if
00:35:33
y menos todo pero
00:35:35
y si el texto
00:35:36
de despide
00:35:39
Es saludar, entonces a despide
00:35:40
Ponle
00:35:44
De hecho es que es una tontería hacerlo con otro if
00:35:45
Porque, claro
00:35:51
No, no, no, o sea, tengo que cambiar el otro
00:35:53
Entonces, si saluda tiene saludar
00:35:55
El otro tiene despedir, con lo cual
00:35:57
A saluda le ponemos, este es despedir
00:35:59
Y al otro le ponemos
00:36:01
Y entonces al otro
00:36:02
Y a despide
00:36:05
Le ponemos
00:36:08
Saludar
00:36:11
Y aquí
00:36:13
eso
00:36:17
y aquí a despide le ponemos
00:36:21
despedir
00:36:24
bueno, pues ya hemos hecho un action perform
00:36:24
que ha necesitado acceder a tres
00:36:37
componentes de la interfaz
00:36:39
al texto para darnos el mensajito
00:36:40
y a los botones para intercambiar
00:36:42
el texto que tuvieran
00:36:45
si tenían uno le ponemos el otro
00:36:46
¿vale? entonces para poder
00:36:48
acceder a ellos, repito
00:36:51
como es imposible pasárselo por parámetros
00:36:53
solo hay una alternativa
00:36:55
que es que los tenga en la clase
00:36:56
un segundo, y para que los tenga en la clase
00:36:58
pues los tendremos que fijar con un setTest
00:37:00
o con un constructor
00:37:03
hemos hecho con un setTest porque era
00:37:04
el método que habéis empezado a apuntar
00:37:06
pero podría haber hecho un constructor
00:37:08
en el que le pasáramos los tres valores
00:37:10
y entonces ahora aquí en el main
00:37:13
no tendría que hacer los set
00:37:14
en el propio constructor se los paso los tres
00:37:15
y ya está, y me ahorro las tres líneas de abajo
00:37:18
¿vale?
00:37:20
sí, sí, pero
00:37:23
lo que importa es que
00:37:24
lo entendáis, ¿vale? podría haber
00:37:26
hecho un constructor aquí
00:37:28
con los tres parámetros
00:37:29
a ver, tú estás empeñado en que haga eso
00:37:31
a ver, venga, control shift
00:37:38
no me ha funcionado
00:37:40
alt shift s
00:37:44
ah, ya sé por qué a mí no me gustan
00:37:47
estos atajos, a ver
00:37:53
porque yo tengo esta mano encajada al revés
00:37:55
Entonces yo esta mano la puedo poner así
00:37:57
Para ponerla así tengo que subir todo el brazo
00:37:59
Entonces si a mí me dices que pulse dos teclas
00:38:02
Con esta mano me has matado
00:38:04
Porque no puedo, tendría que pulsarlas al revés
00:38:06
Entonces debe ser por eso, me acabo de dar cuenta
00:38:07
Por qué a mí no me gustan los atajos
00:38:10
Porque normalmente necesitan que uses esta mano
00:38:11
Va a ser por eso
00:38:13
Dime
00:38:15
¿Puedo mostrarlo aquí?
00:38:16
Sí
00:38:17
¿Cómo que nadie, todo el mundo ha entendido lo que ha pasado?
00:38:18
De que era
00:38:28
Y fue lo borrado
00:38:29
Bueno, pues aquí lo tenéis
00:38:30
A ver
00:38:33
Yo lo escribo rápido porque entiendo que lo vais haciendo
00:38:35
En paralelo vosotros
00:38:38
Que no necesitáis ver lo que yo escribo
00:38:39
Porque si yo os digo intercambiar un texto con el otro
00:38:40
Es que ya me lo sabéis hacer
00:38:42
No tenéis que ver lo que escribo yo
00:38:43
¿El cerebro?
00:38:45
Porque se tiene muy mala solución
00:38:49
Revisa llaves, revisa cositas
00:38:50
Vale, pues entonces
00:38:58
Todo esto de los atajos
00:39:06
Al final lo he hecho, fíjate por donde
00:39:07
A ver
00:39:09
Vamos a hacer el constructor
00:39:10
Vale, un constructor
00:39:12
Y ahora ya no necesito
00:39:16
Los sets, si no quiero
00:39:19
Podría pasárselos
00:39:21
Aquí, le puedo pasar
00:39:23
Aquí el texto
00:39:25
Saluda
00:39:26
Y despide
00:39:35
Espera, vamos a probar esto
00:39:38
Vale, si se lo paso por constructor
00:39:41
Pues me ahorro a hacer los sets
00:39:45
Pero bueno, la idea es la misma
00:39:46
La idea es que los necesita aquí arriba
00:39:47
¿Vale?
00:39:51
Bueno, pues
00:39:55
todo esto, el manejar estas cosas
00:39:56
con cierta soltura, el ir entendiendo el paso de parámetros
00:39:58
es lo más
00:40:01
importante en programación
00:40:03
¿vale? un segundín
00:40:04
vamos a ejecutar esto a ver si lo que hemos hecho
00:40:06
no tiene ningún error
00:40:08
esto no se va a ejecutar obviamente
00:40:10
vale, pues entonces aquí
00:40:16
efectivamente
00:40:21
Pues funciona el evento
00:40:25
Porque se van cambiando
00:40:27
Los textos
00:40:28
Y además
00:40:30
Me he puesto el mensajito correcto
00:40:32
Bueno, pues funciona correctamente
00:40:35
Problemas
00:40:38
Por ahora
00:40:40
Porque
00:40:43
Todavía seguimos
00:40:43
Cada componente, ¿te refieres a cada cosa?
00:40:46
Cada componente
00:40:55
Y luego el texto del botón es
00:40:56
claro, sí, pero no os preocupéis
00:40:59
que vamos a incorporar
00:41:01
un truco rápidamente
00:41:03
pero, bueno, vamos a descansar
00:41:05
dos minutos
00:41:07
por favor, pro
00:41:08
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 12
- Fecha:
- 8 de marzo de 2025 - 19:17
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 41′ 12″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 182.98 MBytes