javafx 2.0 and alternative languages

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

Upload: stephen-chin

Post on 12-May-2015

11.753 views

Category:

Education


2 download

DESCRIPTION

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

TRANSCRIPT

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