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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

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

4,677
views

Published on

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.

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,677
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
51
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • 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
  • 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