Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java FX 2, Un Tour d'Horizon

Java FX 2, Un Tour d'Horizon

[FR] Présentation de Java FX 2 et des nouveautés de Java FX 8
- quickie au Paris JUG (14/01/2014, soirée Young Bloods)
- quickie au BreizhCamp 2014 (22/05/2014) *

*version courante

Simon Baslé

May 22, 2014
Tweet

More Decks by Simon Baslé

Other Decks in Programming

Transcript

  1. Décoration avec CSS Layout externalisable en FXML FXML scriptable JSR

    223 : JavaScript, Groovy, Jython, Clojure...
  2. <?xml version="1.0" encoding="UTF-8"?> <?language javascript?> <?import java.net.*?> <?import javafx.geometry.*?> <?import

    javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <GridPane fx:controller="fxmlexample.FXMLExampleController" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> <padding><Insets top="25" right="25" bottom="10" left="25"/></padding> <Text text="Welcome" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/> <Label text="User Name:" GridPane.columnIndex="0" GridPane.rowIndex="1"/> <TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/> <Label text="Password:" GridPane.columnIndex="0" GridPane.rowIndex="2"/> <PasswordField fx:id="passwordField" GridPane.columnIndex="1" GridPane.rowIndex="2"/> <HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="1" GridPane.rowIndex="4"> <Button text="Sign In" onAction="#handleSubmitButtonAction"/> </HBox> <Text fx:id="actiontarget" GridPane.columnIndex="1" GridPane.rowIndex="6"/> </GridPane>
  3. <?xml version="1.0" encoding="UTF-8"?> <?language javascript?> <?import java.net.*?> <?import javafx.geometry.*?> <?import

    javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <GridPane fx:controller="fxmlexample.FXMLExampleController" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> <padding><Insets top="25" right="25" bottom="10" left="25"/></padding> <Text text="Welcome" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/> <Label text="User Name:" GridPane.columnIndex="0" GridPane.rowIndex="1"/> <TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/> <Label text="Password:" GridPane.columnIndex="0" GridPane.rowIndex="2"/> <PasswordField fx:id="passwordField" GridPane.columnIndex="1" GridPane.rowIndex="2"/> <HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="1" GridPane.rowIndex="4"> <Button text="Sign In" onAction="#handleSubmitButtonAction"/> </HBox> <Text fx:id="actiontarget" GridPane.columnIndex="1" GridPane.rowIndex="6"/> </GridPane> <Text text="Welcome" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/> <Label text="User Name:" GridPane.columnIndex="0" GridPane.rowIndex="1"/> <TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/>
  4. <?xml version="1.0" encoding="UTF-8"?> <?language javascript?> <?import java.net.*?> <?import javafx.geometry.*?> <?import

    javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <GridPane fx:controller="fxmlexample.FXMLExampleController" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> <padding><Insets top="25" right="25" bottom="10" left="25"/></padding> <Text text="Welcome" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/> <Label text="User Name:" GridPane.columnIndex="0" GridPane.rowIndex="1"/> <TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/> <Label text="Password:" GridPane.columnIndex="0" GridPane.rowIndex="2"/> <PasswordField fx:id="passwordField" GridPane.columnIndex="1" GridPane.rowIndex="2"/> <HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="1" GridPane.rowIndex="4"> <Button text="Sign In" onAction="#handleSubmitButtonAction"/> </HBox> <Text fx:id="actiontarget" GridPane.columnIndex="1" GridPane.rowIndex="6"/> </GridPane> <Button text=”Sign in” onAction=”#handleSubmitButtonAction” fx:controller=”fxmlexample.FXMLExampleController” <Text fx:id=”actionTarget”
  5. <?xml version="1.0" encoding="UTF-8"?> <?language javascript?> <?import java.net.*?> <?import javafx.geometry.*?> <?import

    javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <GridPane fx:controller="fxmlexample.FXMLExampleController" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> <padding><Insets top="25" right="25" bottom="10" left="25"/></padding> <Text text="Welcome" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/> <Label text="User Name:" GridPane.columnIndex="0" GridPane.rowIndex="1"/> <TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/> <Label text="Password:" GridPane.columnIndex="0" GridPane.rowIndex="2"/> <PasswordField fx:id="passwordField" GridPane.columnIndex="1" GridPane.rowIndex="2"/> <HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="1" GridPane.rowIndex="4"> <Button text="Sign In" onAction="#handleSubmitButtonAction"/> </HBox> <Text fx:id="actiontarget" GridPane.columnIndex="1" GridPane.rowIndex="6"/> </GridPane> package fxmlexample; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.text.Text; public class FXMLExampleController { //annotation @FXML accéder aux champs privés/protégés @FXML private Text actiontarget; public void handleSubmitButtonAction(ActionEvent e) { actiontarget.setText("Sign in button pressed"); } }
  6. root { display: block; } .root { -fx-background-image: url("background.jpg"); }

    .label { -fx-font-size: 12px; -fx-font-weight: bold; -fx-text-fill: #333333; -fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 ); } #welcome-text { -fx-font-size: 32px; -fx-font-family: "Arial Black"; -fx-fill: #818181; -fx-effect: innershadow( three-pass-box , rgba(0,0,0,0.7) , 6, 0.0 , 0 , 2 ); } #actiontarget { -fx-fill: FIREBRICK; -fx-font-weight: bold; -fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 ); } .button { -fx-text-fill: white; -fx-font-family: "Arial Narrow"; -fx-font-weight: bold; -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); }
  7. root { display: block; } .root { -fx-background-image: url("background.jpg"); }

    .label { -fx-font-size: 12px; -fx-font-weight: bold; -fx-text-fill: #333333; -fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 ); } #welcome-text { -fx-font-size: 32px; -fx-font-family: "Arial Black"; -fx-fill: #818181; -fx-effect: innershadow( three-pass-box , rgba(0,0,0,0.7) , 6, 0.0 , 0 , 2 ); } #actiontarget { -fx-fill: FIREBRICK; -fx-font-weight: bold; -fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 ); } .button { -fx-text-fill: white; -fx-font-family: "Arial Narrow"; -fx-font-weight: bold; -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 ); } .button { -fx-text-fill: white; -fx-font-family: "Arial Narrow"; -fx-font-weight: bold; -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.6), 5, 0.0, 0, 1); }
  8. Java FX 2 On applique directement la transformation Label monFxLabel

    = new Label(“test”); monFxLabel.setRotate(90.0d);
  9. Swing On surcharge JLabel et on joue avec Java2D public

    class VerticalLabel extends JLabel { (...) protected void paintComponent(Graphics g) { Graphics2D gr = (Graphics2D) g.create(); gr.translate(0, getSize(), getHeight()); gr.transform( AffineTransform.getQuadrantRotateInstance(-1)); super.paintComponent(gr); } }
  10. Java FX 2 On applique directement la transformation (à la

    vue) ! Image monFxImage = new Image(“http://.../someImg.png”, true); ImageView view = new ImageView(); view.setImage(monFxImage); view.setRotate(90.0d);
  11. Java FX 2 On applique directement la transformation (à la

    vue) ! Note: le chargement de l’image ci-dessus se fait en arrière- plan (2ème argument), avec un placeholder dans la vue. Pas besoin de coder un SwingWorker pour ça ;) Image monFxImage = new Image(“http://.../someImg.png”, true); ImageView view = new ImageView(); view.setImage(monFxImage); view.setRotate(90.0d);
  12. Swing Encore une fois on joue avec Java2D source: stackOverflow.com

    public static BufferedImage rotate(BufferedImage image, double angle) { double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle)); int w = image.getWidth(), h = image.getHeight(); int neww = (int)Math.floor(w*cos+h*sin), newh = (int)Math.floor(h*cos+w*sin); GraphicsConfiguration gc = getDefaultConfiguration(); BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT); Graphics2D g = result.createGraphics(); g.translate((neww-w)/2, (newh-h)/2); g.rotate(angle, w/2, h/2); g.drawRenderedImage(image, null); g.dispose(); return result; }
  13. Binding de ces propriétés observables Expressions une classe de propriétés

    qui facilite les bindings avec des opérations comme divide, substract, etc...
  14. Extension du modèle des JavaBeans pas limité à l’IHM, peut

    aussi s’appliquer au modèle Définissez les vôtres!
  15. Sur les plate-formes supportant le tactile Rotate + ROTATE_STARTED /

    FINISHED Scroll Zoom +SCROLL_STARTED / FINISHED + ZOOM_STARTED / FINISHED
  16. Sur les plate-formes supportant le tactile Rotate + ROTATE_STARTED /

    FINISHED Scroll Zoom +SCROLL_STARTED / FINISHED + ZOOM_STARTED / FINISHED Swipe SWIPE_LEFT / RIGHT / UP / DOWN
  17. Task exécution unique en tâche de fond avec mise à

    jour de l’UI une FutureTask avec propriétés Observables
  18. Sous-ensemble de FX inclus dans Java SE Embedded Java FX

    sur le Raspberry Pi ! mais sans WebView ni support multimédia...
  19. Support des IDE (en ordre alphabétique :p) Eclipse via le

    plugin e(fx)clipse (3.8, 4.3+) IntelliJ en natif (depuis la 12.1)
  20. Support des IDE (en ordre alphabétique :p) Eclipse via le

    plugin e(fx)clipse (3.8, 4.3+) IntelliJ en natif (depuis la 12.1) Netbeans en natif (depuis la 7.1.1)
  21. Qu’est ce que Java FX 2? Graphismes riches Composants Propriétés

    et Bindings Multitouch Parallélisme et Multithreading Nouveautés de Java FX 8 Autour de Java FX @SimonBasle Questions ?