18 julio 2009

Comenzando con JavaFX en Windows


Bueno empezaremos con una serie de post acerca de JavaFX. Esta tecnologia sale al mercado para competir contra Flex y Silverlight, todavía está en duda si esta tecnología lograra el lugar que busca, pero me parece un buen momento para empezar a descubrirla.

Partiremos desde lo mas básico, instalando las librerías y buscando que IDE usar hasta que podamos hacer ejemplos donde podamos ir viendo el poder que nos ofrece este nuevo lenguaje de scripting. Para no hacer más largo este primer post paso a comentarles los pasos necesarios para preparar nuestras maquinas para trabajar


Pasos:

  • Entraremos al sitio oficial para ver las versiones y hacer las descargas correspondientes
    http://www.javafx.com/
  • En la página de JavaFX encontraremos diversas cosas que podremos bajarnos, daremos una breve explicación de cada una (JavaFX versión 1.2 al momento de escribir esta nota)
  1. JavaFX 1.2 SDK: Al bajar esto estamos bajando el Software Development Kit el cual es un instalador parecido al que ejecutamos al instalar el JDK en nuestras maquinas donde se copiaran las librerías necesarias para desarrollo y además podremos ejecutar los comandos de JavaFX desde la consola de Windows

  2. JavaFX 1.2 Production Suite: Esto es un conjunto de herramientas para los diseñadores que facilita el proceso de incorporación de imágenes en aplicaciones JavaFX

  3. NetBeans IDE 6.5.1 for JavaFX 1.2: Bueno como ya sabrán unos de los IDE más populares para Java en su versión 6.5.1 trae incorporado JavaFX con algunas facilidades para el desarrollo, también hay un plugin para el eclipse pero ciertamente no lo he probado.
Haremos un ejemplo básico para mostrar algunas características básicas y usaremos la consola para compilar y ejecutar nuestro ejemplo, veremos que los archivos no tienen una extensión java sino que poseen su propia extensión .fx igual estos son compilados a bytecode que quedan en archivos .class y luego serán ejecutados por la JVM.
Como primer paso debemos instalar el SDK y probar que la consola nos reconoce lo comandos javafxc y javafx, no debería haber problema alguno con esto pero si alguien tiene algún problema que comente y buscamos el porqué.

Para el ejemplo yo eh creado una carpeta llamada JavaFX donde dejare la siguiente estructura de directorios

C:\JavaFX\maintest\Main.fx

Archivo Main.fx:



package maintest;
// Define Address class.
class Address {
var street: String;
var city: String;
var state: String;
var zip: String;
}

// Create the first Address object instance.
var addressOne = Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}

// Create the second Address object instance.
def addressTwo = Address {
street: "200 Pine Street";
city: "San Francisco";
state: "CA";
zip: "94101";
}

function run(args : String[]) {
for (arg in args) {
println("Parameters = {arg}");
}
println("Street One = {addressOne.street}");
println("Street Two = {addressTwo.street}");
}


Ahora más adelante explicaremos cada parte del código, este sería nuestro archivo Main.fx ahora lo compilaremos por medio de la consola, abrimos una consola de comandos y nos situaremos en C:\JavaFX.

Compilar paso 1:
Situados en el directorio anteriormente dicho escribimos lo siguiente
javafxc "maintest/Main.fx" esto nos genera los .class necesarios para poder ejecutar el ejemplo

Ejecutar paso 2:
Situados en el mismo directorio anterior escribimos
javafx maintest.Main 9 2 de esta forma estaremos ejecutando nuestro ejemplo pasándole dos parámetros el primero un String que contiene 9 y el segundo un String que contiene el 2.

Explicación básica del código:

Parte 1:

class Address {
var street: String;
var city: String;
var state: String;
var zip: String;
}


Aquí estamos definiendo la clase Address la cual tendrá 4 variables que se indican con la palabra reservada var "elNombreDeLaVariable" : "suTipoDeDato"

Parte 2 y 3:

// Create the first Address object instance.
var addressOne = Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}

// Create the second Address object instance.
def addressTwo = Address {
street: "200 Pine Street";
city: "San Francisco";
state: "CA";
zip: "94101";
}


En ambos casos estamos declarando referencias a objetos del Tipo Address donde usamos { ... } como se usaría un constructor donde inicializamos los distintos valores de la clase, la diferencia importante entre estas dos referencias son que una se declaro con la palabra reservada var y la otra con def. Esto quiero decir que la que se declaro con def seria una referencia del tipo final y no puede cambiar durante la ejecución del script.

Parte 4:

function run(args : String[]) {
for (arg in args) {
println("Parameters = {arg}");
}
println("Street One = {addressOne.street}");
println("Street Two = {addressTwo.street}");
}


Aquí estamos definiendo la función run que sería el equivalente al main de una clase Java y recibe un array de argumento de longitud variable, en la primer línea iteramos sobre los argumentos y mostramos sus valores en las otras dos imprimimos los valores de las distintas direcciones para lograr imprimirlo se usa {addressOne.street} de manera que fuera un closure.

Bueno esto fue todo por este post por cualquier duda que posiblemente haya espero los comentarios y en qué forma se podría mejorar el post.
En próximas entradas veremos los tipos de datos de JavaFX así como en más detalles sus distintas características.

Saludos

15 comentarios:

  1. Muy buen articulo, para comenzar con JavaFX

    ResponderEliminar
  2. Luis...sos un genio. Explicas joya. Gracias por compartir tus conocimientos!!!

    ResponderEliminar
  3. al intentar ejecutar el ejemplo me da este error


    D:\JavaFX>D:\JavaFX\javafx-sdk1.2\bin\javafx.exe maintest.Main 9 2

    Exception in thread "main" java.lang.NoClassDefFoundError: maintest/Main (wrong
    name: Main)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
    4)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.sun.javafx.runtime.Main.main(Main.java:68)

    ResponderEliminar
  4. Hola Yamit, según veo en el log vos le decís al comando javafx que ejecute la clase Main que estaría ubicada en D:\JavaFX\maintest\Main.class
    Este error puede suceder ya sea porque la clase Main no se haya en esa ruta o porque no se generaron los archivos .class, fíjate si la compilación con javafxc esta dejando los archivos .class en el directorio donde luego intentas ejecutarlo.
    Espero poder haberte ayudado, si sigue sin funcionar fíjate si podes poner tu estructura de directorio a ver si hay alguna cosa extraña.

    Saludos

    ResponderEliminar
  5. hola luis gracias por la pronta respuesta, el javafxc me genera dos archivos llamados:

    Main$Address.class
    Main.class

    en esta ruta:
    D:\JavaFX\maintest

    acabo de intentar ejecutar lo siguiente:

    parandome en el directorio D:\JavaFX\maintest (dentro del maintest, y no desde afuera)

    javafx Main 9 2

    y funciono...

    ahora usando maintest.Main 9 2, me bota error,

    ahora me pregunto si no habria que declarar en el script Main.fx el paquete al que pertenece??

    algo asi como en java: package maintest ???

    sin embargo lo importante es que ya funciona :D, aprovecho de paso para agradecerte por el blog, me va a ser de gran ayuda!!! mucho exito luis

    ResponderEliminar
  6. Perdóname estas en lo cierto, obviamente falta declarar el package, se ve que me olvide de ponerlo en la parte del código.
    Me alegro que ya este andando y ahora lo cambio asi no queda ese pequeño error, gracias por los comentarios y seguiré intentando ayudarte en lo que pueda

    Saludos

    ResponderEliminar
  7. Anónimo1/9/09, 3:01

    Hola, podrias explicarme la diferencia entre JavaFX 1.2 SDK y JavaFX 1.2 Production Suite, si voy a empezar con JavaFx ¿cuál instalo?.

    Carlos.

    ResponderEliminar
  8. Hola como estas, la diferencia entre el JavaFX 1.2 SDK y el Production Suite consiste basicamente en que en realidad el SDK son las librerias necesarias por poder usar JavaFX esto instalaria el compilador y el interprete osea javafxc y javafx. Por otro lado tenes el Production Suite es cual es un conjunto de plugins para poder acercar a los desarrolladores y los artistas(Disenadores graficos). Contiene plugins para Photoshop y Illustrator(CS3 o CS4) el cual exportas las imagenes con formato JavaFX, puedes visualizar estas imagenes con JavaFX Graphics Viewer(tambien contenido en la Suite) y un SVG Converter, junto con ejemplos y ayuda.

    Espero haber aclarado tu duda y haber sido util.En pocas palabras para empezar a desarrollar deberias instalar JavaFX 1.2 SDK.

    ResponderEliminar
  9. Al fin Dios es grande, al fin encuentro un buen tutorial que me explique y me oriente he visto varios y ninguno esta tan bien explicado como el tuyo, gracias :D me sera de mucha ayuda

    ResponderEliminar
  10. Me alegro te haya servido, igual tene en cuenta que JavaFX no tuvo tanto exito como se esperaba,asi que espero que estes entretenido con varias cosas y no solo apuntes todo a JavaFX.

    Saludos,
    Luis

    ResponderEliminar
  11. Anónimo3/1/13, 3:53

    que tal soy juan, como configuro la variable de entorno porque ya la configure pero el cmd no reconoce javafx, dice: "javafx" no se reconoce como un archivo interno o externo

    ResponderEliminar
  12. Anónimo3/1/13, 4:00

    Soy Juan, por otra parte, lo he intentado haciendo uso del IDE Eclipse Juno (version actual)pero no reconoce los imports, quiero saber si me puedes explicar paso a paso como configurar eclipse para que funcione el javafx

    ResponderEliminar
    Respuestas
    1. Hola Juan la verdad que solo probe JavaFX desde el NetBeans que es mucho mas simple, te aconsejaria que lo prubes de ahi que ademas con muchas opciones y muchas ayudas.
      Con respecto a la variable de entorno, acordate que cuando pones una variables de entorno nueva tenes que cerrar la consola de cmd y abrir una nueva para que la tenga en cuenta.
      Cualquier cosa que necesites avisame.

      Saludos, Luis

      Eliminar
    2. Anónimo9/1/13, 1:12

      hola luis soy Juan, ya hice eso de la variable de entorno, baje el javafx SDK 2.2, segui los pasos para instalar y se creo una carpeta llamada Oracle; dentro de esta se crearon 2 carpetas, la SDK y la Runtime, cual de estas es la que va como variable de entorno, yo puse 2 en el path, hasta el bin del SDK y hasta el bin del Runtime; pero cree aparte otra variable de entorno JAVAFX_HOME en lacual solo puse hasta el bin del SDK

      Eliminar
    3. Anónimo9/1/13, 1:31

      ahh otra cosa, se dice que la version 7 de java ya tiene incluido el javafx, pero yo estoy trabajando con java 6, es posible tener las dos versiones instaladas sin que surja ningun problema con los proyectos que tengo en java 6

      Eliminar