Clase 19-04-24 -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:
aquí en lo que estábamos ahora es que
00:00:00
bueno, la estructura de la aplicación ya está
00:00:02
esto ya es una aplicación que funciona y hace cosas
00:00:04
pero hombre
00:00:06
no queremos que haga esto, esto no es lo que queremos que haga
00:00:07
lo que queremos
00:00:10
que haga esta aplicación cuando yo le doy
00:00:12
al botón es
00:00:14
leer lo que hay en este
00:00:18
texto, que habrá algún
00:00:24
método, este componente
00:00:25
takes fill tendrá algún método para devolverme
00:00:28
lo que hay dentro, recordad que cada
00:00:29
componente de swing tiene tropecientos
00:00:31
mil métodos para hacer lo que yo
00:00:33
quiera hacer con él, pues si este área
00:00:35
de texto es para meter cosas, algún
00:00:37
método tendrá que me devuelva lo que hay
00:00:39
dentro, claro
00:00:41
cuando ya tengo eso que está dentro
00:00:42
operar
00:00:45
cuando ya he operado
00:00:46
generar el resultado y
00:00:49
ponérselo como texto
00:00:51
a esta etiqueta, la etiqueta
00:00:53
tendrá algún método para cambiar el texto
00:00:55
tendrá métodos para hacer mil cosas, una de ellas
00:00:57
para cambiar el texto, pues todo eso
00:00:59
es lo que yo quiero hacer
00:01:01
todas esas sentencias que he dicho
00:01:03
son las que yo quiero
00:01:05
meter aquí dentro
00:01:07
en lugar de estas, esto no quiero meterlo
00:01:08
vale, pues entonces
00:01:12
lo primero que tendremos que hacer aquí es
00:01:15
hemos dicho, coger el texto que hay en el área
00:01:17
de texto, eso es lo primero
00:01:19
que necesitamos hacer, vale
00:01:21
coger el texto del área de texto
00:01:30
pues ya tenemos el primer problemón, ¿no?
00:01:32
que el área de texto
00:01:35
¿dónde está?
00:01:36
el área de texto es una variable
00:01:38
local del constructor
00:01:40
luego ya está
00:01:42
ya
00:01:44
nos hemos encontrado el primer problema
00:01:46
¿cómo voy a llegar
00:01:48
yo aquí al área de texto?
00:01:50
o sea, si yo consigue el área de texto
00:01:52
algún método tendrá para coger el
00:01:54
contenido, pero es que
00:01:56
esto ya es un problema de programación
00:01:57
el que os planteo
00:02:00
esta variable
00:02:01
mi jtextfield dato
00:02:03
que es a la que yo quiero acceder
00:02:07
dato efectivamente
00:02:09
si yo me pongo
00:02:11
dato efectivamente pues
00:02:12
tiene un
00:02:27
método
00:02:29
estupendo, getText
00:02:32
que si yo leo la ayuda, te dice
00:02:35
te devuelve el texto que está dentro del
00:02:36
componente, ah genial
00:02:38
este es el método
00:02:40
que yo quiero, vale
00:02:42
esta parte la tengo resuelta
00:02:44
pero ostras, el problema
00:02:46
que tengo es que
00:02:49
esta variable dato, esta variable es una variable local
00:02:49
a este método, a este bloque
00:02:56
luego como bien sabemos, una variable solo es visible, accesible
00:02:59
dentro del bloque en el que está declarada
00:03:04
luego esto solo es visible y accesible dentro de este bloque
00:03:07
¿vale? luego
00:03:11
aquí, dato
00:03:15
Que yo querría hacer esto
00:03:18
Pues dato no puedo
00:03:20
Yo querría esto, ¿no?
00:03:24
Yo querría esto
00:03:30
Pero dato no es visible
00:03:31
¿Vale?
00:03:32
Bueno, pues ¿qué arreglos, qué apaños podemos hacer?
00:03:34
¿Qué cosas se os van ocurriendo que podamos hacer?
00:03:38
Hay desde la opción más sencilla y más patatera
00:03:42
Hacia la que es ya más sofisticada
00:03:44
Y que es la que se hace
00:03:47
Que es la que tenemos que aprender
00:03:48
Pero la primera que se os ocurriría con lo que sabéis
00:03:51
Hombre, lo primero que se os ocurriría es
00:03:54
¿Qué es lo primero que se os ocurriría?
00:04:00
Así de buenas a primeras
00:04:04
¿Cómo que importa?
00:04:05
¿Importar es importante?
00:04:08
Habría que sacarla afuera
00:04:11
Eso para empezar
00:04:12
Habría que sacarla afuera
00:04:13
¿No?
00:04:14
Vale, pero sacándola afuera, ¿qué solucionamos?
00:04:17
Sacándola afuera
00:04:20
Ahora es una variable
00:04:21
¿Eh?
00:04:23
Pero podéis llamarla como
00:04:26
Imagínate que yo hará JTextField
00:04:27
Vamos a, en lugar de declararla aquí
00:04:29
Yo aquí la
00:04:30
Puedo instanciar y hacer todo lo que sea
00:04:32
Pero la declaro aquí
00:04:35
Ahí
00:04:36
JTextField
00:04:41
Dato
00:04:47
Está ya declarada afuera, ya es una propiedad
00:04:49
De la clase
00:04:52
Luego sí, luego ya está
00:04:53
Aquí está construida, añadida al panel
00:04:55
Eso es lo de menos
00:04:58
Pero donde está declarada, marca su visibilidad
00:04:59
Está declarada afuera
00:05:02
ahora mismo que ha arreglado
00:05:03
no ha arreglado nada
00:05:08
o sea dato aquí
00:05:10
poniendo la static
00:05:11
ahora ya si tendría más
00:05:15
si yo la pongo static
00:05:17
que más tendría que cambiar aquí
00:05:20
para poder acceder a ella
00:05:25
claro tendría que poner el nombre de la clase
00:05:27
ventana
00:05:32
disiesto
00:05:49
vale
00:05:51
hacerle public porque está en paquete
00:05:58
diferente, ¿no? como lo he puesto
00:06:03
en paquete diferente, en mi caso, no sé en el vuestro
00:06:05
vale, bueno, a ver
00:06:07
así un apaño
00:06:11
tengo hecho
00:06:13
pero tengo que hacer, sacar
00:06:14
todos los componentes que me interesen fuera
00:06:16
hacerlos
00:06:19
estáticos y públicos
00:06:21
entonces, hombre, a ver, hacerlos
00:06:23
estáticos, hacer una variable estática
00:06:25
cuidado, puede tener sus implicaciones
00:06:27
en este caso, con lo sencilla que es mi aplicación
00:06:29
no, ya sabéis la implicación
00:06:31
que tiene hacer una variable estática
00:06:33
es que ahora cualquier instancia
00:06:34
que yo haga de esta misma clase
00:06:37
cualquier instancia
00:06:39
ya va a compartir
00:06:40
esa variable, entonces las variables
00:06:43
estáticas, cuidado, son variables compartidas
00:06:45
por todas las instancias de una clase
00:06:47
luego los efectos secundarios
00:06:49
pueden ser brutales, yo modifico
00:06:51
en una clase
00:06:53
y la
00:06:55
modificación se ve en todas las demás
00:06:57
porque es compartida, en este caso
00:06:59
si yo tuviera varias instancias
00:07:01
de ventana bisiesto
00:07:03
y cambiara text fill en una
00:07:04
el text fill me cambiaría en todas las demás automáticamente
00:07:07
me cambiaría en todas
00:07:09
imaginaos que le cambio el color
00:07:10
a este objeto ventana, le cambio el color
00:07:14
el color me cambia en todas las demás
00:07:17
me ha cambiado en todas, porque es estática
00:07:19
ahora mismo aquí solo tengo una ventana
00:07:21
entonces bueno, no habría problema
00:07:22
pero en general, cuidado, las variables
00:07:25
static se usan de forma
00:07:27
muy medida
00:07:29
y en los contextos
00:07:30
no normalmente para solucionar un problema
00:07:32
de acceso, cuando tengo que solucionar un problema
00:07:34
de acceso me busco otra forma más segura
00:07:36
ahora veremos cómo
00:07:38
las variables static se hacen cuando lo que
00:07:39
representan es esa idea
00:07:42
que es la idea de algo compartido
00:07:43
la idea de algo global
00:07:45
cuando le dan la idea de algo global, sí
00:07:48
pero es que ese text field
00:07:50
él por definición
00:07:52
no es una cosa global
00:07:54
él es un text field que está en una ventana
00:07:55
que está en una ventana
00:07:57
luego, conceptualmente no es global
00:07:59
que solo tengo una
00:08:01
no pasa nada porque sea global, porque solo tengo una
00:08:02
pero yo tengo muchas que pasan
00:08:05
¿vale?
00:08:07
entonces, bueno, efectivamente
00:08:08
con esto soluciona el problema de acceso
00:08:11
pero importante, importante que hagamos los diseños
00:08:12
de manera que respondan a lo que
00:08:15
conceptualmente son las cosas
00:08:17
y aquí, este área de texto
00:08:18
no es una variable global a todas mis ventanas
00:08:21
esta variable texto
00:08:23
es un texto de ese objeto
00:08:25
ventana, vale, entonces bueno
00:08:27
vamos a optar por otras soluciones, vale
00:08:29
dentro de que esta es la que, bueno, la que yo
00:08:31
esperaba que
00:08:33
os surgiera
00:08:34
claro
00:08:37
vale, pues entonces yo no puedo acceder aquí
00:08:37
a dato, no puedo acceder a dato
00:08:41
porque no lo tengo
00:08:42
me lo estáis diciendo, no lo tienes, entonces jo, sería
00:08:44
magnífico, sería magnífico
00:08:47
si yo tuviera esto
00:08:49
como propiedad de mi clase
00:08:51
fuera una propiedad de mi clase
00:08:52
y entonces yo podría acceder a ella
00:08:59
¿vale? imaginaos que
00:09:03
dato es una propiedad de mi clase
00:09:06
entonces yo puedo acceder a ella, está claro, es una propiedad de mi clase
00:09:07
esta es una clase que estoy haciendo yo
00:09:10
puedo añadirle lo que me dé la gana
00:09:11
que implemente Action Leaser
00:09:13
no significa que yo no pueda añadir lo que quiera
00:09:16
significa simplemente que es capaz de escuchar
00:09:17
¿vale? pues si dato es una propiedad
00:09:19
de mi clase, magnífico, puedo acceder
00:09:21
pero claro, este dato
00:09:23
¿con qué valor se tiene que rellenar?
00:09:25
se tiene que rellenar
00:09:28
con el text field de la otra
00:09:29
vale, pero es que entonces
00:09:31
yo aquí no le he puesto constructor
00:09:33
porque no he querido, pues voy a hacerle un constructor
00:09:35
que reciba como parámetro
00:09:37
el text field de la otra
00:09:39
y lo inicia
00:09:40
y inicialice este dato con eso
00:09:43
y queda una estructura de programación
00:09:44
más bonita, algo a lo que
00:09:47
recurrimos siempre, cuando yo no tengo
00:09:53
acceso a algo, lo paso por parámetro
00:09:55
es algo que estamos resolviendo siempre
00:09:57
cuando mi aplicación trabaja con un map
00:09:59
mi método no lo tiene
00:10:01
se lo paso por parámetro
00:10:03
pues aquí igual
00:10:05
hago un constructor al que yo le paso
00:10:06
por parámetro
00:10:10
un text fill
00:10:10
le paso por parámetro un text fill
00:10:13
y uso ese text fill
00:10:17
que he pasado por parámetro
00:10:19
para inicializar
00:10:20
esta variable
00:10:22
¿vale? y ahora yo ya trabajo con esta
00:10:24
sin ningún problema, trabajo con esta
00:10:27
¿pero qué ocurre?
00:10:29
esto public, claro que no me puede instanciar
00:10:31
desde fuera
00:10:33
pues que ahora cuando haga captura
00:10:34
botón, le tengo que pasar el text field
00:10:36
con el que yo quiero que trabaje
00:10:38
con el que yo quiero que trabaje
00:10:40
¿y en qué momento he instanciado captura
00:10:41
pulsar botón? aquí abajo
00:10:44
esto me aparece de que
00:10:45
lo había declarado arriba y ya lo he quitado
00:10:53
ahí, sí, el static lo he quitado
00:10:56
ya, vale
00:11:00
y ahora, ¿dónde me aparece el error?
00:11:01
en el constructor que lo he cambiado
00:11:04
me dice, oye, que el constructor de captura
00:11:05
pulsar botón, el constructor, tienes que pasarle
00:11:08
el text fill, este, para que
00:11:10
lo use para inicializar su variable interna
00:11:12
y ya trabaje con ella
00:11:14
cuidado que ya tienes que pasar, ah, claro, perfecto
00:11:15
voy a pasarte
00:11:18
el text fill con el que quiero que trabajes
00:11:19
con este, fue, con este
00:11:21
text
00:11:24
pues venga, ala, magnífico
00:11:24
ya está
00:11:27
ya hemos solucionado el problema
00:11:29
del acceso a variables de la manera habitual
00:11:32
Mi método tiene que trabajar con algo
00:11:34
Pásaselo por parámetro
00:11:37
Y ya está
00:11:39
Pásaselo por parámetro y ya trabaja con él
00:11:40
Pues nada, se lo pasamos por parámetro
00:11:42
Inicializa la variable interna
00:11:45
Y ya trabaja con él
00:11:47
Para coger el año
00:11:48
Vale
00:11:49
Pues ahora, el text field ya lo tenemos
00:11:51
Para ver si esto no había
00:11:54
Un método que era de time
00:11:57
Que lo habías encontrado tú
00:11:58
Esto era, ¿cómo se llamaba el método?
00:12:02
¿Por qué letra empezaba?
00:12:04
Ah, no, la
00:12:05
Ah, que la dejaba Time
00:12:07
Me he liado yo con la clase, sí
00:12:11
gr.is
00:12:12
No, isLib
00:12:14
Vale, pues entonces
00:12:16
Yo le tengo que pasar este año
00:12:19
Pero este año está en string pasado entero
00:12:21
Pero bueno, el pasar entero
00:12:23
Lo hemos hecho muchas veces
00:12:25
Ya sabemos que hago esto
00:12:26
Y ya está
00:12:29
Y ahora
00:12:30
Este es un boolean que me dice si es vis y esto no
00:12:32
entonces
00:12:35
si es bisiesto
00:12:37
hago lo que tenga que hacer
00:12:40
ahora veremos a ver el que hago
00:12:42
y si no lo es
00:12:43
hago lo otro que tenga que hacer
00:12:45
claro, y ahora viene otra vez el problema
00:12:47
¿qué es lo que tengo que hacer si es bisiesto?
00:12:50
pues coger la etiqueta para el resultado
00:12:52
que es esta
00:12:55
la etiqueta result
00:12:55
y fijarle el texto que yo quiera
00:12:57
que tendrá un método para ello
00:12:59
de nuevo me pasa que no tengo aquí la etiqueta
00:13:00
no pasa nada, se la paso por parámetro
00:13:04
me preparo una variable de clase
00:13:06
para ella
00:13:08
me preparo una variable de clase
00:13:09
y se la paso
00:13:12
por parámetro
00:13:18
pues de nuevo, ya tengo
00:13:19
las dos variables que necesitaba
00:13:37
que las paso por parámetro y las inicializo
00:13:39
pero claro, en el constructor
00:13:41
otra vez
00:13:43
entonces ahora ya al constructor
00:13:44
le tendré que pasar
00:13:48
el text fill y la etiqueta
00:13:49
la etiqueta esta
00:13:52
le tendré que pasar esta
00:13:56
para que trabaje con ella
00:13:58
pues hala
00:14:00
ahora ya puede trabajar con la etiqueta
00:14:02
y que tiene que hacer con esa etiqueta
00:14:05
pues con esa etiqueta
00:14:07
tiene que fijarle un texto
00:14:09
que métodos tiene
00:14:10
si uno busca por aquí, anda, si tiene un método
00:14:12
set test, pues tiene la pinta que el método
00:14:15
set test es el que le pone el texto, no es cuestión de
00:14:17
investigar los métodos
00:14:19
que texto queremos poner si es vici esto
00:14:20
No es bisiesto.
00:14:22
¿Que no?
00:14:28
Pues queremos ponerle el otro.
00:14:29
No es bisiesto.
00:14:43
¡Hala!
00:14:49
Ahora ya sí que está terminada la aplicación.
00:14:50
A menos que hayamos hecho algo mal.
00:14:53
Ahora ya, el problema del método.
00:14:55
Que necesitaba el text field, necesitaba la etiqueta resultado.
00:14:56
Para operar con ella.
00:14:59
Escoger el año y mostrar el texto.
00:15:00
No las tiene porque son variables locales.
00:15:02
locales. Pues creamos aquí dos variables de clase a las que sí tiene acceso, obviamente,
00:15:03
porque son variables de su clase, y las inicializamos a través del constructor. Cuando instanciamos
00:15:10
el objeto, le pasamos los dos componentes con los que tiene que operar. Tienes que operar
00:15:18
con esos dos. Vale, estupendo. Pues ahora ya este, estos dos componentes, operar con
00:15:24
Y ahora ya esta aplicación
00:15:30
Uy, claro, es que no le he puesto el año
00:15:37
Entonces me hace al cojero
00:15:39
Hacer el integer parse in del vacío
00:15:41
Vale, siguiente intento
00:15:43
Voy a poner
00:15:46
El 1987
00:15:47
Es bisiesto
00:15:49
Pues ese no lo era, obviamente
00:15:51
El 2024
00:15:53
Ese sí
00:15:55
Vale
00:15:58
Pues ya está, pues esta es la arquitectura básica
00:16:00
Sobre esta arquitectura básica
00:16:08
ya se puede hacer cualquier cosa
00:16:10
pero claro, hay millones de pequeñas
00:16:12
cosas, millones de pequeñas cosas
00:16:15
que
00:16:16
amplían esto
00:16:18
y que cada una de ellas, luego cuando uno se mete
00:16:20
pues claro, tienes que resolver un montón de pequeñas cuestiones
00:16:22
y para resolver
00:16:25
esas pequeñas cuestiones que surgen
00:16:26
hay que saber programar
00:16:28
no vale con saber consultar bien Youtube
00:16:30
chat GPT, Stack Overflow, no vale
00:16:32
¿vale?
00:16:34
todo eso es una ayuda maravillosa
00:16:36
para hacer las cosas
00:16:37
pero el que no sabe
00:16:38
programar no puede hacer
00:16:40
absolutamente nada más
00:16:42
a lo mejor puede engañar a alguien un mes
00:16:44
pero dos meses de verdad que no
00:16:46
es importante que aprendáis a programar
00:16:48
vale, bueno pues
00:16:51
aquí se me ha abierto
00:16:54
esto por la excepción
00:16:57
vale
00:16:58
entonces aquí la solución que hemos dado
00:17:02
para poder acceder a eso es esta
00:17:04
aunque la habitual será otra
00:17:05
que bueno, que no la voy a meter ahora porque es ya
00:17:07
demasiado rollo, no nos da tiempo
00:17:10
el próximo día y ahora simplemente
00:17:11
en el
00:17:13
en el tiempo que os queda
00:17:15
para ver que todo esto está entendido
00:17:18
pues algo muy parecido
00:17:20
algo muy parecido pero más
00:17:21
vale
00:17:23
pues una aplicación
00:17:28
dos áreas de texto, una otra
00:17:31
y aquí un botoncito
00:17:33
con un más delante, pues nada, aún más
00:17:35
un por lo que os dé la gana, cuando le deis
00:17:37
al botoncito que haga la operación
00:17:39
que le hayáis puesto y muestra aquí
00:17:41
pues la suma
00:17:43
que aquí en el bot
00:17:45
habéis puesto multiplicar
00:17:47
lo que queráis
00:17:47
me da igual
00:17:48
¿vale?
00:17:48
la aplicación tiene
00:17:49
dos áreas de texto
00:17:50
metéis dos datos
00:17:51
y cuando se da el botón
00:17:52
muestra el resultado
00:17:54
de la operación
00:17:55
con recorriente
00:17:56
¿vale?
00:17:57
¿eh?
00:17:58
la
00:17:59
bueno a ver
00:18:00
yo lo estoy dibujando así
00:18:01
pero como solamente
00:18:02
hemos puesto
00:18:03
gestor de ubicación
00:18:03
flow layout
00:18:04
pues los puntos
00:18:05
van a quedar seguidos
00:18:05
a ver si ajustáis
00:18:06
los tamaños
00:18:08
con el flow layout
00:18:10
él nos va a poner
00:18:11
precisamente así, si ajustáis el tamaño
00:18:12
del frame, de estos componentes, al ponerlos
00:18:14
seguidos, porque cuando no caben es al trabajo
00:18:16
pero vamos, que como queden
00:18:18
colocados es lo de los demás, vale
00:18:20
y una etiqueta para el resultado de la suma
00:18:22
o de la multiplicación o de lo que queráis
00:18:26
claro, que muestre el resultado
00:18:28
vale, pues venga, esa aplicación
00:18:31
es solo para ver que
00:18:34
la hacéis vosotros desde cero
00:18:36
y para ver que vale, que sí, que esta arquitectura
00:18:38
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 6
- Fecha:
- 21 de abril de 2024 - 19:05
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 18′ 41″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 85.31 MBytes