20260428 JavaFX_GestionTareas_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:
Vale, pues lo único que nos faltaba de la aplicación esta entonces era, dentro de nuestro controller principal, los otros dos botones.
00:00:01
Teníamos el de añadir tarea, que es el que hicimos ayer, el de añadir tarea, cargando la otra escena y ya está.
00:00:12
Y luego he añadido yo, que es lo que habréis añadido vosotros, los otros dos botones, o sea, dos el save, con estas líneas de aquí.
00:00:19
El primer, el save
00:00:27
Si el botón pulsado es eliminar tarea
00:00:29
Pues hemos sacado la tarea seleccionada
00:00:32
Y la hemos eliminado
00:00:36
Se acabó, ya está
00:00:39
La hemos eliminado de la observable list
00:00:40
Y como la table view se ve arrastrada
00:00:42
Por esa observable list, pues ya está
00:00:45
Y en completar tarea
00:00:47
Hemos sacado la tarea seleccionada
00:00:50
Y la hemos marcado como true
00:00:54
¿Vale? Esto es mi forma cómoda de hacerlo y vosotros habréis recorrido la colección, ¿verdad? Vosotros habréis hecho algo así, imagino, ¿no?
00:00:57
Para cada tarea
00:01:11
T
00:01:14
En
00:01:16
Data.tareas
00:01:17
¿No?
00:01:22
Si t.get
00:01:25
¿No? Para completar la seleccionada
00:01:28
Es igual
00:01:30
A, perdón que tengo dos
00:01:32
Tareas
00:01:34
Dos cosas que se llaman t
00:01:36
Es igual a t.getid
00:01:37
Pues
00:01:42
Tarea.setCompletada
00:01:45
true. ¿Vale? Pues esto es lo que falta
00:01:47
de la aplicación. El else if de aquí
00:01:58
que borraba y el else if de aquí que
00:02:01
marcaba true la tarea seleccionada y ya está. ¿Vale?
00:02:06
Entonces
00:02:11
¿A qué quiero hacer el qué?
00:02:12
¿Pero tú no estabas ayer?
00:02:23
Es la decisión que tomamos
00:02:26
para que los dos controladores
00:02:28
pudieran acceder a la observable list.
00:02:29
Sacarla afuera.
00:02:31
¿Qué observable list?
00:02:34
El controlador de una escena
00:02:38
y el controlador de la otra.
00:02:40
Tenemos dos escenas.
00:02:41
O yo tenía dos escenas.
00:02:42
¿Vale?
00:02:45
Y luego llamaros del controlador.
00:02:57
Pues sí.
00:02:59
lo que pasa es que te habrán quedado
00:03:01
métodos cortísimos, una línea cada uno
00:03:02
claro, lo que pasa es que
00:03:05
claro, que extraer un método
00:03:06
que es solo una línea, para eso haces esa línea
00:03:08
y ya está
00:03:10
o sea que aquí, agregar tarea
00:03:11
es tareas.ad, en realidad
00:03:16
pues te haces tareas.ad
00:03:18
en origen, en lugar de agregar tarea
00:03:21
y ya está, pero bueno, a nivel
00:03:22
semántico, pues está bien, pero bueno
00:03:24
como es o una línea o la otra
00:03:26
vale, pues ya está
00:03:28
habréis añadido esos botones, entonces
00:03:30
esto ya funcionaría
00:03:32
perdonad, pero le he pedido una hoja de estilos
00:03:36
para entretenerme un rato
00:03:41
le he dicho, ¿cuál es la más fea que se te ocurre?
00:03:44
y esa es la más fea que se le ha ocurrido, a mí se me ocurren más feas
00:03:50
¿eh?
00:03:53
añadir tarea, pues esta ya habíamos comprobado que funcionaba
00:03:59
Claro, lo ideal aquí
00:04:02
Esto luego hay que refinarlo
00:04:06
No tengo botón de ir para atrás
00:04:07
Yo voy para atrás cuando voy a agregar tarea
00:04:08
Pero si quiero ir para atrás sin agregar tarea no puedo
00:04:10
Porque no tengo ahí botón
00:04:13
Pero se puede añadir y ya está
00:04:14
La X es la aplicación
00:04:15
La X es el stage
00:04:18
Claro, de hecho ves
00:04:21
La barrita de arriba no tiene ese estilo
00:04:23
Porque no es la escena
00:04:25
El estilo se lo he puesto a la escena solamente
00:04:26
Entonces, 2027
00:04:28
Enero, enero
00:04:31
Vale, tarea agregada
00:04:32
Aquí está la tarea agregada
00:04:34
Al J, option panel, perdón
00:04:35
El alert no tiene el estilo
00:04:38
No sé cómo se pondrá un estilo al alert
00:04:39
Pero será también un set style
00:04:42
Como sea, ya está
00:04:44
Vale
00:04:46
Y ahora, los dos botones que he añadido
00:04:47
Completar tarea
00:04:50
O sea, ahora mismo me sale pendiente
00:04:53
Porque la acabo de agregar
00:04:54
Si le doy a completar tarea
00:04:56
Completar, vale
00:04:57
Y ahora, para eliminarla
00:04:59
Eliminar tarea
00:05:02
Este tabla sin contenido
00:05:03
También se podrá configurar para que no aparezca
00:05:07
El tabla sin contenido
00:05:09
Y se va a ir no hace nada
00:05:10
Porque no hay ninguna tarea seleccionada
00:05:13
Aquí tampoco
00:05:14
Entonces claro
00:05:16
Esto pues bueno la funcionalidad básica
00:05:18
Está pero luego pues si
00:05:21
Efectivamente si yo voy a añadir
00:05:23
Tarea y me arrepiento y quiero ir para atrás
00:05:24
Pues no lo tengo
00:05:26
No tengo en ninguna de las
00:05:27
Opciones
00:05:30
no tengo una confirmación
00:05:32
de si se agregó correctamente
00:05:39
no se agregó, o sea, hay muchas cosas
00:05:40
o bueno, que aquí se
00:05:43
podrían arreglar y hacer mejores
00:05:44
la funcionalidad básica en la de hacer esto era
00:05:46
para ver otro elemento nuevo
00:05:48
el table view, que justo con el list view
00:05:50
que el list view es como si fuera una tabla
00:05:52
pero solamente con una filita de cosas
00:05:54
pues es un elemento típico
00:05:56
tanto para mostrar datos como para seleccionar
00:05:58
y además
00:06:00
veis, me sale error abajo aquí
00:06:02
porque cuando yo pincho
00:06:04
esto de aquí
00:06:07
el alert me saca la tarea seleccionada
00:06:07
y aquí no tengo ninguna
00:06:11
entonces, a ver, el usuario no lo vería
00:06:12
pero a mí en mi log, si tengo log
00:06:14
pues estaría todo eso, eso también
00:06:16
pues se podría depurar
00:06:18
por ejemplo
00:06:20
sí
00:06:37
claro
00:06:38
Para que no esté intentándolo cada vez que tú haces clic
00:06:44
Efectivamente
00:06:47
Para que no lo esté intentando cada vez
00:06:47
Que el clic sea solo para seleccionar
00:06:49
Y el doble clic ahora ya para mostrar
00:06:51
Efectivamente, pues tendría mucho más sentido
00:06:53
Claro
00:06:56
La pena es que no haya un único evento que sea doble clic
00:06:57
No lo hay, ¿verdad?
00:07:00
Porque es que
00:07:02
Tener que contar los clics es un
00:07:03
Pero
00:07:05
Claro, es que es una acción tan típica
00:07:05
Que haya que hacerla por código
00:07:09
Es raro, pero bueno
00:07:11
Vale
00:07:12
No hombre, grave no es
00:07:14
Pero es feo
00:07:20
Aquí
00:07:23
Este error en particular
00:07:25
Si hay una consola de logs
00:07:29
Pues vas a estar ensuciando esa consola todo el rato
00:07:33
Y en este caso como no viene de un
00:07:35
Try catch, este viene de aquí
00:07:37
De cuando hacemos el alert
00:07:38
Viene de este controller
00:07:40
De cuando hacemos mostrar tarea
00:07:44
Aquí abajo
00:07:46
Tarea T
00:07:46
Es un null pointer exception o lo que sea
00:07:50
De aquí, porque ese es null
00:07:54
Entonces aquí lo que habría es
00:07:56
Que hacer esto
00:07:58
Solo si T
00:08:00
Es diferente de null
00:08:01
Entonces aquí esto
00:08:04
Podríamos hacer un cambio
00:08:05
Para que al menos nos salga eso
00:08:07
Si T es diferente de null
00:08:09
Es decir, si hay una tarea seleccionada realmente
00:08:11
O sea, si ese clic es sobre una tarea
00:08:16
Pues entonces haces todo esto
00:08:18
Vamos a ver, si te es diferente de nulo
00:08:22
Entonces, ahora ya
00:08:26
A ver, añadimos una tarea
00:08:29
Y ahora, si yo doy aquí me sale
00:08:43
Pero si doy aquí, en cualquiera de los vacíos
00:08:54
claro, es que este es el problema de que se hagan estas cosas
00:09:09
vacías, que hay que arreglar por código
00:09:11
a cualquiera que dé
00:09:12
claro, el
00:09:14
a ver, añadir
00:09:18
dormir
00:09:20
dormir
00:09:22
pues venga
00:09:25
mucho, también
00:09:27
el 1 de enero
00:09:29
vale
00:09:31
entonces
00:09:33
esto va a ocurrir, aquí no pasa nada
00:09:35
porque no hay ninguna seleccionada
00:09:37
pero claro, desde el momento en que yo he seleccionado una
00:09:38
y esa se queda seleccionada
00:09:41
haga clic donde lo haga
00:09:44
ya me va a salir ahí
00:09:45
porque mi
00:09:46
evento es el
00:09:49
clic sobre la tabla
00:09:51
entonces en cuanto hago clic
00:09:56
sobre la tabla, pues ya de la que
00:09:58
esté seleccionada
00:10:00
entonces
00:10:00
si no hay ninguna
00:10:03
seleccionada, por ejemplo
00:10:05
Si yo añado otra tarea
00:10:07
Y ya la dejo para que
00:10:09
Haga un deselect all
00:10:11
Podría hacer un
00:10:13
Que los
00:10:16
Que después de mostrarlo
00:10:16
Haga un deselect para que
00:10:20
Y entonces ahora ya
00:10:21
No, vale, entonces hay bueno
00:10:23
Un montón de cosas que se podrían
00:10:25
Depurar porque lo hemos hecho a lo cómodo
00:10:27
Hemos capturado el evento, hacer click en la tabla
00:10:29
No nos hemos preocupado de nada más
00:10:32
Hacer click, el que esté seleccionado que salga
00:10:33
Pero ahí ya se podría trabajar
00:10:35
Para que tuviera
00:10:37
Más
00:10:39
A ver, la hoja de estilo cuando cargo
00:10:40
Se la puedo poner a una escena
00:10:48
Simplemente así, la cargo
00:10:50
Como cargo cualquier otro fichero
00:10:52
Igual que cargamos
00:10:54
El fxml exactamente igual
00:10:56
Yo cargo mi hoja de estilos
00:10:59
Y ahora ya se la fijo a la escena con esta
00:11:00
Bueno, porque lo necesita
00:11:05
Claro, porque
00:11:08
Lo conviertes así
00:11:10
En string, no sé qué
00:11:13
Bueno, porque así es como lo entiende
00:11:15
Fxml
00:11:17
No puedo decirte más que eso
00:11:17
¿Vale?
00:11:20
A la clase data
00:11:24
Vale, pues entonces
00:11:27
Fxml
00:11:35
También tiene respecto a swing
00:11:43
la ventaja de que hacer animaciones a las cosas
00:11:46
eso podemos ver un ejemplo el próximo día si queréis
00:11:50
pero también lo podéis trabajar vosotros
00:11:53
por ejemplo cuando nosotros hacemos aquí una escena cualquiera
00:11:56
cuando hacemos una escena
00:12:00
cualquiera
00:12:14
pues aparte de los controles típicos
00:12:16
de las aplicaciones típicas
00:12:23
aparte de los controles
00:12:26
viene aquí una cosa que es 3D
00:12:27
vienen formas
00:12:30
y alguna de estas formas
00:12:34
en realidad son
00:12:40
tridimensionales
00:12:42
por ejemplo, veis aquí hay un
00:12:45
hay una esfera
00:12:46
que la esfera tiene
00:12:54
efecto 3D, o si hay cosas
00:12:57
en general, quiero decir
00:12:59
a las que se le puede dar movimiento
00:13:00
¿cómo se le daría movimiento? con métodos
00:13:02
rotate, no sé qué
00:13:04
entonces, hay muchos elementos
00:13:06
que algunos de los métodos que tienen
00:13:09
aparte de ponerle el color, ponerle lo que sea, son relacionados con su movimiento
00:13:11
¿vale? entonces por ejemplo, para ver un
00:13:15
ejemplito rápido, que lo tengo yo aquí, a ver si lo encuentro rápido
00:13:19
a ver, puede que fuera este, vamos a ver
00:13:23
sí, porque este tenía una caja, pues era este
00:13:52
por ejemplo, ya aquí en este proyecto le puse una cajita, sin más
00:14:02
un elemento caja, que no es un control, es algo pues para ver
00:14:06
Un elemento caja
00:14:10
Y al controller
00:14:12
Lo que le hice es que cuando cargara el controller
00:14:16
Pues estuviera en un hilo
00:14:21
En un bucle infinito
00:14:25
Rotando con el método
00:14:26
Fijar la rotación del cacharro
00:14:30
Por ejemplo, métodos que le dan animación
00:14:33
Y entonces esto me quedaba
00:14:35
Algo como esto
00:14:38
A ver si era esto
00:14:40
Vale, entonces esto es la caja
00:14:46
Y el método que tú le pones
00:14:51
Es el método de rotar
00:14:53
Si tú combinas la rotación
00:14:55
Pues ya está
00:14:56
Pues lo que pasa es que esto era un bucle
00:14:57
Que estaba
00:14:59
Vale
00:15:00
En este código a la caja
00:15:08
Le añadía una
00:15:10
Rotación
00:15:13
Que generaba aquí
00:15:15
Vale
00:15:18
y lo hacía en el método inicial este en particular
00:15:19
para que lo
00:15:22
para que esté haciendo esto todo el rato
00:15:23
vale, entonces más 10
00:15:38
cambiando esto pues
00:15:41
la velocidad
00:15:43
cambia
00:15:45
bueno, no solamente mencionaros eso, vale
00:15:49
que
00:16:17
respecto a swing amplía con meterle
00:16:18
muchos más elementos gráficos
00:16:21
que además parte de los métodos
00:16:23
a los que se puede invocar
00:16:25
tienen que ver con rotaciones y efectos
00:16:27
ya está, nada más
00:16:29
pero nada, unas chorraditas
00:16:30
bueno, pues entonces
00:16:32
- 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:
- 2
- Fecha:
- 29 de abril de 2026 - 10:12
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 16′ 35″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 81.01 MBytes