style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Iniciando con JavaFX: Jython + JavaFX

Hace unas horas me puse a picarle al Jython y pues me gusto, allí andaba y luego me dije: ¿Y que onda con Swing? Pues que le sigo scripteando(ese termino siquiera existe?) me aventé unas cuantas ventanitas todo cool hasta que me acorde de JavaFX... no me pude quitar la idea de poder ejecutar código FX en Python (Jython pues...) entonces comenzó la travesía jeje.

Preparando el terreno

Antes que nada debemos establecer una variable de entorno que es la que le dirá a Jython de donde obtener las clases de JavaFX.
Para esto hacemos el procedimiento(Windows 7): Inicio > clic derecho en Equipo > Propiedades > Configuración Avanzada del Sistema > Variables de entorno.

En la ventana de Variables de entorno en la sección Variables del sistema damos clic a Nueva y colocamos los siguientes valores:
Nombre de la variable: CLASSPATH
Valor de la variable: ruta\al\sdk\de\javafx\rt\lib\jfxrt.jar en este caso yo estoy usando la siguiente: C:\Program Files\Oracle\JavaFX 2.1 SDK\rt\lib\jfxrt.jar

Ahora si, podemos continuar.

Código

Primero usaremos un .java de guía para pasarlo a .py

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author kalt
 */

public class JavaFXApplication1 extends Application {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {
        launch(args);
    }
   
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

Este el ejemplo que te hace NetBeans :) ahora hay que hacerlo en Jython

import sys #Para obtener los argumentos que genera JavaFX
#Los siguientes imports son de JavaFX ;)
from javafx.application import Application
from javafx.stage import Stage
from javafx.scene import Scene
from javafx.scene.control import Button
from javafx.scene.layout import StackPane

from javafx.event import ActionEvent
from javafx.event import EventHandler

#Declaramos la clase y hereda de Application e implementa EventHandler
class HiJavaFX(Application, EventHandler):
    #Sobrescribimos el metodo start
    def start(self, escenario):        
        escenario.setTitle("Jython + JavaFX")
        boton = Button("Dame clic")
        boton.setOnAction(self)    
        pane = StackPane()
        pane.getChildren().add(boton)
        escenario.setScene(Scene(pane,300,250))
        escenario.show()
    #Y también el método handle    
    def handle(self, evento):
        print "Hola mundo desde Jython + JavaFX"
if __name__=="__main__": #Iniciamos la aplicación
    #Aqui es donde interviene el modulo sys pues usamos la segunda
    #forma del método launch.
    Application.launch(HiJavaFX().class, sys.argv[0])

Muy parecido, lo mas importante de este ejemplo es el empleo de el modulo sys para obtener los argumentos de JavaFX. Por cierto, que hasta donde yo se, no hay una forma oficial de implementar JavaFX en Jython.
Espero que les sea útil. Saludos!

Basado en hechos reales XD: http://kodegeek.com/blog/2011/10/09/jython-javafx-comienzo-duro

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Python en Java

Muy buena info ... a ver si pruebo tu ejemplo

0_0

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">