GUI Botón que se mueve - 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:
vamos a grabar esta clase por lo tanto si me dais si habláis ya me dais consentimiento para grabar
00:00:00
vuestra voz vale entonces vamos a intentar hacer un programita como este la idea es que hay una
00:00:06
pregunta graciosa si vais sobre el no funciona vale si vais sobre el sí el programa modifica
00:00:14
la posición del sí vale para que no podáis darle no sé por qué esto probablemente porque está detrás
00:00:21
desde aquí ya no lo pilla, no lo puedo ni clickear ni nada, pero la idea es más o menos eso. La idea es
00:00:28
jugar un poquito con los botones, con los controles. Entonces, vamos a crear un nuevo proyecto.
00:00:34
entonces empiezo con lo de siempre vale le tengo que añadir aquí
00:00:44
aquí le tengo que crear aquí un nuevo oficiero
00:01:13
un file que sea mi lista o gui.fxml le pongo aquí una nueva clase que será el
00:01:29
el controller para que sustantivamente aquí haya los métodos ya que estoy le pongo un método ficticio
00:01:47
pero dejo allí vale para que luego vea que funciona al otro lado estoy preparando todo
00:02:03
para que funcione luego si lo quiero lo elimino y luego tengo que editar este señor de aquí con
00:02:15
SimBuilder. SimBuilder está dando algunos problemas de vez en cuando se lía cuando se lía lo más
00:02:25
probable que hayáis hecho algo raro y que él no reconozca su propio código o habéis modificado
00:02:37
el código entonces allí se me empieza a molestar el consejo pues de vez en cuando mientras funciona
00:02:44
hacer copias de este señor vale para que sea un determinado momento deja de funcionar podáis
00:02:53
eliminar lo que está trabajando y no empezar desde cero va a empezar desde donde habéis dejado antes
00:02:59
tened en cuenta que de todas formas hacer la interfaz gráfico cuando ya tenéis todo a
00:03:05
lo más difícil es la parte del control del que haga cosas donde tenéis que vosotros pensar en
00:03:09
algoritmo en el que tengo que hacer este código lo tenéis si tenéis que volver a rehacer el botón
00:03:17
que cuando lo clicas llama este método es sencillo no se tarda mucho vale aún así se os pasa cinco o
00:03:23
seis veces pues por eso fijaos también que por ahora lo digo ahora porque hoy pasará a mí no
00:03:29
me ha pasado vale lo que puede ser es que vosotros en el utilizarlo lo estáis utilizando de una forma
00:03:37
un poco impropia entonces a veces hagáis de este cabo como vosotros que a veces os da que cuando
00:03:44
dais al play en vez de ejecutar el main que tenéis ejecuta otra cosa ejecuta un css2bin o cosa por
00:03:49
el estilo entonces no os funciona vale fijaos en el que estáis ejecutando vale entonces que hacemos
00:03:59
nosotros con esto? Pues ponemos un peina normal y corriente, ponemos una etiqueta donde ponemos
00:04:05
una graciosísima pregunta. ¿Qué ponemos como pregunta? ¿Eh? No, no, no, déjate suscribirte.
00:04:12
¿Cómo andamos en Madrid? ¿Te gusta programar? Interrogación. ¿Qué dejamos ahí? Si lo
00:04:25
tenemos más grande o más pequeño actuaremos sobre eso con CSS y luego dos botones, botón uno, botón dos, esto pone sí, esto pone no, entonces esta sería y luego si lo quiero hacer más
00:04:44
bonito de otra forma o cosa por el estilo puedo trabajar aquí con CSS o puedo trabajar aquí mismo haciendo más grande o más pequeño o lo que sea, quiero que estos botones
00:05:06
sean más pequeñitos por una razón práctica vale que ahora lo veremos después entonces tengo estos
00:05:15
dos la idea es que un usuario ponga así y entonces que le diga muy bien si intenta pinchar no por
00:05:22
ese fin no se mueva entonces vamos a hacer la parte fácil aquí le decimos que como control
00:05:31
le quiero utilizar el controlador, esto no lo reconoce, entonces como siempre voy aquí, lo guardo,
00:05:40
me voy aquí y compruebo que esté, guardo todo y luego hemos visto que el controlador en teoría
00:05:47
debería estar porque ya lo he creado, pero no lo ve ahora mismo, pues entonces lo cierro,
00:05:59
con un poco de suerte
00:06:05
ahora si me ve
00:06:10
entonces una vez que le he dicho que este es el controlador
00:06:12
cuando voy al botón
00:06:24
en el botón
00:06:25
en la parte de código
00:06:27
en la parte de on action del código
00:06:28
pues me aparecen
00:06:31
los varios métodos
00:06:33
que he definido en el controlador
00:06:35
particular aquí
00:06:37
cuando hago clic
00:06:38
no lo sé, que me cambie este de aquí
00:06:40
con muy bien, vale
00:06:46
entonces, para cambiar
00:06:47
este de aquí, necesito darle una identidad
00:06:50
le doy que se llama
00:06:52
texto, vale
00:06:54
guardo esto
00:06:56
me voy
00:06:57
al
00:07:02
controlador
00:07:03
y le digo que
00:07:05
va a tener una conexión
00:07:08
fxml con
00:07:10
un label que se llama txt. Un label lo tengo que importar. Este, no este, ¿vale? Son dos
00:07:12
packages distintos. Y aquí le diré que cuando haces clic en txt.setText, muy bien. Por tanto,
00:07:23
Por ahora tengo esto, el lanzador que no es, ah no, claro, sí, me he olvidado de cambiar el main, ¿vale?
00:07:38
El main este de aquí es el main por defecto que me da el proyecto de JavaFX, por lo tanto aquí le tengo que decir que quiero cargar lo que yo quiero, ¿vale?
00:08:02
Entonces, esencialmente esta parte aquí se queda, a ver si me acuerdo hoy.
00:08:16
Pues aquí creo un objeto que es un SXML loader, que es igual a FXML, no me acuerdo de nunca.
00:08:21
New fxml loader, loader, get class, paréntesis, punto, fuera, o sea, no, paréntesis, fuera,
00:08:33
Y aquí le pongo gui.fxml. Gracias. Este de aquí lo cargo, etc. Entonces, ahora mismo,
00:08:56
esto sería mi scene, veo, no, está ahí, perdón, entonces, a, no, no, no, no lo voy a escribir, pues ya está aquí, aquí dentro voy a cargar, vale, entonces esto me da un parent, si no me equivoco, parent b, coma, por root, no, no sé si tenemos root, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no.
00:09:15
Aquí root es igual a loader.load, justo, esto tiene que estar dentro del este, y luego
00:09:51
creo una sin, ¿me equivoco? No. ¿Qué hago? Escrín. No. Escrín. Escrín. Escrín. Escrín.
00:10:10
Así. Tendré que crearlo nuevo, ¿no? Sí, pero justo la primera es en mayúscula. Igual
00:10:23
que le paso el root y el tamaño con el que creo que sea la escena, ¿vale?
00:10:33
Hacemos 800 por 800.
00:10:42
Luego, esta escena la acepto en el primary stage, que es este que tiene aquí, y luego lo incluimos.
00:10:46
Con esto debería funcionar, ¿no?
00:10:55
Vale, vamos a ver si ahora funciona.
00:10:58
gusta programar, veis que 800x800 es más grande de lo que es, pues debería mirar yo
00:11:07
cuál es el tamaño correcto y cosas por el estilo. Si pongo sí, me pone muy bien, si
00:11:12
pongo no, por ahora no me interesa.
00:11:16
Pienso 600x300.
00:11:18
700x300, creo que es lo que viene.
00:11:21
Al otro lado, por defecto.
00:11:35
Esto lo podría ver, en teoría, por aquí, ¿no?
00:11:38
A properties de este señor de aquí, ¿no me lo pongo por algún lado?
00:11:43
No, no, no.
00:11:47
Sí, 600 por 14.
00:11:51
¿Vale? Lo que estoy viendo aquí es 600 por 14.
00:11:53
Si quiero que se corresponda, pues este número de aquí lo pongo al otro lado.
00:11:56
No sé si, vamos a probarlo.
00:12:00
Esto está sobrecargado así.
00:12:03
Ah, claro, no hace falta poner el tamaño.
00:12:05
entonces va a pillar el tamaño ya definido dentro de estos objetos
00:12:12
los dos parámetros al lado si yo quiero forzar un tamaño distinto
00:12:20
todavía más sencillo vale entonces
00:12:26
a partir de aquí esto está funcionando tengo todo lo que tengo que tener pues
00:12:31
lo único que me queda hacer es mover el botón derecho. Para mover el botón derecho yo quiero
00:12:37
que en determinadas situaciones pase algo para moverse. Entonces necesito aquí crear un método
00:12:45
que lo que haga es hacer mover el botón. Entonces tendré un método mover que hace mover el botón.
00:12:52
Ahora, la idea es que o lo dejo así, y aquí me hago una referencia al botón que se tiene
00:13:04
que mover, siendo que solo un botón se mueve, o en el caso en que yo quiera que el propio
00:13:14
botón en el que tú haces algo es el que se mueve, entonces no lo debería hacer sin
00:13:22
parámetros va a poner aquí un evento vale y cuando pasa este evento pillar
00:13:31
quien ha hecho el evento y mover ese botón de ahí vamos a hacer el segundo
00:13:38
modo es varios porque si trabajamos también es si me voy aquí y voy a este
00:13:43
botón veis que en el code nosotros hemos dado esto una acción vale un hecho es la
00:13:50
más importante, digamos, del botón, que es cuando haces clic en el botón, ¿vale?
00:13:59
Pero en este caso nosotros no queremos usar este evento. Nosotros no queremos mover el botón cuando
00:14:06
hago clic. Podría ser que cada vez que yo hago clic se mueva de otro lado, como decir, no me has clicado,
00:14:12
¿vale? Podría ser eso también. Pero nosotros no lo queremos así. Nosotros queremos que sea imposible
00:14:16
de llegar allí porque cuando yo entro encima del botón, el botón se mueva. Entonces el evento
00:14:21
no es el action. Es otro evento. Es onMouseOver, que vosotros habéis visto en HTML barra Javascript.
00:14:29
Lo busco por aquí. Veis que aquí hay varios eventos. Estos son eventos de drag and drop,
00:14:38
de cuando pincho y lo arrastro. Si detecta que se ha empezado a arrastrar, si al final cuando ya se
00:14:45
arrastrado si el mouse entra mientras está arrastrando etcétera estos son todos distintos
00:14:57
eventos relativos con el track and roll vale eventos de keyboard este de aquí son con el teclado estoy
00:15:08
poniendo una tecla la he presionado la he soltado o la he presionado y soltado vale luego está ratón
00:15:15
que es lo que nos interesa, luego está de rotación, porque esto también puede estar
00:15:23
relacionado con cosas de móviles, entonces si tengo una pantalla táctil y he rotado y
00:15:27
cosas por el estilo, swipe de haber deslizado, gracias, o tocado, o haciendo zoom, o sea que
00:15:33
tengo todos estos posibles eventos. A eso nos interesan ahora mismo los eventos del mouse.
00:15:42
entonces nosotros pillamos el mouse y miramos cuáles son
00:15:49
a nosotros lo que queremos es que cuando el ratón
00:15:53
entra en el botón
00:15:56
pues se mueva, ¿vale?
00:15:59
entonces, ¿cuál veis que hará esto?
00:16:01
con mouse enter
00:16:06
esto es mi evento que cuando el mouse entra
00:16:07
en el campo de acción del botón
00:16:11
pues ejecutará un método
00:16:14
¿Qué método? Pues el otro. ¿No lo he guardado? ¿Sí lo he guardado? No.
00:16:17
Acordaos que si aquí no aparece, esto sí lo podéis refrescar simplemente clickeando aquí y seleccionando otra vez el controller.
00:16:25
Entonces con esto ya ha recargado el control. No, esta vez no.
00:16:34
Esta vez el detective no. Otra vez el detective no ha hecho.
00:16:38
a lo mejor no le he puesto el fx
00:16:41
a refrescar que?
00:16:56
si pero el refresh no debería afectar ese, el refresh afecta al otro
00:16:57
aquí un refresh no lo he encontrado, habéis encontrado el refresh
00:17:06
Entonces, debería aparecer en algún momento, lo borro, lo pongo otra vez, ahí, ahora sí.
00:17:09
Lucháis un poquito con ellos, la forma de refrescarlo, a veces cerrarlo y abrirlo otra vez,
00:17:23
es un poco lento, seguro que hay un método mejor, cuando lo encontraré en un futuro, pues os lo diré.
00:17:30
vale entonces ahora cuando el mouse entra aquí pues ejecutará el mundo vamos a ver si funciona
00:17:34
guardo vuelvo aquí actualizó esta parte de aquí vale para estar seguro que lo puedo mirar aquí
00:17:47
vale, por algún lado tiene que decir es esto, onMouseEntered, move. Entonces ahora le hago hacer,
00:17:57
por ejemplo, en el controller que imprima algo y entonces cada vez que yo entro en ese botón
00:18:06
me escribirá algo, veis, entro algo, ahora que si estoy dentro y me muevo no hace nada,
00:18:20
es al momento en que le entro que salta esta cosa entonces ahora tengo toda la parte de interfaz
00:18:26
gráfica barra eventos ya la tengo lista tengo lo único que tengo que hacer ahora es implementar
00:18:34
un metodito aquí que lo que haga es cerrarlo ahora fijaos que por ahora lo hemos superpuesto sin
00:18:43
evento vale entonces si quisiera aquí ahora tener esa equipo debería poner aquí un botón algo así no
00:18:51
gustó llamar a ver al otro botón y ya tendría acceso vale pero esto me serviría por cualquier
00:18:58
cosa que yo haga mucho siempre mueve este botón en vez de yo quisiera tener dos botones que se
00:19:12
muevan vale en general que tengo tres opciones así bueno no tanto mucho y no vale y quiero que
00:19:18
tú puedas pinchar sólo si entonces son los dos dólares en el mover debería hacer dos duplicar
00:19:25
este código de aquí o sea que yo no quiero entonces los acordáis como hacía podía crear
00:19:31
este método de aquí en vez que sea sin parámetros ponerle aquí un evento nosotros hemos visto acción
00:19:36
un evento esto tengo que importar y fijaos que hay a vt o java cx vale quiero el de java cx vale
00:19:44
perfecto esto se ha enfadado con mucho
00:19:59
ahora vale entonces si ahora yo lo lanzo que va a pasar que cuando entro en el no explota vamos
00:20:06
a entender por qué explota.
00:20:28
¿Vosotros qué hacéis? Porque todo esto
00:20:30
lo ponéis a una
00:20:32
tarjeta artificial y preguntáis.
00:20:33
Vamos a leer si entendemos algo.
00:20:35
Me dice
00:20:38
una illegal argument exception.
00:20:39
Argument type
00:20:42
mismatched.
00:20:44
¿Qué quiere?
00:20:45
Tipo de argumento no sé qué.
00:20:46
Mismatched es como que no corresponde.
00:20:53
Dice, oye, mira.
00:20:55
Es una excepción de
00:20:57
argumento ilegal. Argumento que
00:20:58
no puede estar ahí. ¿Vale? ¿Cuál es la descripción? Pues que el tipo del argumento
00:21:01
no se corresponde. ¿Qué os hace pensar? ¿Dónde está el error? Aquí. ¿Qué es el
00:21:07
argumento? Está aquí. ¿Vale? Te está diciendo este tipo no me gusta. Te está diciendo oye
00:21:17
mira, tú estás haciendo un móvil de action event, pero cuando pasa esto, hay un error en este tipo de aquí.
00:21:30
¿Qué os hace pensar? Que lo que se crea, ¿qué es?
00:21:41
Lo que deberíais pensar, y lo vemos así para que vosotros reflexionáis sobre esto y empezáis a pensar en la filosofía,
00:21:49
es que se crea un evento, porque algo pasa. Alguien llama a este móvil.
00:21:58
Entonces el evento se ha creado y hemos visto antes que funcionaba, cuando yo entraba pues me escribía, cuando esto no estaba me escribía este algo, ¿vale? Ahora se lo he metido y se enfada, dice, oye, mira, no, que no es esto, porque posiblemente lo que yo estoy llamando action event no es un action event, lo que se está creando ahora no es un action event, porque action event se creaba ¿cuándo? ¿Cuándo se creaba action event?
00:22:03
al hacer el clic
00:22:29
hacer el clic, eso es un action
00:22:35
y crea un actionEvent
00:22:38
entonces cuando yo uso esto
00:22:39
un action
00:22:41
el método puede ser o sin parámetros
00:22:43
o utilizando un actionEvent
00:22:47
porque este evento
00:22:50
de aquí crea un objeto
00:22:52
actionEvent que luego se linkará
00:22:53
con este método y lo usaré ahí dentro
00:22:56
lo que hemos hecho ayer
00:22:58
ahora nosotros que conocíamos solo el actionEvent
00:22:59
decimos, vale, pongo actionEvent
00:23:02
Pero lo que te está diciendo es que algo pasa, se crea un evento, pero el tipo de este evento no es ActionEvent, entonces me salta una ilegal argumentación de exception. Estoy usando este método, aspirándome a un ActionEvent y me estás metiendo ahí algo que no es un ActionEvent.
00:23:03
lo que pasa es que no lo sé
00:23:19
porque lo estoy aprendiendo ahora
00:23:29
pero hay distintos tipos
00:23:31
de eventos, el action event
00:23:33
es cuando hago el click o cuando hago la acción
00:23:35
entre comillas, pues esto no es
00:23:37
un evento, entrar con el ratón
00:23:39
no ha hecho click, por lo tanto no se genera
00:23:41
un action event, no ha habido
00:23:44
el evento de acción
00:23:45
ha habido un evento relacionado a gol
00:23:46
con el mouse
00:23:49
pues
00:23:54
eso
00:23:56
entonces cada uno de estos elementos que tenemos aquí pues generará su propio evento
00:24:03
posiblemente por categorías estos eran eventos del mouse pues estos realmente si le pongo más
00:24:18
event no funcionará si le pongo action event tampoco estos serán un kibble event o key event
00:24:25
no lo sé, lo tengo que buscar. Pero la filosofía es siempre eso, cada uno de estos eventos estará
00:24:38
relacionado, generará un objeto de un determinado tipo y si yo uso aquí un método que tiene que
00:24:46
trabajar con ese método tendré que ir a mirar cuál es ese método, cuál es ese evento. Habrá
00:24:52
distintos tipos de eventos, que puedo ir a buscar tanto en una API como en inteligencia
00:25:00
artificial y cosas por el estilo, y decirle, mira, estoy haciendo, estoy haciendo, ¿qué
00:25:08
tipo de evento genera? Pues el evento es el Keyboard Event. Pues entonces allí le pondrán
00:25:11
Keyboard Event. Pero la idea no es saber qué, pero saber qué tengo que poner. Luego, una
00:25:16
vez que yo sé, estoy consciente que lo es, pues no puedo saber todo en la vida, pues
00:25:24
sé que cuando me enfrenta a una cosa así tengo que ir a buscar qué tipo de evento.
00:25:28
Entonces si lo pongo así y ahora lo lanzo, ya vuelve a funcionar.
00:25:33
Ahora me está entrando aquí correctamente, no está haciendo el error y tengo a disposición
00:25:42
mi mouseEvent que llamaré m. Entonces ahora lo que quiero hacer es saber quién ha ejecutado,
00:25:50
quien ha causado este evento. Y esto es como la otra vez, es m.getSold. Este de aquí devuelve
00:26:00
el componente que ha generado este evento de aquí. Este de aquí sería un object, pero yo sé que no es
00:26:17
un object vale yo este de aquí lo he puesto en un botón lo sé porque lo he hecho yo ahora si tú
00:26:30
quisiera mover distintos tipos de componentes pues a lo mejor deberías poner algo más de alto
00:26:37
nivel si vosotros buscáis la jerarquía con que están hechos los controles porque probablemente
00:26:43
todos los controles derivarán de una de una clase genérica que será control en general y luego desde
00:26:47
controla el botón, hay textarea, hay label, o cosa por el estilo. Y sabría que ver cómo está hecho de verdad, ¿vale?
00:26:54
Pero como yo sé que ahora es un botón en concreto, le puedo decir, no, yo quiero un botón, ¿vale? Un botón, cuidado, de JavaFX, ¿eh?
00:27:02
No de Lang, no de AuvT, de JavaFX. Y esto se enfada porque dice, no, esto es un object. Yo sé que esto es un botón y puedo hacer un casting.
00:27:11
dame esta cosa de aquí, esto será un objeto, pero yo sé que es un botón, dame un botón, si no lo supiera podría preguntar, si esta cosa de aquí es tan soft de button, pues entonces hace esta cosa, y si no, entonces si yo tengo esta cosa aquí, pues ahora podría decir, por ejemplo, escribeme o, vamos a ver qué hace, es el botón que tiene no dentro,
00:27:26
Entonces me está reconociendo el botón correcto. Vale, perfecto. Entonces ahora me queda a
00:28:01
este señor hacerle algo para moverlo. Po punto set. Probablemente, siempre filosofía
00:28:11
de Java y cosas por el estilo, el botón tendrá una posición. Y yo lo que quiero es modificar
00:28:28
esa posición entonces nosotros tenemos siempre getter y setter pues la posición será un elemento
00:28:38
un atributo de este botón que me dice está en esta posición entonces por aquí yo puedo buscar
00:28:46
y ver set y get para ver si algo me dice oye mira esto podría ser vale pero por ejemplo max size
00:28:53
muchas cosas esto si no tengo tiempo lo busco en internet o cosas por el estilo tengo mucho
00:29:00
tiempo me lo leo vale pero fijaos que puedo poner un escalado puedo poner muchas cosas
00:29:10
en particular es una cosa que se llama layout layout x y layout y estos son la x y la y de
00:29:16
dónde está este botón. Entonces, si yo pillo esto y lo sexto a 100, por ejemplo, cuando yo lo lanzo,
00:29:26
al entrar aquí me lo mueve a 100. Está claro que ahora cuando entro otra vez me lo mueve a 100,
00:29:44
entonces me lo deja ahí. Entonces ahora lo puedo quitar. Por ahora, simplemente he encontrado la
00:29:53
forma de mover cómo está el set está el get vale entonces si yo puedo poner una cosa y ya la
00:30:01
posición actual y a esa posición actual le restas 50 quiere decir que cada vez que entraré pillo
00:30:20
donde está ahora, y lo muevo 50 a la izquierda, entonces, ahora yo entro y me lo da de 50
00:30:36
a la izquierda, entro, 50 a la izquierda, entro, 50 a la izquierda, entro, 50 a la izquierda,
00:30:51
y no me deja pillarlo hasta que sale, ¿sí? Para saber dónde está y ver si puedo hacer
00:30:56
algo lo que puede hacer es inscribirme donde estoy vale y eso o punto gert leo text
00:31:09
entonces veamos lanzó esto lo estoy haciendo de forma como entre comillas deberías hacer vosotros
00:31:28
para decir yo no sé hacerlo voy haciendo pruebas voy descubriendo cómo trabajar con esto vale me
00:31:37
ha dicho la inteligencia artificial que con setLayout, getLayout, pues puedo ver dónde está y
00:31:43
cambiarle la cosa, pues voy a hacer pruebas. Entonces ahora veo que está aquí y veis que cuando sale es porque
00:31:49
está fuera, ¿vale? O sea que esto es el cero. Perfecto, ahora sí que este es el cero. Entonces, si sé que
00:31:56
eso es el cero, me podría preguntar
00:32:06
oye, mira, si he ido
00:32:08
a la izquierda
00:32:10
del cero,
00:32:12
¿me lo apareciera al otro lado?
00:32:14
¿Sí?
00:32:17
Sí.
00:32:18
Sí.
00:32:21
Oh, punto.
00:32:23
Get layout
00:32:24
x
00:32:26
es menor que cero.
00:32:27
Si después de haberlo
00:32:33
movido es a cero, pues
00:32:34
entonces
00:32:36
hazme hacer un salto a otro lado
00:32:37
ponlo a
00:32:40
no lo sé, al principio había empezado
00:32:43
tipo a 400, pues vuélvelo a su sitio
00:32:46
a 472
00:32:48
lo pongo a 472
00:32:50
feo, eh
00:32:52
estamos haciendo feo, pero
00:32:53
trabajando un poco
00:32:58
entonces ahora tengo
00:33:00
mi botón
00:33:02
que cuando intento pincharlo
00:33:04
se mueve, se mueve, se mueve
00:33:08
y cuando llega a un lado pues vuelve a su sitio. Yo intento pillar otra vez y ya no puedo.
00:33:10
En una versión muy sencilla de esta cosa, a ver si ya lo he hecho. No lo puedo clicar.
00:33:17
Si lo intento a lo mejor a veces lo consigo. Para hacerlo un poquito más bonito, lo que pasa es que se mueve también arriba y abajo.
00:33:25
Podría hacer lo mismo arriba-abajo. Es decir, cuando lo mueves así, lo mueves también así,
00:33:40
se moverá en diagonal. Es decir, siempre es lo mismo. Y si llega un momento en que me paso y me
00:33:52
me voy demasiado para arriba, pues Z lo A, lo aflito, vuelvo para abajo. Entonces, ¿qué
00:34:06
pasa? Aquí tengo esto, ah no, lo he hecho mal, lo he hecho mal, lo he hecho mal, ah
00:34:20
porque aquí lo he puesto ahí, esto sería Y, Y, Y. Ahora se mueve por allí, de vez
00:34:37
Esto parece ya un poquito más aleatorio, en realidad no es aleatorio, va siempre en ese mismo sitio, veis que hace siempre esta S, tiqui, tiqui, tiqui, tiqui.
00:34:53
Lo importante también es que yo lo mueva de un tamaño suficiente, me explico, si yo aquí en vez de menos 50 lo quito de menos 1, me lo mueve, pero yo me quedo dentro.
00:35:07
entonces, si a lo mejor vengo por aquí
00:35:22
no lo consigo pillar
00:35:26
pero si vengo por aquí, lo mueve
00:35:27
y ahora estoy dentro, lo puedo quitar
00:35:30
entonces, en teoría debería ver
00:35:31
cuál es el tamaño
00:35:36
de...
00:35:38
si voy demasiado rápido no consigo procesar
00:35:39
entonces consigo entrar igualmente
00:35:42
el tamaño del
00:35:43
botón y moverlo
00:35:45
al menos del mismo
00:35:48
tamaño, de esta forma
00:35:50
estoy seguro que mi ratón se quede fuera del botón este.
00:35:52
Voy a ir a ver aquí cuál es el tamaño.
00:35:56
Hay una propiedad.
00:36:02
esta es la posición inicial pero no veo el país white de 34 25 34 25 si yo lo muevo en
00:36:18
el ancho 34 en altera 25 siempre mi ratón cuando lo muevo estará fuera entonces al
00:36:40
entrar otra vez lo hará. Esto sería, digamos, lo mínimo, ¿sí? Vale, ok, hagamos un poquito distinto.
00:36:47
También aquí podría haber problemas de si se mete detrás de esto, ¿vale? Que es lo que me ha pasado
00:36:59
antes, creo, que ha llegado un momento que si se mete detrás de este de aquí no consigue entrar en
00:37:05
ese, por cierto, esto debería estar como detrás del todo o estar deshabilitado para que no me pase
00:37:10
problema o yo debería comprobar que este botón nunca se ponga en esta zona aquí
00:37:16
lo dejamos por ahora así y después le hacemos un poquito de aleatoriedad para que esto se mueva
00:37:24
con lo que hemos visto hasta ahora suficiente entre comillas el ejercicio está hecho y los
00:37:30
elementos que podéis utilizar y que tenéis que utilizar ya los tenéis para hacer el cambio que
00:37:40
tenéis que hacer y cosas por el estilo. La única cosa es que podríamos a este punto mejorar el
00:37:46
algoritmo de movimiento para intentar hacerle hacer algo más lógico. Por ejemplo, en vez que
00:37:51
se mueva siempre de 50 en una dirección y cosas por el estilo, pues que haya un movimiento aleatorio.
00:37:59
Ya si vosotros en vez de 50 menos o 50 más le ponéis un pequeño random diciendo que a veces
00:38:05
se mueva a la derecha, a veces a la izquierda, a veces arriba, a veces abajo, pues ya podría
00:38:13
ser suficiente. Si queremos un primer enfoque así, pues esto cuando se llama, yo aquí
00:38:18
Y hago un, bueno, doble x es igual a, digo, vamos a crear un random, random r es igual a new random coma.
00:38:29
Le hacemos que int 1 es igual a r.nextint entre 0 y 100.
00:38:55
Va a ser algo, ¿eh?
00:39:15
Y 2.
00:39:19
¿Vale?
00:39:22
Y luego cuando tengo que moverlo, pues le digo, si 1 es menor que 50, pues entonces hace esto.
00:39:22
No, hace esto.
00:39:39
Esto lo quita 50 hacia atrás y esto le suma 50.
00:39:43
Luego, hago lo mismo con 2, pero moviendo la Y, y una vez que lo he movido, tengo que comprobar si ha salido de los márgenes, ¿vale?
00:39:47
entonces si es menor que cero pues lo resete a este punto de aquí y también voy a comprobar que
00:40:20
si a dónde va es mayor
00:40:31
por ejemplo aquí 472 me queda como una caja así si se la da allí pues lo vuelves a cero
00:40:37
y si supera los 300, pues lo vuelves arriba, 10. Si hago una cosa de ese estilo, la idea es que aquí
00:40:45
tengo una caja como entre 10 y 300 así, y entre 10 y 472 así, donde sustancialmente se puede
00:41:04
mover de 50 en 50 en direcciones variables si sale de esta caja va al otro lado vale entonces
00:41:11
tiene cosas y normalmente se mueve veis que ahora el movimiento es más aleatorio cuando
00:41:17
sale de la caja salta al otro lado y cuando está dentro de la caja más altitos más pequeños
00:41:23
esto es es aleatorio vale veis que tiene un comportamiento que ha definido con esta
00:41:32
pues aquí pero no es aleatorio de un punto cualquiera aquí dentro es nunca podré hacer
00:41:40
clic porque siempre me lo mueve mínimo de 50 por lo tanto nunca estará dentro de y ha entrado y
00:41:47
me lo ha movido en un sitio donde donde está pero al mismo tiempo es un poquito más aleatorio que
00:41:54
antes opción número uno si no podríamos hacer justo para para gestionar esto no es elegante
00:41:59
como lo he hecho estas cosas de 50 esta cosa de 100 aquí esta cosa de poner 472 es feo vale son
00:42:14
cuando se usan números así de que sea más grande o más pequeño pues no son números pero es para
00:42:24
que entendamos un poquito cómo funciona y luego uno puede intentar hacerlo de forma más elegante
00:42:33
vamos a crear un 2
00:42:39
Así no borramos este no. Y si queremos, creamos otro botón, que es el segundo no, que también es
00:42:43
no. Pero este de aquí se mueve con move2. Siempre al entrar con el ratón, sería un mouse enter,
00:43:08
Pues no me lo ve, voy aquí, lo borro, lo cago en el cabezo, voy aquí, lo guardo, ¿vale?
00:43:24
Este botón de aquí se mueve con el algoritmo que hemos echado aquí, aquí hacemos un algoritmo nuevo y este botón se
00:43:49
se moverá de una forma distinta. Lo guardo, vuelvo aquí, vuelvo a mi control. Vamos a hacer una cosa
00:44:05
distinta aquí, vamos a hacer que se mueva pero de una forma aleatoria. Entonces yo necesito un
00:44:19
mínimo máximo, un mínimo máximo y que él elija aleatoriamente el mínimo máximo. Entonces por
00:44:25
ahora pienso solo en la X, ¿sí? Voy a dar el aire. Entonces, ¿cuál es el mínimo en la X?
00:44:34
¿Cuál es el máximo en la X?
00:44:49
¿Más elegante? Pues vamos a preguntar cuánto es grande el panel, ¿vale? Entonces,
00:44:51
mi panel básico era un pane, aquí el panel básico lo llamo pane, guardo, ahora esto está conectado
00:45:10
a mi pane, entonces si yo puedo preguntarme aquí, oye mira, ¿cuál es el ancho del pane?
00:45:38
Ahora, si yo lo pongo en cero, está aquí. Si yo lo pongo en 500 y esto es grande 500,
00:45:49
¿dónde está el botón? Aquí. Entonces, mi máximo no puede ser 500 porque no se vería,
00:46:10
no puede ser el width. Sería el width menos, justo, el ancho del pane menos el ancho del botón.
00:46:21
Así siempre se verá. Entonces, yo puedo moverlo donde me da la gana entre estos dos, ¿vale?
00:46:43
Entonces, doble nuevo x será igual a, hagamos un random, random, random, es igual a random,
00:46:54
entre
00:47:08
será un
00:47:10
rand.next doble
00:47:14
entre minx
00:47:16
y
00:47:20
maxx
00:47:22
¿sí?
00:47:24
mal
00:47:29
repito, penso todos con x
00:47:29
luego todo esto me pongo y
00:47:32
y debería funcionar en vez de que y
00:47:33
y ya está
00:47:35
¿vale?
00:47:37
ahora, esto funcionaría
00:47:38
yo podría hacer o.setLayoutX en nuevo x y funciona. ¿Funciona? ¿Te lo digo? ¿Te lo voy a hacer? No, ¿eh?
00:47:40
Esto explota porque... ¿Qué estoy haciendo? Esto sí, esto no. ¿Qué estoy haciendo más?
00:48:06
A ver, null pointer exception. No está conectado al pane.
00:48:33
¿Has puesto lo del arroba fxml?
00:48:39
Pero no lo está pillando bien.
00:48:42
Es posible que aquí...
00:48:51
Se llama pane, sí.
00:48:53
A veces...
00:48:57
No.
00:48:59
A veces tarda un rato en entenderlo.
00:49:03
Ahora parece sí que funciona.
00:49:12
¿Vale? ¿Funciona esta cosa?
00:49:14
Entregamos.
00:49:17
¿Sí?
00:49:19
¡Suspenso!
00:49:21
¿Por qué?
00:49:22
No es suspenso, está bien, pero
00:49:27
el problema es que como esto es totalmente random,
00:49:28
me lo podría mover
00:49:32
en un sitio que es
00:49:33
parecido a donde estoy.
00:49:35
No he puesto un control
00:49:38
que me dice, sí, pero después de haberlo movido,
00:49:39
después de haber elegido el X,
00:49:41
este nuevo X no puede
00:49:44
estar demasiado cerca al viejo X. ¿Se entiende? Entonces, dile, pongamos esto, el nuevo X
00:49:45
lo pongo igual al viejo X, mientras el nuevo X menos un cierto tamaño, pongámoslo,
00:50:10
del discolagamento, es mayor, no, es, no, es, mientras el nuevo x sea incluido entre el viejo x menos 50 y más 50,
00:50:39
eso es lo que quiero hacer, ¿sí? Mientras que el nuevo x sea mayor del viejo x menos algo, por ejemplo, menos 50,
00:51:04
y el nuevo x sea menor que el viejo x más 50,
00:51:20
cámbialo.
00:51:37
Dame una cosa al azar.
00:51:39
Pero esta cosa al azar, con respecto al viejo,
00:51:41
es muy cerca, es entre menos 50 y más 50,
00:51:45
pues cálculame otro rango.
00:51:50
No me vale.
00:51:52
Es demasiado cerca donde estaba antes.
00:51:53
¿Entiendes?
00:51:56
Donde esté 50, en realidad podría ponerlo como un... no sé cómo llamarlo.
00:51:57
Interrol.
00:52:04
Minmove.
00:52:09
Movimiento mínimo.
00:52:23
Donde en realidad este minmove sería cuánto.
00:52:25
¿Lo veis?
00:52:28
¿Esto qué es? Debería ser un doble.
00:52:51
¿Lo veis o no?
00:52:57
O sea, yo tengo un botón aquí.
00:53:01
vale lo puedo meter en cualquier punto desde aquí hasta aquí vale porque hemos dicho que no hasta el
00:53:07
borde porque si no me lo pinta afuera si me elige este punto aquí ningún problema lo me vaya y ya
00:53:14
está el problema es si me elige un punto yo aquí tendré ratón que sea muy cerca del botón del punto
00:53:20
actual si yo estoy aquí y él me lo mueve solo aquí pues mi botón mi mouse se quedaría allí
00:53:27
dentro entonces yo cuando entro en algún lado me lo tiene que mover de un tamaño suficiente o sea
00:53:34
me valen no me valen cualquier puntos me valen sólo los puntos entre aquí y aquí o aquí en un
00:53:41
cierto sentido entonces tengo que encontrar una forma para eliminar estos puntos de aquí estos
00:53:53
puntos aquí no me valen porque si el punto nuevo vale cae en uno de estos son uno de estos puntos
00:54:05
rojos y yo construiría el cuadrado aquí y se ha entrado desde este lado ahora estoy dentro del
00:54:13
botón entonces yo le tengo que decir oye mira muévelo pero así luego el punto nuevo está más
00:54:21
está demasiado cerca con respecto al punto viejo pues no me vale y yo lo que he hecho es este nuevo
00:54:30
cerca es a 50 menos y 50 más vale esto ya lo dudo como 50 el corazón en realidad como no es el centro
00:54:37
del botón es el ancho pero veo que siento de este lado no me lo puede mover de uno no tiene que
00:54:50
mover como mínimo del tamaño mismo del botón. Si entro de aquí, me lo tiene que mover todo el botón,
00:54:58
y si entro de aquí, me lo tiene que mover todo el botón a la izquierda. Entonces el tamaño mínimo
00:55:07
de este 50 en realidad no es 50, es o .build o .getbuild. Esto me vale sea cual sea el botón,
00:55:11
porque si luego yo lo muevo solo de 50 y hago un botón de 200, pues ya no me funciona.
00:55:27
con este de aquí lo que decía antes de no me gustan los números metidos así a secas porque
00:55:31
luego hago un botón más grande y a este código no me sirve desde este código de aquí es general
00:55:41
y se basa sobre el tamaño del objeto el tamaño de la ventana si tú hace la ventana más pequeña
00:55:45
funciona igual la ventana de función igual y con esto me estoy diciendo mira pues ya me un nuevo
00:55:51
un nuevo punto, ¿vale?
00:55:59
Este nuevo punto, como mínimo,
00:56:01
tiene que ser distante
00:56:03
desde el viejo punto
00:56:04
o punto red-white.
00:56:06
Yo quiero
00:56:10
un nuevo punto que sea como mínimo
00:56:11
distante el tamaño mismo
00:56:13
del botón.
00:56:14
Entonces, que haya entrado a la izquierda, que haya entrado
00:56:17
a la derecha, me da igual, porque
00:56:19
se moverá lo suficiente para que el ratón
00:56:20
nunca esté dentro del botón después
00:56:23
de haberlo movido.
00:56:25
¿Entiendes? Quiero estar seguro
00:56:27
le pongo un margen y esto si no mueve exactamente de esto pues le pongo un margen
00:56:29
si el botón es muy grande igual daría un error
00:56:40
si es demasiado grande pues posiblemente saldría afuera pero con que haya otra
00:56:46
posición ahora si queréis como lo hacemos más grande vemos que pase
00:56:52
A lo mejor se queda ahí dentro dando vueltas y cosas por el estilo hasta que no lo encuentre,
00:56:54
pero aunque haya una solución debería, en cierto momento, salir.
00:57:04
A lo mejor tarda mucho porque como lo está haciendo random, tardaría mucho en contar.
00:57:08
Si yo hago el botón más grande que la mitad de la ventana, posiblemente no hay solución.
00:57:17
se quedaría ahí, eso también podría poner un contador y decir tú intentas lo mil veces, si mil veces no has
00:57:26
encontrado una solución, pues que el usuario quite el botón.
00:57:38
De esta forma, nosotros así nos debería valer y debería funcionar.
00:57:45
Al final, cuando tengo el nuevo X que estará lejanos al menos el movimiento mínimo desde el antiguo, pues
00:57:49
Entonces, ahora debería tener esta cosa aquí que siempre salta, nunca salta un poquito.
00:57:57
¿Veis que salta? Puede saltar poco, pero nunca me encontraré dentro del botón cuando salta.
00:58:08
Y siempre va desde cero hasta un límite máximo, pero siempre se ve el botón, no salta nunca afuera.
00:58:18
Pues ahora pillo esto y hago lo mismo pero con i vieja, mínimo i vieja es igual, mínimo i vieja es esa y aquí hate, vale, después pongo los hate.
00:58:24
In move, i, mismo i, mismo i, ahora a ver, algún i seguramente me lo perderé por la...
00:58:49
Sí. Y ahora, ¿dónde está while? Te pongo height, ¿ah? Height. Y esto es height.
00:59:01
¿Vale? Entonces, ahora, como puedo suerte, esto se ha ido. Esto no está...
00:59:29
¿Por qué no está brujelín y que llega?
00:59:43
Ah, porque he puesto get layout x.
00:59:46
que se mueve en este cuadrado
00:59:49
pero nunca
01:00:03
y esto
01:00:04
son aleatorios los dos
01:00:09
pero este de aquí tiene esta cosa
01:00:12
que cuando puede se mueve solo un poquito
01:00:14
es así
01:00:16
está más cerca
01:00:18
mientras que este de aquí es aleatorio completamente
01:00:20
¿sí?
01:00:22
¿dudas?
01:00:29
Sí, pues
01:00:31
¿Cómo era para poner que el label de te gusta programación quede como atrás de todo?
01:00:32
No lo hemos hecho, no lo sé.
01:00:39
Porque yo cuando paso el mouse por encima de ese label sin querer me sale un error.
01:00:42
O sea, me sigue funcionando, pero me sale como un error.
01:00:46
Cuando pasas el ratón encima del label, porque probablemente habrás puesto en el label un onMouseEntity.
01:00:49
No tengo nada.
01:00:57
Tú has puesto aquí un algo, entonces claro, cuando pases por ahí, hace algo.
01:01:02
¿Podrías poner un segundito el código del primer botón no, que pusiste todos los sigs y demás?
01:01:14
Pero no lo mires, hazlo, pénsalo, o sea, los límites que tienes que poner, eso es,
01:01:22
si estoy fuera de unos límites, pues entonces lo pongo al otro lado.
01:01:33
A lo mejor no lo tienes grabado, luego te los pongo, pero si no...
01:01:36
Vamos a ver, entonces, esto es, para ponerlo, a ver, un problema que puede surgir es si
01:01:41
el botón no está justo detrás de otro es que este botón está encima entonces no daría problemas pero
01:01:49
si en el aquí yo lo muevo entonces puede ser que un botón no esté detrás esto tengo que tenerlo
01:02:00
cuidado ese botón nos está detrás cuando yo paso por aquí no pillará el botón ni siquiera lo pude
01:02:18
decir que una forma de solucionarlo es con esto vale en la jerarquía poner que el label esté detrás
01:02:24
entonces como el level es el primero es el que está detrás de todos entonces los botones
01:02:35
siempre estarán por encima cuando se solapan uno a otro o estará encima de los demás el orden con
01:02:40
que se hacen determina también esto ahora por otro lado yo creo vamos a ver si lo encuentro
01:02:46
y tengo el botón aquí por ejemplo o punto ser porque a veces pueden puedes puedes indicar el
01:02:56
zeta o sea a qué altura está vale en html por ejemplo se hace así aquí no lo sé
01:03:06
¿Veis que está también un scale z?
01:03:14
Entonces, set layout z, no.
01:03:19
Set z, por esto set translate z, pues sirve algo, no lo sé, habría que verlo, ¿vale?
01:03:23
Pero en las interfaces la z no existe, la z sería la profundidad, ¿vale?
01:03:33
Pero se puede utilizar a veces para indicar quién de los controles está más adelante y quién de los controles está más atrás.
01:03:38
Entonces, si yo necesito que un control esté siempre encima de los demás porque se puede mover, pues puedo jugar con el Z para eso.
01:03:46
A veces eso se puede hacer también en HTML barra CSS, a veces se hacía, porque ahora se hace con otras tecnologías,
01:03:54
Pero si yo tengo dos paneles con cosas distintas en la misma ventana, en la misma página, si cambio la Z, cuando pongo la Z esta aquí, se ve el primer panel.
01:04:02
Cuando le cambio la Z y pongo esta Z detrás de la otra, ahora se ve el segundo panel.
01:04:15
Que sirve como para dar la ilusión de que has cambiado ventana, pero todos en la misma ventana.
01:04:19
Tienes dos interfaces, una que está detrás, entonces no se ve, y una que está delante y se ve.
01:04:27
Cuando tú cambias la Z, pues se vuelve a pintar y ahora se ve la que estaba detrás y la que estaba delante ahora se queda escondida.
01:04:33
Pero hoy en día se suele utilizar otra cosa.
01:04:46
Aquí, por ejemplo, si quiero hacer cosas así, es más elegante hacerlo con unos tabs, como hemos visto la otra vez.
01:04:49
Sería la única utilidad que tiene el Z, porque esto es en 2D prácticamente, ¿no?
01:04:56
El SimBusiness trabaja en 2D.
01:05:00
La Z sirve sólo en caso en que el componente se solape, que no es lo normal.
01:05:01
Normalmente es difícil que un botón se mueva o que una cosa se mueva.
01:05:10
No suele existir el componente que cuando tú te acercas cambia en otro lado.
01:05:14
Es para hacer una broma aquí.
01:05:22
esto no es real
01:05:23
lo que hemos hecho nosotros
01:05:27
nos sirve simplemente para jugar con el setlayer
01:05:29
por si en un determinado momento
01:05:33
quiero mover por efecto de un botón
01:05:36
un determinado elemento dentro de mi cosa
01:05:39
o una lista desplegable
01:05:41
y ya viene que funciona
01:05:43
vale, esto lo damos por hecho
01:05:45
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 4
- Fecha:
- 15 de abril de 2026 - 12:24
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 1h′ 05′ 54″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 552.84 MBytes