Clase 06-05-24 - 1 - 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:
Bueno, pues entonces se supone que esto es un editor de texto, es decir, para hacer cosas con ficheros de texto.
00:00:01
Entonces, hay que entender siempre bien la aplicación completa, el contexto de la aplicación antes de plantearse hacer algo.
00:00:11
Hay que entenderla bien, hay que tenerla bien descrita.
00:00:17
Entonces, esta aplicación va a trabajar con ficheros de texto.
00:00:21
ese es
00:00:25
su contenido de trabajo
00:00:28
igual que otro podía ser cliente
00:00:32
otros facturas, este es ficheros de texto
00:00:34
entonces
00:00:36
antes de empezar a trabajar
00:00:38
con datos
00:00:40
y hacer funcionalidades hay que plantearse
00:00:41
dónde van a estar guardados
00:00:45
cómo van a estar guardados esos datos para trabajar con ellos
00:00:46
entonces el diseño
00:00:49
de los datos, la parte de diseño
00:00:50
de los datos tiene muchísima importancia
00:00:52
como os he dicho muchas veces
00:00:54
Con la parte de diseño me refiero a
00:00:55
Dónde y cómo van a estar guardados los datos
00:00:58
Cuando ya lo tengamos claro
00:01:02
Uno ya hace funcionalidades
00:01:03
Que en última instancia
00:01:05
Las funcionalidades de una aplicación
00:01:08
Son siempre coger datos
00:01:09
Hacer tonterías con ellos
00:01:11
Y guardarlos otra vez
00:01:13
O llevarlos de un sitio a otro
00:01:14
Eso es una aplicación en realidad
00:01:17
Coger datos y llevarlos de un lado para otro
00:01:18
Por tanto es importantísimo
00:01:21
Tener clarísimo cuando uno hace una aplicación
00:01:23
esos datos, cuáles son
00:01:25
dónde van a estar almacenados y cómo
00:01:27
lo habitual es una base de datos
00:01:29
pero en nuestro caso ahora no lo es
00:01:31
bueno, pues estos datos de esta aplicación
00:01:32
cuáles son
00:01:35
ficheros de texto, son ficheros de texto
00:01:37
porque es una aplicación que trabaja con ficheros
00:01:40
de texto para visualizarlos
00:01:41
en la pantalla
00:01:44
permitirme cambiar su
00:01:45
contenido
00:01:47
para que tenga otro
00:01:48
contenido
00:01:51
cuando habrá utilidades por ahí
00:01:52
cuando selecciono estas utilidades
00:01:55
pues las mayúsculas
00:01:57
que tenga pasarlas a minúsculas
00:01:59
es decir, con lo que
00:02:01
trabaja esta aplicación son ficheros
00:02:03
de texto, que es sobre
00:02:05
los que hace cosas
00:02:07
una vez que está claro con qué
00:02:08
trabajamos, con qué material trabajamos
00:02:11
¿dónde lo vamos a guardar?
00:02:14
hombre, en una aplicación real
00:02:16
los ficheros de texto se guardarían en el
00:02:17
disco duro, en un fichero con un
00:02:19
nombre. Pero aquí nosotros no podemos tenerlos ahí porque no sabemos todavía cómo coger
00:02:21
datos de un fichero que está en un disco duro. Nosotros solo sabemos trabajar hasta
00:02:29
ahora solo con la información que está en variables. Y esa información que está en
00:02:33
variables se la damos nosotros en el momento en que la aplicación se ejecuta, en el momento
00:02:38
en que se ejecuta y solo en ese momento, se la damos o bien por consola con el escáner
00:02:44
o bien en una interfaz gráfica
00:02:49
donde metemos en áreas de texto
00:02:52
y la interfaz la recoge
00:02:54
¿vale? hasta ahora es nuestra
00:02:55
única manera de tener datos
00:02:58
en variables que rellenamos
00:02:59
en el momento en el que la aplicación arranca
00:03:02
no tenemos
00:03:04
no somos capaces de coger datos de ficheros
00:03:06
luego esta aplicación tenemos
00:03:08
que simular como si nuestros datos
00:03:10
estuvieran en ficheros pero no lo van a estar
00:03:12
bueno pues ¿dónde van a estar?
00:03:14
pues la propuesta que se hace en el ejercicio
00:03:16
es
00:03:18
los ficheros van a estar en un
00:03:19
map, cada fichero recibe
00:03:22
un nombre, eso está claro
00:03:24
cada fichero recibe un nombre
00:03:26
y todos los ficheros de un sistema
00:03:28
operativo tienen que tener nombres distintos
00:03:30
con nombres me refiero
00:03:32
si consideramos como nombre la ruta entera
00:03:34
¿vale? si están en diferentes carpetas
00:03:36
cuando tenemos nombre, pero bueno
00:03:38
bueno, pues entonces el nombre del fichero es la clave
00:03:40
¿vale? pues la clave es el nombre
00:03:42
del fichero, y el contenido del
00:03:44
fichero si es de textos, una cadena de textos
00:03:46
Que se puede meter en un string
00:03:48
Luego estupendo
00:03:50
Nuestros ficheros vamos a simular
00:03:51
Que están en un map
00:03:53
Vale
00:03:56
Entonces cuando la aplicación arranque
00:03:56
Inicialmente no habrá ningún archivo
00:03:59
Pero no pasa nada porque podemos empezar a crearlos
00:04:01
A través de la opción new
00:04:04
De esta de aquí
00:04:05
Entonces ya podemos hacer
00:04:07
Nuestro primer boceto de la aplicación
00:04:09
Que tiene los datos en un map
00:04:11
Nos construimos la interfaz
00:04:14
Y una vez que nos la hemos construido
00:04:16
Pues nos ponemos ya a dar
00:04:18
Funcionalidades
00:04:20
A esto de aquí
00:04:21
¿Vale?
00:04:23
Bueno, pues entonces
00:04:26
Vamos a ir
00:04:28
Haciendo esta aplicación
00:04:35
Vale, pues a ver, entonces
00:04:36
Venga
00:04:56
Aplicación, editor de texto
00:05:03
Por ejemplo, como la queráis llamar
00:05:06
Vale, pues venga
00:05:08
Los datos nuestros
00:05:23
Vamos a hacer
00:05:25
Un paquete aparte
00:05:28
que sea, vamos a llamarlo ficheros
00:05:29
porque ahí es donde van a estar los ficheros
00:05:32
un paquete de ficheros
00:05:33
y ahora, los ficheros van a estar
00:05:36
en un map, ese map tendrá que estar
00:05:38
en alguna clase, pues venga
00:05:39
nos hacemos una clase
00:05:41
que se llame ficheros, por ejemplo
00:05:43
y ahora nuestros datos
00:05:47
nuestros datos, que son
00:05:56
los ficheros, que son el map, pueden ir aquí
00:05:58
por ejemplo
00:06:00
a ver, ala
00:06:01
aquí tenemos, aquí van a ir
00:06:17
nuestros ficheros, inicialmente vacío
00:06:26
¿vale? entonces
00:06:29
para facilitarnos
00:06:30
el acceso a estos datos, como solamente
00:06:32
va a haber un map de ficheros en toda
00:06:34
la aplicación, solo va a haber un map de ficheros
00:06:36
pues vamos
00:06:38
a hacerlo, variable public
00:06:40
y static
00:06:42
pero claro, static porque
00:06:43
solamente va a haber
00:06:46
una colección de ficheros en la aplicación
00:06:48
que es esta, una colección, la que hemos ubicado
00:06:50
aquí, entonces la podemos hacer
00:06:52
static
00:06:54
y al hacerla public
00:06:55
facilitamos el acceso a esta colección
00:06:57
de ficheros con el nombre de la clase
00:06:59
punto ficheros, lo que hemos hecho siempre
00:07:01
vale, pues ya está
00:07:03
aquí están estos datos
00:07:05
luego aquí, según uno vaya haciendo la aplicación
00:07:07
a lo mejor aquí
00:07:10
esto queda más bonito
00:07:11
si vamos haciendo
00:07:13
métodos que me permitan hacer cosas con estos
00:07:15
ficheros, vale
00:07:17
pues por ejemplo
00:07:19
recuperar fichero dado clave
00:07:20
que tendrá dentro un get
00:07:23
pues
00:07:25
cualquier funcionalidad
00:07:26
que vayamos identificando que luego la aplicación
00:07:29
va a hacer, con los ficheros
00:07:31
si la metemos aquí como método
00:07:33
pues luego la aplicación nos va a quedar más bonita
00:07:35
porque ya vamos a ese método y ya está
00:07:37
entonces aquí en principio irían
00:07:39
si luego va surgiendo
00:07:41
irían
00:07:43
métodos para hacer
00:07:44
cosas
00:07:47
con los ficheros del map
00:07:48
que cosas
00:07:51
las que la aplicación vaya necesitando hacer
00:07:54
¿vale? que siempre será mejor
00:07:55
que esté aquí recogido eso
00:07:59
que no que esté en la interfaz gráfica
00:08:01
todo lo que se haga con los ficheros, que esté ahí todo metido
00:08:03
porque entonces está junto
00:08:05
la vista con la lógica
00:08:07
bueno, pues aquí irían esos
00:08:09
métodos que ya veremos a ver si nos va
00:08:13
interesando meter alguno
00:08:14
y ahora vamos a hacer la vista
00:08:16
que la vista ahora ya sí que es
00:08:19
hacer este menú
00:08:20
hacer este menú y luego habrá que darle
00:08:21
el comportamiento, que es darle opciones
00:08:24
a los botones
00:08:26
bueno, vamos a hacernos en el paquete
00:08:27
vista
00:08:30
nuestro frame
00:08:32
pues si lo
00:08:41
hacemos con el builder, por comodidad
00:08:43
pues ya sabemos
00:08:45
como hacerlo
00:08:47
vale, ya vamos a la
00:08:47
ventana, editor, texto
00:08:54
jolín, pues si que está cargando
00:08:56
eso
00:09:27
vale, pues el frame
00:09:28
ya nos ha hecho lo estándar de toda la vida
00:09:51
ya nos ha hecho
00:09:53
lo estándar
00:09:55
crear un panel vacío
00:09:56
y ya está
00:09:59
y dar la opción de que cuando cerremos
00:10:01
el frame, la aplicación cierre
00:10:03
le fija un tamaño, una colocación
00:10:05
inicial al frame, etc
00:10:10
vale, ahora es
00:10:11
cuando tenemos que reproducir
00:10:17
nuestra vista, que es
00:10:19
poner este menú, por ahora sin comportamiento
00:10:20
vale, pues
00:10:22
entonces
00:10:25
estos 5 o 10
00:10:25
minutos de ahora, dedicadlos a ver
00:10:29
si encontráis
00:10:30
cómo construir ese menú ahí
00:10:31
y ahora lo
00:10:34
vale
00:10:37
Miguel, de todas formas si me lo vas
00:10:53
subiendo
00:10:55
el proyecto, para cuando pueda mirarlo
00:10:56
que me decías que no te funcionaba
00:10:59
del este, porque
00:11:00
si lo miro en tu este, voy a ver ahí
00:11:03
200.000 cosas escritas y no voy a saber ni de qué
00:11:05
me estás hablando, entonces aquí me voy a organizar
00:11:07
mejor, ¿vale?
00:11:09
ay, que estaba aquí grabando
00:12:08
repito
00:12:09
vale, pues esto después de uno
00:12:12
buscar, averiguar, mirar por ahí
00:12:14
en documentaciones, en Spacoverflow
00:12:16
donde sea, pues ya
00:12:18
ve que un menú está formado
00:12:19
por tres tipos de
00:12:22
componentes, la
00:12:23
barra de menú, que va asociado
00:12:25
un panel, un panel puede tener
00:12:27
una barra de menú
00:12:29
la barra de menú que es el
00:12:30
JMenuBar, luego a la barra
00:12:33
de menú se pueden anclar
00:12:35
diferentes menús, este
00:12:37
es uno, este es otro, eso
00:12:39
será el JMenu y luego
00:12:41
a cada menú
00:12:43
ahora ya se agregan los diferentes
00:12:45
ítems, que estos ya sí que son
00:12:47
los que recogen el evento
00:12:49
normalmente, entonces tres
00:12:51
componentes, la barra de menú JMenuBar
00:12:53
que se acopla a un panel
00:12:56
a la JMenuBar
00:12:57
van los JMenus
00:12:59
que son estos
00:13:01
y luego a cada JMenu
00:13:02
van los
00:13:03
los ítems
00:13:04
entonces
00:13:07
de hecho
00:13:09
una vez que uno ya
00:13:10
más o menos ha visto
00:13:11
que son tres componentes
00:13:12
los que hacen falta
00:13:14
pues los busca aquí
00:13:14
entonces estos son
00:13:17
ahora
00:13:18
cuando uno
00:13:18
como surgió con lo de
00:13:20
FileChooser y todo
00:13:21
cuando uno se pone a buscar
00:13:22
en la paleta ahí
00:13:24
como loco
00:13:24
a ver, en la paleta que hay
00:13:25
unos cuantos
00:13:27
componentes, contenedores
00:13:29
no está todo, que es lo que está
00:13:31
está la mayor parte de los
00:13:33
componentes y además los que
00:13:35
uno pone ahí y van a estar ahí
00:13:37
todo el tiempo de vida
00:13:39
de
00:13:40
la aplicación, no son
00:13:41
componentes pensados para que
00:13:45
aparezcan o desaparezcan como resultado
00:13:47
de eventos, como el jOptionPane
00:13:49
como el FileChooser, por eso no los ponemos
00:13:51
desde aquí, esos son los
00:13:53
instanciamos a consecuencia de la captura
00:13:55
de un evento, entonces este menú
00:13:57
si que va a estar ahí todo el rato, entonces tiene sentido
00:13:59
que lo busquemos en la paleta
00:14:01
pues de hecho vemos que hay una carpetita
00:14:03
que pone menú donde ya está directamente
00:14:05
todos los elementos relacionados con el menú
00:14:07
entonces viene un JMenuBar
00:14:09
que uno puede
00:14:11
cogerlo y arrastrarlo, yo es que ya
00:14:13
tengo un agregado
00:14:15
lo arrastra al panel, se le pone la
00:14:16
rayita y ahí ya
00:14:19
tiene el menú bar arrastrado, luego
00:14:21
al menu bar puede ir arrastrándolo
00:14:23
por ejemplo yo ya tengo dos
00:14:25
pero podría poner otro más
00:14:27
ahí ya tengo otro
00:14:28
que quiero otro elemento de menú más
00:14:30
pues ahí tengo otro
00:14:32
una vez que los tengo, claro, los selecciono
00:14:33
para cambiar aquí las propiedades
00:14:37
que en este caso
00:14:39
son el nombre de la variable
00:14:41
deseable, si se lo cambio
00:14:43
y sobre todo el texto que hay encima
00:14:44
eso lo cambiamos aquí en properties
00:14:46
ahí el nombre de la variable
00:14:49
y aquí en text
00:14:51
el texto que queremos que aparezca
00:14:53
vale, a cada menú
00:14:55
ahora ya le quiero añadir ítems
00:14:57
pues jMenuItems, lo voy a
00:14:59
este ya tiene uno, que quiero que tenga
00:15:01
que quiero que tenga otro más
00:15:03
ya tiene otro
00:15:06
jolín, que estoy haciendo, ahí
00:15:08
vale
00:15:10
a cada ítem de menú de nuevo
00:15:12
pues lo natural es que
00:15:15
yo en las propiedades le cambie el nombre
00:15:17
de la variable y el nombre del texto
00:15:19
que está encima, que está en text
00:15:21
y ya está, y así puedo ir formando
00:15:22
un menú, vale, voy a quitar
00:15:25
estos
00:15:27
que he hecho nuevos
00:15:29
y este de aquí
00:15:30
entonces, en la estructura
00:15:39
esta jerárquica
00:15:44
de la izquierda, donde nos aparece la jerarquía
00:15:45
de componentes que tenemos
00:15:49
que esta no la perdamos de vista porque es
00:15:50
la mejor foto de lo que tenemos
00:15:52
pues se ve todo claro
00:15:54
tenemos el frame
00:15:56
la barra de menú
00:15:58
de la barra de menú
00:15:59
cuelga el menú archivo
00:16:02
estos son los nombres que yo le he ido dando a las variables
00:16:03
y al texto
00:16:06
menú archivo
00:16:06
de menú archivo cuelgan 5
00:16:09
ítems
00:16:11
los nombres de variables que yo le he dado son estos
00:16:12
pero podéis darle que os dé la gana
00:16:15
ahora de la barra de menú
00:16:16
también cuelga menú de utilidades
00:16:19
con 4 ítems
00:16:21
vale entonces
00:16:23
aquí
00:16:25
se ve todo lo que hemos colocado
00:16:26
entonces si yo miro a ver
00:16:31
qué aspecto tiene, pues bueno, vale justo
00:16:34
es el menú que quería
00:16:36
archivo con cuatro opciones
00:16:37
y utilidades
00:16:40
con otras cuatro
00:16:42
¿vale? entonces la vista está
00:16:44
ah bueno, no, a ver, la vista
00:16:50
no está porque me falta el área de texto
00:16:53
para visualizar los archivos
00:16:55
claro, el área de texto
00:16:57
está en la vista, casi está
00:16:59
vale
00:17:02
¿qué nos falta?
00:17:04
nos falta este panel
00:17:05
este área de texto en blanco
00:17:08
que es el área de visualización de los archivos
00:17:13
entonces el área de visualización
00:17:15
de los archivos
00:17:17
un textfield no tiene sentido que sea
00:17:18
porque un textfield es solo para una línea
00:17:20
de contenido, para una línea
00:17:22
no admite saltos de línea
00:17:24
entonces para un contenido con saltos de línea
00:17:25
tiene que ser un textarea
00:17:29
entonces eso es lo que nos falta
00:17:30
un textarea y ya está
00:17:32
nuestro editor de texto tiene todos los elementos
00:17:34
que necesita
00:17:36
Pues le vamos a poner un text area
00:17:37
Al panel
00:17:41
Bueno, al panel le voy a poner el
00:17:41
El layout
00:17:50
Absoluto, que no se lo había puesto todavía
00:17:51
Así que por eso no me deja
00:17:54
Colocar el área de texto donde a mi me dé la gana
00:17:56
Así que a ver
00:17:58
Que no quiero
00:18:01
A ver
00:18:02
Vale, vamos a poner el panel
00:18:07
Que no se nos olvide, absoluto
00:18:10
Y ahora aquí ya está el panel
00:18:12
con el layout absoluto, vamos a llevar
00:18:15
un área de texto
00:18:17
muy grandota
00:18:18
ahí, por ejemplo
00:18:20
ala, ahí van a ir
00:18:26
los archivos, en esa área de texto blanca
00:18:36
apenas se distingue del fondo
00:18:38
si le pusiéramos poner al panel
00:18:42
a ver
00:18:44
es que nunca
00:18:48
nunca acierto en la
00:19:13
En la variable hay que cambiar
00:19:15
Para cambiar el color del panel
00:19:18
Porque el foreground no
00:19:20
A ver, background, ¿será este?
00:19:23
¿O no?
00:19:30
Ah, sí, vale
00:19:37
Vale, así se ve un poco más el
00:19:38
El
00:19:44
Este, entonces
00:19:47
Bueno, pues nada
00:19:52
La vista ya está
00:19:57
Ahora ya hay que dar funcionalidad
00:19:58
A los componentes que la tengan
00:20:01
En este caso
00:20:03
¿Qué componentes van a tener funcionalidad?
00:20:05
Estos 5 de archivo
00:20:09
Y estos 4 de utilidades
00:20:11
Vamos a ver el diseño de fuente
00:20:12
Cómo nos ha generado
00:20:16
El código fuente
00:20:18
Para estos componentes que hemos añadido
00:20:20
Silencio
00:20:22
Eso es de atrás
00:20:24
Vale, pues efectivamente nos ha creado
00:20:24
Una barra de menú
00:20:28
Y al frame le ha puesto
00:20:29
La barra de menú
00:20:32
Esto es como si fuera un disk
00:20:33
Como ya sabéis, si no aparece nada es que es un dis
00:20:34
¿Vale? Es que antes, perdonad, antes
00:20:36
Estaba diciendo panel cuando quería decir frame
00:20:38
O sea, la barra de menú va a un frame
00:20:40
¿Veis? Al frame, que es a este
00:20:42
Va a la barra de menú
00:20:44
¿Vale?
00:20:46
Vale, tenemos la barra de menú
00:20:48
Ahora, a la barra de menú se le va añadiendo
00:20:49
Cada uno de los menús que hemos hecho
00:20:51
El archivo, el nuevo
00:20:54
El abrir, el guardar
00:20:56
Como y el cerrar
00:20:58
¿Veis?
00:21:00
A la barra de menú le añade el menú archivo
00:21:04
Y al menú archivo
00:21:06
Que es este, le va añadiendo
00:21:08
Cada uno de los ítems
00:21:10
Eso es lo que nos ha generado, es fácil de entender
00:21:11
¿Vale? Y aquí lo mismo
00:21:14
Este es menú utilidades, que se lo ha puesto
00:21:20
A la barra de menús
00:21:22
Y ahora a menú utilidades le va añadiendo
00:21:23
Cada uno de ellos, de los ítems
00:21:26
Cada uno de los ítems
00:21:27
Y ya está, y luego ya le ha puesto
00:21:28
El colorcito al panel
00:21:31
Que la de foreground esta no valía para nada, creo
00:21:33
Vale
00:21:36
Era la de background la que lo daba
00:21:38
Esta
00:21:40
Y ya está, no he hecho nada más
00:21:40
Bueno, pues entonces, los elementos que reciben eventos
00:21:44
Son estos, son
00:21:46
Cada uno de los ítems
00:21:48
Cada uno de los ítems
00:21:52
Son
00:21:54
Estos de aquí
00:21:54
Archivo 1, archivo 2, archivo 3
00:21:57
Entonces
00:22:01
Podemos
00:22:02
Ir un poco a lo vago
00:22:03
y desde aquí
00:22:05
a cada uno de estos
00:22:09
hacerle un add event handler
00:22:13
y un action performed y ya está
00:22:16
a cada uno de ellos y ya hacemos en cada uno de ellos lo que toque
00:22:18
o podríamos hacer
00:22:22
una única clase interna y que esa clase
00:22:25
interna como tenemos un montón distinga
00:22:28
cual de ellos es el que ha
00:22:31
el que ha llamado a
00:22:34
Al evento
00:22:37
¿Vale?
00:22:39
Lo podríais hacer un poco como quisierais
00:22:41
Si fuera una unidad de clase interna, pues quedaría muy larga
00:22:42
Porque tendría ahí un switch case muy enorme
00:22:45
En el caso de que el botoncito
00:22:47
Que se activó
00:22:49
Fuera igual al ítem nuevo
00:22:51
Bla, bla, bla
00:22:53
En el caso de que fuera igual al ítem en abril, bla, bla, bla
00:22:53
¿Vale?
00:22:56
A mí casi me gusta más así
00:23:04
Y de hecho
00:23:08
pero no es que tenga
00:23:10
un criterio muy definido porque
00:23:13
efectos prácticos es lo mismo en realidad
00:23:14
efectos de computacionales
00:23:16
es igual, es como te guste a ti más el código
00:23:19
entonces
00:23:21
normalmente con el plugin del builder
00:23:22
te permite generarlo fácilmente, de la otra manera
00:23:24
uno lo hace así y no se lo plantea
00:23:27
pero para variar, para no hacerlo
00:23:28
siempre como te lo hace el builder, vamos a hacerlo
00:23:31
nosotros con una única clase interna
00:23:33
recogiendo cada botón, pero no porque
00:23:34
yo diga si es mejor, porque tampoco es que
00:23:37
tenga un criterio definido porque depende muchas veces
00:23:39
de el tipo de software que estés haciendo
00:23:41
con quien estés trabajando, etc.
00:23:43
¿Vale? Entonces repito
00:23:46
¿Qué alternativas tendría uno? Pues a cada
00:23:47
uno de ellos le hace esto y le dice
00:23:49
venga, añádeme un gestor de
00:23:51
¿Cómo es el evento por defecto?
00:23:52
De un ítem de menú
00:23:55
podemos dar por hecho que el evento por
00:23:56
defecto de un ítem de menú es hacer click
00:23:59
Entonces aquí con
00:24:00
seleccionar la acción performance, ese sería
00:24:02
el que estamos buscando, porque
00:24:05
el ActionPerformance es el evento por defecto
00:24:06
y en un ítem de menú
00:24:09
cuál va a ser por defecto, sino el de
00:24:11
hacer clic, entonces si fuéramos
00:24:13
vagos, pues eso, vamos uno por uno
00:24:15
haríamos esto
00:24:16
y ya está, y este efectivamente
00:24:20
cuando ha creado el menú de ítem
00:24:22
archivo 1, en ese me hace la clase interna
00:24:24
entonces si lo hacemos con el
00:24:26
Builder, esto
00:24:28
me lo va a hacer para todos
00:24:30
archivo 1, archivo 2, archivo 3
00:24:32
entonces bueno, está bien
00:24:34
o mal, a mí es que se me hace un poco pesado
00:24:36
ver tantas clases anónimas
00:24:38
dentro del constructor
00:24:40
una por cada archivo 1
00:24:41
ahora otra para archivo 2, otra para archivo 3
00:24:44
entonces vamos a hacer una única clase interna
00:24:46
aparte, que distinga
00:24:48
quien llamó al evento
00:24:50
y en función de eso haga unas cosas
00:24:52
o haga otras, vale
00:24:54
entonces vamos a deshacer esto
00:24:55
que ha hecho él, esto fuera
00:24:58
el AddActionListener
00:25:00
lo deshacemos
00:25:02
lo dejamos como estaba, que estaba así
00:25:03
y ahora vamos a hacernos una clase
00:25:08
interna que
00:25:11
para gestionar los
00:25:13
eventos, captura
00:25:15
menú, para todos los eventos del menú
00:25:23
vale, esta si
00:25:25
tiene que ser capaz de estar a la espera
00:25:28
de que salte un evento de interfaz
00:25:30
pues
00:25:33
tiene que implementar un listener
00:25:34
y si en particular el evento
00:25:36
que va a capturar es el por defecto
00:25:38
pues el listener que tiene que implementar es el action
00:25:40
vale, entonces
00:25:42
se implementa la ActionListener
00:25:44
pues entonces tenemos que
00:25:45
añadir los métodos que
00:25:48
ActionListener incluye vacíos
00:25:50
este
00:25:52
bueno, pues aquí, ¿qué hay que hacer?
00:25:52
depende
00:25:57
depende de este evento
00:25:58
de donde vino, si vino de nuevo
00:26:00
si vino de abrir, si vino de cerrar, etc
00:26:02
etc, sabemos que en cualquier
00:26:04
caso vino de un JMenuItem
00:26:06
seguro, entonces
00:26:08
vamos a cogerlo, vamos a decir
00:26:10
venga
00:26:11
Vamos a coger el ítem de menú
00:26:13
Que lanzó el evento
00:26:19
¿Y cómo lo vamos a coger?
00:26:21
Pues de .getSource
00:26:23
Este es el componente que lanzó el evento
00:26:25
Este es el componente, nos lo da en modo object
00:26:28
Pero sabemos que va a ser
00:26:30
Un jMenuItem fijo
00:26:32
Pues venga, le hacemos el casting
00:26:33
Este es el ítem
00:26:40
De menú
00:26:42
Que hizo que se lanzara
00:26:43
Este método
00:26:47
Este es, porque está recogido aquí
00:26:48
en este objeto, está recogido aquí
00:26:51
ahora ya
00:26:52
sí que podemos ya
00:26:54
empezar a distinguir
00:26:56
si el ítem este
00:26:58
vamos a
00:27:03
resulta
00:27:06
que es igual a
00:27:08
archivo 1, aquí por eso
00:27:11
es importante haber cambiado el nombre de las variables
00:27:14
porque si no, uno se vuelve loco
00:27:16
y yo los he cambiado, a cada ítem de menú
00:27:17
los he llamado archivo 1, archivo 2, archivo 3
00:27:20
archivo 4, archivo 5 y a los de utilidades
00:27:22
útil 1, útil 2, útil 3, útil 4
00:27:23
los he llamado así para no liarme
00:27:26
cada ítem
00:27:31
del menú archivo los he llamado así
00:27:33
este, este, este
00:27:35
y cada ítem del menú utilidades
00:27:35
los he llamado útil 1, útil 2, útil 3, útil 4
00:27:39
bueno pues entonces
00:27:41
en el caso de que sea este
00:27:44
archivo 1
00:27:46
este será
00:27:48
cuando le hayamos dado a la opción
00:27:49
nuevo, será este
00:27:54
la opción
00:27:58
9 y así tenemos todos
00:28:00
los demás
00:28:06
si tenéis igual
00:28:07
archivo 2
00:28:10
o unos cuantos y luego cambio
00:28:11
entonces será archivo 1, archivo 2
00:28:25
archivo 3
00:28:28
archivo 4
00:28:29
y archivo 5
00:28:31
porque de archivo tenía 5 y ahora útil
00:28:33
útil 1
00:28:35
efectivamente, ahora si voy a hacer
00:28:36
la pregunta de por qué me lo pone en rojo
00:28:49
efectivamente, te has adelantado
00:28:51
claro
00:28:53
vale, efectivamente, esta sería la estructura
00:28:55
si el ítem ha sido archivo 1, opción nuevos
00:28:59
ha sido archivo 2, opción abrir, etc
00:29:02
y aquí tendría que poner lo que quiero que se haga
00:29:04
en cada opción, pero efectivamente me está diciendo
00:29:08
uy, no conozco archivo 1, no reconozco archivo 2, no lo reconozco
00:29:10
claro, esto rápidamente ya
00:29:14
no nos volvemos a decir, claro, ¿cómo lo vas a reconocer?
00:29:16
son variables locales al constructor
00:29:20
y la clase interna
00:29:22
está fuera del constructor
00:29:24
dentro de la clase pero fuera del constructor
00:29:25
con lo cual no tiene visibilidad
00:29:27
de esas variables, no las tiene
00:29:30
¿qué solución adoptamos ahí?
00:29:33
pues lógicamente subir esas variables
00:29:36
esos ítems de variables
00:29:38
de constructor, variables locales
00:29:40
del método a variables de clase
00:29:42
¿lo hago a mano en el código?
00:29:43
sí, lo puedo hacer a mano en el código
00:29:45
pero si no ya sabéis que tenemos una forma más cómoda
00:29:47
y más rápida de hacerlo
00:29:49
Que es esta
00:29:50
Me voy al componente que quiero yo subir
00:29:54
Me voy aquí y digo
00:29:56
Oye, súbeme a campo
00:29:57
De variable local a campo
00:29:59
Y así voy uno por uno
00:30:01
A la subida a campo
00:30:02
Me voy a la siguiente
00:30:03
También
00:30:04
Súbela
00:30:05
Siguiente
00:30:06
Para afuera
00:30:08
Siguiente para afuera
00:30:11
Y siguiente
00:30:14
Para arriba
00:30:16
Y con esta es lo mismo
00:30:18
Tamaño para afuera
00:30:20
Esta
00:30:25
Para afuera
00:30:27
Esta para afuera
00:30:29
Y esta para afuera
00:30:33
Vale, entonces esos errores
00:30:37
De compilación
00:30:39
Deberían haber desaparecido
00:30:41
Y efectivamente han desaparecido
00:30:43
Vale
00:30:46
Y ahora ya
00:30:47
Ahora ya sí que es cuando
00:30:49
Ya toca programar
00:30:50
Ahora ya toca decir, venga
00:30:52
Para la opción nuevo
00:30:54
¿Qué tenemos que hacer aquí?
00:30:56
Opción nuevo
00:30:59
Pues tenemos que crear un archivo
00:31:00
Con el nombre que me digan
00:31:03
Crearlo inicialmente vacío
00:31:06
Sin nada
00:31:08
Y ya está creado vacío con su nombre
00:31:09
Luego aquí lo que habrá que hacer
00:31:12
Será meter en el map
00:31:14
Un archivo con el nombre que me digan
00:31:15
Luego la clave será el nombre que me digan
00:31:18
Y el contenido en ese momento vacío
00:31:19
Un string vacío
00:31:21
Eso es lo que habrá que meter
00:31:22
meter en el map un archivo con ese nombre
00:31:24
pero claro, habrá que solicitar el nombre del archivo
00:31:27
nuevo
00:31:29
¿qué nombre de archivo desea?
00:31:30
para eso la aplicación dice
00:31:33
que cuando tenga que pedir datos
00:31:35
cuando tenga que pedirlos
00:31:36
los pida siempre con ventanitas emergentes
00:31:38
de estas, entonces habrá que seleccionar
00:31:40
un jOptionPanel
00:31:43
de los que permite meter
00:31:44
información, porque el jOptionPanel
00:31:46
te ofrece muchas
00:31:49
diferentes emergentes, de las que
00:31:50
solo te muestran un mensaje, a las que te permiten
00:31:52
meter datos, pues habrá que
00:31:55
seleccionar una opción pane de estas
00:31:56
coge el nombre de archivo
00:31:59
y con ese nombre de archivo
00:32:00
¿vale? entonces
00:32:01
opción nuevo, pues habrá que
00:32:04
solicitar nombre para nuevo archivo
00:32:06
¿cómo hemos dicho que lo solicitamos?
00:32:09
con el jOptionPane
00:32:21
pues venga, vamos a buscar
00:32:22
que jOptionPane
00:32:24
tiene pinta de devolverme a mi
00:32:26
un string de respuesta
00:32:29
pena no, pena no, damos
00:32:30
nosotros, a ver
00:32:33
J
00:32:34
opción pane, pues venga
00:32:37
vale, vamos a llamar cuadro
00:32:38
porque es el cuadrito que sale
00:32:43
uy, que tonta, perdón, estoy haciendo
00:32:45
el idiota, vale, vamos a ver
00:32:47
que, que opciones
00:32:49
nos da
00:32:57
a ver si nos gusta alguna de las que nos da
00:32:57
pues nos da, vamos a ver
00:33:00
nos vamos a todos los show
00:33:04
nos da uno de confirmación
00:33:06
que me devuelve
00:33:08
ah, pues hay uno
00:33:10
que nos devuelve
00:33:11
como valor de retorno un string
00:33:13
pues tiene toda la pinta de que este es el que queremos
00:33:15
porque este nos muestra una ventana de diálogo
00:33:17
como todas las demás
00:33:20
pero nos devuelve un string como valor de retorno
00:33:21
pues tiene pinta que entonces
00:33:24
ese es el que queremos
00:33:25
y que el string que nosotros metamos
00:33:27
ahí es el que nos va a devolver
00:33:29
tiene toda la pinta de que es este
00:33:31
y el mensaje de aquí pues tiene toda la pinta
00:33:33
de que el mensaje de aquí
00:33:36
es el mensajito de queremos que se ponga en el option pane
00:33:37
como veis
00:33:40
hay varias variantes de show input dialog
00:33:41
porque es más personalizable
00:33:43
vamos a coger la más sencilla
00:33:45
que es esta
00:33:47
a ver que nos sale
00:33:48
y ya
00:33:50
vale, vamos a ponerle aquí
00:33:52
introduzca
00:33:59
nombre archivo
00:34:06
y ahora
00:34:08
ese nombre de archivo
00:34:13
no lo devuelve, valor de retorno aquí
00:34:15
vale, entonces uno
00:34:17
¿qué haría?
00:34:24
Pues comprobaría
00:34:25
Vamos a ver si realmente esto funciona como yo quiero
00:34:27
Vamos a mostrarlo por la consola
00:34:30
La consola ahora mismo
00:34:31
En tiempo de desarrollo la usamos como comprobaciones
00:34:33
Voy a mostrar a ver si
00:34:35
Realmente me ha guardado en esta variable
00:34:37
De retorno nombre lo que yo le haya metido
00:34:40
Entonces si yo
00:34:42
Vamos a ver
00:34:44
Voy a probar yo esta aplicación rápida
00:34:45
A ver si en el menú nuevo me sale el jOptionPane
00:34:47
Pues no me sale el jOptionPane
00:34:53
¿Por qué será que no me sale el jOptionPane?
00:34:57
Porque no se lo ha añadido al ítem.
00:35:05
Le he creado la clase interna,
00:35:07
pero luego no le he añadido el listener.
00:35:08
Error típico que uno lo hace aquí y se le olvida.
00:35:10
Pues venga, vámonos a archivo 1.
00:35:13
A este vamos a archivo 1.
00:35:17
Punto addActionListener.
00:35:21
Como vamos a añadir a todos el mismo actionListener,
00:35:24
vamos a crear aquí un objeto capturaMenu.
00:35:27
Y ese es el que le vamos a añadir a todos los ítems.
00:35:30
Ahora, captura.
00:35:43
ala, el menú nuevo ya tiene
00:35:45
un capturador asociado
00:35:50
vamos a ver si ahora ya nos
00:35:51
saca el archivo
00:35:53
nuevo, sí
00:35:56
vamos a meterle un nombrecito
00:35:57
y
00:35:59
efectivamente
00:36:01
lo recoge con
00:36:03
order return, vale, pues estupendo
00:36:05
entonces ahora, claro, no hemos terminado
00:36:12
lo de capturar nuevo, porque ahora lo que tendremos es
00:36:14
que crear un archivo nuevo vacío y meterlo
00:36:16
en la estructura de archivos
00:36:18
vale
00:36:20
si le damos a cancelar
00:36:22
no devuelve nada, claro
00:36:24
devuelve null, no le hemos metido nada
00:36:25
venga, vamos a parar aquí
00:36:27
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 22
- Fecha:
- 6 de mayo de 2024 - 19:40
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 36′ 32″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 167.12 MBytes