Java Fx

Fernando Lucía

1 De Swing A JavaFX …........................

Documentación Oracle de la API: http://docs.oracle.com/javase/8/javafx/api/toc.htm

http://docs.oracle.com/javase/8/javase-clienttechnologies.htm

Sabía de la existencia de esta herramienta, pero no la importancia que le ha dado Oracle.

JavaFx se ha convertido en el estandard para el desarrollo de la interfaz gráfica para aplicaciones de escritorio con java, sustituyendo a swing.

Por lo tanto es necesario, obligatorio dominarlo.

Para desarrollar la interfaz gráfica Oracle proporciona la herramienta de diseño Scenne Builder. Podemos descargarla desde: http://www.oracle.com/technetwork/java/javase/downloads/index.html

También necesitamos instalar el JDK 8 y la version Netbeans 8.

Netbeans 8 viene preparado para la creación de aplicaciones JavaFX. Pero ademas, permite la utilización de Scenne Builder ,desde su entorno, para la edición de los ficheros FXML,

Los ficheros FXML son fichero xml donde se define la interfaz gráfica de las aplicaciones.

<?xml version="1.0" encoding="UTF-8"?>

<?import cp.*?>

<?import java.lang.*?>

<?import java.util.*?>

<?import javafx.scene.*?>

<?import javafx.scene.control.*?>

<?import javafx.scene.layout.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">

<children>

<FXMLDocumentController layoutX="53.0" layoutY="102.0" />

</children>

</AnchorPane>

 

Para que podamos utilizar Scenne Builder desde Netbeasn 8 lo configuraremos desde Tools/ Options/Java/JavaFX indicando la ruta de la carpeta en la que hemos instalado Scenne Builder.

 

 

 

Creando una aplicación JavaFX.

Hay varias opciones de momento utilizaremos la opción: File / New Proyect / JavaFX / JavaFx FXML Aplication.

Nos crea una estructura de ficheros y carpetas con los elementos básicos de una aplicación.

 

 

El fichero FMXLDocumento.fxml es el fichero xml que define la interfaz gráfica y que es editable con Scenne Builder ( botón derecho Open)

El Ficehero FXMLDocumentController.java es la clase java donde escribiremos las funciones de la aplicación. En estas funciones en muchos casos programaremos los eventos asociados a los controles añadidos en la interfaz gráfica.

Finalmente el fichero PrimerFxml.java hace la función de la clase main en una aplicación java.

FXML es un lenguaje basado en xml por medio del cual JavaFX de Oracle permite crear aplicaciones RIA(aplicaciones web que tienen las características y capacidades de aplicaciones de escritorio). Es la alternativa a Flash y a WPF(xaml) de Microsoft.

JavaFX, al parecer http://www.infoq.com/news/2013/02/javafx-ios-android , también permite desarrollar aplicaciones para Android (http://www.infoq.com/articles/Building-JavaFX-Android-Apps) e IOS. De momento estamos a años luz de esto.

 

De momento …. Pensemos en aplicaciones de escritorio.

 

La estructura de ficheros creada nos permite ver como se desarrollan las aplicaciones JavaFX, ya que aísla completamente la interfaz gráfica que puede crear un diseñador con la herramienta Scenne Builder, de la lógica de la aplicación que se crea en los ficheros java asociados(FXMLDocumentController.java ). En las aplicaciones swing habitualmente mezclábamos en el mismo fichero el diseño con la lógica.

2Hojas de estilo con con JavaFX.

H:\Verano2014\javaFx_groovyFx\tutorial-javafx-primeros-pasos.pdf

http://www.kamlov.site90.net/?p=230

A la hora de trabajar con el diseño gráfico de los controles que van a formar el interfaz las posibilidades que ofrece JavaFx frente a Swing parecen enormes. Podemos lograr trabajando con las propiedades de los controles efectos como estos.

Pero además podemos utilizar css para añadir mas efectos. He incluso crear estas hojas de estilo en ficheros externos.

ejemplo.css

.menus

{

-fx-background-color:blue;

}

Label{

-fx-background-color: linear-gradient(#61a2b1, #2A5058);

}

#file{-fx-background-color:cyan}

#label{

-fx-background-color:red;

}

#caja{

-fx-background-color:pink;

}

Button{

-fx-font-size:24;

}

Las propiedades que definen los estilos css son las mismas(eso parece) pero con el prefijo -fx. Se pueden agrupar estilos por:

  • clases (.) <MenuBar layoutX="83.0" layoutY="14.0" styleClass="menus">

  • por id (#) <Label id="label" layoutX="125.0" layoutY="55.0" text="Label" />

  • por tipo de componente (Button) <Button layoutX="73.0" layoutY="88.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="168.0" />

Para añadir el fichero css desde Scene Bulder , hacemos Preview, Scene Style Sheets, Add a Style Sheet ..

También podemos editar el fichero fxml y indicar el fichero css dentro de la definición de un control contenedor o de otro tipo en la clausula stylesheets.

<AnchorPane id="AnchorPane" prefHeight="200.0" prefWidth="320.0" stylesheets="@estilosJfxXml.css"

 

Otra forma sería con la inserción en el código del fichero fxml, entre las etiquetas que definenn el contenedor <AnchorPane …....> …............... </AnchorPane>

 

<AnchorPane …..>

<stylesheets>

<URL value="@ejemplo.css"/>

</stylesheets>

</AnchorPane>

3Controles personalizados con JavaFX.

JavaFX permite crear fácilmente, pero también de una forma algo liosa, controles personalizados.

Es muy fácil añadir, por ejemplo un botón a una ventana de la aplicación(fichero fxml), darle un diseño utilizando las propiedades del objeto Button, proporcionado por la librería JavaFX, o utilizando CSS(hojas de estilo) y añadirle a la pestaña de controles personalizados.

Lo podemos hacer igualmente con el diseño de toda la pantalla.

Una vez que estén en la pestaña de controles Custom, podremos utilizar estos controles desde cualquier aplicación. Es decir podremos crearnos rápidamente nuestra colección de controles personalizados.

 

 

Lo difícil es cuando queremos crear una aplicación JavaFx, interfaz mas lógica, y a partir de la misma crear un control personalizado.

Para ello seguiremos los siguientes pasos:

1.- Crear la aplicación base a partir de la cual generaremos eñ control personalizado.

Para ello: File / New Proyect / JavaFX / JavaFx FXML Aplication.

En nuestro caso la llamaremos Navegador.

Renombramos los ficheros

 

2. Crear el interfaz

 

En nuestro caso creamos un interfaz con un contenedor AnchorPane y los siguientes controles

Este interfaz genera el siguiente fichero Fxml:

<?xml version="1.0" encoding="UTF-8"?>

 

<?import javafx.scene.web.*?>

<?import java.lang.*?>

<?import java.util.*?>

<?import javafx.scene.*?>

<?import javafx.scene.control.*?>

<?import javafx.scene.layout.*?>

 

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="navegador.ControllerNavegador">

<children>

<Hyperlink fx:id="enlace" layoutX="14.0" layoutY="83.0" onAction="#cambioPagina" prefHeight="23.0" prefWidth="353.0" text="http;//www.informaticasc2.com" />

<WebView fx:id="VisorWeb" layoutX="32.0" layoutY="106.0" prefHeight="425.0" prefWidth="497.0" style=": 100;" />

<ToolBar layoutX="9.0" layoutY="43.0" prefHeight="40.0" prefWidth="543.0">

<items>

<TextField fx:id="textourl" prefHeight="25.0" prefWidth="401.0" promptText="Teclea la url de la página" text="http:/www.informaticasc2.com" />

<Button fx:id="button" onAction="#handleButtonAction" text="Cambia de Página" />

</items>

</ToolBar>

</children>

</AnchorPane>

 

El fichero ControllerNavegador.java con la lógica del programa

 

package navegador;

import java.net.URL;

import java.util.ResourceBundle;

import javafx.event.ActionEvent;

import javafx.fxml.FXML;

import javafx.fxml.Initializable;

import javafx.scene.control.Label;

import javafx.scene.control.TextField;

import javafx.scene.web.WebEngine;

import javafx.scene.web.WebView;

 

 

public class ControllerNavegador implements Initializable {

 

@FXML

private TextField textourl;

@FXML

private WebView VisorWeb;

@FXML

private void handleButtonAction(ActionEvent event) {

 

WebEngine webEngine = VisorWeb.getEngine();

webEngine.load(textourl.getText().toString());

}

@FXML

private void cambioPagina(ActionEvent event) {

WebEngine webEngine = VisorWeb.getEngine();

webEngine.load("http:/www.informaticasc2.com/vcl");

}

@FXML

private void fin(ActionEvent event) {

System.exit(0);

}

@Override

public void initialize(URL url, ResourceBundle rb) {

// TODO

} }

El fichero Navegador,java , clase main de la aplicación.

 

package navegador;

 

import javafx.application.Application;

import javafx.fxml.FXMLLoader;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.stage.Stage;

 

/**

*

* @author izquierda

*/

public class Navegador extends Application {

 

@Override

public void start(Stage stage) throws Exception {

Parent root = FXMLLoader.load(getClass().getResource("FXMLNavegador.fxml"));

 

Scene scene = new Scene(root);

 

stage.setScene(scene);

stage.show();

}

 

/**

* @param args the command line arguments

*/

public static void main(String[] args) {

launch(args);

}

 

}

Si ahora compilamos y ejecutamos la aplicación funciona.

 

3. Modificar los ficheros de la aplicación para poderla convertir en un control personalizado.

Ahora convertir la aplicación en un control personalizado

El problema esta en ,si queremos convertir la aplicación en un control personalizado, el fichero fxml tiene que estar contenido en un elemento <fx:root

Para ello es Scenne Builder marcamos en la pestaña Controller Class del diseño la opción Use fx:root constructor.

Ahora el fichero xml, FXMLNavegador.fxml, sera de la siguiente forma:

<?xml version="1.0" encoding="UTF-8"?>

 

<?import javafx.scene.web.*?>

<?import java.lang.*?>

<?import java.util.*?>

<?import javafx.scene.*?>

<?import javafx.scene.control.*?>

<?import javafx.scene.layout.*?>

 

<fx:root id="AnchorPane" prefHeight="200" prefWidth="320" type="AnchorPane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="navegador.ControllerNavegador">

//Es necesario eliminar el texto destacado,ya que no necesitamos cargar la clase que contiene la lógica del programa

<children>

<Hyperlink fx:id="enlace" layoutX="14.0" layoutY="83.0" onAction="#cambioPagina" prefHeight="23.0" prefWidth="353.0" text="http;//www.informaticasc2.com" />

<WebView fx:id="VisorWeb" layoutX="32.0" layoutY="106.0" prefHeight="425.0" prefWidth="497.0" style=": 100;" />

<ToolBar layoutX="9.0" layoutY="43.0" prefHeight="40.0" prefWidth="543.0">

<items>

<TextField fx:id="textourl" prefHeight="25.0" prefWidth="401.0" promptText="Teclea la url de la página" text="http:/www.informaticasc2.com" />

<Button fx:id="button" onAction="#handleButtonAction" text="Cambia de Página" />

</items>

</ToolBar>

</children>

</fx:root>

 

Si ahora compilamos y ejecutamos la aplicación no funciona.

Tenemos que seguir trabajando

 

Modificar el fichero con la lógica de la aplicación ControllerNavegador.java

package navegador;

 

import java.io.IOException;

import java.net.URL;

import java.util.ResourceBundle;

import javafx.event.ActionEvent;

import javafx.fxml.FXML;

import javafx.fxml.FXMLLoader;

import javafx.fxml.Initializable;

import javafx.scene.control.Label;

import javafx.scene.control.TextField;

import javafx.scene.layout.AnchorPane;

import javafx.scene.web.WebEngine;

import javafx.scene.web.WebView;

 

/**

*

* @author izquierda

*/

//Necesitamos extender de la clase AnchorPane, para que en esta clase contenedor se visualice la interfaz diseñada en el fichero

// xml FXMLNavegador.fxml

public class ControllerNavegador extends AnchorPane {

public ControllerNavegador() {

//Crear un método que sea el constructor de la clase ControllerNavegador() , donde además cargamos el fichero FXMLNavegador.fxml, donde hemos creado el interfaz. El resto igual,

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("FXMLNavegador.fxml"));

fxmlLoader.setRoot(this);

fxmlLoader.setController(this);

 

try {

fxmlLoader.load();

} catch (IOException exception) {

throw new RuntimeException(exception);

}

}

@FXML

private TextField textourl;

@FXML

private WebView VisorWeb;

@FXML

private void handleButtonAction(ActionEvent event) {

 

WebEngine webEngine = VisorWeb.getEngine();

webEngine.load(textourl.getText().toString());

 

}

@FXML

private void cambioPagina(ActionEvent event) {

 

// textourl.setText("Cambio Página");

WebEngine webEngine = VisorWeb.getEngine();

webEngine.load("http:/www.informaticasc2.com/vcl");

 

}

 

}

 

Finalmente modificamos la clase main, Navegador.java

package navegador;

 

import javafx.application.Application;

import javafx.fxml.FXMLLoader;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.stage.Stage;

 

/**

*

* @author izquierda

*/

public class Navegador extends Application {

 

@Override

public void start(Stage stage) throws Exception {

ControllerNavegador customControl = new ControllerNavegador();

//Crear un objeto de la clase controladora (lógica del programa, donde hemos cargado el interfaz), en lugar de cargar aquí en interfaz y hacer visible el objetográfico

stage.setScene(new Scene(customControl));

stage.setTitle("Navegador");

stage.setWidth(300);

stage.setHeight(200);

stage.show();

 

}

 

/**

* @param args the command line arguments

*/

public static void main(String[] args) {

launch(args);

}

 

}

Hacemos Celan an Build sobre el proyecto. En el proyecto se crea la carpeta dist y dentro de esta el fichero Navegador.jar

Si ahora jecutamos la aplicación funciona.

4. Añadir a los componentes Custom de Scenne Bulder la aplicación creada como un componente personalizado .

 

Abrimos Scenne Builder, desplegamos la pestaña de los componentes Custom, desplegamos la opción que aparece a la derecha de Libray

Seleccionamos Import JAR/FXML File, que nos permitirá seleccionar Navegador.jar del sistema de ficheros. De esta manera tendremos el nuevo control(componente) en la pestaña Custon y usarlo en nuestros diseños de interfaces. Para quitar un componente personalizado de la pestaña Custon accedemos a la carpeta C:\Users\izquierda\AppData\Roaming\Scene Builder\Library y eliminamos los jar de los componentes que queremos quitar.

 

 

4Ejecutar aplicaciones JavaFx en un navegador

  • http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/javafx_con_javaee_tutorial/javafx_javaee7.html

  • http://beatrizadriana-javafx.blogspot.com.es/

Después de crear la aplicación lo que tenemos que haces es construir el fichero .jar , que sera el archivo ejecutable desde fuera del entorno NetBeans.

Para ello hacemos clic con el botón derecho sobre el nombre del proyecto y elegimos la opción Clean and Build. Esta opción crea la carpeta dist dentro de la carpeta del proyecto.

Netbeans crea dentro de carpeta dist, los ficheros jnlp, jar y html necesarios para ejecutar la aplicación por medio de un navegador, embebiendo el ejecutable jar dentro de la página html mediante la siguiente cláusula:

<script>

// Se crean dos funciones

launchApplication y javafxEmbed().

  • La función launchApplication se ejecuta al hacer clic en el enlace

<b>Webstart:</b> <a href='Navegador.jnlp' onclick="return launchApplication('Navegador.jnlp');">click to launch this app as webstart</a><br><hr><br>

Al ejecutar esta función la aplicación se instala en el equipo en el que se ejecuta por medio de JavaWebStart. Después, para acceder a la aplicaciones instaladas, vamos a Inicio, Java, ficha General, botón Ver, que nos muestra las aplicaciones instaladas vía JavaWebStart.

  • La función javafxEmbed() ejecuta el código Html de la página y dentro de ella, como un applet, el ejecutable .jar.


 

function launchApplication(jnlpfile) {

dtjava.launch( {

url : 'Navegador.jnlp',

jnlp_content : 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iTmF2ZWdhZG9yLmpubHAiPg0KICA8aW5mb3JtYXRpb24+DQogICAgPHRpdGxlPk5hdmVnYWRvcjwvdGl0bGU+DQogICAgPHZlbmRvcj5penF1aWVyZGE8L3ZlbmRvcj4NCiAgICA8ZGVzY3JpcHRpb24+bnVsbDwvZGVzY3JpcHRpb24+DQogICAgPG9mZmxpbmUtYWxsb3dlZC8+DQogIDwvaW5mb3JtYXRpb24+DQogIDxyZXNvdXJjZXM+DQogICAgPGpmeDpqYXZhZngtcnVudGltZSB2ZXJzaW9uPSIyLjIrIiBocmVmPSJodHRwOi8vamF2YWRsLnN1bi5jb20vd2ViYXBwcy9kb3dubG9hZC9HZXRGaWxlL2phdmFmeC1sYXRlc3Qvd2luZG93cy1pNTg2L2phdmFmeDIuam5scCIvPg0KICA8L3Jlc291cmNlcz4NCiAgPHJlc291cmNlcz4NCiAgICA8ajJzZSB2ZXJzaW9uPSIxLjYrIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2F1dG9kbC9qMnNlIi8+DQogICAgPGphciBocmVmPSJOYXZlZ2Fkb3IuamFyIiBzaXplPSI2MDkzIiBkb3dubG9hZD0iZWFnZXIiIC8+DQogIDwvcmVzb3VyY2VzPg0KPHNlY3VyaXR5Pg0KICA8YWxsLXBlcm1pc3Npb25zLz4NCjwvc2VjdXJpdHk+DQogIDxhcHBsZXQtZGVzYyAgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIG1haW4tY2xhc3M9ImNvbS5qYXZhZngubWFpbi5Ob0phdmFGWEZhbGxiYWNrIiAgbmFtZT0iTmF2ZWdhZG9yIiA+DQogICAgPHBhcmFtIG5hbWU9InJlcXVpcmVkRlhWZXJzaW9uIiB2YWx1ZT0iMi4yKyIvPg0KICA8L2FwcGxldC1kZXNjPg0KICA8amZ4OmphdmFmeC1kZXNjICB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgbWFpbi1jbGFzcz0ibmF2ZWdhZG9yLk5hdmVnYWRvciIgIG5hbWU9Ik5hdmVnYWRvciIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo='

}, { javafx : '2.2+' }, {} );

return false;

}

</script>


 

<script>

function javafxEmbed() {

dtjava.embed(

{ codebase:'../../dist',

url : 'Navegador.jnlp',

placeholder : 'javafx-app-placeholder',

width : 800,

height : 600,

jnlp_content : 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iTmF2ZWdhZG9yLmpubHAiPg0KICA8aW5mb3JtYXRpb24+DQogICAgPHRpdGxlPk5hdmVnYWRvcjwvdGl0bGU+DQogICAgPHZlbmRvcj5penF1aWVyZGE8L3ZlbmRvcj4NCiAgICA8ZGVzY3JpcHRpb24+bnVsbDwvZGVzY3JpcHRpb24+DQogICAgPG9mZmxpbmUtYWxsb3dlZC8+DQogIDwvaW5mb3JtYXRpb24+DQogIDxyZXNvdXJjZXM+DQogICAgPGpmeDpqYXZhZngtcnVudGltZSB2ZXJzaW9uPSIyLjIrIiBocmVmPSJodHRwOi8vamF2YWRsLnN1bi5jb20vd2ViYXBwcy9kb3dubG9hZC9HZXRGaWxlL2phdmFmeC1sYXRlc3Qvd2luZG93cy1pNTg2L2phdmFmeDIuam5scCIvPg0KICA8L3Jlc291cmNlcz4NCiAgPHJlc291cmNlcz4NCiAgICA8ajJzZSB2ZXJzaW9uPSIxLjYrIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2F1dG9kbC9qMnNlIi8+DQogICAgPGphciBocmVmPSJOYXZlZ2Fkb3IuamFyIiBzaXplPSI2MDkzIiBkb3dubG9hZD0iZWFnZXIiIC8+DQogIDwvcmVzb3VyY2VzPg0KPHNlY3VyaXR5Pg0KICA8YWxsLXBlcm1pc3Npb25zLz4NCjwvc2VjdXJpdHk+DQogIDxhcHBsZXQtZGVzYyAgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIG1haW4tY2xhc3M9ImNvbS5qYXZhZngubWFpbi5Ob0phdmFGWEZhbGxiYWNrIiAgbmFtZT0iTmF2ZWdhZG9yIiA+DQogICAgPHBhcmFtIG5hbWU9InJlcXVpcmVkRlhWZXJzaW9uIiB2YWx1ZT0iMi4yKyIvPg0KICA8L2FwcGxldC1kZXNjPg0KICA8amZ4OmphdmFmeC1kZXNjICB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgbWFpbi1jbGFzcz0ibmF2ZWdhZG9yLk5hdmVnYWRvciIgIG5hbWU9Ik5hdmVnYWRvciIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo=',

id:'control'

}, { javafx : '2.2+' }, {} ); }

<!-- Embed FX application into web page once page is loaded -->

dtjava.addOnloadCallback(javafxEmbed);

</script>


 

Meeeeeeee FUNCIONAaaaaaaaaaaaaaaaaaaaa

Veamos como :

1.- Crear la aplicación JavaFx Navegador

2.- Compilar la aplicación Clean and Build, En la carpeta Dist crea la siguiente estructura de ficheros


 

3.- Firmar Navegador .jar

Para ello hacemos:

0. Ir a la carpeta Dist.

  1. Crear un certificado para posteriormente firmar la aplicación:

Para poder acceder a la utilidad keytool añadimos a la variable de entorno path

C:\Program Files\Java\jdk1.8.0\bin

set path=%path%;C:\Program Files\Java\jdk1.8.0\bin

keytool -genkey -keystore galeriaimagenes -alias migaleria

Me pide una contraseña migaleria

Mi nombre y apellidos

Nombre de la unidad de organización

Nombre de la organización

Ciudad

Provincia

Código de país (es) para España

Nos pide otra clave para el almacenamiento, Podemos dejar la misma indicada anteriormente migaleria

Se crea en esta misma carpeta un fichero que es el almacén de claves

galeriaimagenes

 

  1. Firmar GaleriaImagenes.jar

jarsigner -keystore galeriaimagenes Navegador.jar migaleria

 

4.- Crear una aplicación web con NetBeans

Nuevo Proyecto/ Java Web , con el nombre WebNavegador


 

Copiar todos los ficheros de la carpeta dist , incluido el almacen de claves(galeriaimagenes) y la carpeta web-files

Retocar fichero Navegador.html


 

<html><head>

<SCRIPT src="./web-files/dtjava.js"></SCRIPT>

<script>

function launchApplication(jnlpfile) {

dtjava.launch( {

url : 'http://192.168.0.13:8084/WebNavegador/Navegador.jnlp',

jnlp_content : 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iTmF2ZWdhZG9yLmpubHAiPg0KICA8aW5mb3JtYXRpb24+DQogICAgPHRpdGxlPk5hdmVnYWRvcjwvdGl0bGU+DQogICAgPHZlbmRvcj5penF1aWVyZGE8L3ZlbmRvcj4NCiAgICA8ZGVzY3JpcHRpb24+bnVsbDwvZGVzY3JpcHRpb24+DQogICAgPG9mZmxpbmUtYWxsb3dlZC8+DQogIDwvaW5mb3JtYXRpb24+DQogIDxyZXNvdXJjZXM+DQogICAgPGpmeDpqYXZhZngtcnVudGltZSB2ZXJzaW9uPSIyLjIrIiBocmVmPSJodHRwOi8vamF2YWRsLnN1bi5jb20vd2ViYXBwcy9kb3dubG9hZC9HZXRGaWxlL2phdmFmeC1sYXRlc3Qvd2luZG93cy1pNTg2L2phdmFmeDIuam5scCIvPg0KICA8L3Jlc291cmNlcz4NCiAgPHJlc291cmNlcz4NCiAgICA8ajJzZSB2ZXJzaW9uPSIxLjYrIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2F1dG9kbC9qMnNlIi8+DQogICAgPGphciBocmVmPSJOYXZlZ2Fkb3IuamFyIiBzaXplPSI2NDU2IiBkb3dubG9hZD0iZWFnZXIiIC8+DQogIDwvcmVzb3VyY2VzPg0KPHNlY3VyaXR5Pg0KICA8YWxsLXBlcm1pc3Npb25zLz4NCjwvc2VjdXJpdHk+DQogIDxhcHBsZXQtZGVzYyAgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIG1haW4tY2xhc3M9ImNvbS5qYXZhZngubWFpbi5Ob0phdmFGWEZhbGxiYWNrIiAgbmFtZT0iTmF2ZWdhZG9yIiA+DQogICAgPHBhcmFtIG5hbWU9InJlcXVpcmVkRlhWZXJzaW9uIiB2YWx1ZT0iMi4yKyIvPg0KICA8L2FwcGxldC1kZXNjPg0KICA8amZ4OmphdmFmeC1kZXNjICB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgbWFpbi1jbGFzcz0ibmF2ZWdhZG9yLk5hdmVnYWRvciIgIG5hbWU9Ik5hdmVnYWRvciIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo='

},

{

javafx : '2.2+'

},

{}

);

return false;

}

</script>


 

<script>

function javafxEmbed() {

dtjava.embed(

{

url : 'http://192.168.0.13:8084/WebNavegador/Navegador.jnlp',

placeholder : 'javafx-app-placeholder',

width : 800,

height : 600,

jnlp_content : 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iTmF2ZWdhZG9yLmpubHAiPg0KICA8aW5mb3JtYXRpb24+DQogICAgPHRpdGxlPk5hdmVnYWRvcjwvdGl0bGU+DQogICAgPHZlbmRvcj5penF1aWVyZGE8L3ZlbmRvcj4NCiAgICA8ZGVzY3JpcHRpb24+bnVsbDwvZGVzY3JpcHRpb24+DQogICAgPG9mZmxpbmUtYWxsb3dlZC8+DQogIDwvaW5mb3JtYXRpb24+DQogIDxyZXNvdXJjZXM+DQogICAgPGpmeDpqYXZhZngtcnVudGltZSB2ZXJzaW9uPSIyLjIrIiBocmVmPSJodHRwOi8vamF2YWRsLnN1bi5jb20vd2ViYXBwcy9kb3dubG9hZC9HZXRGaWxlL2phdmFmeC1sYXRlc3Qvd2luZG93cy1pNTg2L2phdmFmeDIuam5scCIvPg0KICA8L3Jlc291cmNlcz4NCiAgPHJlc291cmNlcz4NCiAgICA8ajJzZSB2ZXJzaW9uPSIxLjYrIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2F1dG9kbC9qMnNlIi8+DQogICAgPGphciBocmVmPSJOYXZlZ2Fkb3IuamFyIiBzaXplPSI2NDU2IiBkb3dubG9hZD0iZWFnZXIiIC8+DQogIDwvcmVzb3VyY2VzPg0KPHNlY3VyaXR5Pg0KICA8YWxsLXBlcm1pc3Npb25zLz4NCjwvc2VjdXJpdHk+DQogIDxhcHBsZXQtZGVzYyAgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIG1haW4tY2xhc3M9ImNvbS5qYXZhZngubWFpbi5Ob0phdmFGWEZhbGxiYWNrIiAgbmFtZT0iTmF2ZWdhZG9yIiA+DQogICAgPHBhcmFtIG5hbWU9InJlcXVpcmVkRlhWZXJzaW9uIiB2YWx1ZT0iMi4yKyIvPg0KICA8L2FwcGxldC1kZXNjPg0KICA8amZ4OmphdmFmeC1kZXNjICB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgbWFpbi1jbGFzcz0ibmF2ZWdhZG9yLk5hdmVnYWRvciIgIG5hbWU9Ik5hdmVnYWRvciIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo='

},

{

javafx : '2.2+'

},

{}

);

}

<!-- Embed FX application into web page once page is loaded -->

dtjava.addOnloadCallback(javafxEmbed);

</script>


 

</head><body>

<h2>Test page for <b>Navegador</b></h2>

<b>Webstart:</b> <a href='http://192.168.0.13:8084/WebNavegador/Navegador.jnlp' onclick="return launchApplication('http://192.168.0.13:8084/WebNavegador/Navegador.jnlp');">click to launch this app as webstart</a><br><hr><br>


 

<!-- Applet will be inserted here -->

<div id='javafx-app-placeholder'></div>

</body></html>


 

Retocar fichero Navegador.jnlp

<?xml version="1.0" encoding="utf-8"?>

<jnlp spec="1.0" xmlns:jfx="http://javafx.com" href="Navegador.jnlp">

<information>

<title>Navegador</title>

<vendor>izquierda</vendor>

<description>null</description>

<offline-allowed/>

</information>

<resources>

<jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/>

</resources>

<resources>

<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>

<jar href="Navegador.jar" size="6456" download="eager" />

</resources>

<security>

<all-permissions/>

</security>

<applet-desc width="800" height="600" main-class="com.javafx.main.NoJavaFXFallback" name="Navegador" >

<param name="requiredFXVersion" value="2.2+"/>

</applet-desc>

<jfx:javafx-desc width="800" height="600" main-class="navegador.Navegador" name="Navegador" />

<update check="always"/>

</jnlp>

EJECUTEMOS

Abrimos un Navegaror(Chrome, IE)

Y en la la url del navegador escribimos http://192.168.0.13:8084/WebNavegador/Navegador.html

DA ERROR por temas de seguridad de quer no reconoce nuesta firma . Para que nos permita ejecutar hacemos:

Ejecutamos desde la línea de comandos (Buscar) javaws -viewer para abrir el Panel de control de Java


 


 


 


 


 


 


 


 


 


 


 


 


 

Vamos a la pestaña Seguridad y botón Editar Lista Sitios y añadimos http://192.168.0.13:8084/WebNavegador/Navegador.html y http://192.168.0.13:8084/WebNavegador/Navegador.jnlp


 


 


 


 


 


 


 


 


 


 

EJECUTEMOS

Abrimos un Navegaror(Chrome, IE)

Y en la la url del navegador escribimos http://192.168.0.13:8084/WebNavegador/Navegador.html

 

Y FUNCIONA.

5JavaFX para desarrolladores de Swing

http://docs.oracle.com/javafx/2/swing/jfxpub-swing.htm

Trabajando con eventos; http://docs.oracle.com/javafx/2/events/processing.htm

Este tutorial proporciona una visión general de los beneficios JavaFX disponible para los desarrolladores de GUI, ilustra la interoperabilidad JavaFX-Swing, muestra cómo enriquecer una aplicación Swing existente mediante el aprovechamiento de la funcionalidad de JavaFX, y cómo implementar una aplicación Swing típica en JavaFX. Algunas de las características GUI más populares de hoy en día no se puede implementar fácilmente usando Swing.

Este tutorial contiene los siguientes capítulos:

La ventaja de JavaFX para desarrolladores de Swing

JavaFX está diseñada para proporcionar aplicaciones con estas características GUI sofisticados como animación suave, visitas web, reproducción de audio y video, y estilos basados ​​en hojas de estilo en cascada (CSS).

FXML

FXML es un lenguaje de marcado basado en XML que permite a los desarrolladores para crear una interfaz de usuario (UI) en una aplicación JavaFX por separado de la aplicación de la lógica de la aplicación.

Para trabajar el aspecto de los controles podemos utilizar css de la misma forma que se hace en Html.

Proporciona funcionalidad multimedia ,disponible en todas las plataformas en las que se admite JavaFX.

JavaFX permite a los desarrolladores animar objetos gráficos en sus aplicaciones con mucha mayor facilidad que en swing, debido al escenario gráfico subyacente a la plataforma y las API de particulares que se crean específicamente para ese propósito.

Añadir contenido HTML a a las aplicaciones, pudiendo ademas programar la lógica de la aplicación con javascript


 

La integración de JavaFX en aplicaciones Swing

Se trata de combinar en una misma clase Swing y JavaFx.Vamos a explicarlo con un ejemplo. Para ello creamos un proyecto de tipo JavaFx in Swing Aplication desde el menu New Proyect. Dentro del proyecto (H:\Verano2014\javaFx_groovyFx\JavaFX_con_SwingH:\Verano2014\javaFx_groovyFx\JavaFX_con_Swing ) creamos una clase (inicio ) de tipo JFrame From, que extiende de JFrame y podemos crear con el asistente gráfico de NetBeans.

Creamos un interfaz con un JLabel y JButton de Swing y un TextField y Button de JavaFX(desde aquí, de momento, no podemos utilizar el código xml, que genera Scenne Builder).

import javafx.application.Platform;

import javafx.embed.swing.JFXPanel;

import javafx.event.ActionEvent;

import javafx.event.EventHandler;

import javafx.scene.Group;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.TextField;

import javafx.scene.input.MouseEvent;

import javafx.scene.layout.AnchorPane;

import javafx.scene.paint.Color;

import javafx.scene.text.Font;

import javafx.scene.text.Text;

import javax.swing.JFrame;

import javax.swing.SwingUtilities;

public class inicio extends javax.swing.JFrame {

TextField text;

public inicio() {

initComponents();

final JFXPanel fxPanel = new JFXPanel();

//La clase JFXPanel fxPanel nos permitira crear en ella un objeto de tipo Scene, al que

//podremos añadir un objeto contenedor AnchorPane, al que añadiremos los controles TextField y Button

fxPanel.setBounds(10, 10, 400, 100); //Definimos el tamaño de fxPanel

this.getContentPane().add(fxPanel); // Lo añadimos al contenedor de la clase JFrame

this.setSize(440, 160);

this.setLocationRelativeTo(null);

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Para ejecutar código javaFx es necesario crear un hilo (thread)independiente y para ello se utiliza la clase Runnable. Los Runables que vayamos creando se encolan y se van ejecutan en el orden en el que son registrados en la cola de procesos. El método runLater hace que este hilo se ejecute antes de otros que pudieran se creados posteriormente. Una vez que el hilo termina de ejecutar el control de ejecución vuelve al programa desde donde se creo el hilo.

Platform.runLater(new Runnable() {

@Override

public void run() { //Dentro del hilo llamamos a un método pasando la clase fxPanel sobre la cual crearemos el contenedor, los controles JavaFx y programaremos los eventos de los controles..

initFX(fxPanel); } }); }

private void initFX(JFXPanel fxPanel) {

// This method is invoked on the JavaFX thread

Scene scene = createScene();//Llamamps a un método que nos devuelve un objeto de tipo Scene, donde creamos el interfaz gráfico de javaFx

fxPanel.setScene(scene);//Añadimos scene a fxPanel, que esta añadido al JFrame

}


 

private Scene createScene() {

AnchorPane root = new AnchorPane();//Objeto contenedor

Scene scene = new Scene(root, Color.ALICEBLUE); //Creamos el objeto Scene a partir del objetos contenedor.

text = new TextField(); //Caja de texto de JavaFX

text.setTranslateY(45);// Posicionamos el objeto en la pantalla

text.setTranslateX(70);

text.setFont(new Font(18));// Modificamos las propiedades setFont y setText

text.setText("http://docs.oracle.com/javafx/2/swing/port-to-javafx.htm");

//Añadimos el control text al contenedor

root.getChildren().add(text);

// Con el control boton trabajamos de forma parecida

Button boton = new Button();

boton.setText("botón");

boton.setTranslateX(10);

boton.setTranslateY(50);

//Utilizamos Hojas de estilo para darle formato al botón , en lugar de propiedades.

boton.setStyle("-fx-background-color:pink");

// Creamos eventos para el botçon JavaFx (mirar http://docs.oracle.com/javafx/2/events/processing.htm)

boton.setOnMouseMoved(new EventHandler<MouseEvent>() {

public void handle(MouseEvent event) {

//Modificamos el color de fondo y el tamaño de letra de la TextField con hojas de estilo, al pasar encima del Button boton

text.setStyle("-fx-background-color:cyan;-fx-font-size:24");

}

});

boton.setOnAction(new EventHandler<ActionEvent>() {

public void handle(ActionEvent event) {

//Lo mismo que hacíamos para acceder al intefaz creado con JvaFx, mediante la creación de un hilo con la clase Runnable por medio de Platform.runLater. Para poder acceder a los controles de la parte swing desde JavaFX, necesitamos ejecutar el código dentro de un hilo creado con la clase SwingUtilities

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

jLabel1.setText("Mensaje : saludos desde javaFX");

// Código para cambiar los datos de Swing.

}

});

}

});


 

root.getChildren().add(boton);//Añadimos el botón al contenedor

return (scene);// Devolvemos el objeto scene, con la interfaz ya creada.

}

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

// Diseño del interfaz parte swing creada con el asistente de Netbeans

jButton1 = new javax.swing.JButton();

jLabel1 = new javax.swing.JLabel();


 

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

getContentPane().setLayout(null);


 

jButton1.setText("jButton1");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

getContentPane().add(jButton1);

jButton1.setBounds(0, 10, 73, 23);


 

jLabel1.setText("jLabel1");

getContentPane().add(jLabel1);

jLabel1.setBounds(100, 10, 280, 30);


 

pack();

}// </editor-fold>

// Desde el evento ActionPerformed de Jbutton(Swing) accedemos a los objetos FavaFX( TextField)

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

Platform.runLater (new Runnable () {

@Override

public void run () {

text.setText ("Cambio");

}

});

}


 

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

/* Set the Nimbus look and feel */

//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">

/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

*/

try {

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

}

}

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(inicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(inicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(inicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(inicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

}

//</editor-fold>


 

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new inicio().setVisible(true);

}

});

}


 

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JLabel jLabel1;

// End of variables declaration

}

Enriquecer aplicaciones Swing con la Funcionalidad de JavaFX

Ejemplo de una aplicación swing a la que se añade un control JavaFX para representar los datos de un JTable en un gráfico de barras. AL modificar los datos en el JTable, se modifica el gráfico.

Proyecto H:\Verano2014\javaFx_groovyFx\JavaFX_con_Swing.

ClaseH:\Verano2014\javaFx_groovyFx\JavaFX_con_Swing\src\javafx_con_swing\datos\Grafica_1

/*

* To change this license header, choose License Headers in Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package javafx_con_swing.datos;


 

import java.awt.Dimension;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Vector;

import javafx.application.Platform;

import javafx.collections.FXCollections;

import javafx.collections.ObservableList;

import javafx.embed.swing.JFXPanel;

import javafx.scene.Scene;

import javafx.scene.chart.BarChart;

import javafx.scene.chart.CategoryAxis;

import javafx.scene.chart.NumberAxis;

import javafx.scene.chart.XYChart;

import static javafx_con_swing.datos.BarChartSample.austria;

import javax.swing.JTable;

import javax.swing.event.TableModelEvent;

import javax.swing.event.TableModelListener;

import javax.swing.table.AbstractTableModel;


 

public class Grafica_1 extends javax.swing.JFrame {


 

SampleTableModel tableModel;

JFXPanel chartFxPanel;

BarChart chart;

XYChart.Series series1 = new XYChart.Series();

XYChart.Series series2 = new XYChart.Series();

XYChart.Series series3 = new XYChart.Series();

XYChart.Series actualizardatos = new XYChart.Series();

Vector vseries = new Vector();

BarChart<String, Number> bc;


 

/**

* Creates new form datos

*/

public Grafica_1() {

initComponents();

tableModel = new SampleTableModel();

// javax.swing.JOptionPane.showMessageDialog(null, "--0");

this.setSize(500, 900);


 

// create javafx panel for charts

chartFxPanel = new JFXPanel();

// javax.swing.JOptionPane.showMessageDialog(null, "--1");

chartFxPanel.setPreferredSize(new Dimension(400, 300));

chartFxPanel.setBounds(10, 200, 400, 600);

// fxPanel.setBackground(java.awt.Color.red);


 

Platform.runLater(new Runnable() {

@Override

public void run() {

// javax.swing.JOptionPane.showMessageDialog(null, "--2");

createScene();

// javax.swing.JOptionPane.showMessageDialog(null, "--3");

}

});

this.getContentPane().add(chartFxPanel);

}


 

private void createScene() {

// javax.swing.JOptionPane.showMessageDialog(null, "--4");

//chart = creaGrafica();

chartFxPanel.setScene(creaGrafica());

// javax.swing.JOptionPane.showMessageDialog(null, "--5");

}


 

private Scene creaGrafica() {

Vector vcabecera = new Vector();

vcabecera.add("Combustible");

vcabecera.add("2012");

vcabecera.add("2013");

vcabecera.add("2014");

Vector vdatos = new Vector();

Vector linea = new Vector();

linea.add("Gasolina");

linea.add(100);

linea.add(400);

linea.add(500);

vdatos.add(linea);

linea = new Vector();

linea.add("Gasoleo");

linea.add(400);

linea.add(300);

linea.add(50);

vdatos.add(linea);

linea = new Vector();

linea.add("Gas");

linea.add(500);

linea.add(50);

linea.add(600);

vdatos.add(linea);

ModeloTabla MT = new ModeloTabla(vdatos, vcabecera);


 

jTable1 = new JTable(MT);

jScrollPane1.getViewport().add(jTable1, null);

MT.addTableModelListener(new TableModelListener() {

@Override

public void tableChanged(TableModelEvent e) {

// javax.swing.JOptionPane.showMessageDialog(null, MT.getValueAt(jTable1.getSelectedRow(), jTable1.getSelectedColumn()) + "--" + jTable1.getSelectedRow());

actualizardatos = bc.getData().get(jTable1.getSelectedRow());

// javax.swing.JOptionPane.showMessageDialog(null, actualizardatos.getChart().getData());

// javax.swing.JOptionPane.showMessageDialog(null, actualizardatos.getChart().getData().get(0));

ObservableList ol;

ol = (ObservableList) actualizardatos.getChart().getData();

// javax.swing.JOptionPane.showMessageDialog(null, ol);


 

XYChart.Series<String, Number> s

= (XYChart.Series<String, Number>) bc.getData().get(jTable1.getSelectedRow());

BarChart.Data data = s.getData().get(jTable1.getSelectedColumn());

Object numero = (Object) MT.getValueAt(jTable1.getSelectedRow(), jTable1.getSelectedColumn());

// javax.swing.JOptionPane.showMessageDialog(null, numero);

data.setYValue(numero);


 

}

});


 

ArrayList cabecera = new ArrayList(MT.getColumnNames());

CategoryAxis xAxis = new CategoryAxis();

NumberAxis yAxis = new NumberAxis();

bc

= new BarChart<String, Number>(xAxis, yAxis);

bc.setTitle("Consumo de Cobustible");


 

yAxis.setTickUnit(1000);


 

xAxis.setLabel("Años");

yAxis.setLabel("Metros Cúbicos Combustible");

String titulos[] = {"Gasolina", "Gasoleo", "Gas"};

XYChart.Series seriesx=null;

 

for (int i = 0; i < jTable1.getRowCount(); i++) {

seriesx = new XYChart.Series();

seriesx.setName(titulos[i]);

for (int j = 1; j < jTable1.getColumnCount(); j++) {


 

seriesx.getData().add(new XYChart.Data(cabecera.get(j), MT.getValueAt(i, j)));

/* seriesx.getData().add(new XYChart.Data(cabecera.get(0), MT.getValueAt(i, 0)));

seriesx.getData().add(new XYChart.Data(cabecera.get(1), MT.getValueAt(i, 1)));

seriesx.getData().add(new XYChart.Data(cabecera.get(2), MT.getValueAt(i, 2)));

*/

 

}

vseries.add(seriesx);

}

/*

series1.setName("Gasolina");

series1.getData().add(new XYChart.Data(cabecera.get(0), MT.getValueAt(0, 0)));

series1.getData().add(new XYChart.Data(cabecera.get(1), MT.getValueAt(0, 1)));

series1.getData().add(new XYChart.Data(cabecera.get(2), MT.getValueAt(0, 2)));

vseries.add(series1);

series2.setName("Gasoleo");

series2.getData().add(new XYChart.Data(cabecera.get(0), MT.getValueAt(1, 0)));

series2.getData().add(new XYChart.Data(cabecera.get(1), MT.getValueAt(1, 1)));

series2.getData().add(new XYChart.Data(cabecera.get(2), MT.getValueAt(1, 2)));

vseries.add(series2);

series3.setName("Gas");

series3.getData().add(new XYChart.Data(cabecera.get(0), MT.getValueAt(2, 0)));

series3.getData().add(new XYChart.Data(cabecera.get(1), MT.getValueAt(2, 1)));

series3.getData().add(new XYChart.Data(cabecera.get(2), MT.getValueAt(2, 2)));

vseries.add(series3);*/

 

Scene scene = new Scene(bc, 800, 600);

bc.getData().addAll(vseries);//1, series2, series3);

// scene.getStylesheets().add("resources/css/Chart.css");

// Modifica la hoja de estilos de la scena a la que se añade el control con el gráfico de barras.

// stage.setScene(scene);

// stage.show();

return scene;

}


 

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {


 

jScrollPane1 = new javax.swing.JScrollPane();

jTable1 = new javax.swing.JTable();


 

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

getContentPane().setLayout(null);


 

jScrollPane1.setViewportView(jTable1);


 

getContentPane().add(jScrollPane1);

jScrollPane1.setBounds(13, 10, 380, 110);


 

pack();

}// </editor-fold>


 

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

/* Set the Nimbus look and feel */

//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">

/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

*/

try {

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

}

}

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(Grafica.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(Grafica.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(Grafica.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(Grafica.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

}

//</editor-fold>


 

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new Grafica_1().setVisible(true);

}

});

}


 

// Variables declaration - do not modify

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JTable jTable1;

// End of variables declaration


 

class ModeloTabla extends javax.swing.table.AbstractTableModel {


 

Vector ddatos;

Vector NombresColumnas;

Class[] Tipos;

boolean[] Editable;

boolean sw;

Class[] tipocolumna = {java.lang.String.class,java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class};

boolean[] edicionColuma = {true, true, true};


 

public ModeloTabla(Vector Datos, Vector Cabecera)//, Class[] TiposDeDatos, boolean[] EsEditable) //, String user, String passwd

{

NombresColumnas = Cabecera;

ddatos = Datos;

Tipos = tipocolumna;//TiposDeDatos;

Editable = edicionColuma;//EsEditable;


 

System.out.println("..." + ddatos.get(0));

Vector row = (Vector) ddatos.elementAt(0);

System.out.println("..." + row.get(0));

fireTableChanged(null);

}


 

public void borraLinea(int nl) {

ddatos.remove(nl);

fireTableChanged(null);

}


 

public void anadeLinea() {


 

Vector nuevafila = new Vector();


 

nuevafila.addElement(new Integer(0));

nuevafila.addElement(new Integer(0));

nuevafila.addElement(new Integer(0));

ddatos.addElement(nuevafila);


 

sw = true;

fireTableChanged(null);

}

//////////////////////////////////////////////////////////////////////////

// Implementacion de los métodos de interfaz de TableModel

//////////////////////////////////////////////////////////////////////////

public String getColumnName(int column) {

System.out.println("getColumnName " + column);

// if(column==0 || column== 5) return null;

if (NombresColumnas.get(column) != null) {

return NombresColumnas.get(column) + "";

} else {

return "";

}

}

public Class getColumnClass(int column) {


 

switch (column) {

case 0:

return String.class;

case 1:

return Integer.class;

case 2:

return Integer.class;

case 3:

return Integer.class;


 

default:

return Object.class;

}

}


 

public boolean isCellEditable(int row, int column) {

System.out.println("isCellEditable " + column + " " + row);

return Editable[column];

}


 

public int getColumnCount() {

return NombresColumnas.size();

}


 

// Data methods

public int getRowCount() {

return ddatos.size();

}


 

public Object getValueAt(int aRow, int aColumn) {


 


 


 

//System.out.println(aRow +"..."+ aColumn+"..."+ddatos.get(1));

Vector row = (Vector) ddatos.elementAt(aRow);

System.out.println("getValueAt " + aColumn + " " + aRow + " " + row.get(aColumn));

return row.elementAt(aColumn);

// return new Object();


 

}


 

public void setValueAt(Object value, int row, int column) {

System.out.println("setValueAt " + value + " " + +column + " " + row);

Vector dataRow = (Vector) ddatos.elementAt(row);

dataRow.setElementAt(value, column);

fireTableDataChanged();


 

}


 

public String dbRepresentation(int column, Object value) {

System.out.println("dbRepresentation " + value + " " + +column);


 

return value.toString();


 

}


 

public List getColumnNames() {

return Arrays.asList(NombresColumnas.toArray());

}

}

}

6 Clases JavaFx en Jframe/JApplet. Clase JFrame en Javafx

En este apartado pondremos un ejemplo lo mas fácil posible para aprender dos cosas:

  1. Crear una aplicación swing y dentro de la misma insertar JavaFx. Lo haremos con un ejemplo que extiende de un Japplet y otro que extiende de un JFrmae

  2. Crear una aplicación JavaFX y dentro de la misma ejecutar una aplicación(clase) swing.

1.-Aplicación Swing. Proyecto H:\Verano2014\javaFx_groovyFx\SwingConJavafx

Para ello creamos una aplicación Swing normal. New Project/Java/Java Aplication.

Le damos el nombre SwingConJavaFx

Ahora clic con el botón derecho sobre nombre del pakage SwingConJavaFx y elegimos el tipo JavaFx-in-Swing Main class. Creamos una clase con el nombre ClaseFX_en_SwingMain.

Esta clase extiende de la clase contenedorea Japplet,

package swingconjavafx;

import java.awt.BorderLayout;

import java.awt.Dimension;

import javafx.application.Platform;

import javafx.embed.swing.JFXPanel;

import javafx.event.ActionEvent;

import javafx.event.EventHandler;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.layout.StackPane;

import javax.swing.JApplet;

import javax.swing.JFrame;

import javax.swing.SwingUtilities;

import javax.swing.UIManager;

plic class ClaseFX_en_SwingMain extends JApplet {

private static final int JFXPANEL_WIDTH_INT = 300;

private static final int JFXPANEL_HEIGHT_INT = 250;

private static JFXPanel fxContainer;

public static void main(String[] args) {

// Método para ejecutar Swing

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

} catch (Exception e) {

}

JFrame frame = new JFrame("Java Fx en Swing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JApplet applet = new ClaseFX_en_SwingMain();

applet.init();

frame.setContentPane(applet.getContentPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

applet.start();

} }); }

@Override

public void init() {

fxContainer = new JFXPanel();

fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));

add(fxContainer, BorderLayout.CENTER);

// create JavaFX scene

// Método para ejecutar JavaFx dentro Swing

Platform.runLater(new Runnable() {

@Override

public void run() {

createScene();

}

});

}

private void createScene() {

Button btn = new Button();

btn.setText("Java Fx en Swing");

btn.setOnAction(new EventHandler<ActionEvent>() {

@Override

public void handle(ActionEvent event) {

System.out.println("Java Fx en Swing");

}

});

StackPane root = new StackPane();

root.getChildren().add(btn);

fxContainer.setScene(new Scene(root));

}

}


 

 

Ahora vamos a hacerlo de una forma mas manual, pero mas fácil para mi extendiendo de un JFrame. Para ello creamos una nueva clase con New JFrame Form , le damos el nombre ClaseFX_SwingJFrame y lo modificaremos para ejecutar dentro del mismo código JavaFx.

package swingconjavafx;

import java.awt.BorderLayout;

import java.awt.Dimension;

import javafx.application.Platform;

import javafx.embed.swing.JFXPanel;

import javafx.event.ActionEvent;

import javafx.event.EventHandler;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.layout.StackPane;

/**

*

* @author izquierda

*/

public class ClaseFX_SwingJFrame extends javax.swing.JFrame {

private static final int JFXPANEL_WIDTH_INT = 300;

private static final int JFXPANEL_HEIGHT_INT = 250;

private static JFXPanel fxContainer;


 

public ClaseFX_SwingJFrame() {

initComponents();

fxContainer = new JFXPanel();

fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));

add(fxContainer, BorderLayout.CENTER);

// create JavaFX scene

Platform.runLater(new Runnable() {

@Override

public void run() {

createScene();

} });

fxContainer.setBounds(10, 10, 400, 100);

this.getContentPane().add(fxContainer);

this.setSize(440,160);

this.setLocationRelativeTo(this);

}

private void createScene() {

Button btn = new Button();

btn.setText("Java Fx en Swing");

btn.setOnAction(new EventHandler<ActionEvent>() {

@Override

public void handle(ActionEvent event) {

System.out.println("Java Fx en Swing");

}

});

StackPane root = new StackPane();

root.getChildren().add(btn);

fxContainer.setScene(new Scene(root));

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

getContentPane().setLayout(null);

pack();

}// </editor-fold>

public static void main(String args[]) {

try {

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

} } } catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

}

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new NewJFrame().setVisible(true);

} }); } }

El ejemplo siguiente utiliza el diseño del interfaz realizado con Scenne Builder, En el se crea un control TableView y un control DatePicker que van a permitir visualizar y añadir contactos a una lista. Proyecto H:\Verano2014\javaFx_groovyFx\SwingConJavafx\carpetajFx

Clases :

  • InterfazFXML.fxml diseño ScenneBuilder

  • DisenoFXMLController.java clase controller

  • Contactos.java JavaBean que define los datos a almacenar en la TableView

  • principal.java main de la aplicación para su ejecución como javafx

  • SwingPrincipal.java main de la aplicación para su ejecución dentro de un JFrame

H:\Verano2014\javaFx_groovyFx\JavaFX_con_Swing\src\javafx_con_swing\inicio.java , es mas completo y demuestra lo mismo. Embeber código JavaFx dentro de una clase que extiende de JFrame.

Para ver la manera de añadir un JPanel a una clas JavaFx que extiende de Application ver

H:\Verano2014\javaFx_groovyFx\JavaFXconSwing\src\swingDENTROjavafx\

class VisorAlbum.java Clase main que extiende Application

album.fxml Vista de la aplicación JavaFX

class AlbumController Controlador de la aplicación

class LectorImagenes Clase con el código e interface Swing

2.-Crear una aplicación JavaFX y dentro de la misma ejecutar una aplicación(clase) swing.

Mirarse esto (H:\Verano2014\javaFx_groovyFx\JavaFXconSwing) y http://docs.oracle.com/javafx/8/embed_swing/jfxpub-embed_swing.htm , pero al parecer si necesitamos combinar swing con javafx, es mejor crear proyecto swing y dentro embeber javafx, que al revés. Si es valido si todo el interfaz se construye con clase swing. Trabajando algo mas ha cambiado algo, puede que se pueda ….................... Añadimos la calse swing degradado.java , que es un JPanel a javaFX desde la clase Controller FXMLDocumentController. Al hacer clic en el control ColorPicker

Clases : FXMLDocument.fxmlgf

FXMLDocumentController.java

JavaFXconSwing.java

degradado.java Clased swing que extiende Jpanel y es la que añadimos a JavaFx


 

7 JavaFx y javascript

http://docs.oracle.com/javafx/2/deployment/javafx_javascript.htm

http://docs.oracle.com/javafx/2/deployment/javafx_javascript.htm

Aunque los applet han caído en desuso con la aparición de la tecnología AJAX, javaFx también permite incrustar los ejecutables jar generados dentro de una página html.

Podemos crear una página html que se comunique con el applet(javaFx) y viceversa.

Veamos como.

Netbeans no ayuda un montón. Lo que tenemos que hacer es crear una aplicación de tipo JavaFx FXML Aplicación desde File, New Proyecr, JavaFX.

Creamos el diseño con Scenne Builder, programamos los eventos en la clase Controller y la clase de ejecución de la aplicación.

Para ello vamos a utilizar el proyecto Navegador modificando algunas cosillas.

Ficheros de la aplicación:

Navegador.java clase main de la aplicación

package navegador;

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.stage.Stage;

public class Navegador extends Application {

public static String dato="Hola" ;

ControllerNavegador customControl=null;

@Override

public void start(Stage stage) throws Exception {

customControl = new ControllerNavegador();

stage.setScene(new Scene(customControl));

stage.setTitle("Navegador");

stage.setWidth(800);

stage.setHeight(600);

stage.setX(50);

stage.setY(50);

stage.show();

}

public static void main(String[] args) {

launch(args);

}

public void metodo()

{ dato="Gabriel";

customControl.textourl.setText("http://www.google.com");

}

}

ControllerNavegador.java Clase con los métodos(Controller) de la aplicación

package navegador;


 

import java.io.IOException;

import java.net.URL;

import java.util.ResourceBundle;

import javafx.event.ActionEvent;

import javafx.fxml.FXML;

import javafx.fxml.FXMLLoader;

import javafx.scene.control.Button;

import javafx.scene.control.Hyperlink;

import javafx.scene.control.TextField;

import javafx.scene.layout.AnchorPane;

import javafx.scene.web.HTMLEditor;

import javafx.scene.web.WebEngine;

import javafx.scene.web.WebView;


 

public class ControllerNavegador extends AnchorPane {

@FXML

public TextField textourl;

@FXML

private WebView VisorWeb;

@FXML

private Button button;

@FXML

private Hyperlink enlace;

 

public ControllerNavegador() {

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("FXMLNavegador.fxml"));

fxmlLoader.setRoot(this);

fxmlLoader.setController(this);

try {

fxmlLoader.load();

} catch (IOException exception) {

throw new RuntimeException(exception);

}

}

@FXML

private void handleButtonAction(ActionEvent event) {

WebEngine webEngine = VisorWeb.getEngine();

webEngine.load(textourl.getText().toString());

}

@FXML

private void cambioPagina(ActionEvent event) {

WebEngine webEngine = VisorWeb.getEngine();

webEngine.load("http:/www.informaticasc2.com/vcl");

}

public void initialize(URL url, ResourceBundle rb) {

// TODO }

public void cambioPaginaJavascript(String direccion) {

textourl.setText(direccion);

WebEngine webEngine = VisorWeb.getEngine();

webEngine.load(direccion);

}

}

FXMLNavegador.xml. Fichero con el diseño de la apliación

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.web.*?>

<?import java.lang.*?>

<?import java.util.*?>

<?import javafx.scene.*?>

<?import javafx.scene.control.*?>

<?import javafx.scene.layout.*?>


 

<fx:root id="AnchorPane" prefHeight="200" prefWidth="320" type="AnchorPane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">

<children>

<Hyperlink fx:id="enlace" layoutX="14.0" layoutY="83.0" onAction="#cambioPagina" prefHeight="23.0" prefWidth="353.0" text="http;//www.informaticasc2.com" />

<WebView fx:id="VisorWeb" layoutX="32.0" layoutY="106.0" prefHeight="425.0" prefWidth="497.0" style=": 100;" />

<ToolBar layoutX="9.0" layoutY="43.0" prefHeight="40.0" prefWidth="543.0">

<items>

<TextField fx:id="textourl" prefHeight="25.0" prefWidth="401.0" promptText="Teclea la url de la página" text="http:/www.informaticasc2.com" />

<Button fx:id="button" onAction="#handleButtonAction" text="Cambia de Página" />

</items>

</ToolBar>

</children>

</fx:root>


 

Después de crear la aplicación lo que tenemos que haces es construir el fichero .jar , que sera el archivo ejecutable desde fuera del entorno NetBeans.

Para ello hacemos clic con el botón derecho sobre el nombre del proyecto y elegimos la opción Clean and Build. Esta opción crea la carpeta dist dentro de la carpeta del proyecto.

Crear el fichero Navegador.jar que se puede ejecutar de forma independiente desde el sistema de ficheros haciendo click sobre el. Pero este fichero también nos sirve para incrustarle como un applet en una página html.

El fichero Navegador.jnlp que describe el applet a incrustar y ademas nos sirve para desplegar la aplicación vía JavaWebStart( !!!!!!!!!!!! CUANTAS COSAS ….......¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡)

Fichero Navegador.jnlp

<?xml version="1.0" encoding="utf-8"?>

<jnlp spec="1.0" xmlns:jfx="http://javafx.com" href="Navegador.jnlp">

<information>

<title>Navegador</title>

<vendor>izquierda</vendor>

<description>null</description>

<offline-allowed/>

</information>

<resources>

<jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/>

</resources>

<resources>

<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>

<jar href="../../dist/Navegador.jar" size="6093" download="eager" />

</resources>

<security>

<all-permissions/>

</security>

<applet-desc width="800" height="600" main-class="com.javafx.main.NoJavaFXFallback" name="Navegador" >

<param name="requiredFXVersion" value="2.2+"/>

</applet-desc>

<jfx:javafx-desc width="800" height="600" main-class="navegador.Navegador" name="Navegador" />

<update check="always"/>

</jnlp>


 

Este fichero requiere mas explicaciones pero lo tenemos controlado. Jnlp es en su un lenguaje de programación.

Finalmente el fichero Navegador.html

<html><head>

<SCRIPT src="../../dist/web-files/dtjava.js"></SCRIPT>

<script>

function launchApplication(jnlpfile) {

dtjava.launch( {

url : 'Navegador.jnlp',

jnlp_content : 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iTmF2ZWdhZG9yLmpubHAiPg0KICA8aW5mb3JtYXRpb24+DQogICAgPHRpdGxlPk5hdmVnYWRvcjwvdGl0bGU+DQogICAgPHZlbmRvcj5penF1aWVyZGE8L3ZlbmRvcj4NCiAgICA8ZGVzY3JpcHRpb24+bnVsbDwvZGVzY3JpcHRpb24+DQogICAgPG9mZmxpbmUtYWxsb3dlZC8+DQogIDwvaW5mb3JtYXRpb24+DQogIDxyZXNvdXJjZXM+DQogICAgPGpmeDpqYXZhZngtcnVudGltZSB2ZXJzaW9uPSIyLjIrIiBocmVmPSJodHRwOi8vamF2YWRsLnN1bi5jb20vd2ViYXBwcy9kb3dubG9hZC9HZXRGaWxlL2phdmFmeC1sYXRlc3Qvd2luZG93cy1pNTg2L2phdmFmeDIuam5scCIvPg0KICA8L3Jlc291cmNlcz4NCiAgPHJlc291cmNlcz4NCiAgICA8ajJzZSB2ZXJzaW9uPSIxLjYrIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2F1dG9kbC9qMnNlIi8+DQogICAgPGphciBocmVmPSJOYXZlZ2Fkb3IuamFyIiBzaXplPSI2MDkzIiBkb3dubG9hZD0iZWFnZXIiIC8+DQogIDwvcmVzb3VyY2VzPg0KPHNlY3VyaXR5Pg0KICA8YWxsLXBlcm1pc3Npb25zLz4NCjwvc2VjdXJpdHk+DQogIDxhcHBsZXQtZGVzYyAgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIG1haW4tY2xhc3M9ImNvbS5qYXZhZngubWFpbi5Ob0phdmFGWEZhbGxiYWNrIiAgbmFtZT0iTmF2ZWdhZG9yIiA+DQogICAgPHBhcmFtIG5hbWU9InJlcXVpcmVkRlhWZXJzaW9uIiB2YWx1ZT0iMi4yKyIvPg0KICA8L2FwcGxldC1kZXNjPg0KICA8amZ4OmphdmFmeC1kZXNjICB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgbWFpbi1jbGFzcz0ibmF2ZWdhZG9yLk5hdmVnYWRvciIgIG5hbWU9Ik5hdmVnYWRvciIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo=' },

{ javafx : '2.2+' }, {} ); return false;

}

</script>

<script>

function javafxEmbed() {

dtjava.embed(

{ codebase:'../../dist',

url : 'Navegador.jnlp',

placeholder : 'javafx-app-placeholder',

width : 800,

height : 600,

jnlp_content : 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iTmF2ZWdhZG9yLmpubHAiPg0KICA8aW5mb3JtYXRpb24+DQogICAgPHRpdGxlPk5hdmVnYWRvcjwvdGl0bGU+DQogICAgPHZlbmRvcj5penF1aWVyZGE8L3ZlbmRvcj4NCiAgICA8ZGVzY3JpcHRpb24+bnVsbDwvZGVzY3JpcHRpb24+DQogICAgPG9mZmxpbmUtYWxsb3dlZC8+DQogIDwvaW5mb3JtYXRpb24+DQogIDxyZXNvdXJjZXM+DQogICAgPGpmeDpqYXZhZngtcnVudGltZSB2ZXJzaW9uPSIyLjIrIiBocmVmPSJodHRwOi8vamF2YWRsLnN1bi5jb20vd2ViYXBwcy9kb3dubG9hZC9HZXRGaWxlL2phdmFmeC1sYXRlc3Qvd2luZG93cy1pNTg2L2phdmFmeDIuam5scCIvPg0KICA8L3Jlc291cmNlcz4NCiAgPHJlc291cmNlcz4NCiAgICA8ajJzZSB2ZXJzaW9uPSIxLjYrIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2F1dG9kbC9qMnNlIi8+DQogICAgPGphciBocmVmPSJOYXZlZ2Fkb3IuamFyIiBzaXplPSI2MDkzIiBkb3dubG9hZD0iZWFnZXIiIC8+DQogIDwvcmVzb3VyY2VzPg0KPHNlY3VyaXR5Pg0KICA8YWxsLXBlcm1pc3Npb25zLz4NCjwvc2VjdXJpdHk+DQogIDxhcHBsZXQtZGVzYyAgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIG1haW4tY2xhc3M9ImNvbS5qYXZhZngubWFpbi5Ob0phdmFGWEZhbGxiYWNrIiAgbmFtZT0iTmF2ZWdhZG9yIiA+DQogICAgPHBhcmFtIG5hbWU9InJlcXVpcmVkRlhWZXJzaW9uIiB2YWx1ZT0iMi4yKyIvPg0KICA8L2FwcGxldC1kZXNjPg0KICA8amZ4OmphdmFmeC1kZXNjICB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgbWFpbi1jbGFzcz0ibmF2ZWdhZG9yLk5hdmVnYWRvciIgIG5hbWU9Ik5hdmVnYWRvciIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo=', // Contenido del fichero JNLP en BASE64

id:'control' }, { javafx : '2.2+' }, {} );

}

<!-- Embed FX application into web page once page is loaded -->

dtjava.addOnloadCallback(javafxEmbed);

</script>

<script type="text/javascript">

function mensaje() {

var a = document.getElementById("control");

a.metodo();

alert(a.dato);

}

</script>

</head><body>

<h2>Test page for <b>Navegador</b></h2>

<b>Webstart:</b> <a href='Navegador.jnlp' onclick="return launchApplication('Navegador.jnlp');">click to launch this app as webstart</a><br><hr><br>

<!-- Applet will be inserted here -->

<div id='javafx-app-placeholder'></div>

<input type="button" onclick="mensaje()" value="Mensaje"/>

</body></html>

Tanto rollo para esto , este es código que añadimos al fichero Navegador.html que nos genera Netbeans al hacen Clean and Build sobre el nombre del proyecto.

function mensaje() {

var a = document.getElementById("control");

// Obtenemos un objeto(a) que se corresponde con el id definido en el fichero jnlp, en el que hemos configurado el acceso a la clase Navegador.java.

En esta clase esta creado el método:

public void metodo()

{ dato="Gabriel";

customControl.textourl.setText("http://www.google.com");

}

Lo único importante que hace aquí es cambiar el contenido de la caja de texto(textourl), de forma que en la ejecución del programa , al picar en el botón Mensaje de la página html, cambiamos el contenido de la caja de texto( no ve se el cambio, pero si ha cambiado) y al picar en el botón Cambia Página del applet(la aplicación JavaFx) se visualiza esta página en el navegador JavaFX.

a.metodo();

alert(a.dato);

}

Falta la operación inversa, desde las clase java o fxml acceder al código de la página html (DOM y funciones)

Otra opción muy interesante, junto con la posibilidad de utilizar css para el diseño de los controles, es poder crear la lógica del programa utilizando JavaScript. Podemos crear eventos javascript en el fichero fxml en lugar de utilizar java en la clase controller.

Documentación:H:\Verano2014\javaFx_groovyFx\tutorial-javafx-primeros-pasos.pdf

Ejemplo H:\Verano2014\javaFx_groovyFx\LogicaFxmlJavascript

Clase main:

package logicafxmljavascript;

import javafx.application.Application;

import javafx.fxml.FXMLLoader;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.stage.Stage;

public class LogicaFxmlJavascript extends Application {

@Override

public void start(Stage stage) throws Exception {

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

Scene scene = new Scene(root);

stage.setScene(scene);

stage.show();

}

public static void main(String[] args) {

launch(args);

}

}

Fichero FXMLDocument.fxml

Fichero FXMLDocument.fxml generado por netbeans y editable por SceneBuildr

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>

<?import java.util.*?>

<?import javafx.scene.*?>

<?import javafx.scene.control.*?>

<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="logicafxmljavascript.FXMLDocumentController">

<children>

<Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />

<Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />

</children>

</AnchorPane>

Lo modificamos de la siguiente forma. (Una vez modicado manualmente es posible que no lo podamos editar con Scene Builder)

<?xml version="1.0" encoding="UTF-8"?>

<?language javascript?> // Indica que utilizamos javascript como lenguaje de script

<?import java.lang.*?>

<?import java.util.*?>

<?import javafx.scene.*?>

<?import javafx.scene.control.*?>

<?import javafx.scene.layout.*?>

 

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1">

// Hemos elimindo la cláusula fx:controller="logicafxmljavascript.FXMLDocumentController"> que se utiliza para indicar la clase controller donde se programa la lógica del programa

// Creamos las funciones dentro de las etiquetas <fx:script> ... </fx:script>

<fx:script>

function handleSubmitButtonAction() {

label.setText("Yo Te Saludo");

button.setText("Me Saludaste");

}

</fx:script>

<fx:script source="externo.js"/>// Referencia al fichero js creado en fichero externo.js

<children>

<Button layoutX="126" layoutY="90" text="Saludame" onAction="handleSubmitButtonAction(event);"

fx:id="button" />

//Cambiamos onAction="#handleButtonAction" , utilizado para llamadas a metodos creados en el fichero de Controller, por onAction="handleSubmitButtonAction(event);" que hace llamadas al evento javascript

<Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" text="Esperando Saludo"/>

<Button layoutX="126" layoutY="150" text="Saludame desde fuera" onAction="saludoExterno(event);" fx:id="button2" />// Botón que ejecuta un evento programado en el fichero externo.js

</children>

</AnchorPane>

También podemos utilizar ficheros externos javascript(.js) donde programar la lógica de la aplicación. <fx:script source="externo.js"/>

Fichero externo.js

function saludoExterno()

{ label.setText("SaludoExterno");}


 

Después de esto podemos pensar, nos olvidamos de java y trabajamos únicamente con javascript …......


 

8Aprovechar las característica de JavaFx, para crear aplicaciones multimedia.

Tutorial http://docs.oracle.com/javafx/2/media/jfxpub-media.htm

Cualquier aplicación multimedia JavaFX usa las siguientes clases principales:

  • Media clase: Representa un recurso multimedia

  • MediaPlayer clase: Proporciona los controles para reproducir el recurso especificado

  • MediaView clase: Proporciona una vista del recurso multimedia desempeñado por un objeto MediaPlayer

Medios compatibles Codecs

Los formatos soportados son los siguientes:

  • Audio: MP3; AIFF que contiene PCM sin ​​comprimir; WAV PCM sin ​​comprimir que contiene;MPEG-4 contenedor multimedia con Advanced Audio Coding (AAC) audio

  • Vídeo: FLV contiene vídeo VP6 y audio MP3; MPEG-4 contenedor multimedia con H.264 / AVC (Advanced Video Coding) de compresión de vídeo


 

9 Instalador de aplicaciones Java

A partir de la compilación (Clenad and Build), Netbeans crea un fichero nombreaplicacion.jar . Este fichero es autoejecutable siempre que en la máquina cliente tengamos instalada la máquina viretual java.

Pero también podemos utilizar herramientas que nos permitan crear un fichero .exe o msi , que al ejecutarse instalan la aplicación en la máquina cliente, creando un enlace en el menú inicio. Además si es necesario también se instalará la máquina virtual java eb el ordenador cliente.

Dos asistentes:

Crear una fichero de instalación nativo(EXE) para Windows con NetBeans.http://blueskyworkshop.com/topics/Java-Pages/javafx-win-installer/

En el tutorial habla de aplicaciones JavaFX. Con el otro asistente lo haremos para aplicaciones Java estandard.

1.-Creamos una aplicación(con el nombre JavaFxInstalacion), los interfaces, la lógica del programa,...., probamos que funciona y …..........

2.- Configurar el archivo build.xml. Este el el archivo que uiliza Ant para compilar el proyecto java. Por defecto se crea en carpeta del proyecto.

Al crear el proyecto se crea con las siguientes líneas:

<?xml version="1.0" encoding="UTF-8"?>

<project name="JavaFXInstalacion" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">

<description>Builds, tests, and runs the project JavaFXInstalacion.</description>

<import file="nbproject/build-impl.xml"/> </project>

Le modificamos con la siguiente información:

<?xml version="1.0" encoding="UTF-8"?>

<project name="JavaFXInstalacion" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">

<description>Builds, tests, and runs the project JavaFXInstalacion.</description>

<!-- Añadimos las siguientes líneas

<target name="-post-jfx-deploy">

<fx:deploy width="${javafx.run.width}" height="${javafx.run.height}"

nativeBundles="all"

outdir="${basedir}/${dist.dir}" outfile="${application.title}">

<fx:application name="${application.title}" mainClass="${javafx.main.class}"/>

<fx:resources>

<fx:fileset dir="${basedir}/${dist.dir}" includes="JavaFXInstalacion.jar"/>

</fx:resources>

<fx:info title="${application.title}" vendor="${application.vendor}"/>

</fx:deploy>

</target>

<import file="nbproject/build-impl.xml"/>

</project>

3.- Ahora lo que tenemos que hacer es Clean and Build, pero por defecto Netbeans crea un ejecutable .jar, si lo que queremos en generar un ejecutable. Exe, necesitamos instalar las utilidades Inno Setup y Wix.

Inno Setup permite crear un archivo de instalación de nuestras aplicaciones para poder distribuirlas. http://www.llodax.com/Tutoriales/InnoSetup.htm, http://www.opendcl.com/tutorials/IS_Tutorial_ESM.pdf

Download: http://www.jrsoftware.org/isdl.php Se descarga el fichero isetup-5.5.5.exe. Le ejecutamos y seguimos el asistente de isntalación.

Wix. Windows Installer XML (WiX) es un conjunto de herramientas que construye los paquetes de instalación de Windows a partir de código fuente XML. http://wix.tramontana.co.hu/tutorial

Download: http://wixtoolset.org/ https://wix.codeplex.com/releases/view/115492

Descargar wix38-binaries.zip Descomprimimos el archivo. Zip en una carpeta.

4.- Para que Netbeans pueda realizar su trabajo es necesario que indiquemos en la variable de entorno PATH donde hemos instalado estas Herramientas. Par ello Inicio/Equipo , botón derecho Propiedades , enlace Configuración avanzada el Sistema y picamos en el botón Variables de Entorno. Editamos la variable del sistema PATH y le añadimos la ruta de instalación , en mi caso C:\Program Files\Inno Setup 5;H:\Verano2014\javaFx_groovyFx\wix

Comprobamos que funciona abriendo una ventana de comandos del DOS y ejecutando los programas candle.exe y iscc.exe


 


 

5.- Ahora solo nos queda hacer Clean and Build sobre el nombre del proyecto. Ahora vamos a la pestaña Files y veremos que se ha creado la siguiente estructura de ficheros:

El Fichero JavaFxInstalacion.exe es un ejecutable nativo de Windows. Si miramos la carpeta JavaFxIsntalación, vemos que tiene la subcarpeta runtime y esta la carpeta jre, en la que se ha copiado una versión de la máquina virtual java. Si ejecutamos la aplicación en un sistema operativo windows sin máquina virtual java, se instalará en la máquina desde esta versión.


 


 


 


 


 


 


 


 

Otra forma de crear una fichero de instalación nativo(EXE) para Windows con NetBeans https://netbeans.org/kb/docs/java/native_pkg.html?print=yes

Es mas fácil que el anterior. Instalaremos las herramientas Inno Setup y Wix, como hemos descrito anteriormente. Las añadiremos a la variable de entorno PATH.

Creamos una Aplicacin Java desde Netbeans. En nuestro caso la llamamos Instalacion. Creanos los interfaces, la lógica del programa,...., probamos que funciona y …..........

Y fácil , fácil ….

Botón derecho sobre el nombre del proyecto , vamos a la pestaña Propiedades

Picamos en , marcamos la Opción Enable Native Packing Actions Proyect Menu

Despues de este truco , ahora al hacer botón derecho sobre el nombre del proyecto aparece una nueva opción , que es Package as, seleccionamos EXE Instaler que crea el Files la siguiente esturctura de de ficheros:

 

La diferencia del ejecutable anterior y este, es que el creamos de esta forma ocupa mayor tamaño y ofrece un dialogo de instalación. Ademas si todo funciona veremos como se crea un enlace en el menú Inicio para ejecutarle.

 

Otra opción para crear instaladores de aplicaciones Java es crear un exe a partir del jar con utilidades como jsmoth o launch4j y después utilizar Inno Setup, para crear el programa de instalación.

Veamos como lo hace este tutorial:http://jonathanmelgoza.com/blog/inno-setup-compiler-launch4j-instalador/

Inno Setup Compiler / launch4j – Crear un Instalador

Acabas de terminar un proyecto en Java (Vale para cualquier otro) y necesitas convertir tu archivo jar a exe y crear un instalador de la manera mas facil?. En este Articulo te Mostraremos como hacerlo de la manera mas facil posible con un resultado agradable y con algunas caracteristicas importantes como multilenguaje, desinstalador, etc. Esto lo haremos con el programa Inno Setup Compiler que si bien es un programa en el que necesitas escribir tus scripts, tambien tiene una opcion para crearlo con un asistente y en cuestion de minutos resultados. Tambien utilizaremos el programa launch4j para convertir nuestro .jar, en caso de estar nuestro proyecto en java, a un archivo ejecutable .exe. Comenzemos.

Utilidades:

  • Inno Setup Compiler

  • Launch4j

Desarrollo

Antes de Nada necesitamos si necestiamos convertir nuestro archivo jar a exe necesitamos descargar e instalar launch4j, esta es una tipica instalacion sin mucho que decir, despues ejecutamos y nos aparecera una ventana de configuracion.


 

Puedes ver todas las opciones disponibles pero solo son necesarias las primeras dos: outfile y Jar. En la Primera seleccionamos donde queremos guardar el exe y su nombre “miprograma.exe”, y en la segunda seleccionamos el jar que queremos convertir (tambien como puedes ver puedes incluir un icono para tu exe). Despues vamos a la pestaña JRE y en Bunled JRE Path seleccionamos la ruta de instalacion de nuestro jre:

 

Despues pulsamos en la tuerca de arriba (Build Wrapper) y comenzara a convertir nuestro jar a exe, y listo tendremos ya el ejecutable.

Ahora realizaremos el instalador mediante Inno Setup Compiler para lo cual es necesario primero descargar e instalar el programa, al igual que el anterior no es necesario expliar algo en detalle de la instalacion, ahora abrimos Inno Setup y nos aparecerá una ventana como esta:

 

 

Seleccionamos la segunda opcion para crear un nuevo script usando el asistente y luego se iniciara el asistente, donde pulsaremos siguiente, despues nos preguntara el nombre de nuestro proyecto, version, autor y sitioweb. En la siguiente ventanta nos pregunta donde queremos instalar el programa, dejaremos la opcion que viene “Programs Files Folder” y el nombre de esa carpeta. Despues tenemos que especificar los archivos que componen nuestra aplicacion:

 

 

Seleccionaremos el archivo exe principal que creamos en la parte anterior de este articulo, y si es el caso otros archivos y subcarpetas que se instalar junto a nuestro ejecutable en la carpeta de instalacion. Despues escribimos el nombre que queremos que aparezca en el menu inicio despues de instalado, despues si kieres mostrar algunos archivos

como en la licencia de tu programa y despues seleccionamos el lenguaje en el que quieres mostrar tu instalador. Por ultimo configuramos informacion de tu instalador.exe como en que lugar quieres que se guarde, el nombre, y si kieres cambiar su icono. Y listo ahora ya tenemos nuestro instalador listo para distribuirlo.

Ejecutables java con jsmoth:http://www.monografias.com/trabajos28/creacion-ejecutables-codigo-java/creacion-ejecutables-codigo-java.shtml

10 Construyendo una Aplicación con JavaFX y Java EE 7


 

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/javafx_con_javaee_tutorial/javafx_javaee7.html

11 Internacionalización en JavaFx

http://codigoalonso.com/internacionalizacion-en-javafx-i18n/

 

Jueves 25 De Febrero

 

UT3 Componentes :

Q:\dam_smYrr\Desarrollodeinterfaces\ut3\EjercicosFincasSwingJavaFx\FincasVisor

ruta = ruta + "/" + "VMll.html?latitud=" + clatitud.getText() + "&longitud=" + clongitud.getText();

cadenaFinca = ruta;

 

  • Vmll.html

  •  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


 

<HTML xmlns="http://www.w3.org/1999/xhtml" xmlns:v ="urn:schemas-microsoft-com:vml">

<HEAD>

<TITLE>Google Maps JavaScript API Example: Event Arguments</TITLE>

<META content="text/html; charset=utf-8" http-equiv=content-type>

<!-- Clave Google Maps -->

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;key=ABQIAAAAVR3L3ZdOoH8pen-2EVBfIRRaeYqbng1T9K9NPlchqd18G9NXvxQ6zptJEpDlR81a1ajRhE20bnrRkw" type="text/javascript"></script>

<script type="text/javascript">

var map;

var baseIcon = new GIcon();

baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";

baseIcon.iconSize = new GSize(5, 5);

baseIcon.iconAnchor = new GPoint(0, 0);//(9,34);

baseIcon.infoWindowAnchor = new GPoint(9, 2);

var iconoBandera = new GIcon(baseIcon);

function initialize() {

var latitud = 0;

var longitud = 0;

//

// OBTENEMOS LATITUD Y LONGITUD DE LA URL CON PARAMETROS GET

// ruta = ruta + "/" + "VMll.html?latitud=" + clatitud.getText() + "&longitud=" + clongitud.getText();

var query = window.location.search.substring(1);

//alert("carga: " + query)

var vars = query.split("&");

var pair = vars[0].split("=");

latitud = pair[1];

var pair = vars[1].split("=");

longitud = pair[1];

// alert("LatitudLongitud " + latitud + "," + longitud)

// visualizar mapa

if (GBrowserIsCompatible()) {

map = new GMap2(document.getElementById("map_canvas"));

map.setCenter(new GLatLng(latitud, longitud), 16);

map.addControl(new GSmallMapControl());

map.addControl(new GMapTypeControl());

map.setMapType(G_SATELLITE_MAP);

}

}

</script>

</head>

<body style="FONT-WEIGHT: bold;width:100%;height:100%" onload="initialize()">

<div style="margin:5%;width: 90%; height: 90%" id="map_canvas">

</div>

</body>

</html>

 

UT2 javaFX:

  • 4 Ejecutar Página 10

Ejercicios Q:\dam_smYrr\Desarrollodeinterfaces\javaFx_groovyFx\EJECUTAR JAVA FX NAVEGADOR DENTRO DE PAGINA HTML

  • Navegador

  • WebNavegador

  • WebNavegadorJavaSccript

  • Enriquecer aplicaciones Swing con la Funcionalidad de JavaFX página 21


 

Proyecto H:\Verano2014\javaFx_groovyFx\JavaFX_con_Swing.

ClaseH:\Verano2014\javaFx_groovyFx\JavaFX_con_Swing\src\javafx_con_swing\datos\Grafica_1

 

Pag 36.El ejemplo siguiente utiliza el diseño del interfaz realizado con Scenne Builder, En el se crea un control TableView y un control DatePicker que van a permitir visualizar y añadir contactos a una lista. Proyecto H:\Verano2014\javaFx_groovyFx\SwingConJavafx\carpetajFx

Clases :

  • InterfazFXML.fxml diseño ScenneBuilder

  • DisenoFXMLController.java clase controller

  • Contactos.java JavaBean que define los datos a almacenar en la TableView

  • principal.java main de la aplicación para su ejecución como javafx

  • SwingPrincipal.java main de la aplicación para su ejecución dentro de un JFrame

Pag 35 Para ver la manera de añadir un JPanel a una clas JavaFx que extiende de Application ver

H:\Verano2014\javaFx_groovyFx\JavaFXconSwing\src\swingDENTROjavafx\

class VisorAlbum.java Clase main que extiende Application

album.fxml Vista de la aplicación JavaFX

class AlbumController Controlador de la aplicación

class LectorImagenes Clase con el código e interface Swing


 

H:\Verano2014\javaFx_groovyFx\PaginationDemo

43 Otra opción muy interesante, junto con la posibilidad de utilizar css para el diseño de los controles, es poder crear la lógica del programa utilizando JavaScript. Podemos crear eventos javascript en el fichero fxml en lugar de utilizar java en la clase controller.

EJERCICOS IMPORTANTES

Q:\dam_smYrr\Desarrollodeinterfaces\javaFx_groovyFx\MPORTANTE___EJECUTAR JAVA FX NAVEGADOR DENTRO DE PAGINA HTML