Raspberry Pi à la GroovyFXStephen Chin (@steveonjava)Java Technology AmbassadorJavaOne Content Chair
What Runs Java?Example of devices powered by JavaSMALL RFID Readers Parking Meters Intelligent PowerModule Smart Meter...
Java and 3G in a Tiny Package> Cinterion EHS5
Really Tiny…27.6mm18.8mm
http://upload.wikimedia.org/wikipedia/commons/3/3d/Cloud_forest_Ecuador.jpg
=Have Java With Your Dessert
http://elinux.org/File:Raspi-Model-AB-Mono-2-699x1024.png
And what are these for?http://i.imgur.com/k0Puu.jpg
I2C Hardware via Pi4J3.3V/GNDMPU-9150
Chalkboard Electronics Touchscreen 10" or 7" Form Factor Connects via HDMI/USB Tested with JavaFX 8 10% Exclusive Disc...
How to Setup Your Pi> Step 1: Install Linuxhttp://steveonjava.com/javafx-on-raspberry-pi-3-easy-steps/
How to Setup Your Pi> Step 2: Download/Copy Java 8 for ARM EAhttp://steveonjava.com/javafx-on-raspberry-pi-3-easy-steps/
How to Setup Your Pi> Step 3: Deploy and Run JavaFX Appshttp://steveonjava.com/javafx-on-raspberry-pi-3-easy-steps/
JavaFX With Groovy
JavaFX 2.0 PlatformImmersive Application ExperienceLeverage your Java skills with modern JavaFXAPIs> Cross-platform Animat...
16Vanishing Circles
Vanishing Circles in Javapublic class VanishingCircles extends Application {public static void main(String[] args) {Applic...
Application Skeletonpublic class VanishingCircles extends Application {public static void main(String[] args) {Application...
Create the CirclesList<Circle> circles = new ArrayList<Circle>();for (int i = 0; i < 50; i++) {final Circle circle = new C...
Setup Bindingcircle.strokeWidthProperty().bind(Bindings.when(circle.hoverProperty()).then(4).otherwise(0));20
Setup Event Listenerscircle.addEventHandler(MouseEvent.MOUSE_CLICKED,new EventHandler<MouseEvent>() {public void handle(Mo...
Begin the AnimationTimeline moveCircles = new Timeline();for (Circle circle : circles) {KeyValue moveX = new KeyValue(circ...
Features of Groovy> Modern language Closures AST Transforms Strongly typed dynamic language> Tight integration with Jav...
Java vs. GroovyFX DSLpublic class VanishingCircles extends Application {public static void main(String[] args) {Applicatio...
GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(t...
26GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage...
27GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage...
28GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage...
29GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage...
30GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage...
Animation in GroovyFXtimeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {chan...
timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {change circle.centerXProp...
timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {change circle.centerXProp...
timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {tween ease_bothchange cir...
Event Listeners in GroovyFX35> Supported using the built-in Closure syntax> Optional arguments for event objectsonMouseCli...
Event Listeners in GroovyFX> Supported using the built-in Closure syntax> Optional arguments for event objects36Compact sy...
Event Listeners in GroovyFX> Supported using the built-in Closure syntax> Optional arguments for event objects37Optional e...
38But wait, there is more Grooviness…
Properties in Javapublic class Person {private StringProperty firstName;public void setFirstName(String val) { firstNamePr...
Properties in GroovyFXpublic class Person {@FXBindable String firstName;@FXBindable String lastName;}40
public class Person {@FXBindable String firstName;@FXBindable String lastName = “Smith”;}Properties in GroovyFX41Optional ...
TableView in Java42ObservableList<Person> items = ...TableView<Person> tableView = new TableView<Person>(items);TableColum...
TableView in GroovyFX43def dateFormat = new SimpleDateFormat("yyyy-MM-dd");tableView(items: persons) {tableColumn(property...
Layout in Java44TextField urlField = new TextField(“http://www.google.com”);HBox.setHgrow(urlField, Priority.ALWAYS);HBox ...
Layout in GroovyFX45sg.stage(title: "GroovyFX WebView Demo", show: true) {scene(fill: groovyblue, width: 1024, height: 800...
Layout in GroovyFX46
Layout in GroovyFX47gridPane(hgap: 5, vgap: 10, padding: 25) {columnConstraints(minWidth: 50, halignment: "right")columnCo...
Layout in GroovyFX48
GroovyFX Supports…49
And you can do cool stuff like this…https://bitbucket.org/stephanj/tweetwall
Conclusion JavaFX enables graphically rich, fast performing apps Visually create applications using Scene Builder Run o...
Stephen Chintweet: @steveonjavablog: http://steveonjava.comnighthacking.comReal GeeksLive HackingNightHacking Tour
The preceding is intended to outline our general product direction. It isintendedfor information purposes only, and may no...
Upcoming SlideShare
Loading in...5
×

Raspberry Pi à la GroovyFX

3,646

Published on

Presentation on Raspberry Pi and GroovyFX given at the GR8Conf conference in Copenhagen, Denmark.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,646
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
31
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Feel free to reuse this presentation for your local user groups. Some helpful comments are in the notes section, but feel free to embellish.For more details on JavaFX/Raspberry Pi hacking, check out this post:http://javafx.steveonjava.com/javafx-on-raspberry-pi-3-easy-steps/
  • Java embedded technologies are used in a wide variety of embedded devices. This list is just a small sampling of devices that are currently using Java ME and SE Embedded.
  • The Raspberry Pi is a consumer-focused, low-cost board. It has a slightly slower ARM processor (ARMv6 700Mhz), but a better GPU than the BeagleBoard. Connectivity is via HDMI/Component, USBx2, Ethernet, and Audio out.
  • 14, 15 UART lines so you can get the serial console
  • And getting JavaFX is as simple as downloading Java 7 (it has been bundled since Java 7u4). Also, it is supported across different desktop platforms (shown in the picture).
  • And getting JavaFX is as simple as downloading Java 7 (it has been bundled since Java 7u4). Also, it is supported across different desktop platforms (shown in the picture).
  • And getting JavaFX is as simple as downloading Java 7 (it has been bundled since Java 7u4). Also, it is supported across different desktop platforms (shown in the picture).
  • And do cool stuff with the Pi like this pic of the digital signage for Devoxx, which was running on HDMI monitors at 1920x1080 off of a Raspberry Pi.
  • So in conclusion you can do all this cool stuff! Go buy a Pi and get started with JavaFX today!
  • Raspberry Pi à la GroovyFX

    1. 1. Raspberry Pi à la GroovyFXStephen Chin (@steveonjava)Java Technology AmbassadorJavaOne Content Chair
    2. 2. What Runs Java?Example of devices powered by JavaSMALL RFID Readers Parking Meters Intelligent PowerModule Smart MetersLARGE Multi Function Printers ATMs POS Systems In-Flight Entertainment Systems Electronic Voting Systems Medical Imaging SystemsMEDIUM Routers & Switches Storage Appliances Network ManagementSystems Factory Automation Systems Security Systems
    3. 3. Java and 3G in a Tiny Package> Cinterion EHS5
    4. 4. Really Tiny…27.6mm18.8mm
    5. 5. http://upload.wikimedia.org/wikipedia/commons/3/3d/Cloud_forest_Ecuador.jpg
    6. 6. =Have Java With Your Dessert
    7. 7. http://elinux.org/File:Raspi-Model-AB-Mono-2-699x1024.png
    8. 8. And what are these for?http://i.imgur.com/k0Puu.jpg
    9. 9. I2C Hardware via Pi4J3.3V/GNDMPU-9150
    10. 10. Chalkboard Electronics Touchscreen 10" or 7" Form Factor Connects via HDMI/USB Tested with JavaFX 8 10% Exclusive Discount:G1F0U796Z083
    11. 11. How to Setup Your Pi> Step 1: Install Linuxhttp://steveonjava.com/javafx-on-raspberry-pi-3-easy-steps/
    12. 12. How to Setup Your Pi> Step 2: Download/Copy Java 8 for ARM EAhttp://steveonjava.com/javafx-on-raspberry-pi-3-easy-steps/
    13. 13. How to Setup Your Pi> Step 3: Deploy and Run JavaFX Appshttp://steveonjava.com/javafx-on-raspberry-pi-3-easy-steps/
    14. 14. JavaFX With Groovy
    15. 15. JavaFX 2.0 PlatformImmersive Application ExperienceLeverage your Java skills with modern JavaFXAPIs> Cross-platform Animation, Video, Charting> Integrate Java, JavaScript, and HTML5 in thesame application> New graphics stack takes advantage ofhardware acceleration for 2D and 3Dapplications> Use your favorite IDE:NetBeans, Eclipse, IntelliJ, etc.
    16. 16. 16Vanishing Circles
    17. 17. Vanishing Circles in Javapublic class VanishingCircles extends Application {public static void main(String[] args) {Application.launch(args);}@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("Vanishing Circles");Group root = new Group();Scene scene = new Scene(root, 800, 600, Color.BLACK);List<Circle> circles = new ArrayList<Circle>();for (int i = 0; i < 50; i++) {final Circle circle = new Circle(150);circle.setCenterX(Math.random() * 800);circle.setCenterY(Math.random() * 600);circle.setFill(new Color(Math.random(), Math.random(), Math.random(), .2));circle.setEffect(new BoxBlur(10, 10, 3));circle.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {public void handle(MouseEvent t) {KeyValue collapse = new KeyValue(circle.radiusProperty(), 0);new Timeline(new KeyFrame(Duration.seconds(3), collapse)).play();}});circle.setStroke(Color.WHITE);circle.strokeWidthProperty().bind(Bindings.when(circle.hoverProperty()).then(4).otherwise(0));circles.add(circle);}root.getChildren().addAll(circles);primaryStage.setScene(scene);primaryStage.show();Timeline moveCircles = new Timeline();for (Circle circle : circles) {KeyValue moveX = new KeyValue(circle.centerXProperty(), Math.random() * 800);KeyValue moveY = new KeyValue(circle.centerYProperty(), Math.random() * 600);moveCircles.getKeyFrames().add(new KeyFrame(Duration.seconds(40), moveX, moveY));}moveCircles.play();}}1740 Lines1299 Characters
    18. 18. Application Skeletonpublic class VanishingCircles extends Application {public static void main(String[] args) {Application.launch(args);}@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("Vanishing Circles");Group root = new Group();Scene scene = new Scene(root, 800, 600, Color.BLACK);[create the circles…]root.getChildren().addAll(circles);primaryStage.setScene(scene);primaryStage.show();[begin the animation…]}}
    19. 19. Create the CirclesList<Circle> circles = new ArrayList<Circle>();for (int i = 0; i < 50; i++) {final Circle circle = new Circle(150);circle.setCenterX(Math.random() * 800);circle.setCenterY(Math.random() * 600);circle.setFill(new Color(Math.random(), Math.random(),Math.random(), .2));circle.setEffect(new BoxBlur(10, 10, 3));circle.setStroke(Color.WHITE);[setup binding…][setup event listeners…]circles.add(circle);}19
    20. 20. Setup Bindingcircle.strokeWidthProperty().bind(Bindings.when(circle.hoverProperty()).then(4).otherwise(0));20
    21. 21. Setup Event Listenerscircle.addEventHandler(MouseEvent.MOUSE_CLICKED,new EventHandler<MouseEvent>() {public void handle(MouseEvent t) {KeyValue collapse = new KeyValue(circle.radiusProperty(), 0);new Timeline(new KeyFrame(Duration.seconds(3),collapse)).play();}});21
    22. 22. Begin the AnimationTimeline moveCircles = new Timeline();for (Circle circle : circles) {KeyValue moveX = new KeyValue(circle.centerXProperty(),Math.random() * 800);KeyValue moveY = new KeyValue(circle.centerYProperty(),Math.random() * 600);moveCircles.getKeyFrames().add(new KeyFrame(Duration.seconds(40),moveX, moveY));}moveCircles.play();22
    23. 23. Features of Groovy> Modern language Closures AST Transforms Strongly typed dynamic language> Tight integration with Java Very easy to port from Java to Groovy> Declarative syntax with GroovyFX Builders Familiar to Groovy and JavaFX Script developers
    24. 24. Java vs. GroovyFX DSLpublic class VanishingCircles extends Application {public static void main(String[] args) {Application.launch(args);}@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("Vanishing Circles");Group root = new Group();Scene scene = new Scene(root, 800, 600, Color.BLACK);List<Circle> circles = new ArrayList<Circle>();for (int i = 0; i < 50; i++) {final Circle circle = new Circle(150);circle.setCenterX(Math.random() * 800);circle.setCenterY(Math.random() * 600);circle.setFill(new Color(Math.random(), Math.random(), Math.random(), .2));circle.setEffect(new BoxBlur(10, 10, 3));circle.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {public void handle(MouseEvent t) {KeyValue collapse = new KeyValue(circle.radiusProperty(), 0);new Timeline(new KeyFrame(Duration.seconds(3), collapse)).play();}});circle.setStroke(Color.WHITE);circle.strokeWidthProperty().bind(Bindings.when(circle.hoverProperty()).then(4).otherwise(0));circles.add(circle);}root.getChildren().addAll(circles);primaryStage.setScene(scene);primaryStage.show();Timeline moveCircles = new Timeline();for (Circle circle : circles) {KeyValue moveX = new KeyValue(circle.centerXProperty(), Math.random() * 800);KeyValue moveY = new KeyValue(circle.centerYProperty(), Math.random() * 600);moveCircles.getKeyFrames().add(new KeyFrame(Duration.seconds(40), moveX, moveY));}moveCircles.play();}}GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(title: Vanishing Circles, show: true) {scene(fill: black, width: 800, height: 600) {50.times {circles << circle(centerX: rand(800), centerY: rand(600), radius: 150, stroke: white,strokeWidth: bind(hover, converter: {val -> val ? 4 : 0})) {fill rgb(rand(255), rand(255), rand(255), 0.2)effect boxBlur(width: 10, height: 10, iterations: 3)onMouseClicked { e ->timeline {at(3.s) { change e.source.radiusProperty() to 0 }}.play()}}}}timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {change circle.centerXProperty() to rand(800)change circle.centerYProperty() to rand(600)}}}.play()}}2440 Lines1299 Characters29 Lines671 Characters
    25. 25. GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(title: Vanishing Circles, show: true) {scene(fill: black, width: 800, height: 600) {50.times {circles << circle(centerX: rand(800), centerY: rand(600),radius: 150, stroke: white,strokeWidth: bind(hover, converter: {val -> val ? 4 : 0})) {fill rgb(rand(255), rand(255), rand(255), 0.2)effect boxBlur(width: 10, height: 10, iterations: 3)}}}}}25
    26. 26. 26GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(title: Vanishing Circles, show: true) {scene(fill: black, width: 800, height: 600) {50.times {circles << circle(centerX: rand(800), centerY: rand(600),radius: 150, stroke: white,strokeWidth: bind(hover, converter: {val -> val ? 4 : 0})) {fill rgb(rand(255), rand(255), rand(255), 0.2)effect boxBlur(width: 10, height: 10, iterations: 3)}}}}}Builder for GroovyFX scene graphs
    27. 27. 27GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(title: Vanishing Circles, show: true) {scene(fill: black, width: 800, height: 600) {50.times {circles << circle(centerX: rand(800), centerY: rand(600),radius: 150, stroke: white,strokeWidth: bind(hover, converter: {val -> val ? 4 : 0})) {fill rgb(rand(255), rand(255), rand(255), 0.2)effect boxBlur(width: 10, height: 10, iterations: 3)}}}}}Declarative Stage definition
    28. 28. 28GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(title: Vanishing Circles, show: true) {scene(fill: black, width: 800, height: 600) {50.times {circles << circle(centerX: rand(800), centerY: rand(600),radius: 150, stroke: white,strokeWidth: bind(hover, converter: {val -> val ? 4 : 0})) {fill rgb(rand(255), rand(255), rand(255), 0.2)effect boxBlur(width: 10, height: 10, iterations: 3)}}}}}Inline property definitions
    29. 29. 29GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(title: Vanishing Circles, show: true) {scene(fill: black, width: 800, height: 600) {50.times {circles << circle(centerX: rand(800), centerY: rand(600),radius: 150, stroke: white,strokeWidth: bind(hover, converter: {val -> val ? 4 : 0})) {fill rgb(rand(255), rand(255), rand(255), 0.2)effect boxBlur(width: 10, height: 10, iterations: 3)}}}}}Bind to properties
    30. 30. 30GroovyFX.start { primaryStage ->def sg = new SceneGraphBuilder()def rand = new Random().&nextIntdef circles = []sg.stage(title: Vanishing Circles, show: true) {scene(fill: black, width: 800, height: 600) {50.times {circles << circle(centerX: rand(800), centerY: rand(600),radius: 150, stroke: white,strokeWidth: bind(hover, converter: {val -> val ? 4 : 0})) {fill rgb(rand(255), rand(255), rand(255), 0.2)effect boxBlur(width: 10, height: 10, iterations: 3)}}}}}Sequence Creation Via Loop
    31. 31. Animation in GroovyFXtimeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {change circle.centerXProperty() to rand(800)change circle.centerYProperty() to rand(600)}}}.play()31
    32. 32. timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {change circle.centerXProperty() to rand(800)change circle.centerYProperty() to rand(600)}}}.play()Animation in GroovyFX32Easy animation syntax:at (duration) {keyframes}
    33. 33. timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {change circle.centerXProperty() to rand(800)change circle.centerYProperty() to rand(600)}}}.play()Animation in GroovyFX33Key frame DSL
    34. 34. timeline(cycleCount: Timeline.INDEFINITE, autoReverse: true) {circles.each { circle ->at (40.s) {tween ease_bothchange circle.centerYProperty() to rand(600) tween linear}}}.play()Animation in GroovyFX34Optional easing
    35. 35. Event Listeners in GroovyFX35> Supported using the built-in Closure syntax> Optional arguments for event objectsonMouseClicked { e ->timeline {at(3.s) { change e.source.radiusProperty() to 0 }}.play()}
    36. 36. Event Listeners in GroovyFX> Supported using the built-in Closure syntax> Optional arguments for event objects36Compact syntax{body}onMouseClicked { MouseEvent e ->timeline {at(3.s) { change e.source.radiusProperty() to 0 }}.play()}
    37. 37. Event Listeners in GroovyFX> Supported using the built-in Closure syntax> Optional arguments for event objects37Optional event parameter{event -> body}onMouseClicked { MouseEvent e ->timeline {at(3.s) { change e.source.radiusProperty() to 0 }}.play()}
    38. 38. 38But wait, there is more Grooviness…
    39. 39. Properties in Javapublic class Person {private StringProperty firstName;public void setFirstName(String val) { firstNameProperty().set(val); }public String getFirstName() { return firstNameProperty().get(); }public StringProperty firstNameProperty() {if (firstName == null)firstName = new SimpleStringProperty(this, "firstName");return firstName;}private StringProperty lastName;public void setLastName(String value) { lastNameProperty().set(value); }public String getLastName() { return lastNameProperty().get(); }public StringProperty lastNameProperty() {if (lastName == null) // etc.}}39
    40. 40. Properties in GroovyFXpublic class Person {@FXBindable String firstName;@FXBindable String lastName;}40
    41. 41. public class Person {@FXBindable String firstName;@FXBindable String lastName = “Smith”;}Properties in GroovyFX41Optional initializers
    42. 42. TableView in Java42ObservableList<Person> items = ...TableView<Person> tableView = new TableView<Person>(items);TableColumn<Person,String> firstNameCol =new TableColumn<Person,String>("First Name");firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>,ObservableValue<String>>() {public ObservableValue<String> call(CellDataFeatures<Person, String> p){return p.getValue().firstNameProperty();}});tableView.getColumns().add(firstNameCol);
    43. 43. TableView in GroovyFX43def dateFormat = new SimpleDateFormat("yyyy-MM-dd");tableView(items: persons) {tableColumn(property: "name", text: "Name", prefWidth: 150)tableColumn(property: "age", text: "Age", prefWidth: 50)tableColumn(property: "gender", text: "Gender", prefWidth: 150)tableColumn(property: "dob", text: "Birth", prefWidth: 150,type: Date,converter: { from -> return dateFormat.format(from) })}
    44. 44. Layout in Java44TextField urlField = new TextField(“http://www.google.com”);HBox.setHgrow(urlField, Priority.ALWAYS);HBox hbox = new HBox();hbox.getChildren().add(urlField);WebView webView = new WebView();VBox.setVgrow(webView, Priority.ALWAYS);VBox vbox = new VBox();vbox.getChildren().addAll(hbox, webView);
    45. 45. Layout in GroovyFX45sg.stage(title: "GroovyFX WebView Demo", show: true) {scene(fill: groovyblue, width: 1024, height: 800) {vbox {hbox(padding: 10, spacing: 5) {textField(“http://www.yahoo.com”, hgrow: "always")button("Go”)}webView(vgrow: "always")}}}
    46. 46. Layout in GroovyFX46
    47. 47. Layout in GroovyFX47gridPane(hgap: 5, vgap: 10, padding: 25) {columnConstraints(minWidth: 50, halignment: "right")columnConstraints(prefWidth: 250)label("Send Us Your Feedback", font: "24pt sanserif",row: 0, columnSpan: GridPane.REMAINING, halignment: "center",margin: [0, 0, 10])label("Name: ", row: 1, column: 0)textField(promptText: "Your name", row: 1, column: 1, hgrow: always)label("Email:", row: 2, column: 0)textField(promptText: "Your email", row: 2, column: 1, hgrow: always)label("Message:", row: 3, column: 0, valignment: "baseline")textArea(row: 3, column: 1, hgrow: "always", vgrow: "always")button("Send Message", row: 4, column: 1, halignment: "right")}
    48. 48. Layout in GroovyFX48
    49. 49. GroovyFX Supports…49
    50. 50. And you can do cool stuff like this…https://bitbucket.org/stephanj/tweetwall
    51. 51. Conclusion JavaFX enables graphically rich, fast performing apps Visually create applications using Scene Builder Run on Raspberry Pi today!
    52. 52. Stephen Chintweet: @steveonjavablog: http://steveonjava.comnighthacking.comReal GeeksLive HackingNightHacking Tour
    53. 53. The preceding is intended to outline our general product direction. It isintendedfor information purposes only, and may not be incorporated into any contract.It is not a commitment to deliver any material, code, or functionality, andshould not be relied upon in making purchasing decisions. The development,release, and timing of any features or functionality described for Oracle’sproducts remains at the sole discretion of Oracle.
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×