JavaFX Your Way - Devoxx Version

83
JavaFX Your Way Building JavaFX Applications with Alternative Languages Stephen Chin GXS steveonjava@gmail. com tweet: Jonathan Giles Oracle Jonathan.giles@oracle .com

description

Updated version of the JavaFX Your Way talk for Devoxx. This includes additional JavaFX 2.0 API changes and an example of some Fantom code snippets.

Transcript of JavaFX Your Way - Devoxx Version

Page 1: JavaFX Your Way - Devoxx Version

JavaFX Your Way

Building JavaFX Applications with Alternative Languages

Stephen [email protected]: @steveonjava

Jonathan [email protected]: @jonathangiles

Page 2: JavaFX Your Way - Devoxx Version

?

Meet the Presenters…

Steve Jonathan

2

Family Man

A reasonable facsimile of…

Motorcyclist

Page 3: JavaFX Your Way - Devoxx Version

Challenge the Presenter…

Page 4: JavaFX Your Way - Devoxx Version

Challenge the Presenter…

Page 5: JavaFX Your Way - Devoxx Version

Disclaimer: This is proof of concept

Page 6: JavaFX Your Way - Devoxx Version

THE FOLLOWING IS INTENDED TO OUTLINE ORACLE’S GENERAL PRODUCT DIRECTION. IT IS INTENDED FOR INFORMATION PURPOSES ONLY, AND MAY NOT BE INCORPORATED INTO ANY CONTRACT. IT IS NOT A COMMITMENT TO DELIVER ANY MATERIAL, CODE, OR FUNCTIONALITY, AND SHOULD NOT BE RELIED UPON IN MAKING PURCHASING DECISION. THE DEVELOPMENT, RELEASE, AND TIMING OF ANY FEATURES OR FUNCTIONALITY DESCRIBED FOR ORACLE'S PRODUCTS REMAINS AT THE SOLE DISCRETION OF ORACLE.

Page 7: JavaFX Your Way - Devoxx Version

Disclaimer #2: This is code-heavy

Page 8: JavaFX Your Way - Devoxx Version

Overall Presentation Goal

Demonstrate the future potential of the JavaFX platform.

Page 9: JavaFX Your Way - Devoxx Version

Agenda

> JavaFX 2.0 Announcement

> JavaFX in Java

> Explore alternative languages JRuby Clojure Groovy Scala +???

Page 10: JavaFX Your Way - Devoxx Version

JavaFX 2.0 Announcement

• JavaFX Script is no longer required to write JavaFX applications

• Benefits:– Easier integration with business logic on JVM– Access to generics, annotations, (closures), etc– Java has great IDE support

• Downsides:– JavaFX Script was kind to us

Page 11: JavaFX Your Way - Devoxx Version

JavaFX With Java

Page 12: JavaFX Your Way - Devoxx Version

JavaFX in Java

> JavaFX API follows JavaBeans approach

> Similar in feel to other UI toolkits (Swing, etc.)

> Researching approaches to minimize boilerplate

Page 13: JavaFX Your Way - Devoxx Version

Binding

> Unquestionably the biggest JavaFX Script innovation

> Will be supported via a PropertyBinding class

> Lazy invocation for high performance

> Static construction syntax for simple cases e.g.: bindTo(<property>)

Page 14: JavaFX Your Way - Devoxx Version

Observable Pseudo-Properties

> Supports watching for changes to properties

> Implemented via anonymous inner classes

> Will take advantage of closures in the future

Page 15: JavaFX Your Way - Devoxx Version

Observable Pseudo-Properties

Rectangle rect = new Rectangle();rect.setX(40);rect.setY(40);rect.setWidth(100);rect.setHeight(200);

rect.addChangedListener(Rectangle.HOVER, new Listener() { });

Page 16: JavaFX Your Way - Devoxx Version

Observable Pseudo-Properties

Rectangle rect = new Rectangle();rect.setX(40);rect.setY(40);rect.setWidth(100);rect.setHeight(200);

rect.addChangedListener(Rectangle.HOVER, new Listener() { });

The property we want to watch

Page 17: JavaFX Your Way - Devoxx Version

Observable Pseudo-Properties

Rectangle rect = new Rectangle();rect.setX(40);rect.setY(40);rect.setWidth(100);rect.setHeight(200);

rect.addChangedListener(Rectangle.HOVER, new Listener() { });

Only one listener used regardless of data type

Page 18: JavaFX Your Way - Devoxx Version

Observable Pseudo-Properties

Rectangle rect = new Rectangle();rect.setX(40);rect.setY(40);rect.setWidth(100);rect.setHeight(200);

rect.addChangedListener(Rectangle.HOVER, new Listener() { public void handle(Bean bean, PropertyReference pr) { }});

Rectangle is a Bean

Page 19: JavaFX Your Way - Devoxx Version

Observable Pseudo-Properties

Rectangle rect = new Rectangle();rect.setX(40);rect.setY(40);rect.setWidth(100);rect.setHeight(200);

rect.addChangedListener(Rectangle.HOVER, new Listener() { public void handle(Bean bean, PropertyReference pr) { }});

Refers to the Rectangle.hover ‘property’

Page 20: JavaFX Your Way - Devoxx Version

Observable Pseudo-Properties

Rectangle rect = new Rectangle();rect.setX(40);rect.setY(40);rect.setWidth(100);rect.setHeight(200);

rect.addChangedListener(Rectangle.HOVER, new Listener() { public void handle(Bean bean, PropertyReference pr) { rect.setFill(rect.isHover() ? Color.GREEN : Color.RED); }});

Page 21: JavaFX Your Way - Devoxx Version

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 will also have an Observable Map

Page 22: JavaFX Your Way - Devoxx Version

Example Application

public class HelloStage implements Runnable {

public void run() { Stage stage = new Stage(); stage.setTitle("Hello Stage"); stage.setWidth(600); stage.setHeight(450);

Scene scene = new Scene(); scene.setFill(Color.LIGHTGREEN);

stage.setScene(scene); stage.setVisible(true); }

public static void main(String[] args) { FX.start(new HelloStage()); }}

Page 23: JavaFX Your Way - Devoxx Version

Summary

> The JVM has a modern UI toolkit coming to it

> Total port to Java – no hacks or kludges

> Many languages to choose from

> Alternate languages == exciting possibilities

> Choose the best language for your needs

Page 24: JavaFX Your Way - Devoxx Version

Major Question

24

How can alternative languages make developing JavaFX user interfaces easier & more productive?

Page 25: JavaFX Your Way - Devoxx Version

JavaFX With JRuby

Page 26: JavaFX Your Way - Devoxx Version

Why JRuby?

> Direct access to Java APIs

> Dynamic Typing

> Closures> ‘Closure conversion’ for interfaces

Page 27: JavaFX Your Way - Devoxx Version

Java in JRuby - Accessing Properties

timeline.setAutoReverse(true)timeline.autoReverse = truetimeline.auto_reverse = true

timeline.getKeyFrames().add(kf)timeline.key_frames.add(kf)timeline.key_frames.add kf

Page 28: JavaFX Your Way - Devoxx Version

JRuby Example 1: Simple Stage

require 'java'

FX = Java::javafx.lang.FXStage = Java::javafx.stage.StageScene = Java::javafx.scene.SceneColor = Java::javafx.scene.paint.Color

class HelloStage include java.lang.Runnable

def run ..... endend

FX.start(HelloStage.new);

stage = Stage.newstage.title = 'Hello Stage (JRuby)'stage.width = 600stage.height = 450

scene = Scene.newscene.fill = Color::LIGHTGREENstage.scene = scene

stage.visible = true;

Page 29: JavaFX Your Way - Devoxx Version

JRuby Example 2

rect = Rectangle.newrect.x = 25rect.y = 40rect.width = 100rect.height = 50rect.fill = Color::REDscene.content.add(rect)

timeline = Timeline.newtimeline.repeat_count = Timeline::INDEFINITEtimeline.auto_reverse = truekv = KeyValue.new(rect.x(), 200);kf = KeyFrame.new(Duration.valueOf(500), kv);timeline.key_frames.add kf;timeline.play();

Page 30: JavaFX Your Way - Devoxx Version

JRuby Closure Conversion

rect.add_changed_listener(Rectangle::HOVER) do |bean, pr| rect.fill = rect.hover ? Color::GREEN : Color::RED;end

30

Page 31: JavaFX Your Way - Devoxx Version

JRuby Swiby

require 'swiby'

class HelloWorldModel attr_accessor :sayingendmodel = HelloWorldModel.new model.saying = "Hello World"

Frame { title "Hello World“ width 200 content { Label { text bind(model,:saying) } } visible true}

31

Page 32: JavaFX Your Way - Devoxx Version

32

JavaFX With Clojure

Artwork by Augusto Sellhorn http://sellmic.com/

Page 33: JavaFX Your Way - Devoxx Version

33

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!

(def hello (fn [] "Hello world"))(hello)

Page 34: JavaFX Your Way - Devoxx Version

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}

34

(plus macros that are syntactic sugar wrapping the above)

Page 35: JavaFX Your Way - Devoxx Version

Clojure GUI Example

(defn javafxapp [] (let [stage (Stage. "JavaFX Stage") scene (Scene.)] (.setFill scene Color/LIGHTGREEN) (.setWidth stage 600) (.setHeight stage 450) (.setScene stage scene) (.setVisible stage true)))(javafxapp)

35

Page 36: JavaFX Your Way - Devoxx Version

Clojure GUI Example

(defn javafxapp [] (let [stage (Stage. "JavaFX Stage") scene (Scene.)] (.setFill scene Color/LIGHTGREEN) (.setWidth stage 600) (.setHeight stage 450) (.setScene stage scene) (.setVisible stage true)))(javafxapp)

36

Create a Function for the Application

Page 37: JavaFX Your Way - Devoxx Version

Clojure GUI Example

(defn javafxapp [] (let [stage (Stage. "JavaFX Stage") scene (Scene.)] (.setFill scene Color/LIGHTGREEN) (.setWidth stage 600) (.setHeight stage 450) (.setScene stage scene) (.setVisible stage true)))(javafxapp)

37

Initialize the Stage and Scene Variables

Page 38: JavaFX Your Way - Devoxx Version

Clojure GUI Example

(defn javafxapp [] (let [stage (Stage. "JavaFX Stage") scene (Scene.)] (.setFill scene Color/LIGHTGREEN) (.setWidth stage 600) (.setHeight stage 450) (.setScene stage scene) (.setVisible stage true)))(javafxapp)

38

Call Setter Methods on Scene and Stage

Page 39: JavaFX Your Way - Devoxx Version

Clojure GUI Example

(defn javafxapp [] (let [stage (Stage. "JavaFX Stage") scene (Scene.)] (.setFill scene Color/LIGHTGREEN) (.setWidth stage 600) (.setHeight stage 450) (.setScene stage scene) (.setVisible stage true)))(javafxapp)

39

Java Constant Syntax

Java Method Syntax

Page 40: JavaFX Your Way - Devoxx Version

Simpler Code Using doto

(defn javafxapp [] (let [stage (Stage. "JavaFX Stage") scene (Scene.)] (doto scene (.setFill Color/LIGHTGREEN)) (doto stage (.setWidth 600) (.setHeight 450) (.setScene scene) (.setVisible true))))(javafxapp)

40

Page 41: JavaFX Your Way - Devoxx Version

Simpler Code Using doto

(defn javafxapp [] (let [stage (Stage. "JavaFX Stage") scene (Scene.)] (doto scene (.setFill Color/LIGHTGREEN)) (doto stage (.setWidth 600) (.setHeight 450) (.setScene scene) (.setVisible true))))(javafxapp)

41

doto form: (doto symbol (.method params)) equals: (.method symbol params)

Page 42: JavaFX Your Way - Devoxx Version

Refined Clojure GUI Example

(defn javafxapp [] (doto (Stage. "JavaFX Stage") (.setWidth 600) (.setHeight 450) (.setScene (doto (Scene.) (.setFill Color/LIGHTGREEN) (.setContent (list (doto (Rectangle.) (.setX 25) (.setY 40) (.setWidth 100) (.setHeight 50) (.setFill Color/RED)))))) (.setVisible true)))(javafxapp)

42

Page 43: JavaFX Your Way - Devoxx Version

Refined Clojure GUI Example

(defn javafxapp [] (doto (Stage. "JavaFX Stage") (.setWidth 600) (.setHeight 450) (.setScene (doto (Scene.) (.setFill Color/LIGHTGREEN) (.setContent (list (doto (Rectangle.) (.setX 25) (.setY 40) (.setWidth 100) (.setHeight 50) (.setFill Color/RED)))))) (.setVisible true)))(javafxapp)

43

Let replaced with inline declarations

Page 44: JavaFX Your Way - Devoxx Version

Refined Clojure GUI Example

(defn javafxapp [] (doto (Stage. "JavaFX Stage") (.setWidth 600) (.setHeight 450) (.setScene (doto (Scene.) (.setFill Color/LIGHTGREEN) (.setContent (list (doto (Rectangle.) (.setX 25) (.setY 40) (.setWidth 100) (.setHeight 50) (.setFill Color/RED)))))) (.setVisible true)))(javafxapp)

44

Doto allows nested data structures

Page 45: JavaFX Your Way - Devoxx Version

Refined Clojure GUI Example

(defn javafxapp [] (doto (Stage. "JavaFX Stage") (.setWidth 600) (.setHeight 450) (.setScene (doto (Scene.) (.setFill Color/LIGHTGREEN) (.setContent (list (doto (Rectangle.) (.setX 25) (.setY 40) (.setWidth 100) (.setHeight 50) (.setFill Color/RED)))))) (.setVisible true)))(javafxapp)

45

Now a nested Rectangle fits!

Page 46: JavaFX Your Way - Devoxx Version

Closures in Clojure

46

> Inner classes can be created using proxy

(.addChangeListener rect Rectangle/HOVER (proxy [BooleanListener] [] (handle [b, p, o] (.setFill rect (if (.isHover rect) Color/GREEN Color/RED)))))

Page 47: JavaFX Your Way - Devoxx Version

Closures in Clojure

> Inner classes can be created using proxy

47

(.addChangeListener rect Rectangle/HOVER (proxy [Listener] [] (handle [b, p] (.setFill rect (if (.isHover rect) Color/GREEN Color/RED)))))

Proxy form: (proxy [class] [args] fs+) f => (name [params*] body)

Page 48: JavaFX Your Way - Devoxx Version

JavaFX With Groovy

Page 49: JavaFX Your Way - Devoxx Version

Features of Groovy

> Tight integration with Java Very easy to port from Java to Groovy

> Declarative syntax Familiar to JavaFX Script developers

> Builders

Page 50: JavaFX Your Way - Devoxx Version

Example 1: Simple FX Script to Groovy

Page 51: JavaFX Your Way - Devoxx Version

Step 1: Lazy conversion to Groovy

class HelloStage implements Runnable {

void run() { Stage stage = new Stage(); stage.setTitle("Hello Stage (Groovy)“); stage.setWidth(600); stage.setHeight(450);

Scene scene = new Scene(); scene.setFill(Color.LIGHTSKYBLUE); stage.setScene(scene);

stage.setVisible(true); }

static void main(args) { FX.start(new HelloStage()); }}

Page 52: JavaFX Your Way - Devoxx Version

Step 2: Slightly More Groovy

class HelloStage implements Runnable {

void run() { new Stage( title: "Hello Stage (Groovy)", width: 600, height: 450, visible: true, scene: new Scene( fill: Color.LIGHTSKYBLUE, ) ); }

static void main(args) { FX.start(new HelloStage()); }}

Page 53: JavaFX Your Way - Devoxx Version

Slight Aside: Groovy Builders

> Groovy builders make writing custom DSLs easy

> For the next slide, I am using a builder I defined

> Hopefully the community will improve upon this

Page 54: JavaFX Your Way - Devoxx Version

Step 3: Using a Groovy Builder

FxBuilder.build { stage = stage( title: "Hello World", width: 600, height: 450, scene: scene(fill: Color.LIGHTSKYBLUE) { ... } )

stage.visible = true;}

Page 55: JavaFX Your Way - Devoxx Version

Step 4: With Content

FxBuilder.build { stage = stage( title: "Hello Rectangle (Groovy FxBuilder 2)", width: 600, height: 450, scene: scene(fill: Color.LIGHTSKYBLUE) { rectangle( x: 25, y: 40, width: 100, height: 50, fill: Color.RED ) } )

stage.visible = true;}

Page 56: JavaFX Your Way - Devoxx Version

Example 2: FX Script Animation in Groovy

Page 57: JavaFX Your Way - Devoxx Version

Step 1: JavaFX Script

def timeline = Timeline { repeatCount: Timeline.INDEFINITE autoReverse: true keyFrames: [ KeyFrame { time: 750ms values : [ rect1.x => 200.0 tween Interpolator.LINEAR, rect2.y => 200.0 tween Interpolator.LINEAR, circle1.radius => 200.0 tween Interpolator.LINEAR ] } ];}

timeline.play();

Page 58: JavaFX Your Way - Devoxx Version

Step 1a: JavaFX Script Simplificationdef 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();

Page 59: JavaFX Your Way - Devoxx Version

Step 2: Java-ish Groovy Animations

final Timeline timeline = new Timeline( repeatCount: Timeline.INDEFINITE, autoReverse: true)

final KeyValue kv1 = new KeyValue (rect1.x(), 200);final KeyValue kv2 = new KeyValue (rect2.y(), 200);final KeyValue kv3 = new KeyValue (circle1.radius(), 200);

final KeyFrame kf = new KeyFrame(Duration.valueOf(750), kv1, kv2, kv3);

timeline.getKeyFrames().add(kf);

timeline.play();

Page 60: JavaFX Your Way - Devoxx Version

Step 3: JavaFX Animation in Groovy (Using Builders)timeline = timeline(repeatCount: Timeline.INDEFINITE, autoReverse:

true) { keyframes { keyframe(time: 750) { keyvalue(target: rect1.y(), endValue: 200); keyvalue(target: rect2.x(), endValue: 200); keyvalue(target: circle1.radius(), endValue: 200); } }}

timeline.play();

Page 61: JavaFX Your Way - Devoxx Version

Groovy Closures - With interface coercion

def f = { bean, pr -> rect.setFill(rect.isHover() ? Color.GREEN :

Color.RED);} as Listener;

rect.addChangedListener(Rectangle.HOVER, f);

Page 62: JavaFX Your Way - Devoxx Version

62

JavaFX With Scala

Page 63: JavaFX Your Way - Devoxx Version

63

What is Scala

> Started in 2001 by Martin Odersky> Compiles to Java bytecodes> Pure object-oriented language> Also a functional programming language

2001• Scala Started

2003/2004• Scala v1.0

2006• Scala v2.0

2010• Scala 2.8.0 (latest)

Page 64: JavaFX Your Way - Devoxx Version

64

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!

Page 65: JavaFX Your Way - Devoxx Version

Java vs. Scala DSLpublic class HelloStage implements Runnable

{

public void run() { Stage stage = new 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) { FX.start(new HelloStage()); }}

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 }) } }}

65

22 Lines545 Characters

17 Lines324 Characters

Page 66: JavaFX Your Way - Devoxx Version

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 }) } }}

66

Page 67: JavaFX Your Way - Devoxx Version

67

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

Page 68: JavaFX Your Way - Devoxx Version

68

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

Page 69: JavaFX Your Way - Devoxx Version

69

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

Page 70: JavaFX Your Way - Devoxx Version

70

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

Page 71: JavaFX Your Way - Devoxx Version

Animation in Scala

def timeline = new Timeline { repeatCount = INDEFINITE autoReverse = true keyFrames = List( new KeyFrame(50) { values = List( new KeyValue(rect1.x() -> 300), new KeyValue(rect2.y() -> 500), new KeyValue(rect2.width() -> 150) ) } )}

71

Page 72: JavaFX Your Way - Devoxx Version

Animation in Scala

72

Duration set by Constructor Parameter

def timeline = new Timeline { repeatCount = INDEFINITE autoReverse = true keyFrames = List( new KeyFrame(50) { values = List( new KeyValue(rect1.x() -> 300), new KeyValue(rect2.y() -> 500), new KeyValue(rect2.width() -> 150) ) } )}

Page 73: JavaFX Your Way - Devoxx Version

Animation in Scala

73

Operator overloading for animation syntax

def timeline = new Timeline { repeatCount = INDEFINITE autoReverse = true keyFrames = List( new KeyFrame(50) { values = List( new KeyValue(rect1.x() -> 300), new KeyValue(rect2.y() -> 500), new KeyValue(rect2.width() -> 150) ) } )}

Page 74: JavaFX Your Way - Devoxx Version

Closures in Scala

74

> Closures are also supported in Scala> And they are 100% type-safe

rect.addChangedListener(Node.HOVER, (b, p, o) => { rect.fill = if (rect.hover) Color.GREEN else Color.RED

})

Page 75: JavaFX Your Way - Devoxx Version

Closures in Scala

> Closures are also supported in Scala> And they are 100% type-safe

75

rect.addChangedListener(Node.HOVER, (b, p) => { rect.fill = if (rect.hover) Color.GREEN else Color.RED

})

Compact syntax(params) => {body}

rect.addChangedListener(Node.HOVER, (b, p) => { rect.fill = if (rect.hover) Color.GREEN else Color.RED

})

Page 76: JavaFX Your Way - Devoxx Version

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

76

Page 77: JavaFX Your Way - Devoxx Version

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}

77

Page 78: JavaFX Your Way - Devoxx Version

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

78

Fantom has a built-in Duration type

And also supports operator overloading

Page 79: JavaFX Your Way - Devoxx Version

Announcing Project Visage

79

> 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/

> “Visage is a domain specific language (DSL) designed for the express purpose of writing user interfaces.”

Page 80: JavaFX Your Way - Devoxx Version

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 } }}

80

Page 81: JavaFX Your Way - Devoxx Version

Visage Android Workshop

Today @ 21:00 – 22:00Room: BOF 2

Description:

Bring your Android device and learn how to build and deploy Android market applications using the Visage language.

Prizes will be awarded for finding defects and helping the dev team make Visage better.

81

Page 82: JavaFX Your Way - Devoxx Version

Conclusion

> JavaFX as Java APIs is great> Usable in alternate languages> Over time improved support is possible

Groovy Builders, Scala DSL, Visage

Remember: This is a proof of concept only – you can not leave this session and do this today.

Page 83: JavaFX Your Way - Devoxx Version

83

Stephen [email protected]: @steveonjava

Jonathan [email protected]: @jonathangiles

Presentation will be posted at: http://steveonjava.com/

Thank You for Attending!