20260407 JavaFX_intro - 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 ni pizarra ni nada
00:00:00
pero luego es un pollo
00:00:02
bueno, pues
00:00:03
nosotros hasta el año pasado
00:00:05
dábamos
00:00:08
swing
00:00:10
¿vale?
00:00:13
swing
00:00:19
a ver, las interfaces gráficas en Java
00:00:19
tradicionalmente
00:00:28
se han hecho usando
00:00:30
el paquete swing
00:00:32
¿vale?
00:00:33
que en realidad
00:00:36
se sigue usando
00:00:38
en realidad se sigue usando
00:00:39
porque tú puedes hacer cualquier cosa en Swing
00:00:41
¿vale? y hay
00:00:43
alumnos que hasta no hace mucho
00:00:45
incluso ahora supongo
00:00:47
pues parte de lo que tenían que hacer en la empresa
00:00:49
pues era ampliar
00:00:51
modificar, hacer una aplicación que estaba
00:00:53
hecha en Swing ¿vale?
00:00:55
es un paquete que en realidad pues sigue
00:00:57
estando ahí, son muchos paquetes
00:00:59
¿vale?
00:01:01
entonces, ¿en qué se basa la construcción?
00:01:03
a ver
00:01:06
si hay ese ruido de fondo todo el rato es imposible
00:01:07
hablar sin perder el hilo
00:01:09
al final se dicen tonterías
00:01:11
¿vale? entonces
00:01:13
¿en qué se basa la construcción
00:01:15
de interfaces gráficas en swing?
00:01:17
bueno, pues tenemos unas librerías
00:01:20
estas librerías, ya sabéis que son
00:01:21
en realidad
00:01:25
ficheros.jar con un montón de
00:01:26
clases dentro
00:01:29
y estas librerías
00:01:30
¿qué nos ofrecen?
00:01:34
pues nos ofrecen afortunadamente cosas que ya están hechas
00:01:35
para que yo las instancie en mi aplicación
00:01:38
y las deje pegaditas
00:01:43
por ejemplo, ¿qué me ofrece?
00:01:44
¿cuál es la clase básica de Swing?
00:01:47
pues la clase JFrame
00:01:50
¿qué es el JFrame?
00:01:52
el JFrame es esta ventanita de toda la vida
00:01:55
la que tiene los estos de minimizar, de no sé qué y de cerrar
00:01:58
esto es un JFrame
00:02:02
esto ya está hecho
00:02:05
claro, en la clase JFrame
00:02:07
no tenemos que hacerlo, si tuviéramos que
00:02:09
programar una interfaz gráfica desde cero sería una locura
00:02:11
¿vale?
00:02:13
pero podemos hacerlo todo
00:02:15
claro
00:02:17
pero ya hay un montonazo de clases hechas
00:02:17
en los paquetes de swing
00:02:21
pues por ejemplo, entre ellos
00:02:22
la clase JFrame
00:02:24
este es el marco básico
00:02:26
la raíz básica, el punto de partida
00:02:28
básico de una aplicación
00:02:31
hecha con swing
00:02:33
entonces nosotros que hacemos
00:02:34
nosotros que hacemos con swing
00:02:36
pues hacemos nuestra propia
00:02:39
clase
00:02:41
que herede de jframe
00:02:42
entonces al heredar de jframe
00:02:44
pues nuestra aplicación, la que sea
00:02:49
al heredar de jframe
00:02:51
ya nuestra aplicación ya tiene
00:02:53
esto, que es el
00:02:55
marco de partida, ya tiene esto
00:02:57
y a nosotros que hacemos
00:02:59
Le añadimos a esto que ha heredado de JFrame
00:03:00
Le añadimos ya lo que queramos
00:03:04
Pues un panel con botones
00:03:06
Otro panel por aquí con una de esta
00:03:08
Una no sé qué de texto para no sé cuántos
00:03:12
Un desplegable, un menú
00:03:15
Le añadimos lo que nos dé la gana
00:03:17
Y esto que le añadimos
00:03:19
Afortunadamente también está hecho
00:03:21
¿Esto es un botón?
00:03:23
Pues sí, yo tengo dentro de este paquete mío Swing
00:03:25
tengo mi clase
00:03:28
JButton que es ya un botoncito
00:03:32
entero ya hecho
00:03:34
lo único que tenemos que hacer es instanciarlo
00:03:35
y ponerlo
00:03:38
como propiedad dentro de mi app
00:03:40
es decir, mi aplicación
00:03:43
amplía, extiende
00:03:46
hereda de JFrame, la amplía
00:03:48
poniéndole cosas
00:03:50
que la caracterizan
00:03:52
¿y qué es lo que caracteriza una clase?
00:03:53
sus propiedades, pues pueden ser
00:03:56
estos componentes que yo meto
00:03:58
¿vale? eso esencialmente
00:04:00
es como se construye una aplicación en Swing
00:04:02
heredamos de un JFrame
00:04:04
y le metemos
00:04:06
como propiedades ya que lo caracterizan
00:04:08
a él de forma ya propia
00:04:10
le metemos como
00:04:12
propiedades los componentes que a mí me den la gana
00:04:14
eso en resumen
00:04:16
esos componentes son clases que ya están
00:04:17
hechas afortunadamente, no podemos construir
00:04:20
un botón desde cero, un área de texto
00:04:22
desde cero, ¿vale? no podemos
00:04:24
en el momento
00:04:26
luego ya, esto luego tiene
00:04:28
pues lógicamente matices
00:04:30
aparte de añadir el botón
00:04:31
por ejemplo como propiedad
00:04:34
de mi clase aplicación
00:04:36
como propiedad de mi clase aplicación
00:04:38
que lo caracteriza de forma única
00:04:40
pues luego ya tendré que ir a los métodos
00:04:41
de esta clase botón para decidir
00:04:44
donde se coloca dentro del frame
00:04:46
luego ahí hay cosas de aprender a utilizar
00:04:48
los métodos sin más
00:04:50
para colocar las cosas
00:04:51
entonces con eso uno construye
00:04:53
su interfaz gráfica
00:04:57
pero claro, aquí ya sí que aparece algo
00:04:59
que ya sí que es
00:05:02
completamente distinto
00:05:04
a todo lo que hemos visto hasta ahora
00:05:05
que ya sí que es novedoso
00:05:07
y es que aquí hemos construido
00:05:09
nuestra interfaz gráfica programando
00:05:11
como sabemos hacer, haciendo nuestra clase
00:05:13
heredando, poniéndole
00:05:16
propiedades que en este caso
00:05:17
serán componentes que lo particularizan
00:05:19
¿vale? cosas que sabemos
00:05:22
hacer
00:05:24
cambiar las características
00:05:24
de estos objetos
00:05:28
que a su vez tienen sus propias propiedades
00:05:30
como color, todo eso ya lo sabemos hacer
00:05:32
¿vale? pero ¿qué conseguimos
00:05:34
con eso? pues plantar ahí
00:05:36
nuestra ventanita con un montón
00:05:38
de cosas
00:05:40
y ya está, y así nos hemos quedado, eso no vale para nada
00:05:41
lógicamente, una ventana y un montón de cosas
00:05:44
¿dónde está ahí la comunicación
00:05:46
con el usuario?
00:05:48
pues la comunicación con el usuario está
00:05:50
que ahora mi aplicación
00:05:51
arranca, yo la arranco
00:05:54
arrancar la aplicación implica
00:05:56
que todo esto se construye
00:05:58
y se queda ahí construido
00:05:59
pero se queda ahí parado
00:06:00
y ahora ya la aplicación está como ahí parada
00:06:03
está como
00:06:06
no es una aplicación que yo la arranco
00:06:07
se construye esto y se termina
00:06:09
yo la arranco y se queda ahí
00:06:10
mi hilo de ejecución
00:06:14
se queda ahí parado
00:06:15
esperando una cosa que se llama
00:06:16
eventos
00:06:20
y los eventos
00:06:21
es lo que el usuario hace desde fuera
00:06:25
de forma completamente asíncrona cuando le dé la gana
00:06:28
un evento es hacer clic en este botón con el ratón
00:06:31
por ejemplo, otro evento puede ser
00:06:34
escribir en esta área de texto, eventos hay un montón
00:06:37
otro evento puede ser redimensionar
00:06:40
un panel que tengo yo aquí, todos esos son eventos
00:06:43
que vienen de forma asíncrona y
00:06:46
hasta ahora no hemos hecho nada parecido a esto
00:06:50
lo único que hemos hecho parecido a esto es
00:06:53
la sentencia real
00:06:56
de la consola, la única
00:06:57
¿qué hacía la sentencia real?
00:06:59
el next in
00:07:02
perdón, por ejemplo
00:07:03
o el next line, o sea las sentencias del escáner
00:07:05
con las que leíamos del teclado
00:07:08
¿qué hacía? pues
00:07:09
el
00:07:11
el hilo de ejecución
00:07:12
se quedaba ahí parado
00:07:15
ahí parado
00:07:16
a la espera de que
00:07:17
alguien escribiera algo
00:07:20
en el teclado, y ese era el único evento
00:07:22
posible
00:07:24
escribir algo en el teclado
00:07:25
ese era el único evento posible
00:07:27
entonces cuando eso ocurría
00:07:29
el hilo ya despertaba
00:07:31
cogía lo que había en el teclado y hacía cosas
00:07:33
eso era lo más parecido a esto que hemos hecho
00:07:35
aquí lo que pasa es que hay un montón
00:07:37
de eventos posibles
00:07:39
pues
00:07:40
hacer clic en un botón, escribir un área de texto
00:07:42
hacer focus
00:07:45
en un panel en lugar de en otro
00:07:47
aquí hay un montón de eventos distintos
00:07:49
no hay solo uno
00:07:50
y cada evento
00:07:52
distinto queremos una respuesta
00:07:54
diferente, hasta ahora
00:07:57
nuestro único evento era
00:07:59
escribir en el teclado y la
00:08:00
respuesta era única, que es
00:08:02
coger lo que habíamos escrito
00:08:04
y pasarlo a una variable, ya está
00:08:06
y luego ya nosotros con eso en la variable
00:08:08
hacemos lo que correspondiera
00:08:11
pero aquí tendremos
00:08:13
que hacer
00:08:15
una cosa que es la gestión
00:08:15
de los eventos
00:08:19
y la gestión de los eventos implica
00:08:21
decidir qué eventos
00:08:29
nos importan de la aplicación, pero a lo mejor
00:08:31
una aplicación, el único evento que nos importa es hacer clic
00:08:33
en el botón, vale
00:08:35
qué eventos nos importan de la aplicación
00:08:37
pueden ser varios, uno
00:08:39
qué código de respuesta
00:08:41
vamos a dar a esos eventos, pues todo eso
00:08:43
implica programar bastante
00:08:45
y hasta ahora de todo eso
00:08:47
no hemos tenido que hacer nada
00:08:49
luego, construir una interfaz
00:08:50
gráfica en swing
00:08:54
y también en lo que vamos a ver
00:08:55
en realidad tiene como dos partes
00:08:57
por decirlo así, psicológicamente
00:08:59
tiene dos momentos
00:09:02
el momento de
00:09:03
decidir el diseño de la interfaz
00:09:05
voy a necesitar estos componentes, estos patins
00:09:07
decidirlo, diseñarlo y hacer
00:09:09
toda la parte de código para construirla
00:09:12
el extend, el
00:09:14
ir pegando, bla bla bla
00:09:15
y luego ya, después de
00:09:17
esa primera parte, tengo psicológicamente
00:09:19
la segunda parte, que es
00:09:21
ahora voy a ver cómo he gestionado los eventos
00:09:23
qué componentes son los que pueden recibir
00:09:25
evento, qué código, con qué
00:09:28
código quiero yo responder a esos eventos
00:09:30
etcétera, tendrás esas dos
00:09:32
partes, vale
00:09:34
bueno, pues
00:09:35
nosotros hasta el año pasado esto lo veíamos con
00:09:38
Swing, que es la herramienta de Java de toda la vida
00:09:42
y este año
00:09:44
lo vamos a ver con
00:09:45
esto, vale
00:09:47
sí, JavaFX
00:09:51
que es la versión más moderna
00:09:53
vale
00:09:56
no
00:09:57
a ver, podemos rápidamente en un pispás
00:10:00
volver un poco la idea, pero bueno
00:10:03
viene a ser un poco lo mismo, pero en versión antigua
00:10:05
entonces
00:10:07
los componentes por defecto de swing
00:10:09
cuando los ponemos, vemos que su aspecto por defecto
00:10:11
es muy anticuado, tú luego le puedes
00:10:13
fijar el aspecto que te dé la gana
00:10:15
pero ya solo ves el detalle de que
00:10:16
el aspecto por defecto es muy anticuado
00:10:19
JavaFX
00:10:21
son controles como más modernos
00:10:23
sin necesidad de
00:10:25
cambiarle esto el aspecto, su aspecto por defecto
00:10:26
es más moderno
00:10:29
eso por un lado
00:10:30
por otro lado
00:10:32
incorpora ya
00:10:34
conceptos que Swing no incorporaba
00:10:36
porque todavía no estaban en Java
00:10:38
como los de programación funcional
00:10:40
con los que tendremos que meternos un pelinín
00:10:42
solo para poder usarlo aquí
00:10:44
un pelín solo
00:10:46
el concepto de separación
00:10:47
que en Swing estaba
00:10:51
más mezclado
00:10:52
de la vista
00:10:53
separarla del código
00:10:56
eso si no lo tenía
00:10:58
pues java x ya veremos como
00:10:59
la vista, la parte de diseño
00:11:01
la puede separar completamente del código
00:11:03
y meterla en archivo xml
00:11:06
eso si que es novedoso
00:11:07
yo toda la parte de diseño la meto
00:11:09
no la hago en java
00:11:12
la meto en archivos xml
00:11:13
y ahora ya mi aplicación java lee de ellos
00:11:15
entonces si yo quiero cambiar algo
00:11:18
lo puedo cambiar en xml
00:11:20
y cuando la aplicación arranca
00:11:21
Pues le doy ese archivo
00:11:23
No tengo que cambiar el código
00:11:25
¿Vale? También tiene una integración
00:11:27
Con acceso a bases de datos
00:11:29
Un poquito más
00:11:31
Funcional
00:11:33
Para eso, la integración a bases de datos
00:11:35
Está mejor soportada aquí
00:11:38
Que aquí, hay que hacerla más a mano
00:11:39
Entonces, bueno, es la versión como más moderna
00:11:41
¿Vale?
00:11:43
De aquí he hecho unos apuntillos
00:11:44
Que ya os pasaré, pero después
00:11:47
Cuando ya hayamos visto primero
00:11:49
Cómo funciona
00:11:52
para que os sirvan
00:11:53
como recordatorio.
00:11:56
Pero después, ¿vale? Primero vamos a aprender
00:11:57
a hacerlo y luego ya eso que nos sirva como recordatorio.
00:11:59
Es sencillo.
00:12:01
¿Vale? Bueno, pues entonces
00:12:03
JavaFX
00:12:06
la idea también es la misma.
00:12:08
Tu interfaz,
00:12:11
tu objeto,
00:12:11
aquí no se llama el JFrame.
00:12:12
En JavaFX es el Stage.
00:12:16
O sea, el marco
00:12:19
básico en
00:12:19
Swin es el JFrame
00:12:23
pues eso mismo, que es la ventanita
00:12:24
con el minimizado, el cuadradito y esto
00:12:26
eso mismo en JavaFX, en JavaFX es stage
00:12:28
ya está, pero la idea
00:12:31
es la misma, tú te haces tu stage
00:12:33
le pones las escenas, que las escenas
00:12:34
serían, pues ahora ya, el panel
00:12:36
con los componentes
00:12:39
y luego tienes que gestionar los eventos
00:12:40
¿vale?
00:12:43
bueno, pues entonces, vamos a
00:12:46
ver un poquito como arrancar
00:12:48
vamos a ver si conseguimos arrancar una aplicación
00:12:52
en JavaFX, porque no es tan
00:12:54
trivial como en Swing
00:12:56
por pequeñitas cosas
00:12:57
bueno, primer problema
00:12:59
si queremos hacer una aplicación con JavaFX
00:13:06
primer problema que nos encontramos
00:13:08
que lógicamente las clases
00:13:11
que necesitamos, bueno no tan lógicamente
00:13:14
podrían estar, pero bueno
00:13:16
la clase stage, los componentes
00:13:17
todo eso, las clases que necesitamos
00:13:20
no las trae el JDK
00:13:22
las trae el JDK, las tenemos que importar
00:13:23
entonces
00:13:27
eso ya es una primera complicación
00:13:28
para nosotros, porque nosotros
00:13:30
hasta ahora hemos visto
00:13:32
cómo generar un JAR para poder
00:13:34
difundir unas librerías nuestras
00:13:36
y hemos visto cómo incorporarlo
00:13:37
al ClassPath, pero
00:13:40
no hemos necesitado, en ninguna de nuestras aplicaciones
00:13:42
hemos necesitado, que yo recuerde,
00:13:44
incorporar una librería externa para
00:13:46
que funcione.
00:13:47
Bueno, si podemos, cuando nos lo enseñaste un poco
00:13:49
al principio del curso, cuando importábamos algo
00:13:51
Sí, pero para aprender a hacerlo
00:13:53
y para aprender cómo era, pero que todas las aplicaciones
00:13:56
que hemos hecho, todas las clases
00:13:57
que usábamos estaban en el JDK
00:14:00
no necesitábamos importar nada
00:14:02
bueno, pues aquí ya
00:14:03
necesitamos librerías externas
00:14:05
vale, esa es la primera complicación
00:14:08
entonces, bueno
00:14:19
no sería tan complicado porque efectivamente
00:14:21
sabemos cómo importar
00:14:23
librerías externas, cómo están las clases
00:14:25
que uno distribuye por ahí al mundo
00:14:27
están metidas en .jar, ¿verdad?
00:14:29
esto es lo que es un .jar
00:14:34
un .jar es
00:14:36
un fichero comprimido que tiene un montón
00:14:37
de clases, a su vez
00:14:39
distribuidas en paquetillos
00:14:41
entonces, importarlas
00:14:42
¿qué significa? pues lo hemos hecho alguna vez
00:14:45
cuando hemos generado un hard
00:14:47
pues añadirlas a la
00:14:49
famosa variable classPath
00:14:51
entonces, al añadirlas a la
00:14:53
famosa variable classPath
00:14:57
este hard, decir, oye, classPath
00:14:59
tú, usa que mi
00:15:01
aplicación va a usar las clases que están
00:15:03
en este jar, eso es lo que realmente
00:15:05
hacemos cuando importamos un jar
00:15:07
desde Eclipse, le estamos diciendo
00:15:09
a esta variable, oye tú
00:15:11
mi aplicación
00:15:13
va a usar clases que están
00:15:16
en este jar, tenlo en cuenta, para que
00:15:17
si yo te las pido con el import
00:15:19
que tú sepas dónde están, eso es lo que hacemos
00:15:21
entonces hasta ahí pues este
00:15:23
punto no sería tan horrible, no sería
00:15:25
un punto tan horrible, si sabemos hacer importar
00:15:27
un jar para que se usen las clases, no sería tan horrible
00:15:29
vale, pues sí
00:15:31
se convierte en un pelín horrible
00:15:33
Bueno, no un pelín horrible
00:15:35
Pero un pelín no tan fácil
00:15:37
Como esto
00:15:40
A ver, me distraigo mucho
00:15:41
¿Por qué no os escribís las cosas?
00:15:43
¿O habláis por señas?
00:15:45
¿No podéis estar hablando de fondo cuando alguien está hablando?
00:15:47
Es que eso no se puede hacer
00:15:50
Podéis no prestarme atención
00:15:52
Pero no me distraigáis
00:15:55
Si habláis, me distraéis
00:15:56
Os lo vais escribiendo en el monitor
00:15:58
Si queréis
00:16:00
Vale, entonces
00:16:01
esto, que sería
00:16:06
en principio, bueno, no es una complicación
00:16:09
tan grande, bueno, no es una complicación tan grande
00:16:11
ya sabemos añadir un JAR a un CLASSPAD
00:16:13
ya sabemos, pues si se convierte
00:16:15
en una complicación un poquito más grande, ¿por qué?
00:16:17
porque estas librerías
00:16:20
de JavaX
00:16:22
usan el sistema
00:16:23
de módulos
00:16:26
¿os acordáis
00:16:27
el módulo info que nos ha dado guerra alguna vez?
00:16:30
el módulo info
00:16:33
que decía, nada, bórralo y así no nos molesta
00:16:34
Vale, pues las librerías de JavaX, por estar hechas a partir de la versión JBK10 o no sé qué, usan el concepto de módulo de Java, que no es un concepto en realidad que se haya usado mucho y esté muy extendido, pero bueno, hay que conocerlo, pues si usamos alguna librería que lo usa, pues para no tener que pegarnos con ella demasiado, usa el concepto de módulo.
00:16:36
entonces, eso implica
00:17:10
que esto
00:17:12
no sea tan sencillo
00:17:13
importar el hat
00:17:16
de las librerías JavaFX
00:17:17
no sea tan sencillo
00:17:20
como agregarlo al classpath
00:17:21
con el configure buildpath
00:17:24
que hemos hecho hasta ahora
00:17:26
vale
00:17:27
entonces, ¿qué implicaciones tiene
00:17:28
que usen el concepto de módulo?
00:17:34
un poquito por encima
00:17:37
que es esto de los módulos, un poco por encima
00:17:38
no es algo que a nosotros nos importe
00:17:40
ni vayamos a trabajar con ello, ni vayamos a semear de ello, ni de nada.
00:17:41
Pero sí un poco nos importa saber qué es esto de módulos
00:17:45
porque JavaFX los usa.
00:17:48
Y eso nos va a implicar, más que nos va a implicar,
00:17:51
pues nos va a permitir entender por qué lo vamos a hacer
00:17:54
con la herramienta que lo vamos a hacer.
00:17:56
¿Vale?
00:17:58
Pues, ¿qué son los módulos en una aplicación Java que use módulos?
00:18:00
Bueno, pues si una aplicación Java no usa módulos,
00:18:05
todo el código está
00:18:08
todo junto, es como si fuera todo el código
00:18:12
está en la misma caja
00:18:15
entonces todo el código que usa la aplicación
00:18:16
estará pues en los hard
00:18:19
en las propias clases que yo he hecho
00:18:21
estará donde esté, pero está como
00:18:23
todo el código junto y cuando digo
00:18:25
junto es que hay una
00:18:27
única variable
00:18:29
¿vale? una única variable
00:18:30
que es la variable classPath que afortunadamente
00:18:33
como trabajamos con un entorno de desarrollo
00:18:35
la maneja el entorno de desarrollo
00:18:37
y no la manejamos nosotros.
00:18:39
Pues hay una única variable que nos dice
00:18:41
oye, esta aplicación usa este hard,
00:18:43
usa estos paquetes, usa no sé qué,
00:18:46
usa no sé cuántos, está todo aquí.
00:18:48
¿Vale?
00:18:51
Entonces es como si estuviera todo metido en la misma caja.
00:18:52
¿Vale?
00:18:56
Cuando una aplicación usa módulos,
00:18:57
lo que ocurre es que es como si el código
00:18:59
se distribuyera, se separara
00:19:02
en cajitas separadas.
00:19:05
En cajitas separadas.
00:19:08
y cada cajita es un módulo, cada cajita es un módulo y el módulo declara dentro información
00:19:09
sobre qué cosas uso yo de otras cajas y qué cosas de las que yo tengo dentro permito usar,
00:19:19
entonces una aplicación con módulos, cada parte del código, estas clases, estas clases,
00:19:27
clases, cada parte del código
00:19:35
puede ser un módulo diferente
00:19:36
cada módulo
00:19:39
se describe en el famoso
00:19:40
módulo info
00:19:43
por eso cuando hacéis
00:19:44
una aplicación en Eclipse
00:19:46
él asume
00:19:48
que va a haber un solo módulo
00:19:50
que es vuestra aplicación, un único módulo
00:19:52
y os crea ya un módulo info
00:19:55
para describir ese módulo
00:19:57
¿qué ocurre? que si hay un solo
00:19:59
módulo
00:20:01
podemos pasar
00:20:01
de eso completamente, si hay un solo módulo
00:20:04
da igual, está todo en la misma caja
00:20:06
igual, entonces borramos el módulo info
00:20:08
y lo quedamos tan tranquilo, porque no hay
00:20:10
no hace falta que describir el módulo
00:20:12
ni nada, porque solo hay uno
00:20:14
pero si hubiera varios
00:20:15
cada módulo tiene su módulo info
00:20:17
que el módulo info es un ficherito de texto
00:20:20
que dice, oye
00:20:22
este módulo
00:20:24
necesita las clases
00:20:26
de aquí, de aquí, de aquí
00:20:28
y además permite el uso
00:20:30
de las clases suyas, esta y esta
00:20:32
y esta, entonces se queda todo como más
00:20:34
compartimentado, más encapsulado
00:20:36
para esto van los módulos en realidad
00:20:38
para tener el código más organizado, más compartimentado
00:20:40
más compartimentado
00:20:42
y todo eso
00:20:46
para eso vale
00:20:46
que normalmente las aplicaciones de
00:20:47
todo el mundo, de toda la vida de Dios son un solo módulo
00:20:50
y ya está, y el módulo info
00:20:52
describe ese módulo si es que lo queremos usar
00:20:55
pero no hace falta
00:20:57
bueno
00:20:58
el módulo es como un paquete
00:21:00
entonces para distintas
00:21:03
cada módulo tiene un montón de paquetes
00:21:04
dentro
00:21:07
cada módulo es como una parte
00:21:07
de mi código, o sea mi código a lo mejor son
00:21:11
mi aplicación, son mil clases
00:21:13
y puedo tener un módulo
00:21:15
con 500, otro módulo con 150
00:21:17
y otro módulo con 250, yo que sé
00:21:18
o sea un paquete tiene clases y un módulo tiene paquetes
00:21:20
exacto
00:21:23
y un módulo aparte de sus clases
00:21:26
puede ser que necesite para funcionar
00:21:28
clases de otro módulo, porque lo llaman
00:21:30
sus propias clases
00:21:32
y además puede ser que quiera dar
00:21:33
permiso para que otros módulos usen sus
00:21:36
clases o las instancien, pues todo eso
00:21:38
se describe en el módulo
00:21:41
info
00:21:42
¿vale? con que nos quedemos con eso
00:21:43
es suficiente
00:21:46
no hay más
00:21:47
entonces, ¿qué ocurre?
00:21:49
bueno
00:21:54
pues que las librerías
00:21:54
de JavaFX
00:21:56
están modularizadas
00:21:57
es decir, son .jar
00:22:01
que están separados por módulos
00:22:03
eso es lo que nos implica
00:22:05
ahora nosotros
00:22:07
nuestra aplicación va a seguir siendo un módulo igualmente
00:22:08
mi aplicación va a ser un módulo
00:22:11
pero va a necesitar cosas
00:22:12
de otros módulos
00:22:15
que no lo sabré yo
00:22:17
porque ya son estas librerías que yo descargaré
00:22:19
¿vale?
00:22:22
pero mi aplicación va a ser igual
00:22:23
un mismo módulo como lo hemos hecho siempre
00:22:24
lo único es que ahora
00:22:26
las clases
00:22:28
que tenemos que importar
00:22:31
no son puntojar que están ahí sueltos
00:22:32
de la vida de Dios, yo los meto al
00:22:35
claspaz y ya está, no son puntojar
00:22:37
que están sueltos para que vayan al claspaz
00:22:39
lo que son
00:22:41
son módulos
00:22:42
entonces importar un módulo
00:22:44
no es tan sencillo
00:22:47
entonces esa es la primera
00:22:50
cosa peliaguda, que las
00:22:53
librerías de JavaFX al ser en realidad
00:22:55
al estar organizadas en módulos
00:22:57
ellas, al estar organizadas en módulos
00:22:59
yo no incorporo el jar al classpath y se acabó
00:23:01
no, tengo que hacer algo más
00:23:03
¿vale?
00:23:05
y ahora eso por un lado
00:23:08
y por otro lado, arrancar la aplicación
00:23:10
tampoco es trivial
00:23:12
¿vale? porque para cuando la aplicación
00:23:13
arranca, hay que decir
00:23:16
no puedo arrancarla como he hecho hasta ahora
00:23:18
de runas, java, application, no
00:23:20
porque cuando una aplicación tiene módulos
00:23:22
para arrancarla, tenemos que
00:23:24
explicarle a la aplicación
00:23:26
dónde se encuentran esos módulos,
00:23:28
porque ahora no hay un classpath donde está todo.
00:23:30
Ahora no hay un classpath donde está todo.
00:23:32
Ahora hay que arrancarla con unos parámetros
00:23:34
que informen de dónde están esos módulos
00:23:37
que yo he incorporado.
00:23:40
Conclusión.
00:23:42
Se convierte en mucho más complicado
00:23:44
importar las librerías
00:23:46
y arrancar la aplicación.
00:23:48
Podríamos hacerlo incorporando las librerías
00:23:51
al módulo de path
00:23:53
y luego arrancando la aplicación
00:23:54
dándole unos parámetros a la máquina virtual,
00:23:55
dándole las rutas de los módulos
00:23:57
podríamos hacerlo así y ya está
00:23:59
pero ya empieza a complicarse
00:24:00
una tarea tan automática
00:24:03
entre comillas
00:24:05
como importar librerías y ejecutar
00:24:06
que en principio es automática hasta ahora
00:24:09
importo librerías, ejecuto
00:24:11
pues una tarea que en principio debería ser automática
00:24:13
se empieza a hacer complicada
00:24:15
entonces como se empieza a hacer complicada
00:24:17
y no tiene sentido que lo hagamos todo el rato
00:24:19
cada vez que queremos incorporar la aplicación
00:24:21
ni nosotros ni el universo
00:24:22
pues aquí es donde ya empiezan a cobrar
00:24:24
sentido unas cosas
00:24:27
que igual habéis mencionado ya
00:24:29
en entornos de desarrollo
00:24:30
que son las herramientas de
00:24:33
gestión
00:24:35
de proyectos. Como por ejemplo
00:24:37
Maven
00:24:45
¿Os suena el nombre?
00:24:50
Sí, pero no
00:24:53
hemos empezado a verlo.
00:24:54
Por ejemplo, Gradle
00:24:55
otra también, que son las dos más
00:24:57
comunes.
00:25:00
En Java esencialmente es.
00:25:01
Entonces, estas herramientas
00:25:07
de gestión de proyectos, ¿qué hacen?
00:25:08
Pues es un pequeño software
00:25:12
que hace
00:25:14
algunas tareas por nosotros.
00:25:16
Nosotros la configuramos,
00:25:19
configuramos esa herramienta,
00:25:21
que es un pequeño software, la configuramos
00:25:23
con ficheros de configuración
00:25:25
y esa herramienta
00:25:27
hace ya tareas
00:25:31
por nosotros y nos ahorra trabajo.
00:25:33
Puede hacer tareas como compilar,
00:25:34
puede hacer tareas como pasar test,
00:25:36
puede hacer tareas como esta,
00:25:38
que es la que nos va a venir bien a nosotros,
00:25:41
que es incorporar librerías y arrancar la aplicación,
00:25:42
puede hacer todo eso por nosotros.
00:25:46
Entonces, ahora sí que tiene sentido
00:25:49
que incorporemos a nuestros proyectos
00:25:51
esta pequeña o grande, según el uso que queramos darla,
00:25:54
de gestión de proyectos
00:25:58
y así nos va a facilitar incorporar las librerías
00:25:59
y arrancar el proyecto, nos lo va a facilitar.
00:26:03
Bueno, pues entonces
00:26:05
Vamos a
00:26:09
Arrancar un primer proyecto
00:26:11
Con Mabel
00:26:13
Importando las librerías del JavaFX
00:26:14
Aquí ya, claro
00:26:19
Cuando uno empieza a importar librerías
00:26:21
A partir de ahora ya
00:26:23
Os he dicho librerías hasta ahora todo el rato
00:26:26
Porque es una palabra que nos es más familiar
00:26:28
Una librería es un conjunto de clases
00:26:31
Que voy a usar
00:26:33
pero la palabra que deberíamos usar
00:26:34
y vamos a usar a partir de ahora
00:26:37
porque es la palabra técnica de desarrollo
00:26:39
es dependencia
00:26:41
dependencia es
00:26:43
un conjunto de clases
00:26:45
de los cuales tu aplicación depende
00:26:47
para funcionar porque los usa
00:26:49
entonces
00:26:50
nuestra aplicación va a necesitar
00:26:53
las dependencias
00:26:56
de JavaFX
00:26:57
mejor decirlo así
00:26:58
que decir las librerías de JavaFX
00:27:02
entonces
00:27:04
Maven, para lo que es
00:27:06
maravilloso, imprescindible
00:27:08
ya en cuanto tú empiezas a usar librerías externas
00:27:10
o dependencias, es para
00:27:13
la gestión de dependencias
00:27:14
porque si no tendríamos que estar buscando por el mundo
00:27:16
por internet, por todos lados, los hard
00:27:18
descargarlos, incorporarlos
00:27:20
y eso es un rollo, pues Maven hace
00:27:22
todo eso por nosotros
00:27:24
entonces, usar herramientas de gestión de proyectos
00:27:25
cuando ya el proyecto
00:27:29
incorporar dependencias, tengo que estar
00:27:29
automatizando pruebas o cosas, ya es imprescindible
00:27:32
pues venga
00:27:34
ahora ya precisamente
00:27:36
cuando ya necesitamos dependencias
00:27:38
externas, maven y
00:27:40
rollos de estos, ahora es cuando ya
00:27:42
empiezan a pasar cosas
00:27:44
en función de la versión que tengamos
00:27:46
de Eclipse, de JDK, etc
00:27:48
entonces ahora ya pues
00:27:50
algunos os funcionarán desde el principio
00:27:52
a otros no, tendréis que retocar cosas
00:27:54
etc, veremos, misterio
00:27:56
Claro, Mabel automáticamente
00:27:58
Tú le dices, quiero esto
00:28:03
Y de forma transparente para ti
00:28:04
Se conecta al repositorio suyo de Mabel
00:28:07
Lo descarga y te lo deja
00:28:09
En un repositorio local
00:28:11
Para que no tengas que estar todo el rato
00:28:12
¿Vale?
00:28:14
Cuando tu aplicación arranca, va al repositorio local
00:28:16
Si ve que el repositorio local está vacío
00:28:18
Automáticamente, sin decirte nada, se vuelve a conectar y te lo baja
00:28:20
¿Vale?
00:28:22
Pues venga, vamos a ver si tenemos suerte
00:28:26
Y nos funciona todo desde el principio
00:28:27
que no es tan fácil
00:28:29
que nos funcione todo desde el principio
00:28:32
cuando ya dependemos de cosas raras
00:28:34
vale
00:28:37
a ver, bueno
00:28:39
son las 37, vamos a aprovechar a parar aquí un momento
00:28:50
a ver
00:28:53
un momentito
00:28:55
- 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:
- 3
- Fecha:
- 18 de abril de 2026 - 11:14
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 28′ 58″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 173.62 MBytes