JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and Visage
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and Visage

on

  • 4,669 views

Presentation given at Jazoon on using JavaFX with alternative languages. Includes updates for GroovyFX and the JavaFX 2.0 Beta.

Presentation given at Jazoon on using JavaFX with alternative languages. Includes updates for GroovyFX and the JavaFX 2.0 Beta.

Statistics

Views

Total Views
4,669
Views on SlideShare
4,360
Embed Views
309

Actions

Likes
1
Downloads
50
Comments
0

4 Embeds 309

http://www.developpez.net 303
http://translate.googleusercontent.com 3
http://www.slideshare.net 2
http://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • There are two kinds of listener: ‘changedListener’ and ‘ChangingListener’. Being informed of the change before it happens allow for it to be vetoed.It is also possible to either watch a single property, or all properties belonging to a bean.Note that the value passed to the callback is the old value. This is to ensure that we aren’t eagerly computing the new value when it might not be required. To get the new value, you can call the function on the bean or via the propertyReference
  • There are two kinds of listener: ‘changedListener’ and ‘ChangingListener’. Being informed of the change before it happens allow for it to be vetoed.It is also possible to either watch a single property, or all properties belonging to a bean.Note that the value passed to the callback is the old value. This is to ensure that we aren’t eagerly computing the new value when it might not be required. To get the new value, you can call the function on the bean or via the propertyReference
  • There are two kinds of listener: ‘changedListener’ and ‘ChangingListener’. Being informed of the change before it happens allow for it to be vetoed.It is also possible to either watch a single property, or all properties belonging to a bean.Note that the value passed to the callback is the old value. This is to ensure that we aren’t eagerly computing the new value when it might not be required. To get the new value, you can call the function on the bean or via the propertyReference
  • There are two kinds of listener: ‘changedListener’ and ‘ChangingListener’. Being informed of the change before it happens allow for it to be vetoed.It is also possible to either watch a single property, or all properties belonging to a bean.Note that the value passed to the callback is the old value. This is to ensure that we aren’t eagerly computing the new value when it might not be required. To get the new value, you can call the function on the bean or via the propertyReference
  • There are two kinds of listener: ‘changedListener’ and ‘ChangingListener’. Being informed of the change before it happens allow for it to be vetoed.It is also possible to either watch a single property, or all properties belonging to a bean.Note that the value passed to the callback is the old value. This is to ensure that we aren’t eagerly computing the new value when it might not be required. To get the new value, you can call the function on the bean or via the propertyReference
  • There are two kinds of listener: ‘changedListener’ and ‘ChangingListener’. Being informed of the change before it happens allow for it to be vetoed.It is also possible to either watch a single property, or all properties belonging to a bean.Note that the value passed to the callback is the old value. This is to ensure that we aren’t eagerly computing the new value when it might not be required. To get the new value, you can call the function on the bean or via the propertyReference
  • Slight conversion to Groovy. This can be compiled by the Groovy compiler and run, but basically there is only one line difference (the ‘static void main’ line)
  • This is the same code as the previous slide, taking advantage of some of the Groovy syntax tricks. This is getting to look a lot more like JavaFX Script.
  • This DSL handles running on the EDT, and can actually be run as-is – there is no need for a class declaration, or anything else to ensure that we’re on the EDT. This is getting us fairly close to the simple JavaFX Script at the beginning
  • This DSL handles running on the EDT, and can actually be run as-is – there is no need for a class declaration, or anything else to ensure that we’re on the EDT. This is getting us fairly close to the simple JavaFX Script at the beginning

JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and Visage Presentation Transcript

  • 1. JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and Visage
    Stephen Chin
    Chief Agile Methodologist, GXS
    steveonjava@gmail.com
    tweet: @steveonjava
  • 2. About the Presenter
    Stephen Chin
    Java Champion
    Family Man
    Chief Agile Methodologist, GXS
    Author, Pro JavaFX Platform
    OSCON Java Conference Chair
    Motorcyclist
  • 3. Pro JavaFX 2 Platform Coming Soon!
    Coming 2nd half of this year
    All examples rewritten in Java
    Will cover the new JavaFX 2.0 APIs
    3
  • 4. Disclaimer: This is code-heavy
    THE FOLLOWING IS INTENDED TO STIMULATE CREATIVE USE OF JVM LANGUAGES. AFTER WATCHING THIS PRESENTATION YOU MAY FEEL COMPELLED TO START LEARNING A NEW JVM LANGUAGE AND WANT TO APPLY IT AT YOUR WORKPLACE. THE PRESENTER IS NOT LIABLE FOR ANY INNOVATION, BREAKTHROUGHS, OR NP-COMPLETE SOLUTIONS THAT MAY RESULT.
  • 5. JavaFX With Java
  • 6. JavaFX 2.0 Product Timeline
    CYQ1 2011
    CYQ3 2011
    CYQ2 2011
    JavaFX 2.0 EA
    (Early Access)
    JavaFX 2.0 Beta
    JavaFX 2.0 GA
    (General Availability)
    Copyright 2010 Oracle
    JavaFX Beta Available Now!
  • 7. Programming Languages
    JavaFX 2.0 APIs are now in Java
    Pure Java APIs for all of JavaFX
    Expose JavaFX Binding, Sequences as Java APIs
    Embrace all JVM languages
    JRuby, Clojure, Groovy, Scala
    Fantom, Mira, Jython, etc.
    JavaFX Script is no longer supported by Oracle
    Existing JavaFX Script based applications will continue to run
    Visage is the open-source successor to the JavaFX Script language
  • 8. JavaFX in Java
    JavaFX API follows JavaBeans approach
    Similar in feel to other UI toolkits (Swing, etc)
    Uses builder pattern to minimize boilerplate
  • 9. Example Application
    public class HelloStage extends Application {
    @Override public void start(Stage stage) {
    stage.setTitle("Hello Stage");
    stage.setWidth(600);
    stage.setHeight(450);
    Group root = new Group();
    Scene scene = new Scene(root);
    scene.setFill(Color.LIGHTGREEN);
    stage.setScene(scene);
    stage.setVisible(true);
    }
    public static void main(String[] args) {
    launch(HelloStage.class, args);
    }
    }
  • 10. Binding
    Unquestionably the biggest JavaFX Script innovation
    Supported via a PropertyBinding class
    Lazy invocation for high performance
    Static construction syntax for simple cases
    e.g.: bindTo(<property>)
  • 11. Observable Pseudo-Properties
    Supports watching for changes to properties
    Implemented via anonymous inner classes
    Will take advantage of closures in the future
  • 12. Observable Pseudo-Properties
    final Rectangle rect = new Rectangle();
    rect.setX(40);
    rect.setY(40);
    rect.setWidth(100);
    rect.setHeight(200);
    rect.hoverProperty().addListener(new ChangeListener<Boolean>() {
    });
  • 13. Observable Pseudo-Properties
    final Rectangle rect = new Rectangle();
    rect.setX(40);
    rect.setY(40);
    rect.setWidth(100);
    rect.setHeight(200);
    rect.hoverProperty().addListener(new ChangeListener<Boolean>() {
    });
    The property we want to watch
  • 14. Observable Pseudo-Properties
    final Rectangle rect = new Rectangle();
    rect.setX(40);
    rect.setY(40);
    rect.setWidth(100);
    rect.setHeight(200);
    rect.hoverProperty().addListener(new ChangeListener<Boolean>() {
    });
    Only one listener used with generics to specify the data type
  • 15. Observable Pseudo-Properties
    final Rectangle rect = new Rectangle();
    rect.setX(40);
    rect.setY(40);
    rect.setWidth(100);
    rect.setHeight(200);
    rect.hoverProperty().addListener(new ChangeListener<Boolean>() {
    public void changed(ObservableValue<? extends Boolean> property, Boolean oldValue, Boolean value) {
    }
    });
    Refers to the Rectangle.hoverProperty()
  • 16. Observable Pseudo-Properties
    final Rectangle rect = new Rectangle();
    rect.setX(40);
    rect.setY(40);
    rect.setWidth(100);
    rect.setHeight(200);
    rect.hoverProperty().addListener(new ChangeListener<Boolean>() {
    public void changed(ObservableValue<? extends Boolean> property, Boolean oldValue, Boolean value) {
    rect.setFill(rect.isHover() ? Color.GREEN : Color.RED);
    }
    });
  • 17. Sequences in Java
    Replaced with an Observable List
    Public API is based on JavaFX sequences
    Internal code can use lighter collections API
    JavaFX 2.0 also has an Observable Map
  • 18. JavaFX With JRuby
  • 19. Why JRuby?
    • Direct access to Java APIs
    • 20. Dynamic Typing
    • 21. Closures
    • 22. ‘Closure conversion’ for interfaces
  • Java in JRuby - Accessing Properties
    timeline.setAutoReverse(true)
    timeline.autoReverse = true
    timeline.auto_reverse = true
    timeline.getKeyFrames().add(kf)
    timeline.key_frames.add(kf)
    timeline.key_frames.addkf
  • 23. JRuby Example 1: Simple Stage
    require 'java'
    Application = Java::javafx.application.Application
    Stage = Java::javafx.stage.Stage
    Scene = Java::javafx.scene.Scene
    Color = Java::javafx.scene.paint.Color
    class HelloStage< Application
    def start(stage)
    .....
    end
    end
    Application.launch(HelloStage.new);
    stage.title = 'Hello Stage (JRuby)'
    stage.width = 600
    stage.height = 450
    scene = Scene.new
    scene.fill = Color::LIGHTGREEN
    stage.scene = scene
    stage.visible = true;
  • 24. JRuby Example 2
    rect = Rectangle.new
    rect.x = 25
    rect.y = 40
    rect.width = 100
    rect.height = 50
    rect.fill = Color::RED
    root.children.add(rect)
    timeline = Timeline.new
    timeline.cycle_count= Timeline::INDEFINITE
    timeline.auto_reverse = true
    kv = KeyValue.new(rect.xProperty, 200);
    kf = KeyFrame.new(Duration.valueOf(500), kv);
    timeline.key_frames.addkf;
    timeline.play();
  • 25. JRuby Closure Conversion
    rect.hoverProperty.addListener() do |prop, oldVal, newVal|
    rect.fill = rect.hover ? Color::GREEN : Color::RED;
    end
    23
  • 26. JRubySwiby
    require 'swiby'
    class HelloWorldModel
    attr_accessor :saying
    end
    model = HelloWorldModel.new
    model.saying = "Hello World"
    Frame {
    title "Hello World“
    width 200
    content {
    Label {
    text bind(model,:saying)
    }
    }
    visible true
    }
    24
  • 27. 25
    JavaFX With Clojure
    Artwork by Augusto Sellhorn
    http://sellmic.com/
  • 28. A Little About Clojure
    Started in 2007 by Rich Hickey
    Functional Programming Language
    Derived from LISP
    Optimized for High Concurrency
    … and looks nothing like Java!
    26
    (def hello (fn [] "Hello world"))
    (hello)
  • 29. Clojure Syntax in One Slide
    Symbols
    numbers – 2.178
    ratios – 355/113
    strings – “clojure”, “rocks”
    characters – a b c d
    symbols – a b c d
    keywords – :alpha :beta
    boolean – true, false
    null - nil
    Collections
    (commas optional)
    Lists
    (1, 2, 3, 4, 5)
    Vectors
    [1, 2, 3, 4, 5]
    Maps
    {:a 1, :b 2, :c 3, :d 4}
    Sets
    #{:a :b :c :d :e}
    27
    (plus macros that are syntactic sugar wrapping the above)
  • 30. Clojure GUI Example
    (defnjavafxapp []
    (let [stage (Stage. "JavaFX Stage")
    scene (Scene.)]
    (.setFill scene Color/LIGHTGREEN)
    (.setWidth stage 600)
    (.setHeight stage 450)
    (.setScene stage scene)
    (.setVisible stage true)))
    (javafxapp)
    28
  • 31. Clojure GUI Example
    (defnjavafxapp[]
    (let [stage (Stage. "JavaFX Stage")
    scene (Scene.)]
    (.setFill scene Color/LIGHTGREEN)
    (.setWidth stage 600)
    (.setHeight stage 450)
    (.setScene stage scene)
    (.setVisible stage true)))
    (javafxapp)
    29
    Create a Function for the Application
  • 32. Clojure GUI Example
    (defnjavafxapp []
    (let [stage (Stage. "JavaFX Stage")
    scene (Scene.)]
    (.setFill scene Color/LIGHTGREEN)
    (.setWidth stage 600)
    (.setHeight stage 450)
    (.setScene stage scene)
    (.setVisible stage true)))
    (javafxapp)
    30
    Initialize the Stage and Scene Variables
  • 33. Clojure GUI Example
    (defnjavafxapp []
    (let [stage (Stage. "JavaFX Stage")
    scene (Scene.)]
    (.setFill scene Color/LIGHTGREEN)
    (.setWidth stage 600)
    (.setHeight stage 450)
    (.setScene stage scene)
    (.setVisible stage true)))
    (javafxapp)
    31
    Call Setter Methods on Scene and Stage
  • 34. Clojure GUI Example
    (defnjavafxapp []
    (let [stage (Stage. "JavaFX Stage")
    scene (Scene.)]
    (.setFillscene Color/LIGHTGREEN)
    (.setWidthstage 600)
    (.setHeightstage 450)
    (.setScenestage scene)
    (.setVisiblestage true)))
    (javafxapp)
    32
    Java Constant Syntax
    Java Method Syntax
  • 35. Simpler Code Using doto
    (defnjavafxapp []
    (let [stage (Stage. "JavaFX Stage")
    scene (Scene.)]
    (doto scene
    (.setFillColor/LIGHTGREEN))
    (doto stage
    (.setWidth600)
    (.setHeight450)
    (.setScene scene)
    (.setVisibletrue))))
    (javafxapp)
    33
  • 36. Simpler Code Using doto
    (defnjavafxapp []
    (let [stage (Stage. "JavaFX Stage")
    scene (Scene.)]
    (doto scene
    (.setFillColor/LIGHTGREEN))
    (doto stage
    (.setWidth 600)
    (.setHeight 450)
    (.setScene scene)
    (.setVisible true))))
    (javafxapp)
    34
    doto form:
    (doto symbol
    (.method params))
    equals:
    (.method symbol params)
  • 37. Refined Clojure GUI Example
    (defnjavafxapp []
    (doto (Stage. "JavaFX Stage")
    (.setWidth600)
    (.setHeight450)
    (.setScene (doto (Scene.)
    (.setFillColor/LIGHTGREEN)
    (.setContent (list (doto (Rectangle.)
    (.setX25)
    (.setY40)
    (.setWidth100)
    (.setHeight50)
    (.setFillColor/RED))))))
    (.setVisibletrue)))
    (javafxapp)
    35
  • 38. Refined Clojure GUI Example
    (defnjavafxapp []
    (doto(Stage. "JavaFX Stage")
    (.setWidth 600)
    (.setHeight 450)
    (.setScene (doto(Scene.)
    (.setFillColor/LIGHTGREEN)
    (.setContent (list (doto (Rectangle.)
    (.setX 25)
    (.setY 40)
    (.setWidth 100)
    (.setHeight 50)
    (.setFillColor/RED))))))
    (.setVisible true)))
    (javafxapp)
    36
    Let replaced with inline declarations
  • 39. Refined Clojure GUI Example
    (defnjavafxapp []
    (doto (Stage. "JavaFX Stage")
    (.setWidth 600)
    (.setHeight 450)
    (.setScene (doto (Scene.)
    (.setFillColor/LIGHTGREEN)
    (.setContent (list (doto (Rectangle.)
    (.setX 25)
    (.setY 40)
    (.setWidth 100)
    (.setHeight 50)
    (.setFillColor/RED))))))
    (.setVisible true)))
    (javafxapp)
    37
    Doto allows nested data structures
  • 40. Refined Clojure GUI Example
    (defnjavafxapp []
    (doto (Stage. "JavaFX Stage")
    (.setWidth 600)
    (.setHeight 450)
    (.setScene (doto (Scene.)
    (.setFillColor/LIGHTGREEN)
    (.setContent (list (doto (Rectangle.)
    (.setX 25)
    (.setY 40)
    (.setWidth 100)
    (.setHeight 50)
    (.setFillColor/RED))))))
    (.setVisible true)))
    (javafxapp)
    38
    Now a nested Rectangle fits!
  • 41. Closures in Clojure
    39
    Inner classes can be created using proxy
    (.addListenerhoverProperty
    (proxy [ChangeListener] []
    (changed [p, o, v]
    (.setFillrect
    (if (.isHoverrect) Color/GREEN Color/RED)))))
  • 42. Closures in Clojure
    Inner classes can be created using proxy
    40
    Proxy form:
    (proxy [class] [args] fs+)
    f => (name [params*] body)
    (.addListenerhoverProperty
    (proxy[ChangeListener][]
    (changed [p, o, v]
    (.setFillrect
    (if (.isHoverrect) Color/GREEN Color/RED)))))
  • 43. JavaFX With Groovy
  • 44. Features of Groovy
    Tight integration with Java
    Very easy to port from Java to Groovy
    Declarative syntax
    Familiar to JavaFX Script developers
    Builders
  • 45. Step 1: Lazy conversion to Groovy
    class HelloStage extends Application {
    void start(stage) {
    stage.setTitle("Hello Stage (Groovy)");
    stage.setWidth(600);
    stage.setHeight(450);
    Group root = new Group();
    Scene scene = new Scene(root);
    scene.setFill(Color.LIGHTSKYBLUE);
    stage.setScene(scene);
    stage.setVisible(true);
    }
    static void main(args) {
    launch(HelloStage.class, args);
    }
    }
  • 46. Step 2: Slightly More Groovy
    class HelloStage extends Application {
    void start(stage) {
    stage.setTitle("Hello Stage (Groovy)");
    stage.setScene(new Scene(
    width: 600,
    height: 450,
    fill: Color.LIGHTSKYBLUE
    root: new Group()
    ));
    stage.setVisible(true);
    }
    static void main(args) {
    launch(HelloStage.class, args);
    }
    }
  • 47. Introducing GroovyFX
    Groovy DSL for JavaFX
    Started by James Clark
    In Alpha 1.0 State
    http://groovy.codehaus.org/GroovyFX
  • 48. Step 3: Using GroovyFX
    GroovyFX.start ({
    def sg = new SceneGraphBuilder();
    def stage = sg.stage(
    title: "Hello World",
    width: 600,
    height: 450,
    visible: true
    ) {
    scene(fill: Color.LIGHTSKYBLUE) {
    ...
    }
    )
    }
  • 49. Step 4: With Content
    GroovyFX.start ({
    def sg = new SceneGraphBuilder();
    def stage = sg.stage(
    title: "Hello World",
    width: 600,
    height: 450,
    visible: true
    ) {
    scene(fill: Color.LIGHTSKYBLUE) {
    rectangle(
    x: 25, y: 40,
    width: 100, height: 50,
    fill: Color.RED
    )
    })}
  • 50. FX Script Animation in Groovy
  • 51. Step 1: JavaFX Script
    def timeline = Timeline {
    repeatCount: Timeline.INDEFINITE
    autoReverse: true
    keyFrames: [
    KeyFrame {
    time: 750ms
    values : [
    rect1.x => 200.0 tweenInterpolator.LINEAR,
    rect2.y => 200.0 tweenInterpolator.LINEAR,
    circle1.radius => 200.0 tweenInterpolator.LINEAR
    ]
    }
    ];
    }
    timeline.play();
  • 52. Step 1a: JavaFX Script Simplification
    def timeline = Timeline {
    repeatCount: Timeline.INDEFINITE
    autoReverse: true
    keyFrames: at (750ms) {
    rect1.x => 200.0 tween Interpolator.LINEAR;
    rect2.y => 200.0 tween Interpolator.LINEAR;
    circle1.radius => 200.0 tween Interpolator.LINEAR;
    }
    }
    timeline.play();
  • 53. Step 2: Java-ish Groovy Animations
    final Timeline timeline = new Timeline(
    cycleCount: Timeline.INDEFINITE,
    autoReverse: true
    )
    final KeyValue kv1 = new KeyValue (rect1.xProperty(), 200);
    final KeyValue kv2 = new KeyValue (rect2.yProperty(), 200);
    final KeyValue kv3 = new KeyValue (circle1.radiusProperty(), 200);
    final KeyFramekf = new KeyFrame(Duration.valueOf(750), kv1, kv2, kv3);
    timeline.getKeyFrames().add(kf);
    timeline.play();
  • 54. Step 3: GroovyFX Animation
    timeline = timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {
    at 750.ms {
    change (rect1, "y") {
    to 200
    }
    change (rect2, "x") {
    to 200
    }
    change (circle, "radius") {
    to 200
    }
    }
    }
    timeline.play();
  • 55. Groovy Closures - With interface coercion
    def f = {
    p, o, v -> rect.setFill(rect.isHover() ? Color.GREEN : Color.RED);
    } as ChangeListener;
    rect.hoverProperty().addListener(f);
  • 56. 54
    JavaFX With Scala
  • 57. What is Scala
    Started in 2001 by Martin Odersky
    Compiles to Java bytecodes
    Pure object-oriented language
    Also a functional programming language
    55
  • 58. Why Scala?
    Shares many language features with JavaFX Script that make GUI programming easier:
    Static type checking – Catch your errors at compile time
    Closures – Wrap behavior and pass it by reference
    Declarative – Express the UI by describing what it should look like
    Scala also supports DSLs!
    56
  • 59. Java vs. Scala DSL
    public class HelloStage extends Application {
    public void start(Stage stage) {
    stage.setTitle("Hello Stage");
    stage.setWidth(600);
    stage.setHeight(450);
    Scene scene = new Scene();
    scene.setFill(Color.LIGHTGREEN);
    Rectangle rect = new Rectangle();
    rect.setX(25);
    rect.setY(40);
    rect.setWidth(100);
    rect.setHeight(50);
    rect.setFill(Color.RED);
    stage.add(rect);
    stage.setScene(scene);
    stage.setVisible(true);
    }
    public static void main(String[] args) {
    Launcher.launch(HelloStage.class, args);
    }
    }
    object HelloJavaFX extends JavaFXApplication {
    def stage = new Stage {
    title = "Hello Stage"
    width = 600
    height = 450
    scene = new Scene {
    fill = Color.LIGHTGREEN
    content = List(new Rectangle {
    x = 25
    y = 40
    width = 100
    height = 50
    fill = Color.RED
    })
    }
    }
    }
    57
    21 Lines
    541 Characters
    17 Lines
    324 Characters
  • 60. object HelloJavaFX extends JavaFXApplication {
    def stage = new Stage {
    title = "Hello Stage"
    width = 600
    height = 450
    scene = new Scene {
    fill = Color.LIGHTGREEN
    content = List(new Rectangle {
    x = 25
    y = 40
    width = 100
    height = 50
    fill = Color.RED
    })
    }
    }
    }
    58
  • 61. 59
    object HelloJavaFX extends JavaFXApplication {
    def stage = new Stage {
    title = "Hello Stage"
    width = 600
    height = 450
    scene = new Scene {
    fill = Color.LIGHTGREEN
    content = List(new Rectangle {
    x = 25
    y = 40
    width = 100
    height = 50
    fill = Color.RED
    })
    }
    }
    }
    object HelloJavaFX extends JavaFXApplication {
    def stage = new Stage {
    title = "Hello Stage"
    width = 600
    height = 450
    scene = new Scene {
    fill = Color.LIGHTGREEN
    content = List(new Rectangle {
    x = 25
    y = 40
    width = 100
    height = 50
    fill = Color.RED
    })
    }
    }
    }
    Base class for JavaFX applications
  • 62. 60
    object HelloJavaFX extends JavaFXApplication {
    def stage = new Stage {
    title = "Hello Stage"
    width = 600
    height = 450
    scene = new Scene {
    fill = Color.LIGHTGREEN
    content = List(new Rectangle {
    x = 25
    y = 40
    width = 100
    height = 50
    fill = Color.RED
    })
    }
    }
    }
    Declarative Stage definition
  • 63. 61
    object HelloJavaFX extends JavaFXApplication {
    def stage = new Stage {
    title = "Hello Stage"
    width = 600
    height = 450
    scene = new Scene {
    fill = Color.LIGHTGREEN
    content = List(new Rectangle {
    x = 25
    y = 40
    width = 100
    height = 50
    fill = Color.RED
    })
    }
    }
    }
    Inline property definitions
  • 64. 62
    object HelloJavaFX extends JavaFXApplication {
    def stage = new Stage {
    title = "Hello Stage"
    width = 600
    height = 450
    scene = new Scene {
    fill = Color.LIGHTGREEN
    content = List(new Rectangle {
    x = 25
    y = 40
    width = 100
    height = 50
    fill = Color.RED
    })
    }
    }
    }
    List Construction Syntax
  • 65. Animation in Scala
    def timeline = new Timeline {
    repeatCount = INDEFINITE
    autoReverse = true
    keyFrames = List(
    new KeyFrame(time: 50) {
    values = List(
    new KeyValue(rect1.xProperty -> 300),
    new KeyValue(rect2.yProperty -> 500),
    new KeyValue(rect2.widthProperty -> 150)
    )
    }
    )
    }
    63
  • 66. def timeline = new Timeline {
    repeatCount = INDEFINITE
    autoReverse = true
    keyFrames = List(
    new KeyFrame(time: 50) {
    values = List(
    new KeyValue(rect1.xProperty -> 300),
    new KeyValue(rect2.yProperty -> 500),
    new KeyValue(rect2.widthProperty -> 150)
    )
    }
    )
    }
    Animation in Scala
    64
    Duration set by Constructor Parameter
  • 67. Animation in Scala
    65
    def timeline = new Timeline {
    repeatCount = INDEFINITE
    autoReverse = true
    keyFrames = List(
    new KeyFrame(time: 50) {
    values = List(
    new KeyValue(rect1.xProperty -> 300),
    new KeyValue(rect2.yProperty -> 500),
    new KeyValue(rect2.widthProperty -> 150)
    )
    }
    )
    }
    Operator overloading for animation syntax
  • 68. Closures in Scala
    66
    Closures are also supported in Scala
    And they are 100% type-safe
    rect.hoverProperty.addListener((p, o, v) => {
    rect.fill = if (rect.hover) Color.GREEN else Color.RED
    })
  • 69. Closures in Scala
    Closures are also supported in Scala
    And they are 100% type-safe
    67
    rect.hoverProperty.addListener((p, o, v) => {
    rect.fill = if (rect.hover) Color.GREEN else Color.RED
    })
    Compact syntax
    (params) => {body}
  • 70. Other JVM Languages to Try
    Jython
    Started by Jim Hugunin
    High Performance Python
    Mirah
    Invented by Charles Nutter
    Originally called Duby
    Local Type Inference, Static and Dynamic Typing
    Fantom
    Created by Brian and Andy Frank
    Originally called Fan
    Built-in Declarative Syntax
    Portable to Java and .NET
    Local Type Inference, Static and Dynamic Typing
    68
  • 71. Fantom Code Example
    Void main() {
    Stage {
    title= "Hello Stage"
    width= 600
    height= 450
    Scene {
    fill= Color.LIGHTGREEN
    Rectangle {
    x= 25
    y= 40
    width= 100
    height= 50
    fill= Color.RED
    }
    }
    }.open
    }
    69
  • 72. timeline := Timeline {
    repeatCount = Timeline.INDEFINITE
    autoReverse = true
    KeyFrame {
    time = 50ms
    KeyValue(rect1.x()-> 300),
    KeyValue(rect2.y() -> 500),
    KeyValue(rect2.width() -> 150)
    }
    }
    Animation in Fantom
    70
    Fantom has a built-in Duration type
    And also supports operator overloading
  • 73. Announcing Project Visage
    71
    • “Visage is a domain specific language (DSL) designed for the express purpose of writing user interfaces.”
    Visage project goals:
    Compile to JavaFX Java APIs
    Evolve the Language (Annotations, Maps, etc.)
    Support Other Toolkits
    Come join the team!
    For more info: http://visage-lang.org/
  • 74. How about JavaFX on… Visage
    Stage {
    title: "Hello Stage"
    width: 600
    height: 450
    scene: Scene {
    fill: Color.LIGHTGREEN
    content: Rectangle {
    x: 25
    y: 40
    width: 100
    height: 50
    fill: Color.RED
    }
    }
    }
    72
  • 75. How about JavaFX on… Visage
    Stage {
    title: "Hello Stage"
    width: 600
    height: 450
    scene: Scene {
    fill: Color.LIGHTGREEN
    content: Rectangle {
    x: 25
    y: 40
    width: 100
    height: 50
    fill: Color.RED
    }
    }
    }
    73
  • 76. How about JavaFX on… Visage
    Stage {
    title: "Hello Stage"
    width: 600
    height: 450
    Scene {
    fill: Color.LIGHTGREEN
    Rectangle {
    x: 25
    y: 40
    width: 100
    height: 50
    fill: Color.RED
    }
    }
    }
    74
  • 77. Visage on Android
    Curious?
    Drop by room 4 after this talk to find out more…
  • 78. Conclusion
    You can write JavaFX applications in pure Java
    JavaFX is also usable in alternate languages
    Over time improved support is possible
    Groovy Builders, Scala DSL, Visage
  • 79. 77
    Stephen Chin
    steveonjava@gmail.com
    tweet: @steveonjava