47
MANUAL JAVA FX 2.x Java FX 2.X Dentro de este manual, usted aprenderá a manejar la Tecnología Java Fx, para competir contra aplicaciones desarrolladas en Microsoft Silver Light. Java Fx es el Homologo de Silver Light, Las interfaces se ven mucho mejor, y permite efectos tipo Flash para dar un mejor aspecto al Front End de las aplicaciones desarrolladas. Este manual lo desarrollo puesto que no existen manuales libres para aprender. By : John Michel Rivera de León. Lionheart [email protected] “Quisiera Volver a ser niño, para no dejar de sorprenderme” - Albert Einstein

Mi Manual Java FX

Embed Size (px)

Citation preview

Page 1: Mi Manual Java FX

MANUAL JAVA FX

2.x Java FX 2.X

Dentro de este manual, usted aprenderá a manejar la Tecnología Java Fx, para competir contra

aplicaciones desarrolladas en Microsoft Silver Light. Java Fx es el Homologo de Silver Light, Las

interfaces se ven mucho mejor, y permite efectos tipo Flash para dar un mejor aspecto al Front End de

las aplicaciones desarrolladas. Este manual lo desarrollo puesto que no existen manuales libres para

aprender. By : John Michel Rivera de León. Lionheart [email protected]

“Quisiera Volver a ser niño,

para no dejar de sorprenderme”

- Albert Einstein

Page 2: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

1

Java FX Con este manual, usted

aprenderá a manejar

esta tecnología que nos

permite crear

aplicaciones

visualmente más

atractivas. La ventaja de

manejar Java FX y no

Silver Light, es que

dispone de la

portabilidad y todas las

ventajas inherentes de

Java.

Aquí se desarrollara una

aplicación que se

conecte a una B.D,

envié correo con datos

adjuntos, muestre

gráficas, disponga de

un navegador web, y

genere facturas en PDF.

JAVA FX 2.x Java FX 2.X

La principal ventaja de Java FX es que la aplicación puede correr

tanto en web, como en Stand Alone, sin necesidad de modificar

ninguna línea de código.

Esto nos permite ser más agiles en el desarrollo, puesto que ya no se

tiene que pensar en cómo presentar en web una aplicación que era

para escritorio. Además Java FX, puede correr en TV’s, celulares, etc.

Claro que solo en los dispositivos de nueva generación.

JavaFX es una familia de productos y tecnologías pensados para el

desarrollo de “Rich Internet Applications” (RIA’s). Este producto es la

contrapartida de SUN, para las herramientas de desarrollo de este

tipo de aplicaciones, como Flash de ADOBE y Silverlight de

MICROSOFT. Una de las características principales de esta tecnología

es la posibilidad del desarrollo de interfaces visuales para escritorio,

web, dispositivos móviles y TV; con todo el soporte de JAVA SE,

JAVA EE y JAVA ME.

Aquí las imágenes del proyecto de prueba a desarrollar para que

estés motivado en como lucirá la aplicación.

Page 3: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

2

Page 4: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

3

Page 5: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

4

Requerimientos

NOTA IMPORTANTE: Los métodos pueden parecerte extraños, y aquí se explica de manera

general como funcionan, pero se incluye la carpeta de la documentación del API con ejemplos

para comprender mejor cómo funcionan. Así que no te desanimes si vez que no está explicado

todo el código aquí ya que es mucha documentación para meterla dentro de este manual.

Adjunto la carpeta con toda la documentación necesaria para aprender a fondo.

Muy bien, lo primero que necesitamos para crear aplicaciones con Java FX, es el siguiente

software:

1. JDK 1.7 2. JRE 7 3. Librerias Apache FOP 4. Librerias Bar Code (para código QR) 5. Conector MySQL 6. NetBeans 7.1 o Superior

Las librerías están adjuntas en el proyecto, en la carpeta dist/lib, están todas librerías

necesarias.

Muy bien ahora expliquemos como se compone la aplicación:

Los paquetes de los cuales se componen el sistema están asociados a distintas capas de

la arquitectura, a pesar de que algunos paquetes son implementados en distintas capas.

El siguiente diagrama describe la descomposición de las capas de la arquitectura y se

observa como cada capa está relacionada con el MVC.

Modelo

Vista

Controlador

Capa de Integración

Capa de Negocio

Capa de Presentación

Page 6: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

5

Arquitectura

La arquitectura define la estructura en cómo se compone el software. Dicha

arquitectura establece los distintos patrones de diseño a utilizar así como las

tecnologías empleadas en las diferentes capas. Esta es la base para desarrollar la

aplicación y que definirá la frontera entre las distintas capas que la componen.

Los objetivos de la arquitectura se basan principalmente en lograr entre otras cosas

lograr un alto grado de portabilidad e interoperabilidad, así como distribuir los

distintos componentes del sistema en distintos nodos. Esto con el fin de lograr que el

sistema de información desarrollado pueda ser utilizado por distintos dispositivos

para lograr cumplir los propósitos de la organización, consumiendo grandes

cantidades información procesadas para la toma de decisiones y lograr con esto una

ventaja competitiva.

La capa de presentación como su nombre lo indica, es la encargada de interactuar

con el usuario así como mostrar por medio de una interfaz los resultados de las

transacciones realizadas.

Dentro de la capa de negociación se definen las reglas del negocio. Estas reglas del

negocio definen la forma en cómo debe de manejarse la información entre otras

cosas, dichas reglas establecen los límites que la aplicación debe respetar.

La principal característica de la capa de integración es el encapsular los distintos

componentes que manejan la información. Esta capa se encarga de mantener la

integridad de la información y además es la que se encarga de comunicarse

directamente con la base de datos para enviar estos hacia las capas superiores.

Page 7: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

6

Paquetes

El sistema se compone de distintos paquetes que influyen en cada una de las capas de la

arquitectura, así mismo algunos paquetes se compone de otros sub-paquetes que

contienen utilidades o clases para su funcionamiento.

Paquete com.thegang.riping.view

Este paquete se complementa de otro sub-paquete llamado

com.thegang.riping.view.resources que contiene los elementos gráficos tales como

imágenes utilizadas dentro de las interfaces asociadas.

La clase LoginView.java es implementada para la autentificación de los usuarios, esta

permite el acceso a la Clase principal que es la que contiene las interfaces asociadas para

administrar y controlar el sistema.

Page 8: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

7

Esta clase tiene un método ActionListener asociado al botón de login. Este es el

encargado de conectarse a la base de datos de los usuarios del sistema para verificar el

usuario y contraseña.

Este hace uso de clases contenidas en el paquete de modelo y de POJOS para obtener

los datos.

Al loguearse correctamente es la interfaz principal donde se muestran las categorías de

las que el usuario puede hacer uso, estas tienen métodos asociados para la E/S de

información de las respectivas bases de datos utilizadas.

Paquete com.thegang.riping.modelo

El paquete de modelo hace uso de un patrón de diseño de J2EE que implementa DAO,

DTO, FACADE, DELEGATE. Estos están separados dentro de otros paquetes contenidos

dentro del paquete principal de modelo.

Las clases contenidas dentro del paquete DAO se encargan de dar una independencia en

cuanto al acoplamiento con las bases de datos utilizadas, esto con es con la finalidad de

que si surgen cambios en la base de datos, solo tendrá que modificarse los componentes

de este paquete.

El paquete DTO contiene las clases encargadas de actuar como intermediarias entre la

capa de presentación y los servicios que provee la capa de negocios.

El paquete FACADE encapsula la lógica de negocio y la información asociada. La

información es mostrada por medio de interfaces y con esto se logra hacer transparente la

interacción entre los componentes internos del programa.

Page 9: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

8

Vista de Procesos

Esta sección describe la descomposición del sistema dentro de procesos. Se organiza

esta sección por grupos de procesos de comunicación o interacción.

Visto de manera general el sistema funciona por medio de la interacción con una interfaz

de logue, donde el usuario introduce sus datos, una vez introducidos, un proceso es

lanzado y se comunica con la base de datos para obtener la lista de usuarios y

contraseñas registrados para comparar con los datos introducidos por parte del usuario.

Si los datos son válidos se muestra la interfaz principal que provee acceso a las interfaces

subsecuentes que se muestran en el diagrama de procesos.

Muy bien basta de cháchara y empecemos a tirar código xD.

Desarrollando la aplicacio n

Abrimos el IDE de Netbeans y creamos un nuevo proyecto seleccionado JavaFx/JavaFx

Aplication y le asignamos un nombre.

Ya que creamos el proyecto, damos click derecho sobre el, y nos vamos a la pestaña de

propiedades.

Page 10: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

9

Ya que estamos dentro, nos vamos a la sección de “Packaging” y activamos la opción “copy

Dependent Libraries”

Aceptamos y ya estamos listos para empezar a programar.

Login y Menu principal

Creamos una nueva clase llamada SwingInterop, esta contendrá la pantalla del login, y una vez

aceptado, este se ocultara y mostrara el menú principal de la aplicación. Creamos las

variables del tamaño de la aplicación.

public class SwingInterop extends Application {

private static final int PANEL_WIDTH_INT = 799;

private static final int PANEL_HEIGHT_INT =478; //para el login es 370 xD

private static final int TABLE_PANEL_HEIGHT_INT = 100;

public final TextField name= new TextField();

Page 11: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

10

/**

* @param args the command line arguments

*/

public static void main(String[] args) {

launch(args);

}

@Override

public void start(Stage primaryStage) {

name.setPromptText("Enter User Name...");

final StackPane root = new StackPane();

Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();

Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();

En el código anterior especificamos el StackPane que es como un canvas, o panel, donde

concentraremos los elementos como botones, campos de texto, etc.

final Button btn = new Button();

btn.layoutBoundsProperty();

btn.setTranslateX(-170);

btn.setTranslateY(200);

btn.translateXProperty();

btn.translateYProperty();

btn.relocate(50, 300);

btn.setText("Ingresar");

btn.setEffect(ref);

Page 12: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

11

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

@Override

public void handle(ActionEvent event) {

try{

if(new RipingDelegate().Login(name.getText(), pass.getText())){

final TabPane tabPane = new TabPane();

Tab tab = new Tab();

tab.setText("Proveedores");

tab.setTooltip(new Tooltip("Muestra los controles para administrar datos de los

proveedores."));

tab.setClosable(false);

tab.setContent(new ProveedorView(name.getText(),new

LoginDAO().runQueryListUsersADMIN(name.getText(),pass.getText())).createProveedor(PANE

L_WIDTH_INT, PANEL_HEIGHT_INT));

tabPane.getTabs().add(tab);

root.getChildren().remove(btn);

root.getChildren().remove(name);

root.getChildren().remove(pass);

root.getChildren().remove(err);

root.getChildren().add(tabPane);

En el código anterior creamos un botón, el cual tiene un listener, y si el login es correcto,

muestra dentro del mismo Stackpanel los nuevos elementos, y remueve los anteriores.

Así se hace lo mismo para el resto de elementos de los tab’s.

Page 13: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

12

Ahora creamos la clase que se llama dentro de un Tab, llamado ProveedorView.

Elemento del Tab Proveedores

Se crea una nueva clase que se inserta dentro del tab, esta clase contiene dentro de un

nuevo StackPanel nuevos elementos para manejar la alta de proveedores.

public class CreateProveedorView {

public Node createLogin(int PANEL_WIDTH_INT, int PANEL_HEIGHT_INT){

Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();

Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();

final StackPane root = new StackPane();

Glow ef= new Glow(0.9);

Reflection ref = new Reflection();

ref.setFraction(0.9);

Text t= new Text( "Proveedores");

Text nomb= new Text("Contacto:");

nomb.setTranslateX(-360);

nomb.setTranslateY(50);

nomb.setEffect(ef);

final TextField nomb1= new TextField();

nomb1.setPromptText("Nombre de la persona...");

nomb1.setMaxSize(100, 20);

nomb1.setTranslateX(-280);

nomb1.setTranslateY(50);

Page 14: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

13

Dentro del código anterior se define el tamaño del nuevo Panel y se incluyen sus

elementos, se puede agregar efectos como el Glow, para hacer un poco borroso un

elemento, o el de Refleccion para que debajo del botón se vea un reflejo.

Se agrega el botón para que registre los datos dentro de la B.D

Button btn = new Button();

btn.layoutBoundsProperty();

btn.setTranslateX(-250);

btn.setTranslateY(110);

btn.translateXProperty();

btn.translateYProperty();

btn.relocate(50, 300);

btn.setText("Registrar");

btn.setEffect(ref);

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

@Override

public void handle(ActionEvent event) {

try{

p2.setProgress(0);

RipingDelegate xd= new RipingDelegate();

xd.WriteProve(new Proveedores(Integer.parseInt(ide.getText()),

name.getText(), rfc1.getText(), dir1.getText(), Integer.parseInt(tel1.getText()),

mail1.getText(), des1.getText(),nomb1.getText()));

root.getChildren().add(ok);

p2.setProgress(100);

}catch(Exception e){JOptionPane.showMessageDialog(null, e);

}

}

});

Page 15: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

14

Al final agregamos los elementos al StackPane principal:

root.getChildren().add(dir);

root.getChildren().add(dir1);

root.getChildren().add(tel);

root.getChildren().add(tel1);

root.getChildren().add(mail);

root.getChildren().add(mail1);

root.getChildren().add(des);

root.getChildren().add(des1);

root.getChildren().add(nomb);

root.getChildren().add(nomb1);

root.setMinSize(widthDouble, heightDouble);

root.setPrefSize(widthDouble, heightDouble);

return root;

Hacemos lo mismo con las otras clases que son un CRUD, Create, Read, Update, Delete.

Esto se repite con el resto de las tab’s, como son clientes, almance, etc.

Clase para enviar correo electro nico con datos adjuntos

Aquí utilizamos la librería Java Mail. Creamos una nueva clase como las anteriores, que se

inserta dentro de un tab, en el menú principal.

public class EmailView {

public Node createLogin(int PANEL_WIDTH_INT, int PANEL_HEIGHT_INT){

Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();

Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();

final StackPane root = new StackPane();

Glow ef= new Glow(0.9);

Page 16: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

15

Reflection ref = new Reflection();

ref.setFraction(0.9);

Text t= new Text( "Envio de Correos");

t.setTranslateY(-200);

t.setFont(Font.font ("Kunstler Script", 36));

t.setFill(javafx.scene.paint.Color.WHITESMOKE);

t.setEffect(ef);

En el código anterior, creamos la clase y especificamos los elementos, para adjuntar un

archivo pdf, que es la factura, agregamos el siguiente código ara obtener el path:

Text mail= new Text("Adjunto:");

mail.setTranslateX(-360);

mail.setTranslateY(-40);

mail.setEffect(ef);

final TextField mail1= new TextField();

mail1.setPromptText("PDF Path");

mail1.setMaxSize(100, 20);

mail1.setTranslateX(-280);

mail1.setTranslateY(-40);

mail1.setOnMouseClicked(new EventHandler<MouseEvent>() {

final TextField archi= new TextField();

@Override

public void handle(MouseEvent arg0) {

mail1.setText(fc.showOpenDialog(null).getAbsolutePath());

}

Page 17: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

16

});

Para enviar el correo utilizamos los métodos de la librería Java Mail como sigue, en este caso

se realizo con un correo de Gmail, y los parámetros cambian si se realiza con Hotmail u otro.

Button btn = new Button();

btn.layoutBoundsProperty();

btn.setTranslateX(-250);

btn.setTranslateY(170);

btn.translateXProperty();

btn.translateYProperty();

btn.relocate(50, 300);

btn.setText("Enviar");

btn.setEffect(ref);

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

@Override

public void handle(ActionEvent event) {

try{

p2.setProgress(0);

try {

Properties props = new Properties();

// Nombre del host de correo, es smtp.gmail.com

props.setProperty("mail.smtp.host", "smtp.gmail.com");

// TLS si está disponible

props.setProperty("mail.smtp.starttls.enable", "true");

// Puerto de gmail para envio de correos

Page 18: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

17

props.setProperty("mail.smtp.port", "587");

// Nombre del usuario

props.setProperty("mail.smtp.user", ide.getText()); //aqui va el correo

// Si requiere o no usuario y password para conectarse.

props.setProperty("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props);

session.setDebug(true);

//habe...el texto

BodyPart texto = new MimeBodyPart();

texto.setText(tel1.getText());

//el adjunto

BodyPart adjunto = new MimeBodyPart();

adjunto.setDataHandler(new DataHandler(new FileDataSource(mail1.getText())));

adjunto.setFileName("Factura.pdf");

//juntar ambos

MimeMultipart multiParte = new MimeMultipart();

multiParte.addBodyPart(texto);

multiParte.addBodyPart(adjunto);

// Se mete el texto y la foto adjunta.

Page 19: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

18

MimeMessage message = new MimeMessage(session);

// Quien envia el correo

message.setFrom(new InternetAddress(ide.getText())); //correo mio

// A quien va dirigido

message.addRecipient(Message.RecipientType.TO, new

InternetAddress(rfc1.getText()));

message.setSubject(dir1.getText());

message.setContent(multiParte);

// message.setText("texto"); //este lo debo eliminar

Transport t = session.getTransport("smtp");

t.connect(ide.getText(), name.getText());

t.sendMessage(message, message.getAllRecipients());

t.close();

} catch (MessagingException e) {

JOptionPane.showMessageDialog(null, e);

}

p2.setProgress(100);

}catch(Exception e){JOptionPane.showMessageDialog(null, e);

}

}

});

btn.setOnMouseEntered(new EventHandler<MouseEvent>() {

@Override

public void handle(MouseEvent arg0) {

Page 20: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

19

p2.setProgress(0);

root.getChildren().remove(ok);

}

});

Al final, agregamos todos los elementos al StackPane principal.

root.getChildren().add(id);

root.getChildren().add(ide);

root.getChildren().add(rfc);

root.getChildren().add(rfc1);

root.getChildren().add(dir);

root.getChildren().add(dir1);

root.getChildren().add(tel);

root.getChildren().add(mail);

root.getChildren().add(mail1);

root.getChildren().add(tel1);

root.setMinSize(widthDouble, heightDouble);

root.setPrefSize(widthDouble, heightDouble);

return root;

}

Page 21: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

20

Clase para mostrar Graficos

Para mostrar los graficos, creamos una nueva clase, especificamos sus medidas y

creamos un Panel interno para agregar los elementos.

public class ReporteView {

public Node createReporte(int PANEL_WIDTH_INT, int PANEL_HEIGHT_INT){

Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();

Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();

final StackPane root = new StackPane();

Creamos la gráfica de Pie Que se agrega en un acordion.

final CategoryAxis xAxis = new CategoryAxis();

final NumberAxis yAxis = new NumberAxis();

final BarChart<String,Number> bc =

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

bc.setTitle("Historial de articulos vendidos");

xAxis.setLabel("Producto");

yAxis.setLabel("Cantidad");

//articulos

final CategoryAxis xAxis1 = new CategoryAxis();

final NumberAxis yAxis1 = new NumberAxis();

final BarChart<String,Number> bc1 =

new BarChart<String,Number>(xAxis1,yAxis1);

bc1.setTitle("Articulos en Almacen");

xAxis1.setLabel("Producto");

yAxis1.setLabel("Cantidad");

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

Page 22: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

21

series1.setName("2003");

series1.getData().add(new XYChart.Data(austria, 25601.34));

series1.getData().add(new XYChart.Data(brazil, 20148.82));

series1.getData().add(new XYChart.Data(france, 10000));

series1.getData().add(new XYChart.Data(italy, 35407.15));

series1.getData().add(new XYChart.Data(usa, 12000));

bc.getData().addAll(series1);

bc1.getData().addAll(series1);

final PieChart chart = new PieChart();

chart.setTitle("Productos Almacen:");

chart.getData().add(new PieChart.Data("uno", 50));

chart.getData().add(new PieChart.Data("dos", 50));

final Label caption = new Label("");

caption.setTextFill(Color.DARKORANGE);

caption.setStyle("-fx-font: 24 arial;");

for (final PieChart.Data data : chart.getData()) {

data.getNode().addEventHandler(MouseEvent.MOUSE_ENTERED,

new EventHandler<MouseEvent>() {

@Override public void handle(MouseEvent e) {

caption.setTranslateX(e.getX());

caption.setTranslateY(e.getY());

caption.setText(String.valueOf(data.getPieValue())

+ "%");

}

Page 23: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

22

});

}

Agregamos la otra grafica de barras, para mostrar el articulo mas vendido:

tps[1] = new TitledPane("Ventas",bc);

tps[1].setOnMouseClicked(new EventHandler<Event>() {

@Override

public void handle(Event arg0) {

try {

bc.getData().remove(0);

root.getChildren().remove(caption);

bc.getData().removeAll(series1);

bc.getData().removeAll(series1);

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

series1.setName("Ventas");

Object[]algo= new RipingDelegate().MasVendido().toArray();

for(int i=0;i<algo.length;i++){

System.out.println(algo[i]);

series1.getData().add(new XYChart.Data(algo[i], algo[i+1]));

i++;

}

Page 24: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

23

bc.getData().addAll(series1);

} catch (Exception ex) {

Logger.getLogger(ReporteView.class.getName()).log(Level.SEVERE,

null, ex);

}

}

});

Al final agregamos todos los elementos al StackPane Principal:

final Accordion accordion = new Accordion ();

accordion.getPanes().addAll(tps);

accordion.setExpandedPane(tps[0]);

root.getChildren().add(accordion);

root.getChildren().add(caption);

root.setMinSize(widthDouble, heightDouble);

root.setPrefSize(widthDouble, heightDouble);

return root;

}

Clase de Navegador Web ba sico

Esta clase esta de ejemplo en la documentación de Java Fx. Es mas sencillo que como se

realizaba anteriormente con Swing.

public class BrowserView {

Node createBrowser(int PANEL_WIDTH_INT, int PANEL_HEIGHT_INT) {

Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();

Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();

WebView view = new WebView();

view.setMinSize(widthDouble, heightDouble);

view.setPrefSize(widthDouble, heightDouble);

Page 25: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

24

final WebEngine eng = view.getEngine();

final Label warningLabel = new Label("Navegador Web basico...");

eng.load("http://www.google.com");

ChangeListener handler = new ChangeListener<Number>() {

@Override public void changed(ObservableValue<? extends Number> observable,

Number oldValue, Number newValue) {

if (warningLabel.isVisible()) {

warningLabel.setVisible(false);

}

}

};

eng.getLoadWorker().progressProperty().addListener(handler);

final TextField locationField = new TextField("http://www.google.com");

locationField.setMaxHeight(Double.MAX_VALUE);

Button goButton = new Button("Ir");

goButton.setDefaultButton(false);

EventHandler<ActionEvent> goAction = new EventHandler<ActionEvent>() {

@Override public void handle(ActionEvent event) {

eng.load(locationField.getText().startsWith("http://") ? locationField.getText()

: "http://" + locationField.getText());

}

};

goButton.setOnAction(goAction);

locationField.setOnAction(goAction);

eng.locationProperty().addListener(new ChangeListener<String>() {

@Override public void changed(ObservableValue<? extends String> observable, String

oldValue, String newValue) {

Page 26: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

25

locationField.setText(newValue);

}

});

GridPane grid = new GridPane();

grid.setPadding(new Insets(5));

grid.setVgap(5);

grid.setHgap(5);

GridPane.setConstraints(locationField, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER,

Priority.ALWAYS, Priority.SOMETIMES);

GridPane.setConstraints(goButton, 1, 0);

GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS,

Priority.ALWAYS);

GridPane.setConstraints(warningLabel, 0, 2, 2, 1, HPos.CENTER, VPos.CENTER,

Priority.ALWAYS, Priority.SOMETIMES);

grid.getColumnConstraints().addAll(

new ColumnConstraints(widthDouble - 200, widthDouble - 200, Double.MAX_VALUE,

Priority.ALWAYS, HPos.CENTER, true),

new ColumnConstraints(40, 40, 40, Priority.NEVER, HPos.CENTER, true));

grid.getChildren().addAll(locationField, goButton, warningLabel, view);

return grid;

}

}

Todas estas clases se llaman en el menú principal y se insertan dentro de unos Tabs para

separar las distintas partes.

Page 27: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

26

Generar facturas en PDF

Muy bien para generar PDF’s utilizamos la Librería Apache FOP.

Para esto generamos un archivos XML que se utilizan por Apache FOP para generar el PDF,

El generar la factura en PDF se localiza en el paquete de ventas, clase Crear venta, botón

“Generar Factura”.

este tiene el botón siguiente:

Button btnf = new Button();

btnf.layoutBoundsProperty();

btnf.setTranslateX(-90);

btnf.setTranslateY(145);

btnf.translateXProperty();

btnf.translateYProperty();

btnf.relocate(50, 300);

btnf.setText("Generar Factura");

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

@Override

public void handle(ActionEvent arg0) {

try {

char m='"';

RandomAccessFile fo = new RandomAccessFile("xD.xsl", "rw");

fo.setLength(0);

Este botón tiene el listener que crea los XML con los datos de la venta y escribe estos datos

en formato XML dentro de los archivos para generar el PDF. Al final se utilizan los métodos de

la librería Apache FOP para convertir estos XML en un PDF, además se incluye la imagen en

Codigo QR con el numero de folio de la factura.

Page 28: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

27

FacturaDAO fact= new FacturaDAO();

//fact.append(new Factura("'1'", Integer.parseInt(user), Integer.parseInt(cli1.getText()),

"'"+name.getText()+"'", Double.parseDouble(""+tot), "'N/A'"));

//System.out.println("FOLIO FACT="+fact.getNextFolio());

fo.writeBytes("<xsl:stylesheet\n");

fo.writeBytes("xmlns:xsl="+m+"http://www.w3.org/1999/XSL/Transform"+m+"

version="+m+"1.0"+m+"\n");

fo.writeBytes("xmlns:fo="+m+"http://www.w3.org/1999/XSL/Format"+m+">\n");

fo.writeBytes("<xsl:template match ="+m+"root"+m+">\n");

fo.writeBytes("<fo:root xmlns:fo="+m+"http://www.w3.org/1999/XSL/Format"+m+">\n");

fo.writeBytes("<fo:layout-master-set>\n");

fo.writeBytes("<fo:simple-page-master master-name="+m+"simple"+m+"\n");

fo.writeBytes("page-height="+m+"29.7cm"+m+"\n");

fo.writeBytes("page-width="+m+"21cm"+m+"\n");

fo.writeBytes("margin-top="+m+"1.5cm"+m+"\n");

fo.writeBytes("margin-bottom="+m+"1.5cm"+m+"\n");

fo.writeBytes("margin-left="+m+"2.5cm"+m+"\n");

fo.writeBytes("margin-right="+m+"2.5cm"+m+">\n");

fo.writeBytes(" <fo:region-body margin-top="+m+"1.5cm"+m+"/>\n");

fo.writeBytes(" <fo:region-before extent="+m+"1.5cm"+m+"/>\n");

fo.writeBytes("<fo:region-after extent="+m+"1.5cm"+m+"/>\n");

fo.writeBytes("</fo:simple-page-master>\n");

fo.writeBytes("</fo:layout-master-set>\n");

fo.writeBytes("<fo:page-sequence master-reference="+m+"simple"+m+">\n");

fo.writeBytes("<fo:static-content flow-name="+m+"xsl-region-before"+m+">\n");

fo.writeBytes("<fo:block\n");

fo.writeBytes("font-size="+m+"15pt"+m+"\n");

fo.writeBytes("font-family="+m+"serif"+m+"\n");

Page 29: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

28

fo.writeBytes("color="+m+"blue"+m+"\n");

fo.writeBytes("line-height="+m+"14pt"+m+" >\n");

fo.writeBytes(""+emp1.getText()+"\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block text-align="+m+"end"+m+"\n");

fo.writeBytes("font-size="+m+"15pt"+m+"\n");

fo.writeBytes("font-family="+m+"serif"+m+"\n");

fo.writeBytes("color="+m+"blue"+m+"\n");

fo.writeBytes("line-height="+m+"14pt"+m+" >\n");

fo.writeBytes("FACTURA\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block text-align="+m+"end"+m+"\n");

fo.writeBytes("font-size="+m+"14pt"+m+"\n");

fo.writeBytes("font-family="+m+"serif"+m+"\n");

fo.writeBytes("color="+m+"red"+m+"\n");

fo.writeBytes("line-height="+m+"14pt"+m+" >\n");

fo.writeBytes(""+fact.getNextFolio()+"\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</fo:static-content>\n");

fo.writeBytes("<fo:flow flow-name="+m+"xsl-region-body"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("space-after.optimum="+m+"3pt"+m+"\n");

fo.writeBytes("font-weight="+m+"bold"+m+"\n");

fo.writeBytes("start-indent="+m+"1pt"+m+">\n");

fo.writeBytes("RFC:"+rfce1.getText()+"\n");

fo.writeBytes("</fo:block>\n");

Page 30: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

29

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("space-after.optimum="+m+"3pt"+m+"\n");

fo.writeBytes("font-weight="+m+"bold"+m+"\n");

fo.writeBytes("start-indent="+m+"1pt"+m+" >\n");

fo.writeBytes(""+dire1.getText()+"\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("font-weight="+m+"bold"+m+" >\n");

fo.writeBytes("\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("font-weight="+m+"bold"+m+">\n");

fo.writeBytes("-----------------------------------\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("color="+m+"grey"+m+"\n");

Page 31: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

30

fo.writeBytes("font-weight="+m+"bold"+m+">\n");

fo.writeBytes("Facturado el "+name.getText()+" a:\n");

fo.writeBytes("</fo:block>\n");

String[] recabar = new RipingDelegate().runQueryListCliDel(Integer.parseInt(cli1.getText()));

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("font-weight="+m+"bold"+m+">\n");

fo.writeBytes(""+recabar[1]+" "+recabar[2]+" "+recabar[3]+"\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("font-weight="+m+"bold"+m+">\n");

fo.writeBytes(""+recabar[4]+"\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("font-weight="+m+"bold"+m+">\n");

fo.writeBytes(""+"R.F.C "+recabar[7]+"\n");

fo.writeBytes("</fo:block>\n");

Page 32: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

31

fo.writeBytes("<fo:table border-collapse="+m+"collapse"+m+" table-

layout="+m+"fixed"+m+" >\n");

fo.writeBytes("<fo:table-column column-width="+m+"3cm"+m+"/>\n");

fo.writeBytes("<fo:table-column column-width="+m+"3cm"+m+"/>\n");

fo.writeBytes("<fo:table-column column-width="+m+"3cm"+m+"/>\n");

fo.writeBytes("<fo:table-column column-width="+m+"3cm"+m+"/>\n");

fo.writeBytes("<fo:table-body>\n");

fo.writeBytes("<fo:table-row>\n");

fo.writeBytes("<fo:table-cell border-color="+m+"blue"+m+" border-

width="+m+"0.5pt"+m+" border-style="+m+"solid"+m+">\n");

fo.writeBytes("<fo:block text-align="+m+"center"+m+">\n");

fo.writeBytes("Cantidad\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</fo:table-cell>\n");

fo.writeBytes("<fo:table-cell border-color="+m+"blue"+m+" border-

width="+m+"0.5pt"+m+" border-style="+m+"solid"+m+">\n");

fo.writeBytes("<fo:block text-align="+m+"center"+m+">\n");

fo.writeBytes("Descripcion\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</fo:table-cell>\n");

fo.writeBytes("<fo:table-cell border-color="+m+"blue"+m+" border-

width="+m+"0.5pt"+m+" border-style="+m+"solid"+m+">\n");

fo.writeBytes("<fo:block text-align="+m+"center"+m+">\n");

fo.writeBytes("Precio Unitario\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</fo:table-cell>\n");

Page 33: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

32

fo.writeBytes("<fo:table-cell border-color="+m+"blue"+m+" border-

width="+m+"0.5pt"+m+" border-style="+m+"solid"+m+">\n");

fo.writeBytes("<fo:block text-align="+m+"center"+m+">\n");

fo.writeBytes("Importe\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</fo:table-cell>\n");

fo.writeBytes("</fo:table-row>\n");

///fin headers

float subt=0;

float IVA=0;

float tot=0;

for(int i=0; i<inf.size();i++){

fo.writeBytes(" <!-- Iteracion"+i+" -->");

fo.writeBytes("<fo:table-row><fo:table-cell border-color="+m+"blue" +m+" border-

width="+m+"0.5pt" +m+" border-style=" + m +"solid"+m+"> <fo:block text-

align="+m+"center"+m+">"+"\n");

fo.writeBytes( ""+ inf.elementAt(i+5) +"\n");

fo.writeBytes("</fo:block></fo:table-cell>"+"\n");

System.out.println("1----"+inf.elementAt(i+5));

String[] recabarp = new

RipingDelegate().runQueryListAlmDel(Integer.parseInt(""+inf.elementAt(i+9)));

fo.writeBytes("<fo:table-cell border-color="+m+"blue" +m+" border-width="+m+"0.5pt"

+m+" border-style=" + m +"solid"+m+"> <fo:block text-align="+m+"center"+m+">"+"\n");

fo.writeBytes(""+ recabarp[1]+"\n"); //Desc

fo.writeBytes("</fo:block></fo:table-cell>"+"\n");

System.out.println("2----"+recabarp[1]); //desc

Page 34: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

33

fo.writeBytes("<fo:table-cell border-color="+m+"blue" +m+" border-width="+m+"0.5pt"

+m+" border-style=" + m +"solid"+m+"> <fo:block text-align="+m+"center"+m+">"+"\n");

fo.writeBytes(""+ recabarp[3]+"\n"); //precioUnit

fo.writeBytes("</fo:block></fo:table-cell>"+"\n");

System.out.println("3----"+recabarp[3]); //precio unit

fo.writeBytes("<fo:table-cell border-color="+m+"blue" +m+" border-width="+m+"0.5pt"

+m+" border-style=" + m +"solid"+m+"> <fo:block text-align="+m+"center"+m+">"+"\n");

fo.writeBytes(""+ inf.elementAt(i+6)+"\n"); //imp

fo.writeBytes("</fo:block></fo:table-cell></fo:table-row>"+"\n");

System.out.println("4----"+inf.elementAt(i+6)); //imp

subt+=Double.parseDouble(""+inf.elementAt(i+7));

i+=9;

} IVA+=subt*Float.parseFloat(iva1.getText()); tot= subt+IVA;

/*

RandomAccessFile mid= new RandomAccessFile("midle.xml", "rw");

String txt2= mid.readLine();

while(txt2!=null){

fo.writeBytes(txt2+"\n");

txt2= mid.readLine();

}

mid.close();*/

////////////////////midle

fo.writeBytes("</fo:table-body>\n");

fo.writeBytes( "</fo:table>\n");

fo.writeBytes( " <fo:block font-size="+m+"7pt"+m+"\n");

fo.writeBytes( "font-family="+m+"sans-serif"+m+"\n");

Page 35: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

34

fo.writeBytes( "font-weight="+m+"bold"+m+"\n");

fo.writeBytes( " line-height="+m+"20pt"+m+">"+"\n");

fo.writeBytes( "</fo:block>"+"\n");

fo.writeBytes(" <fo:table border-collapse="+m+"collapse"+m+" table-

layout="+m+"fixed"+m+">"+"\n");

fo.writeBytes( "<fo:table-column column-width="+m+"3cm"+m+"/>"+"\n");

fo.writeBytes( "<fo:table-column column-width="+m+"3cm"+m+"/>"+"\n");

fo.writeBytes( "<fo:table-body>"+"\n");

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

fo.writeBytes("<fo:table-row><fo:table-cell border-color="+m+"blue" +m+" border-

width="+m+"0.5pt" +m+" border-style=" + m +"solid"+m+"> <fo:block text-

align="+m+"center"+m+">"+"\n");

fo.writeBytes( "SUB TOTAL"+"\n");

fo.writeBytes("</fo:block></fo:table-cell>"+"\n");

fo.writeBytes("<fo:table-cell border-color="+m+"blue" +m+" border-width="+m+"0.5pt"

+m+" border-style=" + m +"solid"+m+"> <fo:block text-align="+m+"center"+m+">"+"\n");

fo.writeBytes(""+subt+"\n");

fo.writeBytes("</fo:block></fo:table-cell></fo:table-row>"+"\n");

System.out.println(""+subt);

fo.writeBytes("<fo:table-row><fo:table-cell border-color="+m+"blue" +m+" border-

width="+m+"0.5pt" +m+" border-style=" + m +"solid"+m+"> <fo:block text-

align="+m+"center"+m+">"+"\n");

fo.writeBytes( "IVA"+"\n");

fo.writeBytes("</fo:block></fo:table-cell>"+"\n");

Page 36: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

35

fo.writeBytes("<fo:table-cell border-color="+m+"blue" +m+" border-width="+m+"0.5pt"

+m+" border-style=" + m +"solid"+m+"> <fo:block text-align="+m+"center"+m+">"+"\n");

fo.writeBytes(""+IVA+"\n");

fo.writeBytes("</fo:block></fo:table-cell></fo:table-row>"+"\n");

System.out.println(""+IVA);

fo.writeBytes("<fo:table-row><fo:table-cell border-color="+m+"blue" +m+" border-

width="+m+"0.5pt" +m+" border-style=" + m +"solid"+m+"> <fo:block text-

align="+m+"center"+m+">"+"\n");

fo.writeBytes( "TOTAL"+"\n");

fo.writeBytes("</fo:block></fo:table-cell>"+"\n");

fo.writeBytes("<fo:table-cell border-color="+m+"blue" +m+" border-width="+m+"0.5pt"

+m+" border-style=" + m +"solid"+m+"> <fo:block text-align="+m+"center"+m+">"+"\n");

fo.writeBytes(""+tot+"\n");

fo.writeBytes("</fo:block></fo:table-cell></fo:table-row>"+"\n");

System.out.println(""+tot);

//fact.append("2", "'"+name.getText()+"'", tot, "'N/A'", Integer.parseInt(user),

Integer.parseInt(cli1.getText()));

//fact.append(new Factura("1",Integer.parseInt(user) , Integer.parseInt(cli1.getText()),

Integer.parseInt(name.getText()), tot, user));

//begin end xml

/*

RandomAccessFile fin= new RandomAccessFile("end.xml", "rw");

String txt3= fin.readLine();

while(txt3!=null){

Page 37: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

36

fo.writeBytes(txt3+"\n");

txt3= fin.readLine();

}

fin.close();

*/

fo.writeBytes("</fo:table-body>\n");

fo.writeBytes("</fo:table>\n");

fo.writeBytes("<xsl:apply-templates/>\n");

fo.writeBytes("<fo:block font-size="+m+"10pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("line-height="+m+"11pt"+m+"\n");

fo.writeBytes("space-before.optimum="+m+"2cm"+m+">\n");

fo.writeBytes("PDF generado con Apache FOP\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</fo:flow>\n");

fo.writeBytes("</fo:page-sequence>\n");

fo.writeBytes("</fo:root>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("<xsl:template match ="+m+"div"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"14pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("space-before.optimum="+m+"3pt"+m+"\n");

fo.writeBytes("space-after.optimum="+m+"3pt"+m+"\n");

fo.writeBytes("text-align="+m+"center"+m+"\n");

Page 38: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

37

fo.writeBytes("padding-top="+m+"3pt"+m+">\n");

fo.writeBytes("<xsl:apply-templates/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("<xsl:template match ="+m+"div0/head"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"16pt"+m+"\n");

fo.writeBytes("line-height="+m+"18pt"+m+"\n");

fo.writeBytes("padding-top="+m+"3pt"+m+"\n");

fo.writeBytes("space-before.optimum="+m+"3pt"+m+"\n");

fo.writeBytes("space-after.optimum="+m+"3pt"+m+"\n");

fo.writeBytes("text-align="+m+"center"+m+"\n");

fo.writeBytes("start-indent="+m+"2cm"+m+"\n");

fo.writeBytes("end-indent="+m+"2cm"+m+"\n");

fo.writeBytes("background-color="+m+"red"+m+"\n");

fo.writeBytes("color="+m+"white"+m+">\n");

fo.writeBytes("<xsl:value-of select="+m+"."+m+"/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("<xsl:template match ="+m+"div/fo"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"13pt"+m+"\n");

fo.writeBytes("line-height="+m+"14pt"+m+"\n");

fo.writeBytes("text-align="+m+"start"+m+">\n");

fo.writeBytes("<xsl:value-of select="+m+"."+m+"/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

Page 39: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

38

fo.writeBytes("<xsl:template match ="+m+"explanation"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"11pt"+m+"\n");

fo.writeBytes("line-height="+m+"12pt"+m+"\n");

fo.writeBytes("font-family="+m+"sans-serif"+m+"\n");

fo.writeBytes("text-align="+m+"start"+m+"\n");

fo.writeBytes("start-indent="+m+"0.5cm"+m+">\n");

fo.writeBytes("<xsl:apply-templates/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("<xsl:template match ="+m+"div/content"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"10pt"+m+"\n");

fo.writeBytes("line-height="+m+"11pt"+m+"\n");

fo.writeBytes("font-family="+m+"Courier"+m+"\n");

fo.writeBytes("text-align="+m+"start"+m+"\n");

fo.writeBytes("start-indent="+m+"0.5cm"+m+"\n");

fo.writeBytes("wrap-option="+m+"wrap"+m+">\n");

fo.writeBytes("Fin: <xsl:value-of select="+m+"."+m+"/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

//creo la img QR

int udm = 0;

int resolucion = 72;

float margenIzq = 0.000f;

float margenDer = 0.000f;

float margenSup = 0.000f;

Page 40: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

39

float margenInf = 0.000f;

int rotacion = 0;

float tamanoModulo = 5.000f;

QRCode codigoQR = new QRCode();

codigoQR.setData("Folio: "+fact.getNextFolio());

codigoQR.setDataMode(QRCode.MODE_BYTE);

codigoQR.setUOM(udm);

codigoQR.setLeftMargin(margenIzq);

codigoQR.setResolution(resolucion);

codigoQR.setRightMargin(margenDer);

codigoQR.setTopMargin(margenSup);

codigoQR.setBottomMargin(margenInf);

codigoQR.setRotate(rotacion);

codigoQR.setModuleSize(tamanoModulo);

String archivo = System.getProperty("./") +"lion.jpg";

codigoQR.renderBarcode(archivo);

fo.writeBytes("<xsl:template match ="+m+"div/properties"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"10pt"+m+"\n");

fo.writeBytes("line-height="+m+"11pt"+m+"\n");

fo.writeBytes("font-family="+m+"Courier"+m+"\n");

fo.writeBytes("text-align="+m+"start"+m+"\n");

fo.writeBytes("start-indent="+m+"0.5cm"+m+">\n");

Page 41: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

40

fo.writeBytes("Codigo QR:\n");

fo.writeBytes("<fo:external-graphic src="+m+"url('./nulllion.jpg')"+m+"/>");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("<fo:block space-after.optimum="+m+"3pt"+m+">\n");

fo.writeBytes("<xsl:apply-templates/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("<xsl:template match ="+m+"properties/property"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"9pt"+m+"\n");

fo.writeBytes("line-height="+m+"10pt"+m+"\n");

fo.writeBytes("text-align="+m+"start"+m+"\n");

fo.writeBytes("start-indent="+m+"1cm"+m+">\n");

fo.writeBytes("<xsl:value-of select="+m+"."+m+"/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("<xsl:template match ="+m+"div/property-def"+m+">\n");

fo.writeBytes("<fo:block font-size="+m+"13pt"+m+"\n");

fo.writeBytes("line-height="+m+"14pt"+m+"\n");

fo.writeBytes("text-align="+m+"start"+m+">\n");

fo.writeBytes("<xsl:value-of select="+m+"."+m+"/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("<xsl:template match ="+m+"div/values"+m+">\n");

Page 42: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

41

fo.writeBytes("<fo:block font-size="+m+"11pt"+m+"\n");

fo.writeBytes("text-align="+m+"start"+m+"\n");

fo.writeBytes("line-height="+m+"12pt"+m+">Values: <xsl:value-of

select="+m+"."+m+"/>\n");

fo.writeBytes("</fo:block>\n");

fo.writeBytes("</xsl:template>\n");

fo.writeBytes("</xsl:stylesheet>\n");

///fin end xml

fo.close(); //finaliza creacion del xsl

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

//se crea el xml

RandomAccessFile foxml = new RandomAccessFile("xD.xml", "rw");

foxml.setLength(0);

foxml.writeBytes("<?xml version="+m+"1.0"+m+" encoding="+m+"UTF-8"+m+"?>\n");

foxml.writeBytes("<root>\n");

foxml.writeBytes("<div0><head> *** FACTURA DE PRUEBA XD ***</head>\n");

foxml.writeBytes("<div id="+m+"fo:basic-link"+m+">\n");

foxml.writeBytes("<fo> Factura</fo>\n");

foxml.writeBytes("<explanation>TESOEM</explanation>\n");

foxml.writeBytes("<content>Fin del Documento</content>\n");

foxml.writeBytes("<properties>\n");

foxml.writeBytes("<property>...</property>\n");

foxml.writeBytes("</properties>\n");

foxml.writeBytes("</div>\n");

foxml.writeBytes("</div0></root>\n");

Page 43: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

42

foxml.close();

///

System.out.println("Preparando...");

// Setup directories

File baseDir = new File("./");

File outDir = new File(baseDir, "");

outDir.mkdirs();

// Setup input and output files

File xmlfile = new File(baseDir, "xD.xml");

File xsltfile = new File(baseDir, "xD.xsl");

File pdffile = new File(outDir, "FacturaPDF.pdf");

System.out.println("Entrada: XML (" + xmlfile + ")");

System.out.println("Stylesheet: " + xsltfile);

System.out.println("Salida: PDF (" + pdffile + ")");

System.out.println();

System.out.println("Transformando...");

// configure fopFactory as desired

FopFactory fopFactory = FopFactory.newInstance();

FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

// configure foUserAgent as desired

Page 44: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

43

// Setup output

OutputStream out = new java.io.FileOutputStream(pdffile);

out = new java.io.BufferedOutputStream(out);

try {

// Construct fop with desired output format

Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

// Setup XSLT

TransformerFactory factory = TransformerFactory.newInstance();

Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));

// Set the value of a <param> in the stylesheet

transformer.setParameter("versionParam", "2.0");

// Setup input for XSLT transformation

Source src = new StreamSource(xmlfile);

// Resulting SAX events (the generated FO) must be piped through to FOP

Result res = new SAXResult(fop.getDefaultHandler());

// Start XSLT transformation and FOP processing

transformer.transform(src, res);

}catch(Exception e){JOptionPane.showMessageDialog(null, e);

} finally {

out.close();

}

Page 45: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

44

System.out.println("Finalizado!");

try{

String ap2="cmd /k FacturaPDF.pdf";

Process proceso2=Runtime.getRuntime().exec(ap2);}catch(Exception e){

JOptionPane.showMessageDialog(null, e);

}

JOptionPane.showMessageDialog(null, "Nota: La factura fue almacenada

en:"+"\n"+xmlfile.getCanonicalPath());

}catch(Exception e){}}

});

Estos métodos ya los explique en otros manuales, donde se utiliza por medio de CMD la

invocación de Adobe Reader para mostrar el PDF.

Y Listo, al final tenemos la aplicación desarrollada para administrar un pequeño negocio.

Se adjunta toda la documentacion de Java Fx 2.x para conocer todos los metodos con

ejemplos implementados.

Esta aplicación la desarrolle con algunos amigos, como proyecto, así que el credito

tambien es de ellos

Aguilar Arteaga Fabio

Dias Tenorio Josue Arturo

Quiterio Vazques marcos

Flores Pimentel Ana Karina

Jimenez Carmona Luis Angel

Page 46: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

45

APENDICE A

B

C

D

DAO: Data Access Object, tiene la finalidad de que si surgen cambios en

la base de datos, solo tendrá que modificarse los componentes de este

paquete sin afectar el resto de la arquitectura.

DTO: Data Transfer Object, su finalidad es el transportar los datos entre

las distintas capas de la arquitectura.

DELEGATE: Permite que los elementos de la capa de presentación

accedan a los servicios de la capa de negocios.

E

F

FACADE: encapsula la lógica de negocio y la información asociada. La

información es mostrada por medio de interfaces y con esto se logra

hacer transparente la interacción entre los componentes internos del

programa.

G

H

I

J

JSP: Java Server Pages, tecnología que permite crear páginas web

dinámicas.

JDBC: Java Data Base Connectivity, permite establecer una conectividad

entre el lenguaje de programación JAVA y una base de datos.

K

L

M

MVC: El Modelo Vista Controlador es un patrón de diseño aportado

originariamente por el lenguaje SmallTalk a la Ingeniería del Software.

Consiste principalmente en dividir las aplicaciones en tres partes:

Controlador

Page 47: Mi Manual Java FX

By: John Michel Rivera de León

JAV

A F

X 2

.x

46

Modelo

Vistas

El controlador es el encargado de redirigir o asignar una aplicación a

cada petición; el controlador debe poseer de algún modo, un "mapa"

de correspondencias entre peticiones y respuestas que se les asignan.

El modelo seria la lógica de negocio a fin de cuentas. Una vez

realizadas las operaciones necesarias el flujo vuelve al controlador y

este devuelve los resultados a una vista asignada.

N

O

ORM: Object Relational Mapping, técnica para lograr una compatibilidad

entre sistemas orientados a objetos y bases de datos relacionales.

P

Q

R

S

Session Factory: Es una representación de Hibérnate, este se encarga de

administrar las sesiones para ingresar a las bases de datos.

Servlet: El Servlet es un elemento de control, este procesa las peticiones

del usuario y devuelve una respuesta. El Servlet es un elemento que se

encuentra del lado del servidor y ahí mismo se ejecuta, puede trabajar en

conjunto con JSP.

T

U

UP: Unified Process, Esta metodología mejor conocida como RUP, ya que

su creador fue Rational Software. Esta metodología permite capturar la

información del proceso de desarrollo del software.

V

W

X

Y

Z