SlideShare ist ein Scribd-Unternehmen logo
1 von 88
The JavaFX Platform – A Java Developer’s Guide Stephen Chin Inovis, Inc.
About Your Presenter Director SWE, Inovis, Inc. Open-Source JavaFX Hacker MBA Belotti Award UberScrumMaster XP Coach Agile Evangelist WidgetFX JFXtras FEST-JavaFX Piccolo2D Java Champion JavaOneRockstar JUG Leader Pro JavaFX Author 2 Family Man Motorcyclist
LearnFX and Win at Devoxx Tweet to answer: @projavafxcourse your-answer-here 3
Part 1 - JavaFX Crash Course var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
1. Download JavaFX http://javafx.com/ 5 2. Run Your IDE ,[object Object]
Eclipse – ExadelJavaFX Studio3. Write Your First App Hello Devoxx! ,[object Object],var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
Hello Devoxx!: Creating a Stage Stage {     title: "Hello Devoxx!"     scene: Scene {         content: [             "..."         ]     } } 6 var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
Hello Devoxx!: Displaying Images ImageView {     image: Image { url: "http://www.javoxx.com/download/attachments/1706305/Devoxx09.jpg"     }     opacity: .5 } 7 var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
Hello Devoxx!: RSS Feed varitems:Item[]; RssTask {     interval: 30s;     location: "http://search.twitter.com/search.rss?q=devoxx" onItem: function(item) {         insert item into items;     } }.start(); 8
Hello Devoxx!: VBox Layout vartextBox:VBox; textBox = VBox { layoutX: 40 layoutY: 40     spacing: 20     content: "..." } 9
Hello Devoxx!: Displaying Text content: bind for (item in items) {     Text { textOrigin: TextOrigin.TOP textAlignment: TextAlignment.JUSTIFY wrappingWidth: 520 font: Font.font(null, FontWeight.BOLD, 18)         content: item.title     } } 10
Hello Devoxx!: Animating Graphics vartransTransition = TranslateTransition {     duration: 2m     node: bind textBox fromY: 600 toY: -4000     interpolator: Interpolator.LINEAR repeatCount: Timeline.INDEFINITE } transTransition.play(); 11
Hello Devoxx!: Playing Audio ? MediaPlayer { autoPlay: true repeatCount: MediaPlayer.REPEAT_FOREVER     media: Media {     source: "http://blogs.sun.com/roller/resources/dcb/Java.mp3"     } } 12
13 Hello Devoxx! Demo
Resource: JavaFX API Documentation 14 http://java.sun.com/javafx/1.2/docs/api/
15 Part 2 - Comparing JavaFX and Java var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
Language Similarities Java is… Statically typed Compiled to bytecodes Runs on the JVM Has a large library JavaFX is… Statically typed Compiled to bytecodes Runs on the JVM Can call Java libraries 16
Language Differences 17
Integrating JavaFX and Java Calling Java from JavaFX Can call Java interface or classes directly Automatic conversion to and from Arrays and Collections Can even extend Java interfaces and classes Calling JavaFX from Java Easiest way is to create a Java interface that JavaFX extends Can invoke JavaFX as a script and get results back 18
Datatype Support 19
JavaFX Operators 20 ,[object Object]
Underflows/Overflows will fail silently, producing inaccurate results
Divide by zero will throw a runtime exception,[object Object]
Access Modifiers 22
Data Binding A variable or a constant can be bound to an expression var x = bind a + b; The bound expression is remembered The dependencies of the expression is watched Variable is updated Regular binding: when dependencies change values Lazy binding: when the variable is accessed var x = bind lazy a+ b; 23
What Bind Updates var x = bind if(a) then b else c x is updated if a or b or c changes var x = bind for (i in [a..b]) { i * i } Not everything is recalculated If a = 1 and b = 2, x is [1, 4] If b changes to 3, only the added element is calculated 24 1 4 9
Binding to Expressions Binding to a block Bound block may contain any number of defs followed by one expression Dependencies of block is backtraced from the expression Binding to function invocation expression Regular function: dependencies are parameters Bound function: backtraced from final expression inside function 25
Binding to Object Literals var a = 3; var b = 4; var p = bind Point { x: a, y: b }; var q = bind Point { x: bind a, y: b }; var r = bind Point { x: bind a, y: bind b }; When a changes: p gets a new instance of Point q and r keep the old instance with a new x value r will never get a new instance of Point (the outer bind in r is useless) 26
Binding to Functions Stage {   def cModel = CircleModel {}; varsliderRef:Slider;   scene:     Scene {       content: [         Circle {           radius: bind cModel.diameter / 2         },         Text {           content: bind "Diameter: {%3.0f cModel.diameter}"         },         Text {           content: bind "Area: {%3.2f cModel.getArea()}"         }, sliderRef = Slider {           value: bind cModel.diameter with inverse }]}} 27 class CircleModel { vardiameter:Number;   bound function getArea():Number { Math.PI * Math.pow(diameter / 2, 2);   } } http://learnjavafx.typepad.com/weblog/javafx_app_deployment/
JavaFX Sequences Represents collections of homogeneous data A fundamental container data type Rich set of language facilities Contributor to declarative syntax Automatic conversion to and from Java Arrays and Collections 28
Creating Sequences Explicit sequence expression [1, 3, 5, 7, 9] Elements are separated by commas Comma may be omitted if element ends with brace 29 1 3 5 7 9
Creating Sequences Numeric sequence with range expressions: [1..10] Can have a step: [1..10 step 2] [0.0..0.9 step 0.1] Can be decreasing: [10..1 step -3] Beware of step that goes opposite direction: [10..1] is [] Exclusive right end [1..<5] 30 1 2 3 4 5 6 7 8 9 10 1 3 5 7 9 0 .1 .2 .3 .4 .5 .6 .7 .8 .9 10 7 4 1 1 2 3 4
Getting Information from Sequences ints = [1, 3, 5, 7, 9] sizeofintsis 5 ints[0] is 1, ints[1] is 3, ..., ints[4] is 9 ints[-1] is 0 (default value of Integer), so is ints[5] For a sequence of objects, the default is null 31 1 3 5 7 9 [0] [1] [2] [3] [4]
Getting Slices From Sequences ints = [1, 3, 5, 7, 9] ints[0..2] is [1, 3, 5] ints[0..<2] is [1, 3] ints[2..] is [5, 7, 9] ints[2..<] is [5, 7] ints[2..0], ints[-2..-1], ints[5..6] are all []s 32 1 3 5 7 9 [0] [1] [2] [3] [4]
Getting Subsets from Sequences ints = [1, 3, 5, 7, 9] ints[k | k > 6] is: [7, 9] (k > 6 is a condition) ints[k | indexof k < 2] is: [1, 3] ints[k | k > 10] is: [] 33 1 3 5 7 9 [0] [1] [2] [3] [4]
Inserting into Sequences ints = [1, 3, 5, 7, 9] insert 20 into ints insert 30 before ints[2] insert 40 after ints[4] insert [50, 60] into ints 34 1 3 5 7 9 1 3 5 7 9 20 1 3 5 7 9 20 30 1 3 5 7 9 20 30 40 1 3 5 7 9 20 30 40 50 60
Deleting from Sequences ints = [1, 3, 5, 7, 9] delete 7 from ints delete ints[0] delete ints[0..1] delete ints: ints becomes [] 35 1 3 5 7 9 1 3 5 7 9 1 3 5 9 3 5 9 9
Sequence Puzzlers FX What is the size of this sequence: [1..10 step -1] What does this evaluate to: [10..<20 step 2][k|k>17] What is the size of this sequence: sizeof [20..1 step -3] 36 1 A: 0 2 A: [18] 3 A: 1
Reference: JavaFXRefCard 37 http://refcardz.dzone.com/refcardz/
Demo by Tor Norbye 38 JavaFX Builder Tool ?
39 JavaFX 1.2 Layouts
JavaFX 1.2 Custom Layouts Container Panel Both Extend Parent Container creates layouts by extension Panel creates layouts by declaration 40
Who is My Representative? 41 Web Service Integration
Calling a REST Service REST URL: http://whoismyrepresentative.com/getall_mems.php?zip=90210&output=json Output: { "results": [   { "type": "rep", "name": "Henry A. Waxman", "party": "D", "state": "CA", "district": "30", "phone": "(202) 225-3976", "office": "2204 Rayburn", "link": "http://www.henrywaxman.house.gov/" } ]} 42
Making an HttpRequest req = HttpRequest {   method: HttpRequest.GET   location: url onInput: parseResponse onDone: function() {     if (req.responseCode != 200) {       message = req.responseMessage;     } else if (sizeof senators == 0 and sizeof representatives == 0) {       message = "No members found for {zipcode}";     }   } onException: function(ex: java.lang.Exception) { println("Exception: {ex.getClass()} {ex.getMessage()}");   } } req.start(); 43
Using the Pull Parser while (parser.event.type != PullParser.END_DOCUMENT) { parser.seek( "type" );   if (parser.event.type == PullParser.START_VALUE) { parser.forward();     if (parser.event.text == "rep") { var rep = Representative{} parseMemberOfCongress( rep, parser );       insert rep into representatives;     } else if (parser.event.text == "sen" ) { varsen = Senator{} parseMemberOfCongress( sen, parser );       insert sen into senators; } } } 44
JavaFX Mobile Development
JavaFX Mobile Advantages Write Once, Run Anywhere Desktop, Mobile, Set-top Boxes (future) Large Embedded Base Built on top of Java ME platform Wide Range of Devices Runs on Feature Phones, Smart Phones Currently available for Windows Mobile devices
JavaFX Mobile Constraints Screen Size Your application has to be capable of adapting to different screen sizes as small as 320 by 240. Common Profile Mobile applications are limited to the JavaFX APIs that are part of the Common Profile, which is a subset of the Desktop Profile. Performance Mobile applications run on much less powerful devices, so they have less CPU and memory resources available to work with.
Developing for the Common Profile
Changes to Improve Hello Devoxx! It runs as is with no changes, but was not designed for the mobile format. We can do better: Replace all hard-coded sizes with a bind Scale the background image to the screen size Put an error up on network failure The improved version also works on the desktop. 49
Mobile Demo Hello Devoxx!
JavaFX How-To’s 51 http://javafx.com/learn/howto.jsp
52 JFXtras – Open Source JavaFXAddons http://jfxtras.org/
JFXtras Grid 53 Row Row
JFXtras Grid XGrid {   effect: Reflection {}   border: 20 vgap: 12 hgap: 12   rows: bind [     row([text, progressBar]),     row([navigator, mediaGrid])   ] } 54
Media Explorer Example 55
JFXtras Borders 56
JFXtras Borders Function: override function create() { XTitledBorder {     id: "imageTitle“     title: file.getName()     content: XFrameBorder {       id: "imageFrame“       node: XImageView { preserveRatio: true         smooth: true         image: bind image       }     }   } } CSS: #imageTitle {     position: "bottom";     justification: "center";     font: bold 12pt Serif;     text-color: #000060; } #imageFrame {     border-left-width: 12;     border-top-width: 12;     border-bottom-width: 20;     border-right-width: 12;     background-fill: #00007020; } 57
JFXtras Borders 58
59 MigLayout for JavaFX
60 Flexible Grid-Based Layout Flow Wrap
MigLayout Constraints “wrap” “fill” “flowy” “gap” MigLayout {   constraints: “fill, wrap”   // to be continued } 61
MigLayout {   constraints: "fill, wrap"   columns: "[][]"   rows: "[][]4mm[]push[]"   content: [     Label {       text: "Email" layoutInfo: nodeConstraints( "ax right" )     } TextBox { layoutInfo: nodeConstraints( "growx, pushx" )     }     Label {       text: "Password" layoutInfo: nodeConstraints( "ax right" )     } TextBox { layoutInfo: nodeConstraints( "growx, pushx" )     }     Button {       text: "Login" layoutInfo: nodeConstraints( "skip, right" )     }     Label {       text: "This text is 'pushed' to the bottom" layoutInfo: nodeConstraints( "span" )     }   ] } 62
JFXtras Shapes 63 	Almond	Intersection of two circles (VesicaPiscis)	centerX, centerY, width 	Arrow	Arrow shape	x, y, width, height, depth, rise 	Asterisk	Asterisk with rounded corners	centerX, centerY, width, radius, beams, roundness AstroidHypocloid with four cusps	centerX, centerY, radius 	Balloon	Rectangular shape with a tab	x, y, width, height, arc, anglePosition, tabWidth, tabHeight, tabLocation, tabDisplacement 	Cross	Symmetrical cross shape	centerX, centerY, width, radius, roundness 	Donut	Regular polygon with a hole	centerX, centerY, innerRadius, outerRadius, sides Lauburu	Four comma-shaped heads	centerX, centerY, radius Continued…
JFXtras Shapes (continued) 64 MultiRoundRectangle	Rectangle with configurable corners	x, y, width, height, topLeftWidth/Height, topRightWidth/Height, bottomLeftWidth/Height, bottomRightWidth/Height 	Rays	Multiple rays extend from center	centerX, centerY, rays, radius, extent, rounded RegularPolygon 	Polygon with equal sides	centerX, centerY, sides, radius ReuleauxTriangle	Curved triangle shape	centerX, centerY, radius RoundPin	Cone with rounded top	centerX, centerY, height, radius 	Star2	Multipoint star	centerX, centerY, innerRadius, outerRadius, count ETriangle	Equilateral triangle	x, y, width ITriangle	Isosceles triangle	x, y, width, height 	RTriangle	Right triangle	x, y, width, height, anglePosition
JFXtras Shapes 65
Sphere Challenge 66 Andres Almiray’s Weblog http://www.jroller.com/aalmiray/entry/griffon_gfxbuilder_fxbuilder_side_by “The following snapshot shows a couple of spheres drawn with GfxBuilder and FxBuilder, can you guess which one is which? … This is by no means a post to bash JavaFX rather to point out some of its deficiencies” 			-- Andres Almiray (taken completely out of context)
Sphere Challenge – JavaFX Response Composition: RadialGradient for the Sphere  Three additional RadialGradients for the light sources  A blurred shadow underneath Features: All Bound/Relative Coordinates Configurable – Base, Ambient, Specular, Shine Colors Shadow Size and Height Uses New JFXtrasColorUtil Library JavaFX Caching for High Performance 67 Will be shipped with JFXtras 0.6
JFXtras Spheres Demo 68
JFXtras Shelf 69
The JavaFX Desktop Widget Platform WidgetFX
WidgetFX Origins 71
72 Why WidgetFX Matters
Movie Widget Tutorial
Widget Properties 74
Widget Definition var widget: Widget; widget = Widget {   width: 640   height: 352 aspectRatio: bind player.media.width                / player.media.height   content: bind player } 75
Load the Media var source = "http://projavafx.com/movies/ elephants-dream-640x352.flv"; var player = bind SimpleMoviePlayer {     media: Media {         source: source     }     width: bind widget.width     height: bind widget.height } 76
Run in Widget Runner 77
Widget Configuration Properties 78
Widget Configuration widget = Widget {   ...   configuration: Configuration {     properties: [ StringProperty {         name: "source“         value: bind source with inverse       }     ]     scene: Scene {…} // see next page   } } 79
Widget Config Dialog Scene {   content: XGrid {     rows: row([       Text {         content: "Source URL:“       }, TextBox {         columns: 30,         value: bind source with inverse       }     ])   } } 80
Add an On-Replace Trigger var player = bind SimpleMoviePlayer {   media: Media {     source: source   }   width: bind widget.width   height: bind widget.height } on replace =oldPlayer { oldPlayer.player.stop(); } 81
Widget Configuration (demo) 82
WidgetFX Contest Results! 3rd Place Infix WeatherWidget Larry Dickson 2nd Place RadioFX Yannick Van Godtsenhoven 1st Place ScreenshotFX Pär Dahlberg 83
JavaFXpert RIA Exemplar Challenge "Create an application in JavaFX that exemplifies the appearance and behavior of a next-generation enterprise RIA (rich internet application)". Grand Prize: $2,000 USD (split between a two-man graphics artist and application developer team) Deadline: 10 January, 2010 For more info: http://learnjavafx.typepad.com/ 84
LearnFX and Win at Devoxx 85
Thursday’s Question HttpRequest {   location: http://steveonjava.com/ onResponseMessage: function(m) { println(m); FX.exit() }}.start(); Launch LearnFX from my blog: http://steveonjava.com/ Or tweet @projavafxcourse answer 2:00PM Room 8 (right here!) 86

Weitere ähnliche Inhalte

Was ist angesagt?

Integration testing with spring @snow one
Integration testing with spring @snow oneIntegration testing with spring @snow one
Integration testing with spring @snow oneVictor Rentea
 
Meck at erlang factory, london 2011
Meck at erlang factory, london 2011Meck at erlang factory, london 2011
Meck at erlang factory, london 2011Adam Lindberg
 
Integration testing with spring @JAX Mainz
Integration testing with spring @JAX MainzIntegration testing with spring @JAX Mainz
Integration testing with spring @JAX MainzVictor Rentea
 
Implementações paralelas
Implementações paralelasImplementações paralelas
Implementações paralelasWillian Molinari
 
Error Management: Future vs ZIO
Error Management: Future vs ZIOError Management: Future vs ZIO
Error Management: Future vs ZIOJohn De Goes
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutinesNAVER Engineering
 
Come on, PHP 5.4!
Come on, PHP 5.4!Come on, PHP 5.4!
Come on, PHP 5.4!paulgao
 
JavaOne 2016 -Emerging Web App Architectures using Java and node.js
JavaOne 2016 -Emerging Web App Architectures using Java and node.jsJavaOne 2016 -Emerging Web App Architectures using Java and node.js
JavaOne 2016 -Emerging Web App Architectures using Java and node.jsSteve Wallin
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaWiem Zine Elabidine
 
Find bottleneck and tuning in Java Application
Find bottleneck and tuning in Java ApplicationFind bottleneck and tuning in Java Application
Find bottleneck and tuning in Java Applicationguest1f2740
 
Python concurrency: libraries overview
Python concurrency: libraries overviewPython concurrency: libraries overview
Python concurrency: libraries overviewAndrii Mishkovskyi
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoJavier Abadía
 
Metrics-Driven Engineering at Etsy
Metrics-Driven Engineering at EtsyMetrics-Driven Engineering at Etsy
Metrics-Driven Engineering at EtsyMike Brittain
 
Testing My Patience
Testing My PatienceTesting My Patience
Testing My PatienceAdam Lowry
 
ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?장현 한
 
Contextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEContextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEMarcos Placona
 
Testing a 2D Platformer with Spock
Testing a 2D Platformer with SpockTesting a 2D Platformer with Spock
Testing a 2D Platformer with SpockAlexander Tarlinder
 
Exploit ie using scriptable active x controls version English
Exploit ie using scriptable active x controls version EnglishExploit ie using scriptable active x controls version English
Exploit ie using scriptable active x controls version Englishchen yuki
 

Was ist angesagt? (20)

Integration testing with spring @snow one
Integration testing with spring @snow oneIntegration testing with spring @snow one
Integration testing with spring @snow one
 
Meck at erlang factory, london 2011
Meck at erlang factory, london 2011Meck at erlang factory, london 2011
Meck at erlang factory, london 2011
 
Integration testing with spring @JAX Mainz
Integration testing with spring @JAX MainzIntegration testing with spring @JAX Mainz
Integration testing with spring @JAX Mainz
 
Implementações paralelas
Implementações paralelasImplementações paralelas
Implementações paralelas
 
Error Management: Future vs ZIO
Error Management: Future vs ZIOError Management: Future vs ZIO
Error Management: Future vs ZIO
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutines
 
Come on, PHP 5.4!
Come on, PHP 5.4!Come on, PHP 5.4!
Come on, PHP 5.4!
 
Spring hibernate jsf_primefaces_intergration
Spring hibernate jsf_primefaces_intergrationSpring hibernate jsf_primefaces_intergration
Spring hibernate jsf_primefaces_intergration
 
JavaOne 2016 -Emerging Web App Architectures using Java and node.js
JavaOne 2016 -Emerging Web App Architectures using Java and node.jsJavaOne 2016 -Emerging Web App Architectures using Java and node.js
JavaOne 2016 -Emerging Web App Architectures using Java and node.js
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in Scala
 
Find bottleneck and tuning in Java Application
Find bottleneck and tuning in Java ApplicationFind bottleneck and tuning in Java Application
Find bottleneck and tuning in Java Application
 
Python concurrency: libraries overview
Python concurrency: libraries overviewPython concurrency: libraries overview
Python concurrency: libraries overview
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar Django
 
Metrics-Driven Engineering at Etsy
Metrics-Driven Engineering at EtsyMetrics-Driven Engineering at Etsy
Metrics-Driven Engineering at Etsy
 
Core data optimization
Core data optimizationCore data optimization
Core data optimization
 
Testing My Patience
Testing My PatienceTesting My Patience
Testing My Patience
 
ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?ES6, 잘 쓰고 계시죠?
ES6, 잘 쓰고 계시죠?
 
Contextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEContextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DE
 
Testing a 2D Platformer with Spock
Testing a 2D Platformer with SpockTesting a 2D Platformer with Spock
Testing a 2D Platformer with Spock
 
Exploit ie using scriptable active x controls version English
Exploit ie using scriptable active x controls version EnglishExploit ie using scriptable active x controls version English
Exploit ie using scriptable active x controls version English
 

Andere mochten auch

JavaFX and WidgetFX at SVCodeCamp
JavaFX and WidgetFX at SVCodeCampJavaFX and WidgetFX at SVCodeCamp
JavaFX and WidgetFX at SVCodeCampStephen Chin
 
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Stephen Chin
 
Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)Stephen Chin
 
Oracle IoT Kids Workshop
Oracle IoT Kids WorkshopOracle IoT Kids Workshop
Oracle IoT Kids WorkshopStephen Chin
 
Devoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopDevoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopStephen Chin
 
Devoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopDevoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopStephen Chin
 
JFXtras - JavaFX Controls, Layout, Services, and More
JFXtras - JavaFX Controls, Layout, Services, and MoreJFXtras - JavaFX Controls, Layout, Services, and More
JFXtras - JavaFX Controls, Layout, Services, and MoreStephen Chin
 

Andere mochten auch (7)

JavaFX and WidgetFX at SVCodeCamp
JavaFX and WidgetFX at SVCodeCampJavaFX and WidgetFX at SVCodeCamp
JavaFX and WidgetFX at SVCodeCamp
 
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
 
Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)
 
Oracle IoT Kids Workshop
Oracle IoT Kids WorkshopOracle IoT Kids Workshop
Oracle IoT Kids Workshop
 
Devoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopDevoxx4Kids NAO Workshop
Devoxx4Kids NAO Workshop
 
Devoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopDevoxx4Kids Lego Workshop
Devoxx4Kids Lego Workshop
 
JFXtras - JavaFX Controls, Layout, Services, and More
JFXtras - JavaFX Controls, Layout, Services, and MoreJFXtras - JavaFX Controls, Layout, Services, and More
JFXtras - JavaFX Controls, Layout, Services, and More
 

Ähnlich wie JavaFX Platform Guide - A Java Developer's Introduction

Presentation - Course about JavaFX
Presentation - Course about JavaFXPresentation - Course about JavaFX
Presentation - Course about JavaFXTom Mix Petreca
 
Java 5 6 Generics, Concurrency, Garbage Collection, Tuning
Java 5 6 Generics, Concurrency, Garbage Collection, TuningJava 5 6 Generics, Concurrency, Garbage Collection, Tuning
Java 5 6 Generics, Concurrency, Garbage Collection, TuningCarol McDonald
 
Building Data Rich Interfaces with JavaFX
Building Data Rich Interfaces with JavaFXBuilding Data Rich Interfaces with JavaFX
Building Data Rich Interfaces with JavaFXStephen Chin
 
What is new in sulu 2.0
What is new in sulu 2.0What is new in sulu 2.0
What is new in sulu 2.0danrot
 
Writing DSL with Applicative Functors
Writing DSL with Applicative FunctorsWriting DSL with Applicative Functors
Writing DSL with Applicative FunctorsDavid Galichet
 
Java Fx Overview Tech Tour
Java Fx Overview Tech TourJava Fx Overview Tech Tour
Java Fx Overview Tech TourCarol McDonald
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume Laforge
 
JavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative LanguagesJavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative LanguagesStephen Chin
 
2018 05-16 Evolving Technologies: React, Babel & Webpack
2018 05-16 Evolving Technologies: React, Babel & Webpack2018 05-16 Evolving Technologies: React, Babel & Webpack
2018 05-16 Evolving Technologies: React, Babel & WebpackCodifly
 
JavaFX 2.0 and Alternative Languages
JavaFX 2.0 and Alternative LanguagesJavaFX 2.0 and Alternative Languages
JavaFX 2.0 and Alternative LanguagesStephen Chin
 

Ähnlich wie JavaFX Platform Guide - A Java Developer's Introduction (20)

JavaFX introduction
JavaFX introductionJavaFX introduction
JavaFX introduction
 
Presentation - Course about JavaFX
Presentation - Course about JavaFXPresentation - Course about JavaFX
Presentation - Course about JavaFX
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
00_Introduction to Java.ppt
00_Introduction to Java.ppt00_Introduction to Java.ppt
00_Introduction to Java.ppt
 
Java 5 6 Generics, Concurrency, Garbage Collection, Tuning
Java 5 6 Generics, Concurrency, Garbage Collection, TuningJava 5 6 Generics, Concurrency, Garbage Collection, Tuning
Java 5 6 Generics, Concurrency, Garbage Collection, Tuning
 
Nalinee java
Nalinee javaNalinee java
Nalinee java
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
 
Java Generics
Java GenericsJava Generics
Java Generics
 
JavaFXScript
JavaFXScriptJavaFXScript
JavaFXScript
 
Building Data Rich Interfaces with JavaFX
Building Data Rich Interfaces with JavaFXBuilding Data Rich Interfaces with JavaFX
Building Data Rich Interfaces with JavaFX
 
What is new in sulu 2.0
What is new in sulu 2.0What is new in sulu 2.0
What is new in sulu 2.0
 
Java Lab Manual
Java Lab ManualJava Lab Manual
Java Lab Manual
 
Writing DSL with Applicative Functors
Writing DSL with Applicative FunctorsWriting DSL with Applicative Functors
Writing DSL with Applicative Functors
 
Java Fx Overview Tech Tour
Java Fx Overview Tech TourJava Fx Overview Tech Tour
Java Fx Overview Tech Tour
 
JavaFX Overview
JavaFX OverviewJavaFX Overview
JavaFX Overview
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
JavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative LanguagesJavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative Languages
 
JavaProgrammingManual
JavaProgrammingManualJavaProgrammingManual
JavaProgrammingManual
 
2018 05-16 Evolving Technologies: React, Babel & Webpack
2018 05-16 Evolving Technologies: React, Babel & Webpack2018 05-16 Evolving Technologies: React, Babel & Webpack
2018 05-16 Evolving Technologies: React, Babel & Webpack
 
JavaFX 2.0 and Alternative Languages
JavaFX 2.0 and Alternative LanguagesJavaFX 2.0 and Alternative Languages
JavaFX 2.0 and Alternative Languages
 

Mehr von Stephen Chin

DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2Stephen Chin
 
10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java CommunityStephen Chin
 
Java Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive GuideJava Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive GuideStephen Chin
 
DevOps Tools for Java Developers
DevOps Tools for Java DevelopersDevOps Tools for Java Developers
DevOps Tools for Java DevelopersStephen Chin
 
Java Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJCJava Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJCStephen Chin
 
RetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleRetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleStephen Chin
 
JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)Stephen Chin
 
Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Stephen Chin
 
Confessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistConfessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistStephen Chin
 
Zombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the UndeadZombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the UndeadStephen Chin
 
JCrete Embedded Java Workshop
JCrete Embedded Java WorkshopJCrete Embedded Java Workshop
JCrete Embedded Java WorkshopStephen Chin
 
OpenJFX on Android and Devices
OpenJFX on Android and DevicesOpenJFX on Android and Devices
OpenJFX on Android and DevicesStephen Chin
 
Java on Raspberry Pi Lab
Java on Raspberry Pi LabJava on Raspberry Pi Lab
Java on Raspberry Pi LabStephen Chin
 
Java 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and LegosJava 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and LegosStephen Chin
 
Raspberry Pi Gaming 4 Kids - Dutch Version
Raspberry Pi Gaming 4 Kids - Dutch VersionRaspberry Pi Gaming 4 Kids - Dutch Version
Raspberry Pi Gaming 4 Kids - Dutch VersionStephen Chin
 
Raspberry pi gaming 4 kids
Raspberry pi gaming 4 kidsRaspberry pi gaming 4 kids
Raspberry pi gaming 4 kidsStephen Chin
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Stephen Chin
 
Raspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFXRaspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFXStephen Chin
 
LUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi HackingLUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi HackingStephen Chin
 

Mehr von Stephen Chin (20)

DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2
 
10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community
 
Java Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive GuideJava Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive Guide
 
DevOps Tools for Java Developers
DevOps Tools for Java DevelopersDevOps Tools for Java Developers
DevOps Tools for Java Developers
 
Java Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJCJava Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJC
 
RetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleRetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming Console
 
JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)
 
Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)
 
Confessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistConfessions of a Former Agile Methodologist
Confessions of a Former Agile Methodologist
 
Zombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the UndeadZombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the Undead
 
JCrete Embedded Java Workshop
JCrete Embedded Java WorkshopJCrete Embedded Java Workshop
JCrete Embedded Java Workshop
 
OpenJFX on Android and Devices
OpenJFX on Android and DevicesOpenJFX on Android and Devices
OpenJFX on Android and Devices
 
Java on Raspberry Pi Lab
Java on Raspberry Pi LabJava on Raspberry Pi Lab
Java on Raspberry Pi Lab
 
Java 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and LegosJava 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and Legos
 
DukeScript
DukeScriptDukeScript
DukeScript
 
Raspberry Pi Gaming 4 Kids - Dutch Version
Raspberry Pi Gaming 4 Kids - Dutch VersionRaspberry Pi Gaming 4 Kids - Dutch Version
Raspberry Pi Gaming 4 Kids - Dutch Version
 
Raspberry pi gaming 4 kids
Raspberry pi gaming 4 kidsRaspberry pi gaming 4 kids
Raspberry pi gaming 4 kids
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)
 
Raspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFXRaspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFX
 
LUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi HackingLUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi Hacking
 

Kürzlich hochgeladen

Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 

Kürzlich hochgeladen (20)

Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 

JavaFX Platform Guide - A Java Developer's Introduction

  • 1. The JavaFX Platform – A Java Developer’s Guide Stephen Chin Inovis, Inc.
  • 2. About Your Presenter Director SWE, Inovis, Inc. Open-Source JavaFX Hacker MBA Belotti Award UberScrumMaster XP Coach Agile Evangelist WidgetFX JFXtras FEST-JavaFX Piccolo2D Java Champion JavaOneRockstar JUG Leader Pro JavaFX Author 2 Family Man Motorcyclist
  • 3. LearnFX and Win at Devoxx Tweet to answer: @projavafxcourse your-answer-here 3
  • 4. Part 1 - JavaFX Crash Course var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
  • 5.
  • 6.
  • 7. Hello Devoxx!: Creating a Stage Stage { title: "Hello Devoxx!" scene: Scene { content: [ "..." ] } } 6 var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
  • 8. Hello Devoxx!: Displaying Images ImageView { image: Image { url: "http://www.javoxx.com/download/attachments/1706305/Devoxx09.jpg" } opacity: .5 } 7 var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
  • 9. Hello Devoxx!: RSS Feed varitems:Item[]; RssTask { interval: 30s; location: "http://search.twitter.com/search.rss?q=devoxx" onItem: function(item) { insert item into items; } }.start(); 8
  • 10. Hello Devoxx!: VBox Layout vartextBox:VBox; textBox = VBox { layoutX: 40 layoutY: 40 spacing: 20 content: "..." } 9
  • 11. Hello Devoxx!: Displaying Text content: bind for (item in items) { Text { textOrigin: TextOrigin.TOP textAlignment: TextAlignment.JUSTIFY wrappingWidth: 520 font: Font.font(null, FontWeight.BOLD, 18) content: item.title } } 10
  • 12. Hello Devoxx!: Animating Graphics vartransTransition = TranslateTransition { duration: 2m node: bind textBox fromY: 600 toY: -4000 interpolator: Interpolator.LINEAR repeatCount: Timeline.INDEFINITE } transTransition.play(); 11
  • 13. Hello Devoxx!: Playing Audio ? MediaPlayer { autoPlay: true repeatCount: MediaPlayer.REPEAT_FOREVER media: Media { source: "http://blogs.sun.com/roller/resources/dcb/Java.mp3" } } 12
  • 15. Resource: JavaFX API Documentation 14 http://java.sun.com/javafx/1.2/docs/api/
  • 16. 15 Part 2 - Comparing JavaFX and Java var x = ['x','o','v','e','d','x']; insert x[5] before x[0]; println("{reverse x[0..<]}"); @projavafxcourse answer
  • 17. Language Similarities Java is… Statically typed Compiled to bytecodes Runs on the JVM Has a large library JavaFX is… Statically typed Compiled to bytecodes Runs on the JVM Can call Java libraries 16
  • 19. Integrating JavaFX and Java Calling Java from JavaFX Can call Java interface or classes directly Automatic conversion to and from Arrays and Collections Can even extend Java interfaces and classes Calling JavaFX from Java Easiest way is to create a Java interface that JavaFX extends Can invoke JavaFX as a script and get results back 18
  • 21.
  • 22. Underflows/Overflows will fail silently, producing inaccurate results
  • 23.
  • 25. Data Binding A variable or a constant can be bound to an expression var x = bind a + b; The bound expression is remembered The dependencies of the expression is watched Variable is updated Regular binding: when dependencies change values Lazy binding: when the variable is accessed var x = bind lazy a+ b; 23
  • 26. What Bind Updates var x = bind if(a) then b else c x is updated if a or b or c changes var x = bind for (i in [a..b]) { i * i } Not everything is recalculated If a = 1 and b = 2, x is [1, 4] If b changes to 3, only the added element is calculated 24 1 4 9
  • 27. Binding to Expressions Binding to a block Bound block may contain any number of defs followed by one expression Dependencies of block is backtraced from the expression Binding to function invocation expression Regular function: dependencies are parameters Bound function: backtraced from final expression inside function 25
  • 28. Binding to Object Literals var a = 3; var b = 4; var p = bind Point { x: a, y: b }; var q = bind Point { x: bind a, y: b }; var r = bind Point { x: bind a, y: bind b }; When a changes: p gets a new instance of Point q and r keep the old instance with a new x value r will never get a new instance of Point (the outer bind in r is useless) 26
  • 29. Binding to Functions Stage { def cModel = CircleModel {}; varsliderRef:Slider; scene: Scene { content: [ Circle { radius: bind cModel.diameter / 2 }, Text { content: bind "Diameter: {%3.0f cModel.diameter}" }, Text { content: bind "Area: {%3.2f cModel.getArea()}" }, sliderRef = Slider { value: bind cModel.diameter with inverse }]}} 27 class CircleModel { vardiameter:Number; bound function getArea():Number { Math.PI * Math.pow(diameter / 2, 2); } } http://learnjavafx.typepad.com/weblog/javafx_app_deployment/
  • 30. JavaFX Sequences Represents collections of homogeneous data A fundamental container data type Rich set of language facilities Contributor to declarative syntax Automatic conversion to and from Java Arrays and Collections 28
  • 31. Creating Sequences Explicit sequence expression [1, 3, 5, 7, 9] Elements are separated by commas Comma may be omitted if element ends with brace 29 1 3 5 7 9
  • 32. Creating Sequences Numeric sequence with range expressions: [1..10] Can have a step: [1..10 step 2] [0.0..0.9 step 0.1] Can be decreasing: [10..1 step -3] Beware of step that goes opposite direction: [10..1] is [] Exclusive right end [1..<5] 30 1 2 3 4 5 6 7 8 9 10 1 3 5 7 9 0 .1 .2 .3 .4 .5 .6 .7 .8 .9 10 7 4 1 1 2 3 4
  • 33. Getting Information from Sequences ints = [1, 3, 5, 7, 9] sizeofintsis 5 ints[0] is 1, ints[1] is 3, ..., ints[4] is 9 ints[-1] is 0 (default value of Integer), so is ints[5] For a sequence of objects, the default is null 31 1 3 5 7 9 [0] [1] [2] [3] [4]
  • 34. Getting Slices From Sequences ints = [1, 3, 5, 7, 9] ints[0..2] is [1, 3, 5] ints[0..<2] is [1, 3] ints[2..] is [5, 7, 9] ints[2..<] is [5, 7] ints[2..0], ints[-2..-1], ints[5..6] are all []s 32 1 3 5 7 9 [0] [1] [2] [3] [4]
  • 35. Getting Subsets from Sequences ints = [1, 3, 5, 7, 9] ints[k | k > 6] is: [7, 9] (k > 6 is a condition) ints[k | indexof k < 2] is: [1, 3] ints[k | k > 10] is: [] 33 1 3 5 7 9 [0] [1] [2] [3] [4]
  • 36. Inserting into Sequences ints = [1, 3, 5, 7, 9] insert 20 into ints insert 30 before ints[2] insert 40 after ints[4] insert [50, 60] into ints 34 1 3 5 7 9 1 3 5 7 9 20 1 3 5 7 9 20 30 1 3 5 7 9 20 30 40 1 3 5 7 9 20 30 40 50 60
  • 37. Deleting from Sequences ints = [1, 3, 5, 7, 9] delete 7 from ints delete ints[0] delete ints[0..1] delete ints: ints becomes [] 35 1 3 5 7 9 1 3 5 7 9 1 3 5 9 3 5 9 9
  • 38. Sequence Puzzlers FX What is the size of this sequence: [1..10 step -1] What does this evaluate to: [10..<20 step 2][k|k>17] What is the size of this sequence: sizeof [20..1 step -3] 36 1 A: 0 2 A: [18] 3 A: 1
  • 39. Reference: JavaFXRefCard 37 http://refcardz.dzone.com/refcardz/
  • 40. Demo by Tor Norbye 38 JavaFX Builder Tool ?
  • 41. 39 JavaFX 1.2 Layouts
  • 42. JavaFX 1.2 Custom Layouts Container Panel Both Extend Parent Container creates layouts by extension Panel creates layouts by declaration 40
  • 43. Who is My Representative? 41 Web Service Integration
  • 44. Calling a REST Service REST URL: http://whoismyrepresentative.com/getall_mems.php?zip=90210&output=json Output: { "results": [ { "type": "rep", "name": "Henry A. Waxman", "party": "D", "state": "CA", "district": "30", "phone": "(202) 225-3976", "office": "2204 Rayburn", "link": "http://www.henrywaxman.house.gov/" } ]} 42
  • 45. Making an HttpRequest req = HttpRequest { method: HttpRequest.GET location: url onInput: parseResponse onDone: function() { if (req.responseCode != 200) { message = req.responseMessage; } else if (sizeof senators == 0 and sizeof representatives == 0) { message = "No members found for {zipcode}"; } } onException: function(ex: java.lang.Exception) { println("Exception: {ex.getClass()} {ex.getMessage()}"); } } req.start(); 43
  • 46. Using the Pull Parser while (parser.event.type != PullParser.END_DOCUMENT) { parser.seek( "type" ); if (parser.event.type == PullParser.START_VALUE) { parser.forward(); if (parser.event.text == "rep") { var rep = Representative{} parseMemberOfCongress( rep, parser ); insert rep into representatives; } else if (parser.event.text == "sen" ) { varsen = Senator{} parseMemberOfCongress( sen, parser ); insert sen into senators; } } } 44
  • 48. JavaFX Mobile Advantages Write Once, Run Anywhere Desktop, Mobile, Set-top Boxes (future) Large Embedded Base Built on top of Java ME platform Wide Range of Devices Runs on Feature Phones, Smart Phones Currently available for Windows Mobile devices
  • 49. JavaFX Mobile Constraints Screen Size Your application has to be capable of adapting to different screen sizes as small as 320 by 240. Common Profile Mobile applications are limited to the JavaFX APIs that are part of the Common Profile, which is a subset of the Desktop Profile. Performance Mobile applications run on much less powerful devices, so they have less CPU and memory resources available to work with.
  • 50. Developing for the Common Profile
  • 51. Changes to Improve Hello Devoxx! It runs as is with no changes, but was not designed for the mobile format. We can do better: Replace all hard-coded sizes with a bind Scale the background image to the screen size Put an error up on network failure The improved version also works on the desktop. 49
  • 52. Mobile Demo Hello Devoxx!
  • 53. JavaFX How-To’s 51 http://javafx.com/learn/howto.jsp
  • 54. 52 JFXtras – Open Source JavaFXAddons http://jfxtras.org/
  • 55. JFXtras Grid 53 Row Row
  • 56. JFXtras Grid XGrid { effect: Reflection {} border: 20 vgap: 12 hgap: 12 rows: bind [ row([text, progressBar]), row([navigator, mediaGrid]) ] } 54
  • 59. JFXtras Borders Function: override function create() { XTitledBorder { id: "imageTitle“ title: file.getName() content: XFrameBorder { id: "imageFrame“ node: XImageView { preserveRatio: true smooth: true image: bind image } } } } CSS: #imageTitle { position: "bottom"; justification: "center"; font: bold 12pt Serif; text-color: #000060; } #imageFrame { border-left-width: 12; border-top-width: 12; border-bottom-width: 20; border-right-width: 12; background-fill: #00007020; } 57
  • 62. 60 Flexible Grid-Based Layout Flow Wrap
  • 63. MigLayout Constraints “wrap” “fill” “flowy” “gap” MigLayout { constraints: “fill, wrap” // to be continued } 61
  • 64. MigLayout { constraints: "fill, wrap" columns: "[][]" rows: "[][]4mm[]push[]" content: [ Label { text: "Email" layoutInfo: nodeConstraints( "ax right" ) } TextBox { layoutInfo: nodeConstraints( "growx, pushx" ) } Label { text: "Password" layoutInfo: nodeConstraints( "ax right" ) } TextBox { layoutInfo: nodeConstraints( "growx, pushx" ) } Button { text: "Login" layoutInfo: nodeConstraints( "skip, right" ) } Label { text: "This text is 'pushed' to the bottom" layoutInfo: nodeConstraints( "span" ) } ] } 62
  • 65. JFXtras Shapes 63 Almond Intersection of two circles (VesicaPiscis) centerX, centerY, width Arrow Arrow shape x, y, width, height, depth, rise Asterisk Asterisk with rounded corners centerX, centerY, width, radius, beams, roundness AstroidHypocloid with four cusps centerX, centerY, radius Balloon Rectangular shape with a tab x, y, width, height, arc, anglePosition, tabWidth, tabHeight, tabLocation, tabDisplacement Cross Symmetrical cross shape centerX, centerY, width, radius, roundness Donut Regular polygon with a hole centerX, centerY, innerRadius, outerRadius, sides Lauburu Four comma-shaped heads centerX, centerY, radius Continued…
  • 66. JFXtras Shapes (continued) 64 MultiRoundRectangle Rectangle with configurable corners x, y, width, height, topLeftWidth/Height, topRightWidth/Height, bottomLeftWidth/Height, bottomRightWidth/Height Rays Multiple rays extend from center centerX, centerY, rays, radius, extent, rounded RegularPolygon Polygon with equal sides centerX, centerY, sides, radius ReuleauxTriangle Curved triangle shape centerX, centerY, radius RoundPin Cone with rounded top centerX, centerY, height, radius Star2 Multipoint star centerX, centerY, innerRadius, outerRadius, count ETriangle Equilateral triangle x, y, width ITriangle Isosceles triangle x, y, width, height RTriangle Right triangle x, y, width, height, anglePosition
  • 68. Sphere Challenge 66 Andres Almiray’s Weblog http://www.jroller.com/aalmiray/entry/griffon_gfxbuilder_fxbuilder_side_by “The following snapshot shows a couple of spheres drawn with GfxBuilder and FxBuilder, can you guess which one is which? … This is by no means a post to bash JavaFX rather to point out some of its deficiencies” -- Andres Almiray (taken completely out of context)
  • 69. Sphere Challenge – JavaFX Response Composition: RadialGradient for the Sphere Three additional RadialGradients for the light sources A blurred shadow underneath Features: All Bound/Relative Coordinates Configurable – Base, Ambient, Specular, Shine Colors Shadow Size and Height Uses New JFXtrasColorUtil Library JavaFX Caching for High Performance 67 Will be shipped with JFXtras 0.6
  • 72. The JavaFX Desktop Widget Platform WidgetFX
  • 74. 72 Why WidgetFX Matters
  • 77. Widget Definition var widget: Widget; widget = Widget { width: 640 height: 352 aspectRatio: bind player.media.width / player.media.height content: bind player } 75
  • 78. Load the Media var source = "http://projavafx.com/movies/ elephants-dream-640x352.flv"; var player = bind SimpleMoviePlayer { media: Media { source: source } width: bind widget.width height: bind widget.height } 76
  • 79. Run in Widget Runner 77
  • 81. Widget Configuration widget = Widget { ... configuration: Configuration { properties: [ StringProperty { name: "source“ value: bind source with inverse } ] scene: Scene {…} // see next page } } 79
  • 82. Widget Config Dialog Scene { content: XGrid { rows: row([ Text { content: "Source URL:“ }, TextBox { columns: 30, value: bind source with inverse } ]) } } 80
  • 83. Add an On-Replace Trigger var player = bind SimpleMoviePlayer { media: Media { source: source } width: bind widget.width height: bind widget.height } on replace =oldPlayer { oldPlayer.player.stop(); } 81
  • 85. WidgetFX Contest Results! 3rd Place Infix WeatherWidget Larry Dickson 2nd Place RadioFX Yannick Van Godtsenhoven 1st Place ScreenshotFX Pär Dahlberg 83
  • 86. JavaFXpert RIA Exemplar Challenge "Create an application in JavaFX that exemplifies the appearance and behavior of a next-generation enterprise RIA (rich internet application)". Grand Prize: $2,000 USD (split between a two-man graphics artist and application developer team) Deadline: 10 January, 2010 For more info: http://learnjavafx.typepad.com/ 84
  • 87. LearnFX and Win at Devoxx 85
  • 88. Thursday’s Question HttpRequest { location: http://steveonjava.com/ onResponseMessage: function(m) { println(m); FX.exit() }}.start(); Launch LearnFX from my blog: http://steveonjava.com/ Or tweet @projavafxcourse answer 2:00PM Room 8 (right here!) 86
  • 89. Sneak Preview of Thursday’s Session 87
  • 90. 88 Thank You Stephen Chin http://steveonjava.com/ Tweet: steveonjava Thanks to my co-authors, Jim, Weiqi , and Dean for content included in this talk!