Mi Manual Java FX
Mi Manual Java FX
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 [email protected]
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.
Java FX
Con este manual, usted aprender a manejar esta tecnologa que nos permite crear aplicaciones JAVA FX 2.x 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 las imgenes del proyecto de prueba a desarrollar para que ests motivado en como lucir la aplicacin. 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
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. 2. 3. 4. 5. 6. JDK 1.7 JRE 7 Librerias Apache FOP Librerias Bar Code (para cdigo QR) Conector MySQL NetBeans 7.1 o Superior
JAVA FX 2.x
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.
Capa de Negocio
Modelo
Capa de Integracin
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. JAVA FX 2.x 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.
JAVA FX 2.x
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.
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.
JAVA FX 2.x
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.
JAVA FX 2.x
Desarrollando la aplicacion
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.
Ya que estamos dentro, nos vamos a la seccin de Packaging y activamos la opcin copy Dependent Libraries
JAVA FX 2.x
/** * @param args the command line arguments */ public static void main(String[] args) { launch(args); }
@Override public void start(Stage primaryStage) { JAVA FX 2.x 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);
10
btn.setText("Ingresar"); btn.setEffect(ref);
btn.setOnAction(new EventHandler<ActionEvent>() {
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)); JAVA FX 2.x
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.
11
public Node createLogin(int PANEL_WIDTH_INT, int PANEL_HEIGHT_INT){ Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue(); JAVA FX 2.x 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");
12
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>() {
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()));
JAVA FX 2.x
13
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);
JAVA FX 2.x
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.
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();
14
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); JAVA FX 2.x 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());
15
}
});
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); JAVA FX 2.x btn.setText("Enviar"); btn.setEffect(ref);
btn.setOnAction(new EventHandler<ActionEvent>() {
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
16
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);
//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);
17
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); // JAVA FX 2.x 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); }
18
19
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();
JAVA FX 2.x
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");
20
yAxis1.setLabel("Cantidad");
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);
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) {
JAVA FX 2.x
21
}); }
JAVA FX 2.x
root.getChildren().remove(caption);
22
i++;
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; }
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);
JAVA FX 2.x
23
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); } } JAVA FX 2.x }; 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);
24
eng.locationProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
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; } JAVA FX 2.x
} Todas estas clases se llaman en el men principal y se insertan dentro de unos Tabs para separar las distintas partes.
25
@Override public void handle(ActionEvent arg0) { try { char m='"'; RandomAccessFile fo = new RandomAccessFile("xD.xsl", "rw"); fo.setLength(0);
26
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.
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"); JAVA FX 2.x
27
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"); JAVA FX 2.x 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");
28
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"); JAVA FX 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("font-weight="+m+"bold"+m+">\n"); JAVA FX 2.x fo.writeBytes(""+recabar[1]+" "+recabar[2]+" "+recabar[3]+"\n"); fo.writeBytes("</fo:block>\n");
30
fo.writeBytes("</fo:block>\n");
fo.writeBytes("<fo:table border-collapse="+m+"collapse"+m+" tablelayout="+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+" borderwidth="+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"); JAVA FX 2.x
fo.writeBytes("<fo:table-cell border-color="+m+"blue"+m+" borderwidth="+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");
31
JAVA FX 2.x
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+" borderwidth="+m+"0.5pt" +m+" border-style=" + m +"solid"+m+"> <fo:block textalign="+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
32
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"); JAVA FX 2.x
33
fo.writeBytes( " <fo:block font-size="+m+"7pt"+m+"\n"); fo.writeBytes( "font-family="+m+"sans-serif"+m+"\n");
fo.writeBytes( fo.writeBytes(
"font-weight="+m+"bold"+m+"\n");
" line-height="+m+"20pt"+m+">"+"\n");
fo.writeBytes( "</fo:block>"+"\n");
fo.writeBytes(" <fo:table border-collapse="+m+"collapse"+m+" tablelayout="+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"); ////////////////////// JAVA FX 2.x
fo.writeBytes("<fo:table-row><fo:table-cell border-color="+m+"blue" +m+" borderwidth="+m+"0.5pt" +m+" border-style=" + m +"solid"+m+"> <fo:block textalign="+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);
34
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+" borderwidth="+m+"0.5pt" +m+" border-style=" + m +"solid"+m+"> <fo:block textalign="+m+"center"+m+">"+"\n"); fo.writeBytes( "TOTAL"+"\n"); fo.writeBytes("</fo:block></fo:table-cell>"+"\n");
//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));
JAVA FX 2.x
35
JAVA FX 2.x
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");
36
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"); JAVA FX 2.x
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");
37
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");
JAVA FX 2.x
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
38
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); JAVA FX 2.x
39
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"); JAVA FX 2.x 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");
40
fo.writeBytes("</xsl:template>\n");
fo.close(); //finaliza creacion del xsl JAVA FX 2.x ///////////// //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");
41
foxml.close(); ///
System.out.println("Preparando...");
// Setup directories File baseDir = new File("./"); File outDir = new File(baseDir, ""); outDir.mkdirs(); JAVA FX 2.x
// 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...");
42
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)); JAVA FX 2.x
// 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(); }
43
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){}} }); JAVA FX 2.x
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
44
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 K L M 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.
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
JAVA FX 2.x
45
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.
JAVA FX 2.x
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
46
Y Z