20250306 GUI_clases_internas - 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:
vale, pues que bien esto ya
00:00:00
problema solucionado
00:00:03
se lo pasamos por parámetro y estupendo
00:00:05
pero
00:00:07
nunca se hace así
00:00:08
claro, pero y lo que habéis pensado
00:00:10
eso es oro, puro
00:00:13
es que eso es lo que tenéis que hacer, os van a pagar por pensar
00:00:14
si, si, si, de verdad
00:00:17
¿por qué?
00:00:21
pues porque y si
00:00:25
el método tiene que acceder a un montón de cosas
00:00:26
no le puedo pasar
00:00:29
hay mil cosas, es un poco engorroso
00:00:31
estoy hablando en términos de
00:00:33
escritura de código
00:00:37
no es que sea computacionalmente
00:00:38
poco eficiente, es estupendísimo
00:00:41
lo que pasa es que es un rollo, constructores enormes
00:00:43
o hacer un montón de set
00:00:46
pues es un rollo
00:00:47
cuando ya tenemos un montón de componentes
00:00:48
que queremos pasarle
00:00:51
¿qué podemos hacer?
00:00:52
pues, mira
00:00:56
vamos a inventarnos, según se han ido inventando
00:00:57
cosas en Java, según iban haciendo falta
00:01:00
pues se han ido inventando cosas en Java
00:01:01
pues de repente se inventa una cosa
00:01:03
que son
00:01:05
las clases internas
00:01:07
que se usan muchísimo
00:01:08
que es, vamos a ver, mi problema
00:01:10
es que esta clase
00:01:13
no puede acceder
00:01:14
a nada de esta otra, porque son
00:01:17
clases separadas, entonces ya sabemos
00:01:19
¿verdad? eso lo tenemos clarísimo
00:01:21
dos clases separadas para acceder
00:01:23
una a lo de la otra
00:01:25
se lo tenemos que pasar por parámetro
00:01:27
a sus métodos, que es lo que hemos hecho
00:01:29
si lo hemos pasado por los set o por constructor
00:01:31
por parámetro, no hay otro
00:01:33
vale, pero
00:01:35
como eso es un rollo, pues
00:01:37
llega en lumbreras
00:01:38
y dice
00:01:41
pues meto una dentro de otra
00:01:42
y magnífico, si meto esta dentro
00:01:44
de esta otra, pues hala, ya puede
00:01:47
acceder esta a lo de aquí, y no tengo ni que pasárselo
00:01:49
pues efectivamente
00:01:52
ese parche, lo llamo parche
00:01:53
pero en realidad es un recurso de programación
00:01:55
muy usado, pues ya está
00:01:57
y ya lo podemos usar
00:01:58
que es meter una clase
00:02:01
dentro de la otra
00:02:03
pero eso no es algo que uno haga
00:02:04
porque le da la gana
00:02:07
tengo aquí un montón de clases en mi aplicación
00:02:08
mis 300, 500 clases
00:02:11
y esta quiero que acceda a esta otra
00:02:13
y a propiedades
00:02:15
de aquí y no me apetece pasárselas
00:02:17
por parámetro porque entonces tengo que ir a
00:02:19
propiedades, meto esta dentro de la otra
00:02:20
A ver, ojo, no
00:02:22
Esas cosas hay que hacerlas con criterio
00:02:23
Entonces, lo de clases internas
00:02:25
Que es lo que estoy diciendo
00:02:28
Que es que una clase está dentro de la otra
00:02:29
Tiene que hacerse cuando a nivel de diseño
00:02:30
Tiene sentido
00:02:34
¿Vale? Tiene sentido
00:02:36
Y a nivel de diseño tiene sentido
00:02:37
Cuando la clase que yo meto dentro de otra
00:02:40
Solo tiene sentido
00:02:42
Que existan objetos de ella
00:02:44
Si existe la otra clase
00:02:45
¿Vale?
00:02:48
Entonces vamos a
00:02:49
Tres minutos para que entendáis esto
00:02:51
Porque es importante
00:02:54
Tienes que ser los mejores
00:02:57
No hacer las cosas así a lo tonto
00:03:00
Porque vais a tener de rodaje un año
00:03:02
Un año y medio
00:03:03
Si sois los buenos, los que sabéis pensar
00:03:04
Los que lo entendéis todo
00:03:08
Pues tendréis rodaje toda vuestra vida
00:03:09
Vale
00:03:11
Y ahora es cuando Juan saca su boli
00:03:19
Y su papel
00:03:41
que eso es lo que tendría que hacer todo el mundo
00:03:42
porque lo que escribes
00:03:44
normalmente es lo que mejor
00:03:46
interiorizas
00:03:48
porque se piensa con la mano
00:03:49
bastante a menudo
00:03:54
no solo piensa el cerebro
00:03:55
piensa el cerebro y la mano
00:03:58
desde que nació
00:03:59
desde que le enseñaron a coger o hacer
00:04:17
las barritas
00:04:20
y aprendió a hacer las barritas y dijo ya está
00:04:22
ojo que yo he hecho
00:04:23
para mi ortografía
00:04:26
hasta que los abandonaste
00:04:28
pero no mejoraron para la caligrafía
00:04:30
son malísimos
00:04:31
bueno
00:04:32
bueno a ver
00:04:33
clases internas
00:04:37
que son
00:04:39
vamos a dejarlas entendidas
00:04:40
y así las podremos aplicar y utilizar
00:04:43
siempre que queramos
00:04:45
Y este es uno de los contextos en los cuales viene bien usado, el contexto de las interfaces gráficas.
00:04:46
Pero no solo, no solo, hay muchos otros.
00:04:52
Bueno, pues cuando yo os dije en su momento que una clase tiene dentro dos partes,
00:04:58
que son las propiedades
00:05:12
que caracterizan
00:05:15
los objetos
00:05:17
que se van a instanciar de esa clase
00:05:19
esa es una de las partes, las propiedades
00:05:21
lo va a caracterizar el color, la altura
00:05:22
no sé cuánto, y los métodos
00:05:25
que es
00:05:27
el código
00:05:29
que esos objetos van a poder
00:05:31
ejecutar
00:05:33
su comportamiento, lo que van a poder hacer
00:05:34
y eso que van a poder hacer pues va a modificar
00:05:37
sus propiedades o lo que haga falta
00:05:39
pues siempre os dije
00:05:41
bueno, os miento un poco pero bueno
00:05:43
os voy mintiendo poco a poco, pues sí efectivamente
00:05:45
os mentí un poco
00:05:47
porque no es sólo eso
00:05:50
lo que puede tener dentro de una clase
00:05:52
aparte de propiedades y métodos
00:05:53
hay otras dos cosas más que puede tener, alguna ya la hemos mencionado
00:05:55
también es lo de estática
00:05:58
la mencionamos un poco por encima pero bueno
00:05:59
como si la hagáis por olvidada
00:06:02
no pasa nada, ya surgirá en proyectos
00:06:04
del año que viene, ya son más grandes
00:06:06
la otra cosa que puede tener
00:06:07
dentro de una clase, es el bloque static, que es esto, static y entre llaves, un código que afecta solamente a propiedades estáticas de la clase
00:06:10
y sería como una especie de inicialización de la parte estática de la clase, una especie de inicialización de las propiedades estáticas
00:06:26
y se puede ejecutar también código, sentencias de código, pero que toquen solo variables estáticas de la clase,
00:06:33
Es como una especie de inicialización de lo que se llama el contexto estático de la clase,
00:06:40
que es las propiedades estáticas que tiene esta clase,
00:06:46
que son esas propiedades que están ahí, que pueden existir aunque no exista ningún objeto de la clase.
00:06:49
Esas son las propiedades estáticas, las que pueden existir aunque no exista ningún objeto de la clase.
00:06:56
Por esas propiedades se puede hacer un bloque estático para inicializarlas,
00:07:01
para hacer comprobaciones con ellas,
00:07:04
y ese bloque estático se va a ejecutar
00:07:05
una única vez
00:07:08
la primera vez
00:07:10
que se hace referencia a esa clase
00:07:11
o que se crea un objeto
00:07:14
de esa clase, que es en el momento
00:07:16
en el que aparecen las variables estáticas, ¿verdad?
00:07:18
En el momento en el que aparecen las variables
00:07:20
estáticas de una clase,
00:07:22
¿cuándo aparecen? La primera vez
00:07:24
que en un main
00:07:26
se llaman a esas variables con clase
00:07:27
a punto no sé qué o se crea un objeto,
00:07:30
la primera vez que se hace referencia
00:07:32
a una clase, esa primera vez
00:07:34
es la que aparece en todas las variables
00:07:36
estáticas.
00:07:38
Y se quedan ahí. Y ya van a existir para siempre.
00:07:39
¿Vale?
00:07:42
Bueno, pues esa vez, esa primera vez
00:07:43
en la que se quedan todas las propiedades estáticas,
00:07:45
también se ejecuta este código si lo hubiera.
00:07:48
¿Vale? Pues esta es la primera
00:07:50
cosa que digo, que también
00:07:52
puede estar aparte de propiedades y métodos.
00:07:54
Y también puede
00:07:57
haber otra cosa, que son
00:07:58
clases internas.
00:07:59
Puede haber una clase dentro de otra
00:08:01
Es decir, dentro de esta clase A
00:08:04
Puedo declarar yo dentro directamente una clase B
00:08:08
Así alegremente
00:08:12
Con sus propiedades
00:08:21
Por ejemplo, esta podría tener a lo mejor una propiedad
00:08:23
Y para distanciar un objeto de esa clase B
00:08:26
Tendría que distanciar primero uno de clase A
00:08:30
si
00:08:32
lo que pasa es que las clases internas
00:08:35
pueden ser, pueden admitir dentro
00:08:39
una cosa
00:08:41
que es
00:08:43
la clase interna puede tener dentro el modificador
00:08:43
estático
00:08:47
entonces puedes instanciar un objeto
00:08:47
clase interna
00:08:51
si no existe uno de la de arriba
00:08:51
en este modificador, lo digo para no
00:08:54
responderte así
00:08:56
sin mentirte, pero no quiero
00:08:58
meterme en eso, dime
00:09:00
Sí, a ver
00:09:01
Primero, esto se declararía así
00:09:04
La clase va directamente dentro de la otra
00:09:06
No va dentro de un método ni de nada
00:09:09
Va directamente dentro de la otra
00:09:11
¿Vale? Esta otra clase
00:09:12
Y ahora, ¿qué implicaciones tiene esto?
00:09:14
Bueno, esto es otra clase distinta
00:09:17
Es otra clase diferente
00:09:19
¿Vale? Entonces, con un código así
00:09:21
Tendríamos dos clases
00:09:23
La clase está de aquí
00:09:24
Y la otra clase
00:09:26
Cuyo nombre se convierte en compuesto
00:09:29
la otra clase se llama en realidad
00:09:31
así
00:09:34
es decir, su nombre cambia
00:09:37
de hecho, cuando compilamos
00:09:40
si compilamos esto y vemos lo que ha generado
00:09:42
pues vemos que ha generado
00:09:45
una clase A
00:09:47
y la otra la ha llamado así
00:09:47
tendríamos la A.class
00:09:50
y esta.class
00:09:54
porque el punto
00:09:57
como nombre de fichero
00:09:57
vale
00:09:59
¿vale? entonces, para empezar el nombre es distinto
00:10:00
el nombre no es directamente, el nombre cambia
00:10:03
pero bueno, eso es lo de menos, y ahora, ¿qué implicaciones
00:10:05
tiene a nivel de código?
00:10:07
pues que resulta
00:10:10
que esta clase que está aquí dentro
00:10:11
puede acceder
00:10:13
si le da la gana, vamos a imaginarnos que
00:10:15
yo aquí voy a hacer un método
00:10:17
mostrar
00:10:19
pues esta clase interna de aquí
00:10:20
puede acceder
00:10:25
por supuesto a sus propiedades
00:10:27
como siempre, claro, eso no cambia
00:10:29
pero es que también puede, si le da la gana, acceder a las propiedades de la clase que la contiene.
00:10:31
Es decir, esto tiene sentido.
00:10:42
Sin embargo, desde la clase externa no se puede acceder a las propiedades de la interna, no se puede, ¿vale?
00:10:46
Pero desde la clase interna sí se puede acceder a las de la externa.
00:10:56
entonces, espera, déjame un poco terminar
00:10:59
para que a lo mejor se resuelvan las dudas
00:11:02
después de acabar
00:11:03
entonces, ahora, claro, esto es una cosa rara
00:11:05
me diréis, vale
00:11:08
pero si me dices que son clases separadas
00:11:09
y que por tanto yo puedo hacer objetos separados
00:11:12
si yo instancio
00:11:15
un objeto de clase B
00:11:16
y llamo luego a mostrar
00:11:18
la Y está claro
00:11:20
la que se haya creado en el constructor
00:11:23
la que sea, pero que X muestra
00:11:25
claro, que X muestra
00:11:27
claro, es que para yo poder crear un objeto de esta clase
00:11:29
tiene que existir un objeto de esta
00:11:34
y yo cuando lo instancie, lo instanciaré
00:11:37
asociado a ese objeto, haré algo como esto
00:11:41
yo tengo el objeto A
00:11:46
perdón
00:11:52
algo así
00:11:53
yo tengo un objeto A
00:12:00
vale, pues muy bien
00:12:04
new clase A
00:12:05
y ahora como ya tengo un objeto A
00:12:07
con sus propiedades dentro llenas
00:12:12
las que sean como ya lo tengo
00:12:14
ya podría crear
00:12:15
un objeto de la otra clase
00:12:17
pero asociado a este
00:12:20
bueno, espera, lo estoy llamando A B
00:12:24
sería clase A, clase B
00:12:29
entonces
00:12:31
asociado a este objeto
00:12:40
se hace el nio
00:12:44
algo así, ahora lo comprobamos
00:12:46
porque no recuerdo muy bien si aquí también es obligatorio
00:12:51
poner clase A, yo creo que no
00:12:53
pero lo que me importa es la idea
00:12:54
¿vale?
00:12:56
entonces, para instanciar
00:12:58
un objeto de la clase de dentro
00:13:01
para instanciarlo
00:13:03
tiene que existir
00:13:05
un objeto de la de arriba
00:13:07
¿vale? tiene que existir
00:13:08
¿cuando te está después de placear es un punto?
00:13:11
sí, sí, sí, es un punto
00:13:14
¿vale? tiene que existir
00:13:14
entonces ahora ya esa primera duda está resuelta
00:13:17
si yo llamo a los métodos de B
00:13:19
los métodos de B
00:13:22
trabajan con las propiedades
00:13:23
estas y con las del objeto
00:13:25
este, trabajan con las de este
00:13:28
sin ningún problema
00:13:30
sin embargo tiene sentido que desde la
00:13:31
externa yo no pueda hacer hasta propiedades
00:13:34
porque este objeto puede existir
00:13:36
por libre independientemente
00:13:38
entonces si yo desde aquí pudiera acceder
00:13:39
a las propiedades de aquí y creo este
00:13:42
objeto por libre, cuando
00:13:44
accedo a esas propiedades, es que no están
00:13:46
ni creadas, ¿qué valor tendría?
00:13:48
no se puede, ¿vale?
00:13:50
es que no, puede existir
00:13:54
un objeto de esta clase
00:13:56
sin que estas propiedades existan, no existen
00:13:58
ni siquiera, entonces no tiene sentido que nos dejen
00:14:00
por código acceder a ellas
00:14:02
pero cuando estos objetos existan
00:14:03
Esta tiene que existir, con lo cual tiene sentido que me dejen hacer estas propiedades.
00:14:06
Luego esas son las implicaciones que tiene en cuanto a desarrollo, a escritura de código.
00:14:12
Y entonces uno podría decir, bueno, ¿y con esto qué gano?
00:14:19
Primero, gano una cosa que es la más importante, que es hacer diseños que de nuevo se correspondan muchísimo mejor con la realidad que estoy representando.
00:14:23
porque si yo hago un diseño de clases
00:14:34
que responde a la realidad de lo que estoy
00:14:36
gestionando seguramente esa aplicación
00:14:38
me va a ser mucho más fácil
00:14:40
luego irla manteniendo, irla ampliando
00:14:42
cosas porque estoy precisamente
00:14:44
representando la situación real
00:14:46
con lo cual cualquier cosa que se incorpora a la realidad
00:14:48
se va a incorporar
00:14:50
a mi aplicación de forma natural porque mi
00:14:52
aplicación es directamente un reflejo
00:14:54
de la realidad, no entonces por
00:14:56
ejemplo una situación en la cual
00:14:58
tenemos
00:15:00
alumnos y matrículas
00:15:01
una aplicación que gestiona alumnos, matrículas
00:15:04
una secretaría, vale, pues yo puedo
00:15:07
hacer mis clases alumno
00:15:09
con mis objetos alumno, mis clases
00:15:10
matrícula con mis objetos matrícula
00:15:12
vale, luego poner pues dentro
00:15:15
de la clase alumno un objeto
00:15:17
matrícula que sea su matrícula, puedo hacer ese
00:15:18
diseño, o también podríamos decir
00:15:20
vale, solamente
00:15:23
tiene sentido que existan objetos
00:15:25
matrícula, solo
00:15:26
si son de un alumno
00:15:28
mi aplicación no quiere
00:15:29
que exista un objeto matrícula por libre
00:15:32
no puede, no debería
00:15:34
yo poder hacer un new matrícula
00:15:36
sin más y que exista un objeto matrícula
00:15:39
por libre
00:15:40
¿vale? entonces
00:15:41
¿cómo puedo a lo mejor reflejar eso?
00:15:44
vale, pues que la clase matrícula
00:15:46
la hago interna
00:15:48
a la clase alumno
00:15:50
¿vale?
00:15:51
si, o sea, clase alumno tiene
00:15:53
de propiedad una matrícula
00:15:55
ya, pero es que ya no la tendría
00:15:56
claro, ya no la tendría
00:15:57
entonces, tú puedes
00:16:00
programar de esta manera
00:16:02
tú tienes tu clase alumno con sus propiedades
00:16:04
tiene una clase interna matrícula
00:16:06
y entonces tú te creas tu alumno
00:16:08
y cuando te creas una matrícula
00:16:10
obligatoriamente esa matrícula ya va asociada a un alumno
00:16:12
obligatoriamente, es que no hay tu tía
00:16:14
tienes que crearla aparte
00:16:16
tienes que estar creando un objeto alumno
00:16:18
y luego crear el objeto matrícula
00:16:20
ya, pero si están por separado igual
00:16:21
creas el objeto alumno, matrícula, luego tendrías que hacer el set
00:16:23
para asociarlos
00:16:26
entonces aquí
00:16:27
pues primero garantizas que nadie
00:16:29
va a instanciar una matrícula que se va a quedar suelta
00:16:32
por libre ahí en la aplicación, muerta
00:16:34
no, cualquier objeto matrícula
00:16:35
es que va a estar asociado a un alumno
00:16:38
sí o sí, no necesitas luego hacer
00:16:40
el set para asociárselo ni nada
00:16:42
porque ese alumno ha tenido que
00:16:43
existir para yo poder crear una matrícula
00:16:46
eso es la primera
00:16:48
cosa, y la segunda
00:16:50
desde la clase matrícula yo ya
00:16:51
puedo acceder tranquilamente
00:16:54
A todas las propiedades del alumno
00:16:55
Puedo hacer dentro del método matrícula
00:16:57
Mostrar datos de no sé qué
00:16:59
Y en ese mismo método de matrícula
00:17:01
Pues puedo yo ya
00:17:04
Usar las propiedades de la matrícula
00:17:05
Y las del alumno, tranquilamente
00:17:07
Pero en el objeto alumno no puedes acceder a tu matrícula
00:17:09
No, ya, pero
00:17:12
Sí, pero depende de lo que tengas que hacer
00:17:13
Pero desde aquí, si la gestión es
00:17:15
Pues hacer no sé qué con las matrículas
00:17:17
Tú tienes aquí los métodos
00:17:18
Y estos métodos ya te pueden hacer a lo de arriba
00:17:20
Que de nuevo depende, o sea, que es una herramienta más de diseño
00:17:22
No es que sea la herramienta que haya que utilizar, es un recurso más, un recurso más para diseñar, hacer una clase interna que te puede venir muy bien muchas veces, sobre todo la gran ventaja es que te facilita el paso de parámetros, porque aquí no hay parámetros que pasar.
00:17:25
Si tú en matrícula quieres poner un método que necesite los datos del alumno al que está asociado esa matrícula, tienes que hacerlo muy retorcido, lo tienes que pasar el objeto alumno por parámetro.
00:17:41
Eso luego se te puede complicar un poquito más, ahora llamar a ese método, pues tienes que coger el alumno al que esa matrícula estaba asociado, pasárselo.
00:17:54
Entonces, en función de la situación y de lo que estés resolviendo, esto puede ser mucho más cómodo.
00:18:02
Aquí metes el método y ese método tranquilamente lo tiene todo a su disposición.
00:18:07
Toda la matrícula y todo el alumno.
00:18:12
¿Y hay algún método que me muestre las subclases, o sea, las clases que están dentro de una clase?
00:18:14
No.
00:18:20
¿Por qué no puedo saber las clases que están dentro de una clase?
00:18:21
Porque eres el desarrollador, que has hecho ese diseño.
00:18:24
Sí, pero no.
00:18:27
Claro, eres el...
00:18:29
Sí, sí, lo he hecho yo, claro.
00:18:30
claro, pero es que si no lo has hecho tú
00:18:32
ese diseño
00:18:35
estará con una API
00:18:36
me refiero, estará con un uso, el que lo ha hecho
00:18:38
te dirá, estos son los métodos que tú puedes usar
00:18:41
y tú usarás esos métodos, como lo haya hecho
00:18:42
por dentro te da igual
00:18:45
dime
00:18:45
si yo cambiase
00:18:47
X de la clase A
00:18:50
en la clase B
00:18:52
si metieras esto aquí
00:18:54
no, si yo en caso
00:18:55
que tiene X y lo cambiase en la clase B
00:18:58
Sí, sí, sí, claro
00:19:00
Claro, o sea, tú ves de aquí
00:19:03
Si a X le das 7
00:19:05
El X de A se cambia
00:19:07
¿Vale? Con lo cual esto a veces
00:19:09
Se confunde con la herencia
00:19:11
No tiene nada que ver
00:19:13
Porque tú cuando una clase le da de otra
00:19:14
Tienes dos clases diferentes
00:19:17
Pero los objetos
00:19:19
Son completamente independientes
00:19:21
Entonces cuando una clase le da de otra
00:19:23
Si esta clase hiciera un extens de clase A
00:19:25
Efectivamente tiene un X dentro
00:19:27
al que acceder, pero ese X es el suyo propio
00:19:30
y cuando instanciamos
00:19:32
un objeto de clase B y accedemos a X
00:19:34
accedemos a su propia copia
00:19:36
de X
00:19:38
y clase A tendrá
00:19:38
si la pasas por parámetro como a cualquier otra
00:19:40
pero si esta hereda de esta
00:19:43
este tiene su propio X
00:19:46
y clase A tiene su propio X
00:19:47
cuando tú instancias uno de B
00:19:49
tiene su copia de X y uno de A tiene su copia de X
00:19:51
sin embargo
00:19:54
cuando no estás heredando
00:19:55
sino que es una clase interna
00:19:58
esta tiene
00:19:59
el X que es el único que existe
00:20:01
compartido por los dos
00:20:04
por este objeto al que también puede acceder
00:20:05
este X no es que sea
00:20:08
una propiedad de clase B
00:20:10
es de A, lo que pasa es que
00:20:11
esta tiene acceso directo a ella
00:20:14
para mostrarlo, para modificarlo
00:20:16
para lo que sea, es una propiedad
00:20:18
a la que puede acceder, o sea esto no es una herencia
00:20:19
entonces esto no responde
00:20:22
a clase B
00:20:24
es clase A, sino
00:20:26
responde a la idea de tiene un
00:20:27
clase A tiene un clase B
00:20:30
un alumno tiene
00:20:32
una matrícula, ¿vale?
00:20:34
nunca haríamos matrícula extensa alumno
00:20:36
porque una matrícula no es
00:20:38
un alumno
00:20:40
pero sí lo haríamos como clase interna
00:20:41
porque un alumno sí tiene una matrícula
00:20:44
entonces
00:20:46
dos opciones, como hemos dicho
00:20:47
o bien que clase A tenga un objeto
00:20:50
matrícula dentro y que luego lo instanciemos
00:20:52
o lo pasemos con el set, lo que sea
00:20:54
o como clase interna.
00:20:56
Como clase interna tenemos la seguridad
00:20:57
de que no va a haber objetos matrícula en la aplicación
00:21:00
sueltos. Y luego está otra ventaja.
00:21:02
Y es otro recurso más.
00:21:04
A mí me marea la idea
00:21:06
de no poder acceder
00:21:07
como propiedad de clase A a los
00:21:10
alumnos y matrículas.
00:21:11
Las matrículas de todos los alumnos,
00:21:14
como las tienes que recopilar, pues lo que sea.
00:21:16
Claro.
00:21:18
Pero no puedes acceder directamente
00:21:19
a través de los alumnos.
00:21:21
Claro, es que depende de lo que quieras hacer, pues no lo harías así.
00:21:21
claro, esto en realidad lo de las clases
00:21:24
internas se usa para cosas muy concretas
00:21:26
no es que se use todo el rato
00:21:28
no, para cosas muy concretas, para una aplicación
00:21:30
en general, tú tienes tus colecciones de datos
00:21:32
efectivamente, como hemos
00:21:34
hecho más hasta ahora, ¿vale? pero es
00:21:35
un recurso más que a veces en algún
00:21:38
contexto pequeño tiene sentido
00:21:39
y en este de la interfaz
00:21:41
gráfica es justo lo que necesitamos
00:21:44
los listeners
00:21:45
solo tiene sentido que haya listeners
00:21:47
si hay un frame
00:21:49
si no, ¿para qué quiere uno un listener suelto?
00:21:51
solo tiene sentido si hay un frame
00:21:54
luego que los listeners sean clases internas
00:21:55
porque una clase
00:21:59
puede tener todas las internas que hagan falta
00:22:00
no tiene por qué tener una, todas las que hagan falta
00:22:02
bueno pues
00:22:05
que los listeners sean clases internas
00:22:06
y al ser clases internas
00:22:08
ya pueden acceder a todo
00:22:10
lo que hay en el frame
00:22:12
entonces lo único que tenemos que hacer es sacarlo
00:22:13
de variable local de constructor a propiedad
00:22:16
de clase del frame
00:22:18
Y ya está solucionado
00:22:19
¿Vale?
00:22:21
Entonces
00:22:23
Nos queda algo así
00:22:24
¿Quién se ha dormido?
00:22:27
¿Tú te habías dormido?
00:22:36
Un poco, ¿no?
00:22:38
Vale, pues entonces
00:22:42
Mi ventana
00:22:44
Versión 2
00:22:48
¿Por qué lloras?
00:22:50
Tú estás aquí por gusto, se supone
00:22:57
Venga, pues vamos a hacernos una copia
00:22:59
De mi ventana
00:23:05
Hago copy-paste
00:23:06
Mi ventana 2
00:23:12
De verdad, tenéis que graduaros la pista
00:23:13
no, no, no
00:23:29
te puede ayudar para actividades creativas
00:23:52
claro, lo que he dicho
00:23:54
en la facultad de filosofía
00:23:55
claro, pero aquí no
00:23:57
ni el pegamento tampoco
00:23:59
tampoco
00:24:01
Un polvorón
00:24:03
Eso igual sí, hombre
00:24:11
Uf, eso menos todavía
00:24:12
No, no, no, no, por Dios
00:24:15
Venga, a ver
00:24:18
He hecho una copia de mi ventana
00:24:20
Mi ventana 2
00:24:22
¿Qué es esta? Mi ventana 2
00:24:23
Haced un
00:24:25
A ver, pero haced simple
00:24:26
Mi ventana, le ponéis aquí, botón derecho, copy
00:24:29
Hacéis en el main paste
00:24:31
Y ya te lo ofrece con nombre 2
00:24:33
Vale, mi ventana 2
00:24:34
Pues mi ventana 2
00:24:37
Vamos a hacer el listener
00:24:42
Vamos a meterlo dentro, como clase interna
00:24:44
Pues vamos a copiar
00:24:46
El escucha saludar este
00:24:49
Bueno
00:24:50
Vamos a
00:24:55
El action performance solo
00:24:55
Vale, y copio el action performance
00:24:58
Enterito
00:25:14
que tenía aquí
00:25:17
todos los atajos
00:25:21
que sean con este dedo, eso sí me los puedes decir
00:25:28
pero los que impliquen dos dedos
00:25:31
no
00:25:33
¿se te atasca la mano?
00:25:33
es que no, es que nací
00:25:40
esta articulación
00:25:41
bueno, a ver, nací
00:25:42
imagino que nacería con ella suelta
00:25:44
y en algún momento se soldó, pero se soldó girada
00:25:47
entonces
00:25:50
claro, o sea, a ver, yo puedo hacer así
00:25:51
pero para hacer así tengo que subir mucho esto
00:25:54
entonces
00:25:56
Es muy incómodo
00:25:56
O sea que tú puedes hacer esto y puedes hacer esto
00:25:58
¿Verdad? Con las dos
00:26:01
Pues yo con esta llego hasta aquí
00:26:02
Ya no llego hasta aquí
00:26:03
Como pianista habría tenido un futuro
00:26:04
Pues lo toqué algunos años
00:26:12
Poder se puede
00:26:22
Vale, pues de mi ventana a dos
00:26:24
Entonces ya lo hemos puesto como clase interna
00:26:26
Implementation Listener
00:26:28
El import
00:26:32
Sí, pero precisamente los acordes
00:26:33
O sea, es que
00:26:37
Claro
00:26:37
Vale, pues entonces
00:26:38
¿Qué?
00:26:43
Pero a ver, que tenéis el cuello muy ágil
00:26:50
Vosotras
00:26:52
Tenéis que agradecerme
00:26:52
Las sesiones que os estoy dando
00:26:56
A ver, echa un copia y pega
00:26:57
A ver, clase escucha saludar
00:27:01
Copiáis y pegáis
00:27:06
Pero dejáis sobre la acción performe dentro
00:27:08
¿Vale?
00:27:10
Claro, entonces
00:27:13
El escucha saludar, ¿qué necesitaba?
00:27:14
Necesitaba acceder a texto
00:27:17
A saluda y a despide
00:27:18
Ya está, pues puede acceder directamente
00:27:19
Como es interna, la hemos hecho interna
00:27:22
Puede acceder a todas las propiedades de la clase
00:27:24
tranquilamente, puede acceder a todas ellas
00:27:26
claro, pero es que
00:27:29
no son propiedades de la clase, son locales
00:27:31
a construir interfaz, no pasa nada
00:27:33
vamos a hacerlas como propiedades de la clase
00:27:35
ala
00:27:37
vamos a hacerlas como propiedades
00:27:40
de la clase, no pasa nada
00:27:43
las hago como propiedades del frame
00:27:45
ya son propiedades de la clase
00:27:46
entonces
00:27:48
ahora ya
00:27:50
puede acceder, veis, tranquilamente
00:27:52
a ellas como clase interna
00:27:55
Pues ya está
00:27:56
La clase interna accede a ello
00:28:06
Entonces ahora ya
00:28:08
El objeto lo tengo que crear igualmente
00:28:13
Bueno, el constructor ya le quito todo esto
00:28:16
Claro
00:28:17
Lo sella, ni falta que me hacen
00:28:18
Ni las quiero
00:28:21
Vale
00:28:22
Vale
00:28:24
no, no he hecho nada
00:28:30
os lo he dejado igual, he sacado
00:28:37
los componentes los he sacado
00:28:39
fuera, como variables de clase
00:28:41
están fuera
00:28:43
el constructor, mi ventana, construí
00:28:44
interfaz, ahora ya como los he sacado fuera
00:28:47
ya no los declara dentro, porque ya están
00:28:49
fuera los propiedades de la clase
00:28:51
he instanciado
00:28:52
mi listener
00:28:55
que es una clase interna, no pasa
00:28:56
nada, la instancia igualmente, como veis
00:28:59
no le hace falta que le ponga su nombre
00:29:01
doble, su nombre porque
00:29:03
como la estamos accediendo
00:29:05
desde la propia clase, no hace
00:29:07
falta ponérselo, vale
00:29:09
entonces instanciamos la clase, que es interna
00:29:10
la instanciamos y se la añadimos
00:29:13
y se acabó y ya está
00:29:15
y listo, y ahora ya en la clase interna
00:29:17
pues, un segundo
00:29:21
la clase interna es igual que la que era
00:29:23
pero ya me olvido del paso de parámetros
00:29:25
no hace falta, porque ya accede directamente
00:29:27
a todo lo de la interfaz.
00:29:30
¿Hasta dónde?
00:29:33
Que le estaba pasando,
00:29:38
como era copia y pega la versión anterior,
00:29:41
le estaba pasando cosas al constructor, se lo he quitado.
00:29:43
Nada más.
00:29:46
Claro, porque
00:29:54
este escucha saludar ya no tiene
00:29:55
propiedades ni tiene nada porque ya accede
00:29:57
directamente a las de la clase
00:29:59
que la contiene, que es el frame, esa es la ventaja
00:30:01
de que sea interna
00:30:03
pero
00:30:04
entre hoy
00:30:07
y mañana, aparte de subir
00:30:09
todos los proyectos
00:30:11
al tema, organizados y eso
00:30:13
y las grabaciones, pues
00:30:15
lo tendréis todo esto, lo tendréis todo ahí subido
00:30:16
en cuanto lo hagáis 3 o 4 veces
00:30:31
ya está
00:30:37
ya, pero es que lo de subir y bajar
00:30:37
es relativo
00:30:43
que subo, que bajo
00:30:43
el ratón, la pantalla
00:30:49
Bueno, pues a ver
00:31:09
Vale, de todas maneras
00:31:46
Vais a hacer ahora
00:31:57
Una parecida
00:31:59
Para que a todo el mundo ya le quede claro
00:32:01
Como se colocan las cosas y demás
00:32:03
Antes de pasar a lo siguiente
00:32:04
Claro, a ver
00:32:07
Estamos arrancando un mundo
00:32:09
De posibilidades enormes
00:32:10
Que tenemos que explorar
00:32:13
vale, bueno pues entonces
00:32:14
solo de cara a que todo el mundo esté organizado
00:32:17
situado y sepa construir
00:32:19
lo básico
00:32:21
pues a ver
00:32:21
haced una interfaz vosotros
00:32:24
en la que haya que pedir
00:32:26
pida un nombre
00:32:29
o sea un área de texto para pedir un nombre
00:32:30
se escribe un nombre
00:32:32
y cuando se le dé al enter
00:32:34
pues diga tu nombre
00:32:36
tiene 27 letras
00:32:38
por ejemplo, vale ya está
00:32:40
entonces lo único que os digo es
00:32:42
el componente
00:32:44
para
00:32:47
poner texto
00:32:48
se llama text fill
00:32:50
se llama j text fill
00:32:51
ese es el componente para meter texto
00:32:53
y el evento por defecto del text fill
00:32:55
es darle al enter
00:32:58
cuando estás situado en él y has escrito le das a enter
00:32:59
lo tendrás que
00:33:01
se guarda dentro del objeto text fill
00:33:06
tú sácalo con el método que
00:33:08
text fill
00:33:09
es el objeto que tiene dentro de todo
00:33:12
el texto que tú hayas puesto, su tamaño
00:33:14
tiene un montón
00:33:16
¿lo sacas de él?
00:33:16
igual, si el Jbutton tiene un gettest
00:33:19
¿cómo no va a tener el textfield
00:33:21
un gettest?
00:33:24
claro
00:33:26
¿puedo repetir el enunciado?
00:33:26
sí
00:33:30
enunciado
00:33:30
a ver
00:33:33
¿necesito un ratón?
00:33:35
sí, sí
00:33:37
¿necesito café?
00:33:39
enunciado
00:33:41
Enunciado va a ser la
00:33:42
Segunda GUI
00:33:46
¿Qué quieres que te haga?
00:33:54
Si no
00:33:55
A ver
00:33:55
Efectivamente
00:33:57
Por eso os traigo
00:34:05
Vale
00:34:06
Pues me vais a hacer
00:34:07
A ver voy a hacer aquí una clasecita
00:34:09
solo para poner el texto
00:34:11
lo que me vais a hacer es
00:34:13
esto
00:34:17
aplicación con una
00:34:18
interfaz gráfica
00:34:25
gráfica
00:34:28
no
00:34:29
gráfica, a ver, ¿quién tenía que
00:34:29
fumar?
00:34:33
que permita
00:34:34
introducir
00:34:35
tu nombre
00:34:39
y
00:34:41
Y te indique
00:34:41
Cuántas letras tiene
00:34:46
Área de texto
00:34:51
Metes el nombre, enter
00:34:56
Tu nombre tiene no sé cuántas
00:34:58
Ya está
00:34:59
Y te indica
00:35:01
- 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:22
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 35′ 06″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 680.59 MBytes