- Es una aplicación con la que podemos realizar archivos ejecutables .jar de JAVA.
- El B4J, está realizado para realizar archivos jar para Java forma parecida a como se programa en Visual Basic.
- El programa B4J es para Windows, pero el archivo .jar que obtiene es multiplataforma, es decir puede funcionar en Windows, Linux y Mac. (No vale para Android).
- El B4J es un programa gratis. __________________________________ -- Instalación. (3 pasos = Java + JavaFX Scene Builder + B4J)
- Puedes bajarte Java gratuitamente de...Java 7 JDK
- Marca la opción: Accept License Agreement - Instala la versión Windows x86 o Windows x64 (si tu Windows es de 64 bits)
Esto lo utilizamos para dibujar los controles, botones, label, casilleros...
3.- Instalación del IDE B4J
Ahora vamos a instalar el IDE B4J, este IDE está realizado para poder hacer archivos ejecutables jar de una forma parecida a como se programa en Visual Basic.
_______________________________________________
1.- Nuestro primer programa: Teorema de Pitágoras.
El primer programita que hago siempre para aprender esto, es el teorema de Pitágoras, tal vez sea por aquello de los catetos.
- Introducimos un cateto.
- Introducimos otro cateto.
- Calculamos la hipotenusa = raiz cuadrada (un cateto al cuadrado + otro cateto al cuadrado)
- Lo primero crear la carpeta Pitagoras que será donde guardemos el programa.
IMPORTANTE: Cada programa se guarda en una carpeta distinta. Es conveniente crear la carpeta del programa antes de comenzar a poner los códigos.
En nuestra carpeta C:\Android, creamos una subcarpeta llamada Pitagoras.
Entramos en el B4J.
Se puede crear aplicaciones de consola y gráficas UI (JavaFx). Nuestra aplicación será gráficas, así que marcamos UI (JavaFX)
Vamos a File / Save y guardamos el programa (incluso antes de comenzar) en C:\Android\Pitagoras con el nombre pitagoras.b4j
_________________________________________________
- Vamos a situar los controles mediante el Designer (JavaFx Scene Builder)
Vamos a poner los casilleros, etiquetas y el botón, para ello vamos Designer / Create New Layout
y ponemos un nombre, en nuestro caso "layout"
Debemos respetar minúsculas y mayúsculas.
En el código observamos esta línea: MainForm.RootPane.LoadLayout("layout")
también debe estar con minúsculas como lo hemos puesto anteriormente.
Deberá aparecer el JavaFX Scene Builder. Añadimos:
- una Label (En el Text escribe: Introduce un cateto)
IMPORTANTE:
- Los Controls, deben tener un nombre para después utilizarlos en el código. Ese nombre se lo pondremos en el recuadro: JavaFX CSS Id
En nuestro caso pondremos: Label1, Label2, Label3, Label4, TextField1, TextField2 y Button1.
Además en el código debemos de declarar mediante Dim los controles que vamos a utilizar dentro de subrutinas, en nuestro caso:
Label4, TextField1, TextField2 y Button1.
Respeta las mayúsculas y minúsculas, si pones button1 en vez de Button1, el programa no funcionará correctamente.
- Seguimos añadiendo:
- Label (En el Text escribe: Introduce el otro cateto).
- Label (En el Text escribe: Hipotenusa).
- Label4 (JavaFX CSS Id = Label4)
- TextField1 (JavaFX CSS Id = TextField1)
- TextField2 (JavaFX CSS Id = TextField2)
- Button (En el Text escribe: Pulsa). (JavaFX CSS Id = Button1)
Ahora lo guardamos, para ello vamos a File / Save
- El Layout se guarda en la carpeta C:\Android\Pitagoras\Files\layout.fxml - En un programa puede haber más de un layout.fxml
Si pulsamos el icono de la flecha azul (ejecutar) obtendremos la siguiente pantalla gráfica.
Observa que está en modo Debug.
- Borrar un elemento.
- En caso que queramos borrar un elemento, lo marcamos, pulsamos con el botón derecho del ratónDelete.
- También podemos poner un elemento encima o detrás de otro mediante Bring To Front.
- Crear el código
Ahora vamos hacer que cuando pulsemos el Button, se realice la operación, para ello vamos a hacer que aparezca en nuestro código la Subrutina:
Sub Button1_Action
End Sub
Para ello vamos al Designer / layout.fxml / Generate Members
y marcamos Action en el Button1
Luego pulsa en Generate Members
Si consultas el código observarás que se ha creado las líneas.
Sub Button1_Action
End Sub
_________________________________________
- Vamos al código: (copia y pega)
Código de pitagoras
Sub Process_Globals
' Juan Antonio Villalpando' juana1991@yahoo.com' 20 de noviembre de 2013Private fx As JFX
Private MainForm As Form
Dim x, y, z AsDouble' Establecemos las variablesDim Button1 As Button ' No es necesario declararloDim TextField1, TextField2 As TextField ' Tenemos que declarar los TextField utilizadosDim Label4 As Label ' Tenemos que declarar el Label utilizado.EndSubSub AppStart (Form1 As Form, Args() AsString)
MainForm = Form1
MainForm.RootPane.LoadLayout("layout")
MainForm.Show
MainForm.Title = "Teorema de Pitágoras."
MainForm.BackColor=fx.Colors.White
' MainForm.Icon = fx.LoadImage(File.DirAssets, "dibujo_icono.png")
MainForm.Resizable=FalseEndSubSub Button1_Action
x = TextField1.Text
y = TextField2.Text
z = x + y
z = Sqrt(Power(x,2) + Power(y,2))
Label4.Text = z
End Sub
- Ejecución del programa
Para compilarlo y que funcione, pulsamos sobre el icono de la flecha azul.
- Cómo lo he realizado:
- Declaramos las variables y los controles utilizados.
- Tomamos el valor puesto en TextField1 y lo asignamos a x
- Tomamos el valor puesto en TextField2 y lo asignamos a y
- Hacemos los cuadrados y la raiz.
- Presentamos el valor de z en el Label4
Nota: El B4J no permite hacer el cuadrado de esta manera x ^ 2, en todo caso admite Power(x, 2)
Diferencias entre VB y BASIC4Android
__________________________
- Ejecuta el archivo .jar
Bien, me funciona, ¿cómo puedo ejecutar el archivo creado?
Si has compilado el programa mediante Release...
(en modo Debug no se crea el pitagoras.jar)
... ve a C:\B4J\pitagoras\Objects y observa el archivo pitagoras.jar
Si pulsas sobre ese archivo (y los archivos de extensión .jar lo tienes vinculado a Java (como ocurre normalmente)), se ejecutará tu aplicación.
Los archivos .jar son Executables jar Files, Java(TM) Platform SE binary, se abre con javaw.exe que se encuentra en la carpeta Java.
Descompilar un archivo .jar
Si consultas el pitagoras.jar con el Bloc de notas, verás que es ilegible. Hay programas que pueden descompilarlo por ejemplo el JavaDecompiler JD GUI
- Otra manera de ver el contenido de un archivo .jar
Los archivos .jar son archivos que están comprimidos.
Tomemos el archivo pitagoras.jar y le cambiamos la extensión a zip, es decir lo renombramos como pitagoras.zip
Ahora vamos a cualquier programa compresor/descompresor como el Winzip, el Winrar... y abrimos con él el pitagoras.zip, observaremos que un contiene archivos y carpetas. Así que hemos observamos que los archivos .jar son archivos comprimidos.
- IMPORTANTE:
Podemos compilar el código en modo Debug y en modo Release.
- En modo Release obtenemos el archivo pitagoras.jar.
- El modo Debug es para hacer pruebas de depuración y creación del programas.
Varias cosas que debes recordar siempre:
- Cada proyecto debe estar en una carpeta distinta.
- Acabado de entrar en el proyecto, pulsa la flecha azul de ejecutar/compilar para que se creen las carpetas necesarias, especialmente una llamada Files que es donde en otros proyectos guardarás imágenes, textos,...
Nota sabia:
- Anteriormente he indicado que debemos declarar los controles antes de utilizarlos.
Dim EditText1, EditText2 As EditText ' Tenemos que declarar los EditText utilizados Dim Label1, Label2, Label3, Label4 As Label ' Tenemos que declarar los Label utilizados
En realidad solo tenemos que declarar los controles que se utilizan dentro de una Subrutina. En este programa solo sería necesario declarar.
Dim EditText1, EditText2 As EditText Dim Label4 As Label
Ya que solamente el Label4 está dentro de una Subrutina, los demás Label no están.
Notas:
- ¿Para qué sirven estos archivos .jar?
Estos archivos pueden contener un programa gráfico (UI) como el que acabamos de ver que puede funcionar en multiplataformas, es decir en Windows, Linux y Mac (en Android no).
Además mediante estos archivos .jar se pueden hacer librerías como las utilizadas en Basic4Android, recuerda que las librerías suelen estar compuesta de dos archivos uno .jar y otro .xml (aunque debes ser un buen programador para hacer buenas librerías). En estos casos se crean los códigos para funcionar en modo consola.
Otra posibilidad que tienen estos archivo .jar es poderse convertir a ejecutables de Windows con extensión .exe. Para pasar un archivo .jar o al menos intentarlo, podemos utilizar el http://launch4j.sourceforge.net/
Si lo que queremos es hacer aplicaciones de Escritorio (Desktop), como el que hemos visto, es más recomendable utilizar el gratuito Visual Basic 2010 o el también gratuito AutoIt.
____________________________________ 2.- Nuestro segundo programa: Adivina
Ahora se trata de hacer un programa llamado Adivina donde pulsamos un botón, en ese momento el móvil crea un número aleatorio comprendido entre el 1 y el 100 que debemos adivinar.
Luego introducimos un número en el casillero y pulsamos el botón ¿Es este?
El programa nos responderá si el número creado es igual, mayor o menor que el que hemos introducido.
Notas: Antes de comenzar el proyecto creamos una carpeta llamada adivina y dentro de ella un archivo llamado adivina.b4j
Cada vez que hagas un cambio en el código guárdalo (File / Save)
Si te equivocas y quieres deshacer el cambio pulsa la combinación de teclas Ctrl Z
____________________________________________________
- Vamos a situar los controles mediante el Designer (JavaFx Scene Builder)
- Vamos a Designer para poner los controles.
- Escribimos el nombre del Layout como "layout", con minúsculas.
- Añadimos 2 Botones, 2 Label y un TextField.
- En el Text del botón1 escribimos: Pulsa para una nueva partida
- En el Text del botón 2 escribimos: ¿Es este?
- En el Text del Label1 escribimos: Introduce un número
- En el Text del Label2 escribimos:-
- Situamos los botones como indica la figura.
- Recuerda que debemos poner el nombre de los controles en: JavaFX CSS Id
Para ello en el Designer pulsamos en layout.fxml y Generate Members
marcamos los Action de los botones
pulsamos en Generate members
en el código aparecerá...
Sub Button1_Action
End Sub
Sub Button2_Action
End Sub
___________________________________
- Vamos al código: (copia y pega)
Código de adivina
#Region Project Attributes
#MainFormWidth: 315
#MainFormHeight: 400
#End RegionSub Process_Globals
' Juan Antonio Villalpando' juana1991@yahoo.com' 20 de noviembre de 2013Private fx As JFX
Private MainForm As Form
' Declaramos las variables ordenador y mio e indicamos de qué tipo son nuestros controles TextField y Label Dim ordenador, mio, intentos As Int
Dim Label2 As Label
Dim TextField1 As TextField
EndSubSub AppStart (Form1 As Form, Args() AsString)
MainForm = Form1
MainForm.RootPane.LoadLayout("layout") ' En minúsculas.
MainForm.Show
MainForm.Title = "Adivina."
MainForm.BackColor=fx.Colors.White
' MainForm.Icon = fx.LoadImage(File.DirAssets, "icono.png")
MainForm.Resizable=FalseEndSubSub Button1_Action
' Cuando pulsamos el Botón1, se crea un número aleatorio entre 1 y 100 en la variable ordenador
ordenador = Rnd(1,100)
TextField1.Text=""EndSubSub Button2_Action
' Cuando pulsamos el Botón2, asigna a la variable mio el valor del TextField1' Se compara el valor de ordenador con el mio
mio = TextField1.Text
If ordenador > mio Then Label2.Text = "Mi número es mayor"If ordenador < mio Then Label2.Text = "Mi número es menor"If ordenador = mio Then Label2.Text = "HAS ACERTADO"End Sub
_______________________
- Comentarios.
Dim Label2 As Label
El Label1 ("Introduce un texto"), no es necesario declararlo, ya que no se encuentra dentro de ninguna Subrutina.
El Label2 sí hay que declararlo, porque está dentro de una Subrutina.
Podemos ajustar el tamaño de la pantalla pulsando sobre ella y moviendo sus aristas.
En Layout: AnchorPane podemos ver sus dimensione y podemos ponerlas en el código en... #Region Project Attributes
#MainFormWidth: 315
#MainFormHeight: 400
#End Region
Varias cosas que debes recordar siempre:
- Cada proyecto debe estar en una carpeta distinta.
- Solo es imprescindible poner en e JavaFX CSS Id, aquellos controles que vayan a ser utilizado en Subrutinas, en caso que no estén en Subrutina no es necesario ponerle nombre.
- Igualmente solo es necesario declarar mediante Dim aquellos controles que vayan a ser utilizado en Subrutinas.
- Estamos utilizando como nombre de controles Label1, Label2, TextField1, Button1, Button2 pero podemos poner nombres más parecido a la función que realizan como: boton_inicio, boton_prueba, entrada_numero. No debemos utilizar acentos ni espacios en esos nombres.
___________________________________
3.- Nuestro tercer programa: Ruleta Rusa
En este caso tenemos un revólver para 6 balas.
Primero Rearmamos el revólver poniendo una sola bala y girando el tambor. La bala se ubicará aleatoriamente en uno de los 6 sitios.
Luego vamos pulsando de manera desordenada los distintos botones .
Si el número de lugar de la bala coincide con el número del Botón pulsado, la pantalla se tiñe de rojo
En caso contrario se deshabilita (Button.Enabled = False ) el botón pulsado
Notas: Antes de comenzar el proyecto creamos una carpeta llamada ruleta_rusa y dentro de ella un archivo llamado ruleta_rusa.b4j
Cada vez que hagas un cambio en el código guárdalo (File / Save)
Si te equivocas y quieres deshacer el cambio pulsa la combinación de teclas Ctrl Z
Vamos a situar los botones mediante el Designer (JavaFx Scene Builder)
- Vamos a Designer para poner los botones.
- Creamos un Layout llamado "layout", en minúsculas.
- Añadimos 7 botones y un Label.
- En el Text de los botones ponemos un número del 1 al 6.
- Los Botones los ponemos con Font de 30px
- El Text del botón 7 escribimos: Rearme.
- En JavaFX CSS Id ponemos los nombres de los controles:
Button1, Buttonl2, Button3, Button4, Button5, Button6, Button7, Label1.
- Situamos los botones como indica la figura.
- Guardamos el Designer (File / Save).
- Vamos hacer que en el código aparezca:
Sub Button1_Action
End Sub
Para ello en el Designer pulsamos en layout.fxml y Generate Members
marcamos todos los Click de los botones
pulsamos en Generate members
en el código aparecerá...
Sub Button1_Action
End Sub
___________________________________
- Vamos al código: (copia y pega)
Código de ruleta rusa
#Region Project Attributes
#MainFormWidth: 445
#MainFormHeight: 400
#End RegionSub Process_Globals
' Juan Antonio Villalpando' juana1991@yahoo.com' 20 de noviembre de 2013Private fx As JFX
Private MainForm As Form
Dim x As Int
Dim Button1, Button2, Button3, Button4, Button5, Button6 As Button
Dim Label1 As Label
EndSubSub AppStart (Form1 As Form, Args() AsString)
MainForm = Form1
MainForm.RootPane.LoadLayout("layout")
MainForm.Show
MainForm.Title = "Ruleta Rusa."
MainForm.BackColor=fx.Colors.White
' MainForm.Icon = fx.LoadImage(File.DirAssets, "dibujo_icono.png")
MainForm.Resizable=False
Label1.Style="-fx-background-color: #0000ff"
x = Rnd(1,6)
EndSubSub Button1_Action
If x = 1 Then
Label1.Style="-fx-background-color: #ff0000"Else
Button1.Enabled=FalseEndIfEndSubSub Button2_Action
If x = 2 Then
Label1.Style="-fx-background-color: #ff0000"Else
Button2.Enabled=FalseEndIfEndSubSub Button3_Action
If x = 3 Then
Label1.Style="-fx-background-color: #ff0000"Else
Button3.Enabled=FalseEndIfEndSubSub Button4_Action
If x = 4 Then
Label1.Style="-fx-background-color: #ff0000"Else
Button4.Enabled=FalseEndIfEndSubSub Button5_Action
If x = 5 Then
Label1.Style="-fx-background-color: #ff0000"Else
Button5.Enabled=FalseEndIfEndSubSub Button6_Action
If x = 6 Then
Label1.Style="-fx-background-color: #ff0000"Else
Button6.Enabled=FalseEndIfEndSub' Rearme. El Label1 vuelve a ser Azul y todo los Botones se habilitan.' Se crea un número aleatorio del 1 al 6 Sub Button7_Action
Label1.Style="-fx-background-color: #0000ff"
Button1.Enabled=True
Button2.Enabled=True
Button3.Enabled=True
Button4.Enabled=True
Button5.Enabled=True
Button6.Enabled=True
x = Rnd(1,6)
End Sub
_______________________
- Comentarios
Podemos cambiar los colores, tipo de letra, tamaño, fondo de los controles de esta manera:
Si quisieramos poner esos códigos en el JavaFX Scene Builder, lo debemos poner en Style, como indica el gráfico de abajo.
- Rotate
Estamos en el JavaFX Scene Builder. Pulsa sobre un botón. En el panel de la derecha ve a Layout Button. Pulsa en Rotate.
____________________________________
4.- Nuestro cuarto programa: Tres iguales
Se trata de pulsar el botón Comienzo, en ese momentos tres imagenes fresa.gif, limon.gif y pera.gif, se van reproduciendo aleatoriamente en los cuadros (ImageView1, ImageView2 y ImageView3). Cuando pulsamos el botòn Parar, las imagenes quedan estáticas, se incrementa en uno el número de intentos y se comprueba si las tres imagenes son iguales, en este caso se incrementa en uno el número de aciertos.
Creamos una carpeta llamada Tres_iguales, dentro de ella el archivo tresiguales.b4j.
Baja y descomprime el archivo de los dibujos de las frutas y guarda esos dibujos en la carpeta Tres_iguales / Files
NOTA IMPORTANTE: En vez de guardar los archivos de imágenes mediante copiar y pegar en la carpeta Files, es más conveniete Añadirlos (Add Files) mediante el mismo B4J, pulsando el bótón abajo-derecha:
Files / Add Files
Áñade siempre los archivos que debas guardar en Files de esta manera.!!!! (Incluso primero los puedes copiar y pegar en la carpeta Files y luego añadirlo mediante estos botones.)
______________________________________________
- Vamos a situar los botones mediante el Designer
(JavaFx Scene Builder)
- Vamos a Designer para poner los botones.
- Creamos un Layout llamado "layout", en minúsculas.
- Añadimos 3 ImageView en la parte de arriba de la ventana.
Cada vez que ponemos un ImageView "desaparecen" los anteriores, para que aparezcan pulsamos sobre cada ImageView en la parte de Hierarchy.
- Añadimos 3 botones como indica la imagen.
- En el Text de un botón ponemos "Continua", en otro "Para" y en el otro "Comienzo"
- Los Botones los ponemos con Font de 30px
- Añadimos 5 Label.
- En el uno ponemos "¡¡¡PREMIO!!!" en otro "Intentos", en otro "Aciertos" y en los otros dos Label2 y Label3.
- Los Label los ponemos con Font de 30px
IMPORTANTE:
- Vamos a la parte JavaFX CSS Id de cada control y ponemos los nombres de los controles:
ImageView1, ImageView2 ImageView3, Button1, Button2, Button3, Label1, Label2, Label3
(Solo es imprescindible dar nombre a aquellos controles que se encuentran dentro de Subrutinas o que crean una Subrutina en el código.)
- Pulsamos en AddView y añadimos 3 botones y 5 Label.
- En el Text del Botón1 he puesto Continua
- En el Text del Botón2 he puesto Parar
- En el Text del Botón3 he puesto Comienzo
- En el Text del Label1 escribe ¡¡¡PREMIO!!! y lo pones de color rojo
- Guardamos el Designer (File / Save).
___________________________________
- Vamos al código: (copia y pega)
Código de tres iguales
#Region Project Attributes
#MainFormWidth: 600
#MainFormHeight: 611
#End RegionSub Process_Globals
' Juan Antonio Villalpando' juana1991@yahoo.com' 20 de noviembre 2013Private fx As JFX
Private MainForm As Form
' Crea el temporizador Dim Timer1 As Timer
' Declara los ImageView y los Label Dim ImageView1, ImageView2, ImageView3 As ImageView
Dim Label1, Label2, Label3 As Label
' Declara las variables x, y, z, intentos y aciertos. Dim x, y, z As Int
Dim intentos, aciertos As Int
EndSubSub AppStart (Form1 As Form, Args() AsString)
MainForm = Form1
MainForm.RootPane.LoadLayout("layout")
MainForm.Show
MainForm.Title = "Tres iguales."
MainForm.BackColor=fx.Colors.White
' MainForm.Icon = fx.LoadImage(File.DirAssets, "dibujo_icono.png")
MainForm.Resizable=False' Establece el tiempo del temporizador en 100 milisegundos' Para el temporizador' Pone invisible el Label1 de Premio
Timer1.Initialize("Timer1", 100) ' 1000 = 1 segundo
Timer1.Enabled = False
Label1.Visible= FalseEndSubSub Button1_Action
' Cuando pulses este botón' El Timer empieza a contar' Pone invisible el Label1 de Premio' Incrementa el número de intentos' Pone el número de intentos en el Label2
Timer1.Enabled = True
Label1.Visible= False
intentos = intentos + 1
Label2.Text = intentos
EndSubSub Button2_Action
' Cuando pulses este botón' El Timer se para' Si la x = y = z los tres iguales: pone el PREMIO, incrementa los aciertos, pone los aciertos
Timer1.Enabled = FalseIf x = y AND x = z Then
Label2.Visible= True
aciertos = aciertos + 1
Label3.Text = aciertos
EndIfEndSubSub Button3_Action
' Cuando pulses este botón' Pone los intentos y los aciertos a cero
intentos = 0
Label2.Text = intentos
aciertos = 0
Label3.Text = aciertos
Timer1.Enabled = True
Label1.Visible= FalseEndSubSub Timer1_Tick
' Cada vez que pasan 100 milisegundos' Se crean tres números aleatorios del 1 al 3 (aunque aquí para que funcione he puesto el 4)' Según salga el 1, el 2 o el 3, se carga en el ImageView1, ImageView2 y ImageView3 un dibujo
x = Rnd(1,4)
y = Rnd(1,4)
z = Rnd(1,4)
If x = 1 Then ImageView1.SetImage(fx.LoadImage(File.DirAssets, "fresa.gif"))
If x = 2 Then ImageView1.SetImage(fx.LoadImage(File.DirAssets, "limon.gif"))
If x = 3 Then ImageView1.SetImage(fx.LoadImage(File.DirAssets, "pera.gif"))
If y = 1 Then ImageView2.SetImage(fx.LoadImage(File.DirAssets, "fresa.gif"))
If y = 2 Then ImageView2.SetImage(fx.LoadImage(File.DirAssets, "limon.gif"))
If y = 3 Then ImageView2.SetImage(fx.LoadImage(File.DirAssets, "pera.gif"))
If z = 1 Then ImageView3.SetImage(fx.LoadImage(File.DirAssets, "fresa.gif"))
If z = 2 Then ImageView3.SetImage(fx.LoadImage(File.DirAssets, "limon.gif"))
If z = 3 Then ImageView3.SetImage(fx.LoadImage(File.DirAssets, "pera.gif"))
End Sub
El botón aparecerá con los vértices redondeados, con degradado azul y tipo de letra Helvetica, de color blanco, en negrita.
Observa que cada renglón de -fx-aaaaaaaaaaa; termina en punto y coma;
Bájate el Visual Basic 2010 Express
(La versión 2010 está bien, no hace falta una mayor)
Tienes 30 días de pruebas, pero antes de que se cumplan envíale un correo a Microsoft para Registrarte y te envíarán gratuitamente a tu correo un número de Registro para que puedas utilizar el Visual Basic sin problemas posteriormente.
Con Visual Basic 2010 puedes hacer programas parecidos a los que estamos haciendo en Basic4Android, pero para que funcionen en el sistema operativo Windows de tu ordenador.
Este sería el programa tresiguales, visto anteriormente en Visual Basic 2010.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto Más información