82
JavaFX 2.0 and Alternative Languages Stephen Chin Chief Agile Methodologist, GXS [email protected] tweet: @steveonjava

JavaFX 2.0 and Alternative Languages

Embed Size (px)

DESCRIPTION

Presentation on JavaFX 2.0 and development with alternative languages given to the Chennai Java User Group in India.

Citation preview

Page 1: JavaFX 2.0 and Alternative Languages

JavaFX 2.0 and Alternative Languages

Stephen ChinChief Agile Methodologist, [email protected]: @steveonjava

Page 2: JavaFX 2.0 and Alternative Languages

About the Presenter

Stephen Chin

Motorcyclist

Family ManChief Agile Methodologist, GXS

Author, Pro JavaFX Platform

Java Champion

Page 3: JavaFX 2.0 and Alternative Languages

Disclaimer: This is code-heavy

Page 4: JavaFX 2.0 and Alternative Languages

Agenda

> JavaFX 2.0 Platform

> JavaFX in Java

> Explore Alternative Languages

Page 6: JavaFX 2.0 and Alternative Languages

JavaFX Design Goals

Deliver the Best HTML5 & Native Application Experience from Java

> Programming model: the power of Java, the ease of JavaFX

> Native interoperability between Java, JavaScript & HTML5

> High performance 2D and 3D Java graphics engine designed to exploit hardware advances in desktop & mobile

> Complete & integrated development lifecycle experience

Copyright 2010 Oracle

Page 7: JavaFX 2.0 and Alternative Languages

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 languageCopyright 2010 Oracle

Page 8: JavaFX 2.0 and Alternative Languages

JavaFX 2.0 Product Timeline

CYQ1 2011

JavaFX 2.0 EA(Early Access)

CYQ2 2011 CYQ3 2011

JavaFX 2.0 Beta JavaFX 2.0 GA(General Availability)

Copyright 2010 Oracle

Page 9: JavaFX 2.0 and Alternative Languages

JavaFX With Java

Page 10: JavaFX 2.0 and Alternative Languages

JavaFX in Java

> JavaFX API follows JavaBeans approach

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

> Uses builder pattern to minimize boilerplate

Page 11: JavaFX 2.0 and Alternative Languages

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

Page 12: JavaFX 2.0 and Alternative Languages

Observable Pseudo-Properties

> Supports watching for changes to properties

> Implemented via anonymous inner classes

> Will take advantage of closures in the future

Page 13: JavaFX 2.0 and Alternative Languages

Observable Pseudo-Properties

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

rect.addChangeListener(Rectangle.HOVER, new ChangeListener() { });

Page 14: JavaFX 2.0 and Alternative Languages

Observable Pseudo-Properties

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

rect.addChangeListener(Rectangle.HOVER, new ChangeListener() { });

The property we want to watch

Page 15: JavaFX 2.0 and Alternative Languages

Observable Pseudo-Properties

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

rect.addChangeListener(Rectangle.HOVER, new ChangeListener() { });

Only one listener used regardless of data type

Page 16: JavaFX 2.0 and Alternative Languages

Observable Pseudo-Properties

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

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

Rectangle is a Bean

Page 17: JavaFX 2.0 and Alternative Languages

Observable Pseudo-Properties

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

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

Refers to the Rectangle.hover ‘property’

Page 18: JavaFX 2.0 and Alternative Languages

Observable Pseudo-Properties

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

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

Page 19: JavaFX 2.0 and Alternative Languages

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 20: JavaFX 2.0 and Alternative Languages

Example Application

public class HelloStage extends Application {

@Override public void start() { Stage stage = new 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) { Launcher.launch(HelloStage.class, args); }}

Page 21: JavaFX 2.0 and Alternative Languages

JavaFX With JRuby

Page 22: JavaFX 2.0 and Alternative Languages

Why JRuby?

> Direct access to Java APIs

> Dynamic Typing

> Closures> ‘Closure conversion’ for interfaces

Page 23: JavaFX 2.0 and Alternative Languages

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 24: JavaFX 2.0 and Alternative Languages

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 25: JavaFX 2.0 and Alternative Languages

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, Rectangle::X, 200);kf = KeyFrame.new(Duration.valueOf(500), kv);timeline.key_frames.add kf;timeline.play();

Page 26: JavaFX 2.0 and Alternative Languages

JRuby Closure Conversion

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

26

Page 27: JavaFX 2.0 and Alternative Languages

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}

27

Page 28: JavaFX 2.0 and Alternative Languages

28

JavaFX With Clojure

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

Page 29: JavaFX 2.0 and Alternative Languages

29

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 30: JavaFX 2.0 and Alternative Languages

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}

30

(plus macros that are syntactic sugar wrapping the above)

Page 31: JavaFX 2.0 and Alternative Languages

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)

31

Page 32: JavaFX 2.0 and Alternative Languages

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)

32

Create a Function for the Application

Page 33: JavaFX 2.0 and Alternative Languages

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)

33

Initialize the Stage and Scene Variables

Page 34: JavaFX 2.0 and Alternative Languages

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)

34

Call Setter Methods on Scene and Stage

Page 35: JavaFX 2.0 and Alternative Languages

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

Java Constant Syntax

Java Method Syntax

Page 36: JavaFX 2.0 and Alternative Languages

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)

36

Page 37: JavaFX 2.0 and Alternative Languages

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)

37

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

Page 38: JavaFX 2.0 and Alternative Languages

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)

38

Page 39: JavaFX 2.0 and Alternative Languages

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)

39

Let replaced with inline declarations

Page 40: JavaFX 2.0 and Alternative Languages

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)

40

Doto allows nested data structures

Page 41: JavaFX 2.0 and Alternative Languages

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)

41

Now a nested Rectangle fits!

Page 42: JavaFX 2.0 and Alternative Languages

Closures in Clojure

42

> Inner classes can be created using proxy

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

Page 43: JavaFX 2.0 and Alternative Languages

Closures in Clojure

> Inner classes can be created using proxy

43

(.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 44: JavaFX 2.0 and Alternative Languages

JavaFX With Groovy

Page 45: JavaFX 2.0 and Alternative Languages

Features of Groovy

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

> Declarative syntax Familiar to JavaFX Script developers

> Builders

Page 46: JavaFX 2.0 and Alternative Languages

Example 1: Simple FX Script to Groovy

Page 47: JavaFX 2.0 and Alternative Languages

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 48: JavaFX 2.0 and Alternative Languages

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 49: JavaFX 2.0 and Alternative Languages

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 50: JavaFX 2.0 and Alternative Languages

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 51: JavaFX 2.0 and Alternative Languages

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 52: JavaFX 2.0 and Alternative Languages

Example 2: FX Script Animation in Groovy

Page 53: JavaFX 2.0 and Alternative Languages

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 54: JavaFX 2.0 and Alternative Languages

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 55: JavaFX 2.0 and Alternative Languages

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 56: JavaFX 2.0 and Alternative Languages

Step 3: JavaFX Animation Groovy DSL (courtesy of Jim Clarke – work in progress)

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

at 750.ms update values { change rect1.y() to 200 change rect2.x() to 200 change circle.radius() to 200 }}

timeline.play();

Page 57: JavaFX 2.0 and Alternative Languages

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 58: JavaFX 2.0 and Alternative Languages

58

JavaFX With Scala

Page 59: JavaFX 2.0 and Alternative Languages

59

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 60: JavaFX 2.0 and Alternative Languages

60

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 61: JavaFX 2.0 and Alternative Languages

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

61

22 Lines545 Characters

17 Lines324 Characters

Page 62: JavaFX 2.0 and Alternative Languages

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

62

Page 63: JavaFX 2.0 and Alternative Languages

63

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 64: JavaFX 2.0 and Alternative Languages

64

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 65: JavaFX 2.0 and Alternative Languages

65

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 66: JavaFX 2.0 and Alternative Languages

66

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 67: JavaFX 2.0 and Alternative Languages

Animation in Scala

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

67

Page 68: JavaFX 2.0 and Alternative Languages

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

Animation in Scala

68

Duration set by Constructor Parameter

Page 69: JavaFX 2.0 and Alternative Languages

Animation in Scala

69

Operator overloading for animation syntax

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

Page 70: JavaFX 2.0 and Alternative Languages

Closures in Scala

70

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

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

})

Page 71: JavaFX 2.0 and Alternative Languages

Closures in Scala

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

71

Compact syntax(params) => {body}

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

})

Page 72: JavaFX 2.0 and Alternative Languages

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

72

Page 73: JavaFX 2.0 and Alternative Languages

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}

73

Page 74: JavaFX 2.0 and Alternative Languages

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

74

Fantom has a built-in Duration type

And also supports operator overloading

Page 75: JavaFX 2.0 and Alternative Languages

Announcing Project Visage

75

> 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 76: JavaFX 2.0 and Alternative Languages

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

76

Page 77: JavaFX 2.0 and Alternative Languages

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

77

Page 78: JavaFX 2.0 and Alternative Languages

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

78

Page 79: JavaFX 2.0 and Alternative Languages

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

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

Page 80: JavaFX 2.0 and Alternative Languages

Challenge the Presenter…

Page 81: JavaFX 2.0 and Alternative Languages

Challenge the Presenter…

Page 82: JavaFX 2.0 and Alternative Languages

82

Stephen [email protected]: @steveonjava