Está en la página 1de 47

MANUAL JAVA FX

2.x
Java FX 2.X
Dentro de este manual, usted aprender a manejar la Tecnologa 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 Len. Lionheart 815@hotmail.com


Quisiera Volver a ser nio,
para no dejar de sorprenderme
- Albert Einstein




By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

1
Java FX
Con este manual, usted
aprender a manejar
esta tecnologa que nos
permite crear
aplicaciones
visualmente ms
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
aplicacin que se
conecte a una B.D,
envi correo con datos
adjuntos, muestre
grficas, 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 aplicacin puede correr
tanto en web, como en Stand Alone, sin necesidad de modificar
ninguna lnea de cdigo.
Esto nos permite ser ms agiles en el desarrollo, puesto que ya no se
tiene que pensar en cmo presentar en web una aplicacin que era
para escritorio. Adems Java FX, puede correr en TVs, celulares, etc.
Claro que solo en los dispositivos de nueva generacin.
JavaFX es una familia de productos y tecnologas pensados para el
desarrollo de Rich Internet Applications (RIAs). 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 caractersticas principales de esta tecnologa
es la posibilidad del desarrollo de interfaces visuales para escritorio,
web, dispositivos mviles y TV; con todo el soporte de JAVA SE,
JAVA EE y JAVA ME.

Aqu las imgenes del proyecto de prueba a desarrollar para que
ests motivado en como lucir la aplicacin.





By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

2




By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

3










By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

4
Requerimientos

NOTA IMPORTANTE: Los mtodos pueden parecerte extraos, y aqu se explica de manera
general como funcionan, pero se incluye la carpeta de la documentacin del API con ejemplos
para comprender mejor cmo funcionan. As que no te desanimes si vez que no est explicado
todo el cdigo aqu ya que es mucha documentacin para meterla dentro de este manual.
Adjunto la carpeta con toda la documentacin 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 cdigo QR)
5. Conector MySQL
6. NetBeans 7.1 o Superior
Las libreras estn adjuntas en el proyecto, en la carpeta dist/lib, estn todas libreras
necesarias.
Muy bien ahora expliquemos como se compone la aplicacin:

Los paquetes de los cuales se componen el sistema estn asociados a distintas capas de
la arquitectura, a pesar de que algunos paquetes son implementados en distintas capas.
El siguiente diagrama describe la descomposicin de las capas de la arquitectura y se
observa como cada capa est relacionada con el MVC.

Modelo
Vista
Controlador
Capa de Integracin
Capa de Negocio
Capa de Presentacin




By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

5
Arquitectura


La arquitectura define la estructura en cmo se compone el software. Dicha
arquitectura establece los distintos patrones de diseo a utilizar as como las
tecnologas empleadas en las diferentes capas. Esta es la base para desarrollar la
aplicacin 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 informacin desarrollado pueda ser utilizado por distintos dispositivos
para lograr cumplir los propsitos de la organizacin, consumiendo grandes
cantidades informacin procesadas para la toma de decisiones y lograr con esto una
ventaja competitiva.
La capa de presentacin 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 negociacin se definen las reglas del negocio. Estas reglas del
negocio definen la forma en cmo debe de manejarse la informacin entre otras
cosas, dichas reglas establecen los lmites que la aplicacin debe respetar.
La principal caracterstica de la capa de integracin es el encapsular los distintos
componentes que manejan la informacin. Esta capa se encarga de mantener la
integridad de la informacin y adems es la que se encarga de comunicarse
directamente con la base de datos para enviar estos hacia las capas superiores.





By: John Michel Rivera de Len

J
A
V
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 grficos tales como
imgenes utilizadas dentro de las interfaces asociadas.
La clase LoginView.java es implementada para la autentificacin 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.





















By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

7
Esta clase tiene un mtodo ActionListener asociado al botn de login. Este es el
encargado de conectarse a la base de datos de los usuarios del sistema para verificar el
usuario y contrasea.

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 categoras de
las que el usuario puede hacer uso, estas tienen mtodos asociados para la E/S de
informacin de las respectivas bases de datos utilizadas.

Paquete com.thegang.riping.modelo

El paquete de modelo hace uso de un patrn de diseo de J2EE que implementa DAO,
DTO, FACADE, DELEGATE. Estos estn 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 presentacin y los servicios que provee la capa de negocios.
El paquete FACADE encapsula la lgica de negocio y la informacin asociada. La
informacin es mostrada por medio de interfaces y con esto se logra hacer transparente la
interaccin entre los componentes internos del programa.







By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

8
Vista de Procesos

Esta seccin describe la descomposicin del sistema dentro de procesos. Se organiza
esta seccin por grupos de procesos de comunicacin o interaccin.
Visto de manera general el sistema funciona por medio de la interaccin 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
contraseas registrados para comparar con los datos introducidos por parte del usuario.
Si los datos son vlidos se muestra la interfaz principal que provee acceso a las interfaces
subsecuentes que se muestran en el diagrama de procesos.


Muy bien basta de chchara y empecemos a tirar cdigo 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 pestaa de
propiedades.




By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

9
Ya que estamos dentro, nos vamos a la seccin de Packaging y activamos la opcin 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 aplicacin. Creamos las
variables del tamao de la aplicacin.
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();




By: John Michel Rivera de Len

J
A
V
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 cdigo 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);





By: John Michel Rivera de Len

J
A
V
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 cdigo anterior creamos un botn, 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 tabs.




By: John Michel Rivera de Len

J
A
V
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);




By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

13
Dentro del cdigo anterior se define el tamao 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 botn se vea un reflejo.
Se agrega el botn 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);
}
}
});





By: John Michel Rivera de Len

J
A
V
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 tabs, como son clientes, almance, etc.

Clase para enviar correo electro nico con datos adjuntos

Aqu utilizamos la librera 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);




By: John Michel Rivera de Len

J
A
V
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 cdigo anterior, creamos la clase y especificamos los elementos, para adjuntar un
archivo pdf, que es la factura, agregamos el siguiente cdigo 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());


}




By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

16
});

Para enviar el correo utilizamos los mtodos de la librera Java Mail como sigue, en este caso
se realizo con un correo de Gmail, y los parmetros 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




By: John Michel Rivera de Len

J
A
V
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.






By: John Michel Rivera de Len

J
A
V
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) {




By: John Michel Rivera de Len

J
A
V
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;
}








By: John Michel Rivera de Len

J
A
V
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 grfica 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();




By: John Michel Rivera de Len

J
A
V
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())
+ "%");


}




By: John Michel Rivera de Len

J
A
V
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++;

}




By: John Michel Rivera de Len

J
A
V
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 documentacin 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);




By: John Michel Rivera de Len

J
A
V
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) {




By: John Michel Rivera de Len

J
A
V
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.









By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

26
Generar facturas en PDF

Muy bien para generar PDFs utilizamos la Librera 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, botn
Generar Factura.
este tiene el botn 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 botn 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 mtodos de
la librera Apache FOP para convertir estos XML en un PDF, adems se incluye la imagen en
Codigo QR con el numero de folio de la factura.






By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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");






By: John Michel Rivera de Len

J
A
V
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");





By: John Michel Rivera de Len

J
A
V
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




By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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");





By: John Michel Rivera de Len

J
A
V
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){




By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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");





By: John Michel Rivera de Len

J
A
V
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;




By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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");




By: John Michel Rivera de Len

J
A
V
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





By: John Michel Rivera de Len

J
A
V
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();
}





By: John Michel Rivera de Len

J
A
V
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 mtodos ya los explique en otros manuales, donde se utiliza por medio de CMD la
invocacin de Adobe Reader para mostrar el PDF.
Y Listo, al final tenemos la aplicacin desarrollada para administrar un pequeo negocio.

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

Esta aplicacin 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









By: John Michel Rivera de Len

J
A
V
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 presentacin
accedan a los servicios de la capa de negocios.

E
F
FACADE: encapsula la lgica de negocio y la informacin asociada. La
informacin es mostrada por medio de interfaces y con esto se logra
hacer transparente la interaccin entre los componentes internos del
programa.

G
H
I
J
JSP: Java Server Pages, tecnologa que permite crear pginas web
dinmicas.
JDBC: Java Data Base Connectivity, permite establecer una conectividad
entre el lenguaje de programacin JAVA y una base de datos.
K
L
M
MVC: El Modelo Vista Controlador es un patrn de diseo aportado
originariamente por el lenguaje SmallTalk a la Ingeniera del Software.
Consiste principalmente en dividir las aplicaciones en tres partes:

Controlador




By: John Michel Rivera de Len

J
A
V
A

F
X

2
.
x

46
Modelo
Vistas

El controlador es el encargado de redirigir o asignar una aplicacin a
cada peticin; el controlador debe poseer de algn modo, un "mapa"
de correspondencias entre peticiones y respuestas que se les asignan.

El modelo seria la lgica 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, tcnica para lograr una compatibilidad
entre sistemas orientados a objetos y bases de datos relacionales.
P
Q
R
S
Session Factory: Es una representacin de Hibrnate, 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 metodologa mejor conocida como RUP, ya que
su creador fue Rational Software. Esta metodologa permite capturar la
informacin del proceso de desarrollo del software.
V
W
X
Y
Z

También podría gustarte