20260422 JavaFX_Combo_ActionEvent - 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 la aplicación esta de países que hicisteis el otro día nos permitió incorporar, pues un elemento nuevo, nos permitió incorporar este desplegable de aquí, ¿vale?
00:00:01
Entonces este desplegable de aquí
00:00:14
Como tiene la notación
00:00:17
FXML
00:00:20
Se instancia automáticamente
00:00:21
Por eso aquí
00:00:24
Ni lo inicializamos a New Combo Box
00:00:24
Ni nada
00:00:28
Este se instancia automáticamente
00:00:28
En cuanto se carga la vista
00:00:31
En cuanto se carga
00:00:33
La vista aquí
00:00:36
Con esto
00:00:36
Pues lo que haya en esa vista
00:00:39
Que es el Combo Box, todo lo que haya
00:00:41
automáticamente se instancia este combo box
00:00:43
y esta etiqueta en ese caso con los elementos de la vista
00:00:48
y ya están permanentemente conectados
00:00:51
y ahora ya nuestro controlador pues que hacía
00:00:54
pues primero a través de este método opcional
00:00:57
inicializaba cosas en la vista
00:01:03
en particular lo que hacía en este caso era
00:01:06
cargar los datos de la aplicación
00:01:08
y ponérselos
00:01:11
a el combo box
00:01:14
¿vale? se los ponía al combo box
00:01:15
mediante el método setItems
00:01:18
el combo box tiene muchos más métodos
00:01:20
si uno quiere ya jugar con él, hacer lo que sea
00:01:21
¿vale?
00:01:23
entonces
00:01:25
para añadirle ítems al combo box
00:01:26
creábamos una lista
00:01:30
un ArrayList normal y corriente
00:01:31
un ArrayList a partir
00:01:33
de los países de nuestro fichero
00:01:35
pero ese ArrayList en lugar de ser
00:01:37
un ArrayList normal y corriente
00:01:39
lo hacíamos
00:01:42
fuera de la clase ObservableList
00:01:43
que se especifica de JavaX
00:01:46
y
00:01:47
la clase ObservableList
00:01:49
permite que
00:01:51
esta lista esté automáticamente conectada
00:01:53
a la vista.
00:01:56
Entonces, si hay cambios
00:01:58
en esta lista, algún
00:01:59
otro evento hace cambios en esta lista,
00:02:01
el ComboBox
00:02:04
que lo tiene asociado, cambia
00:02:05
automáticamente.
00:02:07
esa es la ventaja de usar una observable list
00:02:08
en lugar de una array list
00:02:12
directamente para el combo box
00:02:13
bueno pues
00:02:15
esta aplicación nos permitió por tanto
00:02:17
incorporar este elemento
00:02:19
incorporar esta lista
00:02:20
que se asocia a muchos otros controles
00:02:22
que son para mostrar datos
00:02:25
el combo box es un control para mostrar datos
00:02:27
muy bueno el desplegable
00:02:30
pero también hay el list view
00:02:31
que es una lista, la típica lista que uno puede
00:02:32
seleccionar elementos, también hay un table view
00:02:34
que es una tabla para seleccionar
00:02:37
elementos, pues todos ellos pueden
00:02:39
tener asociadas listas observables
00:02:41
de estas
00:02:43
vale, además nuestra aplicación que hacía
00:02:44
pues ya cuando pulsábamos en el combo box
00:02:47
hacía algo
00:02:49
entonces pulsaba en el combo box, dijimos
00:02:50
uy, será el onAction, que es el método por defecto
00:02:53
lo probamos, pues sí
00:02:55
era el onAction, el onAction nos llevaba aquí
00:02:56
y de aquí sacábamos los
00:02:59
habitantes asociados
00:03:01
a ese nombre de país que estaba
00:03:03
en el combo box seleccionado
00:03:05
y listo, vale
00:03:07
bueno, pues esta aplicación
00:03:08
ya nos permitió incorporar alguna otra cosa
00:03:11
vale
00:03:13
pues venga, vamos a hacer otra
00:03:14
para incorporar alguna cosa
00:03:17
básica también
00:03:18
vale
00:03:21
nosotros, con lo que hemos
00:03:23
hecho hasta ahora
00:03:25
cada control tiene un método
00:03:26
asociado
00:03:29
luego si mi aplicación tiene mil
00:03:30
controles
00:03:33
mil métodos en el controller
00:03:34
vale, pues no pasa nada
00:03:37
pues se puede sobrevivir así
00:03:39
pero bueno, a lo mejor
00:03:41
podríamos optimizar el código si ocurre lo siguiente
00:03:43
uy, tengo
00:03:45
cuatro controles que
00:03:47
responden prácticamente con el mismo
00:03:49
código, solo cambia
00:03:51
una cosita mínima
00:03:53
entonces, voy a poner cuatro
00:03:54
métodos prácticamente iguales
00:03:57
en los que solo cambia una cosita mínima
00:03:59
asociados a los cuatro controles
00:04:01
no podría yo hacer un único método
00:04:04
y que ese método decida
00:04:07
que control lo llamó
00:04:09
y en función del control
00:04:11
que lo llamara a hacer una cosa u otra
00:04:13
sería lo ideal ¿no?
00:04:15
y así no tengo que copiar el mismo código
00:04:17
en cuatro sitios distintos
00:04:18
¿entendéis a lo que me refiero?
00:04:21
por ejemplo
00:04:26
lo vamos a ver
00:04:27
en el caso básico y luego ya lo hacemos
00:04:29
en una aplicación un poco más esta
00:04:31
Bueno, esta calculadora como era de texto
00:04:32
La dejamos, vamos a hacer la calculadora 2
00:04:36
Así rápidamente
00:04:38
Pues venga, nuestro maven project
00:04:40
Si hoy nos da tiempo
00:04:42
Y si no el viernes, ponemos el plugin de Eclipse
00:04:44
Para que no lo tengáis que hacer como proyecto maven
00:04:46
Si os es más rápido
00:04:49
Vale, pues venga
00:04:50
Hacemos un proyecto maven normal
00:04:54
Esto ya lo hacéis todo de carrerilla sin equivocaros
00:04:55
Un proyecto nuevo
00:04:58
calculadora 2, para ver esto que os digo
00:05:05
muy cortito
00:05:07
para ver esto, vale
00:05:10
pues yo que sé, calculadora
00:05:11
teclas, le voy a poner
00:05:14
porque la otra, tú ponías los numeritos
00:05:15
en el área de texto, en esta los numeritos
00:05:17
los vas a pulsar por teclas
00:05:19
o las operas
00:05:20
ah, no, no, no, perdón, perdón
00:05:21
lo vamos a hacer, vamos a reutilizar
00:05:25
la anterior, porque
00:05:27
así no metemos más basurilla
00:05:28
vamos a reutilizar la anterior, vamos a ver como era
00:05:31
la anterior. ¿Vale? Abortar
00:05:33
el proceso de hacer proyecto nuevo y así ahorramos
00:05:37
tiempo. La anterior, vamos a
00:05:39
recordar cómo funcionaba.
00:05:41
Vale, esta funcionaba. Tú ponías
00:05:50
45 más
00:05:51
12
00:05:54
igual a lo que fuera.
00:05:56
Habíamos
00:05:59
habilitado solo el botón más, ¿verdad?
00:05:59
El menos no hacía nada. Vamos a
00:06:01
habilitar el botón menos.
00:06:03
Vamos a ampliar la calculadora
00:06:05
habilitándole el botón menos.
00:06:07
Pues entonces, ¿qué haríamos?
00:06:09
con lo que sabemos hasta ahora
00:06:11
pues entonces nos iríamos a nuestro controlador
00:06:14
con lo que sabemos hasta ahora nos iríamos a nuestro controlador y diríamos
00:06:18
venga
00:06:22
pues un nuevo evento
00:06:23
en otro control distinto pues un nuevo método botón igual botón suma pues
00:06:25
botón menos
00:06:29
entonces voy a copiar y pegar porque son casi iguales
00:06:33
botón suma
00:06:37
botón resta
00:06:39
eeeh
00:06:46
vale
00:06:48
vale, sí, es que este en particular da igual porque es que es el mismo código clavado, ni siquiera cambia nada, con lo cual es que ni siquiera puede ser el mismo botón para ambos, porque solo, vale, el botón igual, vale, vale, vale, no, es que, vale, nada, no, a ver, tal y como está hecha la calculadora, botón igual, tienes que haber cual dado la operación,
00:06:58
Claro, es que el botón igual
00:07:21
Hacia la suma
00:07:23
Entonces tú le dabas a la resta
00:07:25
Vale, vale, entonces
00:07:26
Claro, sí
00:07:28
Sí, es que por eso no sé si este es un
00:07:37
Buen ejemplo
00:07:39
Si tú le das a
00:07:40
Más
00:07:43
Vale, entonces
00:07:45
Vamos a cambiar un poquito esta calculadora
00:07:46
Para que aplique un poco más esto que vamos a hacer
00:07:49
Entonces
00:07:50
¿Eh?
00:07:51
Venga, vale
00:07:56
¿Sabes qué pasa? Que es que esta está mal
00:07:57
Porque es que el botón igual
00:08:01
Lo único que hace es sumar
00:08:02
Entonces ya está mal
00:08:03
La calculadora tiene que guardar
00:08:05
O sea, el botón igual
00:08:08
Hace una cosa o hace otra
00:08:10
En función de la operación previa
00:08:12
Entonces esta calculadora está mal
00:08:14
¿Vale?
00:08:16
Entonces, ¿vosotros la tenéis
00:08:19
Igual que yo?
00:08:20
Es que claro, si me pongo ya a modificar
00:08:22
Cosas, vosotros tenéis otra cosa
00:08:25
Entonces por eso es casi, para que os enteréis
00:08:26
Como, para que os enteréis
00:08:28
de lo que vamos a meter ahora, es casi mejor
00:08:30
hacer un proyecto nuevo, porque si no, como cada uno
00:08:32
tú tienes ya el tuyo completo bien
00:08:34
entonces
00:08:36
si yo me puedo cambiar esto
00:08:37
pues voy a ir un poco por libre
00:08:40
y no es plan, vale, pero ahora
00:08:41
entendéis el problema de esta calculadora
00:08:44
los que la tengáis copiada tal cual
00:08:46
pues vosotros ya podéis hacer la modificación por vuestra
00:08:48
cuenta como ha hecho él, para que tenga sentido
00:08:50
o sea, esta calculadora le dabas igual y te sumaba
00:08:52
era absurdo, o sea, el menos
00:08:54
tenías que haberlo guardado en algún sitio
00:08:56
idealmente el objeto
00:08:57
En algún sitio lo tienes que haber guardado
00:08:59
Vale, entonces
00:09:02
Esto lo voy a poner
00:09:03
Aquí
00:09:05
La calculadora
00:09:07
Suma siempre
00:09:13
Entonces habría que cambiar esto
00:09:18
La aplicación
00:09:24
Para que distinga
00:09:28
En función de la operación
00:09:30
De la operación previa
00:09:31
Vale, pero este cambio no implica
00:09:34
Esto nuevo que quiero contar yo ahora
00:09:39
Con lo cual eso se queda aquí planteado
00:09:41
Cada uno que lo cambie como haya querido
00:09:43
Y ahora ya sí que vamos a hacer
00:09:45
Venga, pues a ver
00:09:47
Venga, entonces vamos a
00:09:49
Vale, a ver
00:10:01
Estoy pensando algo más bonito que
00:10:12
Venga, una calculadora 2
00:10:14
Aunque sea una chorrada
00:10:28
Vale, calculadora
00:10:29
Calculadora teclado
00:10:35
Le vamos a llamar
00:10:40
Para que...
00:10:42
No, no.
00:10:44
Calculadora 2.
00:10:45
Bueno, pues os acordáis
00:11:00
de cambiar la máquina virtual.
00:11:01
Sí, al final he hecho otra calculadora.
00:11:07
Después de muchas idas y venidas
00:11:09
me he decidido.
00:11:10
Venga, pues a ver.
00:11:14
Cambiamos el nivel de compilación.
00:11:15
Ahora.
00:11:26
Cuidado.
00:11:29
Ahora el POM
00:11:30
lo copiamos de un archivo
00:11:32
que nos funcione.
00:11:35
desde descripción hacia abajo
00:11:38
dígame
00:11:40
si, no, no, no te preocupes por eso
00:11:45
a ver, no necesariamente
00:11:51
esa línea en particular
00:11:58
no necesariamente
00:12:01
vale, entonces, ahora
00:12:01
me abro el POM de mi
00:12:04
calculadora 2
00:12:06
copio eso
00:12:08
cambio los rojitos y nos da
00:12:11
talk y
00:12:15
revisamos
00:12:18
que el plugin tiene la clase
00:12:20
main correctamente puesta
00:12:23
venga, la vamos a llamar así
00:12:25
yo la voy a llamar así, así no tengo ni que
00:12:27
cambiar
00:12:29
vale, entonces guardando esto
00:12:29
pues efectivamente ahora ya
00:12:33
venga, vale
00:12:35
pues entonces mi calculadora 2
00:12:45
verificamos que
00:12:47
las maven dependencias se han
00:12:49
cargado, bien
00:12:51
y ahora ya, venga, nos vamos a hacer
00:12:52
un modelo con un objeto calculadora
00:12:55
igual que el otro, entonces vamos a hacer nuestra primera
00:12:58
aplicación, nuestro primer paquete
00:13:00
nuestro primer
00:13:01
paquete
00:13:03
es .dump1
00:13:05
.model
00:13:08
y en este paquete de modelo va a ir
00:13:09
la entidad
00:13:14
con la que va a trabajar
00:13:16
mi aplicación, que yo he decidido que sea una
00:13:18
calculadora, mi aplicación va a trabajar con una
00:13:20
calculadora, pues la meto aquí
00:13:22
voy a copiar y pegarla del otro sitio
00:13:24
y le voy a añadir la operación resta que no tenía
00:13:26
copiar, copiar
00:13:30
venga, la pego ahí
00:13:37
esta es mi calculadora
00:13:44
se caracteriza
00:13:48
por los operandos
00:13:50
y por las operaciones que puede hacer
00:13:52
sumar y restar
00:13:54
¿vale?
00:13:56
se podría poner en un método que es
00:13:58
un único método
00:14:00
operar
00:14:02
y que reciba por parámetro la operación
00:14:03
Reciba el más, el menos
00:14:06
Se podría hacer de diferentes formas
00:14:08
Y ya está
00:14:11
Mi calculadora con dos operaciones
00:14:14
Y dos operandos
00:14:16
Este es el modelo que decido yo
00:14:18
Por los requisitos de mi aplicación
00:14:20
De lo que voy a hacer
00:14:21
De lo que me he hablado con el cliente, etc.
00:14:22
Sí, están por ahí abajo
00:14:26
Constructor no le he puesto
00:14:28
Vale, pues entonces ahora ya vamos a hacernos
00:14:31
La aplicación
00:14:35
el paquete
00:14:37
si
00:14:41
es que me pasa por ir rápido
00:14:53
y hablar
00:14:55
y hacerlo todo a la vez
00:14:56
que no me sale
00:14:59
entonces no pasa nada
00:15:00
le cambio el nombre ahora
00:15:03
y ahora ya si que me hago la clase
00:15:04
pero está bien que estéis atentos
00:15:07
app con el main
00:15:12
aquí debajo
00:15:16
el main tiene
00:15:17
el land
00:15:19
arts
00:15:20
y esta hereda
00:15:25
de application
00:15:28
extends application
00:15:29
vale, y ahora
00:15:39
me tengo que hacer yo mi método start
00:15:47
para que este se calle
00:15:49
y porque lo tengo que hacer lógicamente
00:15:50
primero importo
00:15:53
y ahora añado el start
00:15:56
y ahora en el start
00:15:59
cargo la vista
00:16:01
que todavía la tengo por hacer
00:16:03
y me hago mi primera escena con esa vista
00:16:04
entonces esto de nuevo copio y pego
00:16:09
del otro
00:16:11
copio y pego de la otra que tenía
00:16:13
vale, pues lo primero
00:16:17
que vamos a hacernos, pues esta vista
00:16:34
y luego ya nos hacemos el controller, porque en función de los
00:16:35
controles que tengamos, pues ya habrá unos métodos
00:16:38
o habrá otros
00:16:40
venga, pues hala
00:16:41
voy a abrir el
00:16:43
este de aquí
00:16:50
pues hala
00:16:52
Me hago
00:17:09
Mi área de texto
00:17:10
Podría haber copiado la otra
00:17:12
Sin más
00:17:17
Voy a copiar la misma otra vista
00:17:18
Como lo que cambia es el control
00:17:24
En lugar de hacer una de nuevas
00:17:25
La otra vista que tenía
00:17:26
En la otra calculadora
00:17:30
La voy a reutilizar aquí
00:17:32
La otra vista que tenía que estaba en resources
00:17:34
Esta vista la copio
00:17:37
Y la pego aquí también
00:17:39
En los resources de este
00:17:43
Vale pues
00:17:44
Y ahora esta vista
00:17:49
Que es una copia
00:17:52
Idéntica de la de la otra calculadora
00:17:54
La voy a editar
00:17:56
Ahora ya si con el steam builder
00:17:57
Vale
00:17:59
Si hacéis open with
00:18:01
Pues buscáis la aplicación
00:18:03
Si pero
00:18:06
No es que yo no quiero esto
00:18:07
Donde pone steam builder
00:18:10
Yo no lo veo ahí
00:18:11
Ah, vale, vale
00:18:12
Ya, ya, ya
00:18:22
El eclipse no...
00:18:22
Venga
00:18:27
Vale, a ver
00:18:28
Aquí
00:18:51
a ver donde lo tengo
00:18:52
archivo encendido
00:18:54
pues espérate
00:18:55
a ver que averigüe yo donde estaba este
00:19:09
vale
00:19:11
appdata
00:19:21
pues venga
00:19:22
si lo tengo
00:19:26
si no ya lo ha visto donde
00:19:27
en appdata
00:19:30
no no lo tengo ahí
00:19:31
vale
00:19:33
aquí
00:19:33
Vale, estaba un poco escondida, venga, pues a ver, calculadora 2, vale, entonces, ahora,
00:19:41
Vamos a poner el controller, el controller está aquí ya puesto como es Danbuno controller,
00:20:37
este ya tiene un nombrecito puesto aquí en code, este ya tiene su nombre que se llamaba dato,
00:20:48
este tiene un onAction y este no lo tiene, entonces vamos a suponer que digo, bueno, yo quiero restar también,
00:20:58
yo también quiero restar
00:21:05
pues entonces vamos a ponerle aquí un onAction
00:21:07
que sea botón resta
00:21:09
botón resta
00:21:11
y el igual tiene botón igual
00:21:16
entonces estos son los tres que van a recibir evento
00:21:17
este, este y este
00:21:20
este no va a recibirlo
00:21:22
pero si necesitamos saber su nombre
00:21:24
y ya está, tiene el controlador, lo tiene todo
00:21:25
en la vista ya en principio no tengo nada más
00:21:28
que tocar
00:21:30
vale, pues ya está, ahí se queda cerrado
00:21:31
ahora
00:21:34
ahora nos toca hacer el controller
00:21:35
entonces voy a copiar y pegar
00:21:37
el otro controller para ahorrarme tiempo
00:21:39
el otro controller, el paquete entero
00:21:41
de hecho
00:21:43
copiar
00:21:44
vale, pues nada
00:21:46
el controller
00:21:56
el controller necesita el objeto calculadora
00:21:59
necesita el dato y a los
00:22:01
eventos, vale, entonces
00:22:03
esto lo quitamos
00:22:05
tiene un inicialice arrancando calculadora
00:22:06
ya está y ahora vamos a
00:22:11
añadirle, ahora mismo solamente tengo
00:22:12
el evento de botón
00:22:14
suma
00:22:16
entonces
00:22:17
vale, si yo le he dado
00:22:19
al botón suma, que es lo que estoy haciendo
00:22:22
cargar en la calculadora
00:22:24
el operando 1
00:22:26
y tengo que cargar también
00:22:30
en algún sitio la operación para que se quede
00:22:34
en memoria, para luego cuando le dé
00:22:36
al botón igual
00:22:38
para que se quede en memoria
00:22:39
entonces
00:22:42
que opción
00:22:42
podríamos optar aquí, muchas
00:22:45
podríamos poner aquí por ejemplo
00:22:47
pues
00:22:48
en el propio controller
00:22:50
podríamos poner la operación
00:22:52
o en la calculadora
00:22:54
vale
00:22:56
vamos a ponerla en el controller
00:22:58
he quitado el botón igual
00:23:01
vale, he quitado el botón igual
00:23:26
porque ese método
00:23:29
estaba mal, porque sumaba siempre
00:23:31
He dejado solo botón suma que tenemos que tocar
00:23:32
Vale, entonces string operación
00:23:35
Vale, entonces
00:23:37
Cuando yo le doy al botón suma
00:23:38
Operación
00:23:40
Se guarda así
00:23:42
Por ejemplo
00:23:44
Botón resta
00:23:45
Va a hacer lo mismo
00:23:48
Lo mismo
00:23:52
Salvo esta cosita pequeña de aquí
00:23:55
Salvo esta
00:23:59
Poner la operación a menos
00:24:00
Va a hacer lo mismo
00:24:02
Que este de aquí
00:24:03
¿Vale?
00:24:04
Aquí
00:24:10
Y ahora
00:24:10
Ahora ya me hago el botón igual
00:24:15
Igual
00:24:18
Y el evento del botón igual
00:24:35
Pues ahora ya sí que será
00:24:37
Coger el segundo operador
00:24:39
Coge el segundo operador
00:24:41
Del área de texto
00:24:52
Y ahora ya en función de la operación
00:24:53
Hace una cosa u otra
00:24:57
¿Vale? En el caso de que sea más
00:24:58
Pues entonces hace poner el área de texto
00:25:19
Voy a abrir otro controller para copiarlo
00:25:23
Dato se llama
00:25:26
Pues dato.setText
00:25:36
Y ahora calc.sumar
00:25:42
Más esto
00:25:48
Y ahora
00:25:50
En el caso de que sea menos
00:25:54
pues llama a restar
00:25:59
y lo pone en dato
00:26:07
y ya está
00:26:17
y si le damos al botón igual
00:26:20
sin que la operación
00:26:23
se haya cargado antes con nada
00:26:25
pues vamos a hacer
00:26:28
que no haga nada
00:26:30
ya está, no hace nada
00:26:32
nada más que
00:26:36
poner a cero la
00:26:38
poner a cero la
00:26:40
ventanita y ya está
00:26:42
default
00:26:43
Vale, pues tenemos los tres eventos
00:26:45
Los tres eventos asociados
00:27:03
Vamos a ver si esto funciona
00:27:04
Sí
00:27:05
Solamente cambia esto
00:27:08
Solo cambia eso
00:27:19
Cada uno de los dos eventos
00:27:21
De suma y resta
00:27:23
Solo cambia eso
00:27:24
Y luego
00:27:25
Llamas a calculadora
00:27:30
en función del operando, haces una cosa u otra
00:27:33
o si hubiéramos
00:27:35
tenido un único método operación
00:27:38
pasándole el operando, pues operación
00:27:39
pasándole el operando
00:27:41
o podríamos haber puesto en la calculadora
00:27:42
operando activo, bueno, muchos diseños posibles
00:27:48
pero bueno, ahora no nos importa mucho
00:27:50
vale
00:27:52
vamos a ver si esto funcionara
00:27:53
mabil
00:27:55
fx
00:28:01
run
00:28:07
vale, 23
00:28:08
más 2
00:28:18
uy, más 12
00:28:19
igual a 35
00:28:21
vale, y ahora
00:28:22
56
00:28:26
más
00:28:28
uy, quería yo menos, bueno, da igual
00:28:30
1 igual
00:28:32
a 57
00:28:35
y ahora
00:28:36
se le podría añadir un botón de clear
00:28:38
pero bueno, y ahora
00:28:41
34 menos
00:28:42
1 igual
00:28:44
a 33, vale
00:28:47
bueno, la calculadora funciona
00:28:48
con cositas que se le podrían añadir
00:28:50
que borrar automáticamente
00:28:52
pero ahora
00:28:53
lo que nos importa a nosotros
00:28:56
bueno, hasta aquí bien
00:28:59
no, no tengo que entender
00:29:01
cuando llamas
00:29:03
cuando tú pillas
00:29:06
ese text te fija en esta etiqueta lo que tú le pongas
00:29:10
sí, pero digo
00:29:13
cuando tú sacas el segundo operador
00:29:15
yo saco el segundo operador
00:29:17
y se lo meto a la calculadora
00:29:19
y ahora le digo a la calculadora que sume
00:29:20
y suma
00:29:23
La calculadora la hemos puesto en el paquete modelo y se limita a sumar los dos operadores que le hemos fijado previamente, claro.
00:29:25
Vale, pues entonces, ¿qué ocurre? Ahora ya nos ponemos a revisar esta aplicación y decimos, a ver, controller, ¿dónde estás? Aquí.
00:29:35
Vamos a ver, tenemos dos métodos que son prácticamente idénticos, prácticamente idénticos, solo cambian en esta línea y en esta línea, al menos son cortos pero son idénticos y si pusiéramos más operaciones, multiplicación, división, empezarían a aparecer aquí un montón de métodos, todos prácticamente iguales salvo una línea.
00:29:50
bueno, esta situación se puede dar
00:30:14
en mil situaciones equivalentes
00:30:17
este es el ejemplo más sencillo que se me ha ocurrido
00:30:19
los botones de una calculadora
00:30:21
pero una situación así se puede dar en mil situaciones
00:30:23
en mil aplicaciones distintas
00:30:25
entonces
00:30:27
nosotros pensamos, jolines
00:30:29
y si yo hago un único evento
00:30:30
y que el evento dentro
00:30:33
distinga a quien le llamó
00:30:35
y en función de quien le llamara
00:30:36
ponga el más o ponga el menos
00:30:38
sería ideal
00:30:40
que yo desde un método
00:30:43
de evento, de respuesta a evento
00:30:45
tenga yo acceso a la información
00:30:47
de quien me ha llamado
00:30:49
porque ahora mismo con lo que tenemos aquí
00:30:50
yo llego a este punto y yo aquí por código
00:30:53
no tengo información de quien me ha llamado
00:30:55
no la tengo
00:30:57
no, vale
00:30:59
entonces, que podemos
00:31:01
hacer, pues bueno
00:31:03
a estos métodos de
00:31:05
evento, los que están anotados
00:31:07
con fxml
00:31:09
y que luego está en el onAction
00:31:10
en el onDrag, en no sé qué
00:31:12
se les puede pasar opcionalmente
00:31:14
si uno quiere, opcionalmente
00:31:16
un objeto que se llama
00:31:18
de muchas formas posibles
00:31:20
ActionEvent, MouseEvent, KeyEvent
00:31:22
ahora vemos, pero
00:31:24
el por defecto es ActionEvent, me explico
00:31:25
vamos a comentar estos
00:31:28
estos que son mucha duplicidad
00:31:30
de código, estos no me gustan
00:31:32
están duplicando
00:31:35
código, voy a hacer uno solo
00:31:36
voy a hacer uno solo
00:31:38
pues venga, vamos a hacer uno solo
00:31:39
venga, pues ese solo
00:31:42
fxml
00:31:45
que se llame por ejemplo
00:31:49
public void
00:31:51
botón
00:31:53
operación
00:31:55
es decir, este va a ser
00:31:56
el evento que va a responder
00:31:59
a pulsar cualquier botón
00:32:01
operación, me da igual cual sea
00:32:03
vale, entonces vamos a abrir
00:32:05
otra vez el modelo
00:32:07
vale, pues entonces ese evento que yo estoy
00:32:09
haciendo que responda
00:32:15
tanto al más como al menos
00:32:18
porque total el código es casi igual
00:32:20
entonces si el código es
00:32:22
casi igual que me responda tanto al más
00:32:24
como al menos
00:32:26
pues venga voy a cambiar
00:32:27
en el onAction del más
00:32:29
ahora ya no quiero que sea botón suma
00:32:31
sino botón
00:32:33
operación
00:32:34
botón operación
00:32:37
y en el menos igual
00:32:38
botón operación
00:32:41
los dos el mismo
00:32:44
total, son prácticamente iguales
00:32:45
vale, pues si lo he escrito bien
00:32:50
ahora ya
00:32:52
sea cual sea el botón que yo dé
00:32:53
sea más o sea menos
00:32:55
las librerías de JavaFX
00:32:56
me enchufan aquí
00:32:59
vale, pues ahora vamos
00:33:00
¿qué hay que hacer?
00:33:03
pues que hay que hacer, fijar el primero operando
00:33:05
eso me da igual el botón
00:33:07
que haya pulsado, me da exactamente igual
00:33:12
haya pulsado el más, el menos
00:33:13
esto hay que hacerlo, fijar el primero operando
00:33:15
ahora ya que me pongo
00:33:17
limpiar la ventana
00:33:20
perdón, el área de texto
00:33:22
limpiarla, eso los dos, da igual el que lo haga
00:33:23
y ahora es cuando me viene el problema
00:33:26
y ahora la sentencia
00:33:28
que me falta es op igual
00:33:30
a qué
00:33:32
pues es que no lo sé
00:33:34
depende como haya llegado yo hasta aquí
00:33:36
si yo he llegado hasta aquí habiendo pulsado
00:33:38
el más, esto sería
00:33:40
un más, pero si yo he llegado
00:33:42
hasta aquí habiendo pulsado el menos
00:33:44
que es otro control distinto, esto sería un menos
00:33:46
con lo cual no sé qué poner aquí, aquí hay un if
00:33:49
si te pulso más pon más, si te pulso menos
00:33:52
pon menos, claro, ¿cómo puedo saber yo
00:33:55
quién me ha pulsado para ponerlo en el if?
00:33:58
no tengo ni idea, bueno pues puedo saberlo
00:34:01
porque los métodos de controlador pueden recibir
00:34:03
si yo quiero y si me da la gana
00:34:07
un objeto de tipo action event
00:34:09
de JavaFX, cuidado, recordad que os ofrece siempre las dos
00:34:12
no importéis la que no es
00:34:21
y este objeto diréis vosotros
00:34:23
y este objeto quien lo genera, quien lo aparece
00:34:26
recordad que a este método no lo llamáis vosotros por código
00:34:28
a este método lo llama automáticamente
00:34:31
la librería de JavaFX cuando un humano
00:34:34
o una máquina hace pum
00:34:37
entonces las librerías de JavaFX
00:34:40
cuando detectan que se ha pulsado el botón
00:34:43
construyen ellas un objeto Action Event
00:34:46
con toda la información del control que ha sido accionado
00:34:49
lo construyen ellas
00:34:53
ellas van al método de evento
00:34:55
que es este
00:34:57
y le pasan ese objeto
00:34:59
luego ese objeto
00:35:00
lo construye automáticamente JavaFX
00:35:02
cuando detecta que se ha accionado un control
00:35:05
lo construye empaquetando dentro mucha información
00:35:07
relacionada con el control que ha recibido la acción
00:35:11
y se lo pasa a este método
00:35:14
botón operación para que se ejecute
00:35:17
bueno, pues entonces yo puedo, si yo habilito
00:35:19
la recepción de ese objeto, que no es obligatorio
00:35:23
puedo no habilitarla, aquí por ejemplo no he habilitado
00:35:26
la recepción de ese objeto, lo va a crear igual
00:35:29
la interfaz, pero cuando llame al método
00:35:32
no se lo va a pasar, pero aquí si lo he habilitado
00:35:35
entonces cuando java.fx cree ese objeto
00:35:37
como resultado de haber hecho el click
00:35:40
va a llamar al método y además le va a pasar
00:35:42
el objeto, bueno pues de este objeto
00:35:44
nosotros podemos sacar mucha información
00:35:46
si uno hace . aquí tiene para aburrir
00:35:48
entre otras
00:35:50
cosas tiene
00:35:52
getSource y getSource
00:35:54
te dice quien generó
00:35:56
el evento
00:35:58
entonces yo aquí puedo hacer
00:35:59
oye, si
00:36:02
e.getSource
00:36:06
podría poner
00:36:10
es igual
00:36:12
al botón suma
00:36:14
tengo un pequeño problema
00:36:17
que no le he dado referencia al botón suma
00:36:18
porque hasta ahora no lo necesitaba
00:36:21
bueno, podría solucionarlo
00:36:22
y poner aquí
00:36:25
el botón suma fxml
00:36:27
con un nombrecito y habilitarlo aquí
00:36:29
el botón suma en fxid
00:36:31
darle un nombrecito
00:36:33
aquí en encode
00:36:35
vale
00:36:37
podría hacer eso
00:36:38
pero ni siquiera necesito meter tanta
00:36:40
morraya, porque
00:36:43
puedo decir, oye, si el botón que me llamó
00:36:44
voy a sacar de él, por ejemplo
00:36:47
el texto que tiene puesto
00:36:49
por ejemplo, e.getSource
00:36:50
que estoy aquí, es el
00:36:53
objeto que me ha llamado, es este
00:36:55
de este objeto a su vez
00:36:57
yo puedo sacar un montón de cosas
00:36:59
yo sé que es un botón
00:37:01
porque solamente puedo llegar a operación
00:37:02
con un botón, venga, pues le voy a
00:37:05
hacer un casting a button
00:37:07
Lo voy a guardar aparte fuera del if
00:37:08
Para que se vea más claro
00:37:14
Voy a sacar el botón que me llamó
00:37:15
Botón, botón pulsado
00:37:18
El botón pulsado
00:37:21
Es este
00:37:22
E.get source
00:37:23
Este es el botón pulsado
00:37:27
Tengo que hacer el casting
00:37:30
A, bueno primero importarlo
00:37:32
Y luego hacer el casting
00:37:34
Este es un casting controlado, no hay que temerle
00:37:35
Porque yo sé que a botón operación
00:37:41
solo voy a llegar
00:37:43
si he pulsado este o este, solo
00:37:45
porque son los únicos controles que tienen puesto aquí
00:37:47
botón operación, los únicos
00:37:49
entonces este es un casting necesario, imprescindible
00:37:50
pero controlado
00:37:54
vale, es el botón pulsado
00:37:55
y ahora, yo ahora ya podría
00:37:57
hacer, if botón pulsado
00:38:00
equals
00:38:02
el botón suma
00:38:07
repito, pero
00:38:11
claro, tendría que tener yo botón
00:38:13
suma, habilitado
00:38:15
como referencia aquí arriba
00:38:17
tendría que tenerlo habilitado como referencia
00:38:18
aquí arriba, no pasa nada, lo puedo habilitar
00:38:21
como referencia aquí arriba, igual que habilite
00:38:23
el text fill, igual, lo puedo
00:38:25
habilitar y entonces no se
00:38:27
me olvida aquí ponerle
00:38:29
su fxid
00:38:31
aquí
00:38:33
pero ni siquiera me hace falta
00:38:33
ni siquiera me hace falta pringarme tanto
00:38:36
digo, oye
00:38:38
si el botón que has pulsado
00:38:40
el texto que
00:38:43
tiene encima, porque el botón tiene aquí
00:38:45
un montón de métodos para sacar cosas sobre él
00:38:47
pues por ejemplo
00:38:49
tiene un gettest
00:38:50
tiene un gettest que te saca el texto que tiene
00:38:52
pues si el texto que tiene encima
00:38:54
resulta que es
00:38:57
igual a más
00:38:59
ala
00:39:00
pues ya tienes lo que queríamos
00:39:03
que es igual a más, pues ya está
00:39:04
operación entonces
00:39:09
igual a más
00:39:11
y si no, operación
00:39:12
igual a menos, tiene que ser el otro
00:39:18
porque solo hay dos que respondan con eso
00:39:19
el, a ver, botón
00:39:21
hasta aquí
00:39:31
a ver, entiendes
00:39:33
que este objeto, esta referencia
00:39:35
es una referencia directamente
00:39:37
al botón que ha sido pulsado
00:39:39
o sea, esta línea sí, ¿no?
00:39:40
vale, pues ese objeto botón es un objeto
00:39:43
que tiene propiedades, muchas cosas
00:39:45
entre ellas, una de las
00:39:47
propiedades que caracterizan a botón
00:39:49
es el texto que tiene encima
00:39:51
que lo puedes sacar con el método
00:39:53
getTest
00:39:55
entonces tú si del objeto
00:39:56
button, claro, esa clase button tú no la has
00:39:58
hecho, entonces tú no sabes que tiene dentro
00:40:00
pero si tú buceas dentro del objeto
00:40:02
button, ves que tiene un montón de cosas
00:40:04
entre ellas un gettest que es justo
00:40:05
el texto que tiene encima post
00:40:08
claro
00:40:09
entonces si el botón pulsado tiene un más
00:40:11
encima, el texto
00:40:14
que tiene encima es este
00:40:16
de hecho
00:40:17
es que no nos hace falta
00:40:19
ni el if, podemos hacer
00:40:21
op igual a botón pulsado
00:40:24
punto get test, y ya está
00:40:26
tal y como lo hemos hecho, incluso
00:40:28
nos armaríamos, vale
00:40:30
pero en cualquier caso lo que me importa a mi
00:40:32
de todo esto es este objeto
00:40:34
y es que
00:40:36
el método que responde
00:40:38
al evento
00:40:40
a la acción sobre la interfaz
00:40:42
ese método puede opcionalmente
00:40:43
si yo lo habilito, recibir
00:40:46
un objeto con mucha información
00:40:48
de quien ha recibido
00:40:50
esa acción
00:40:52
¿vale? y ese objeto
00:40:53
con toda esa información de quien ha recibido
00:40:56
esa acción es este objeto E
00:40:58
y ese objeto E seguramente en muchas
00:40:59
situaciones me va a ser necesario
00:41:02
a mí usarlo aquí
00:41:04
en este caso me ha sido necesario
00:41:05
para juntar en un único
00:41:07
método las respuestas
00:41:10
a los dos botones y así no he tenido que
00:41:12
hacer un método por separado
00:41:14
¿vale? entonces el ActionEvent
00:41:15
es el objeto que se genera
00:41:21
en los métodos
00:41:23
que onAction, que son los que
00:41:25
estamos usando hasta ahora
00:41:27
los métodos onAction son los que
00:41:28
se ejecutan cuando se da
00:41:31
la acción por defecto
00:41:33
la de por defecto de un botón es
00:41:34
pulsar, la de por defecto de un
00:41:37
combo box es
00:41:39
pulsar, ya lo hemos comprobado, la de por defecto
00:41:41
de un text field sería
00:41:43
darle al enter, sería el onAction
00:41:45
también puede saltar algo
00:41:46
pero hay controles que no tienen onAction
00:41:47
no tienen acción por defecto
00:41:50
o podemos querer capturar en un control
00:41:52
otros eventos relacionados
00:41:55
con ratón, con teclado
00:41:57
entonces no sería el onAction
00:41:59
sería el onKeyPrest
00:42:01
onMouseDrag
00:42:03
un montón de métodos que hay
00:42:05
que el Steam Builder me ayuda porque me los muestra a todos
00:42:07
si yo capturo un evento
00:42:09
del tipo onKeyPrest, onKey no sé qué
00:42:11
este sería key event
00:42:13
no sería acción event
00:42:15
y si yo capturo
00:42:16
un evento del tipo
00:42:19
onMouseDrag, onMouseDroped
00:42:20
onMouse no sé qué, este sería mouse
00:42:23
event
00:42:25
y si yo capturo un evento del tipo
00:42:25
onDrag no sé qué, onDrag no sé cuánto
00:42:29
que también los hay, esto sería drag event
00:42:31
¿vale?
00:42:33
pero como estamos capturando
00:42:35
el onAction que es el por defecto
00:42:37
pues es action event el que se genera
00:42:39
¿vale?
00:42:42
entonces eso me permite
00:42:45
en este caso
00:42:47
agrupar varios métodos en uno
00:42:48
o me permite cosas mucho
00:42:51
más interesante. Es como si tengo
00:42:53
varias ventanas,
00:42:55
varios stages,
00:42:57
porque quiero
00:42:59
cerrar uno y abrir otro, quiero cerrar
00:43:01
una escena y abrir otra, pues
00:43:03
ese me permite navegando hacia
00:43:04
arriba, luego lo vemos, acceder a la ventana en la que
00:43:07
estoy, en la que ese control está.
00:43:09
Muchas cosas.
00:43:12
¿Vale?
00:43:14
Vamos a probar si funciona antes de
00:43:14
parar.
00:43:17
Vale, pues
00:43:28
12 más
00:43:29
12 igual a 24
00:43:31
la suma va
00:43:34
y 23 menos
00:43:36
2 igual a 21
00:43:38
vale
00:43:41
venga, vamos a parar aquí unos minutejos
00:43:42
- 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:
- 1
- Fecha:
- 27 de abril de 2026 - 13:07
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 43′ 52″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 187.77 MBytes