Pro Java Fx – Developing Enterprise Applications
Upcoming SlideShare
Loading in...5
×
 

Pro Java Fx – Developing Enterprise Applications

on

  • 6,143 views

Pro JavaFX - Developing Enterprise Applications talk given at Devoxx 2009 in Antwerp, Belgium.

Pro JavaFX - Developing Enterprise Applications talk given at Devoxx 2009 in Antwerp, Belgium.

Statistics

Views

Total Views
6,143
Views on SlideShare
3,124
Embed Views
3,019

Actions

Likes
0
Downloads
40
Comments
0

9 Embeds 3,019

http://steveonjava.wordpress.com 2405
http://steveonjava.com 418
http://javafx.steveonjava.com 152
http://www.slideshare.net 15
https://steveonjava.wordpress.com 13
http://translate.googleusercontent.com 11
http://www.linkedin.com 3
http://209.85.129.132 1
url_unknown 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Pro Java Fx – Developing Enterprise Applications Pro Java Fx – Developing Enterprise Applications Presentation Transcript

  • Pro JavaFX – Developing Enterprise Applications
    Stephen Chin
    Inovis, Inc.
  • About the 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
  • Enterprise JavaFX Agenda
    JFXtras Layouts and Controls
    Automated JavaFX Testing
    Sample Enterprise Applications
    4
    HttpRequest {
    location: http://steveonjava.com/
    onResponseMessage: function(m) {
    println(m); FX.exit()
    }}.start();
    @projavafxcourse answer
    4
  • 5
    JFXtras Layouts and Controls
    HttpRequest {
    location: http://steveonjava.com/
    onResponseMessage: function(m) {
    println(m); FX.exit()
    }}.start();
    @projavafxcourse answer
  • JFXtras 0.6 Controls
    XCalendarPicker
    XMenu
    XMultiLineTextBox
    XPane
    XPasswordPane
    XPicker
    XScrollView
    XShelfView
    XSpinnerWheel
    XTableView
    XTreeView
    6
  • XPicker
    Multiple Picker Types
    Side Scroll
    Drop Down
    Thumb Wheel
    Side/Thumb Nudge
    Supports All Events
    Mouse Clicks
    Mouse Wheel
    Keyboard
    7
  • XCalendarPicker
    Configurable Locale
    Multiple Selection Modes
    Single
    Multiple
    Range
    Completely Skinnable
    8
  • JFXtras Data Providers
    9
  • XShelfView
    High Performance
    Features:
    Scrollbar
    Image Title
    Reflection Effect
    Aspect Ratio
    Infinite Repeat
    Integrates With JFXtras Data Providers
    Automatically Updates on Model Changes
    10
  • XTreeView
    Hierarchical data representation
    Supports JFXtras Data Model
    Can add arbitrary nodes
    Vertical and horizontal scrollbars
    Mouse wheel navigation
    11
  • XTableView
    Insanely Scalable
    Up to 16 million rows
    Extreme Performance
    Pools rendered nodes
    Caches images
    Optimized scene graph
    Features:
    Drag-and-Drop Column Reordering
    Dynamic Updating from Model
    Automatically Populates Column Headers
    Fully Styleablevia CSS
    12
  • SpeedReaderFX
    Written by Jim Weaver
    Read News, Twitter, and RSS in one place!
    Showcases use of JFXtras Layouts and Controls
    XMenu
    XTableView
    XPicker
    Contributed back to the JFXtras Samples Project
    13
  • JFXtras 0.6 Release Date: 11/23/2009
    14
    Open Source Project (BSD License)
    Join and help us out at:
    http://jfxtras.org/
  • 15
    Testing With FEST-JavaFX
    HttpRequest {
    location: http://steveonjava.com/
    onResponseMessage: function(m) {
    println(m); FX.exit()
    }}.start();
    @projavafxcourse answer
  • 16
    Mike Cohn’s Testing Pyramid
    Robot
    (coming soon)
    BDD
    Fluent
    Assertions
  • Basic Test Format
    Test {
    say: "A sequence should initially be empty"
    do: function() {
    varsequence:String[];
    return sequence.size();
    }
    expect: equalTo(0)
    }.perform();
    17
  • Fluent Assertions
    lessThanOrCloseTo
    greaterThanOrCloseTo
    lessThanOrEqualTo
    greaterThanorEqualTo
    typeIs
    instanceOf
    anything
    is
    isNot
    equalTo
    closeTo
    greaterThan
    18
    Make sure to include this static import:
    • import org.jfxtras.test.Expect.*;
    And then chain any of these assertions:
  • Fluent Assertion Examples
    isNot(null)
    isNot(closeTo(floor(i*1.5)))
    lessThanOrEqualTo(2.0)
    greaterThanOrCloseTo(123.10, 0.0100000)
    isNot(lessThanOrCloseTo(2.1435, 0.00011))
    typeIs("org.jfxtras.test.UserXException")
    instanceOf(UserXException{}.getJFXClass())
    19
  • Testing Quiz: Which test will fail?
    20
    varseq = [1, 3, 5, 7, 9];
    Test {
    say: "ranges"
    do: function() {
    seq[0..2]
    }
    expect: equalTo([1, 3, 5])
    }
    Test {
    say: "exclusive ends"
    do: function() {
    seq[0..<2]
    }
    expect: equalTo([1, 3])
    }
    Test {
    say: "open ends"
    do: function() {
    seq[2..]
    }
    expect: equalTo([5])
    }
    Test {
    say: "open exclusive ends"
    do: function() {
    seq[2..<]
    }
    expect: equalTo([5, 7])
    }
    1
    2
    3
    4
  • Parameterized Testing
    Test {
    say: "A Calculator should"
    var calculator = Calculator {}
    test: [
    for (a in [0..9], b in [0..9]) {
    Test {
    say: "add {a} + {b}"
    do: function() {calculator.add(a, b)}
    expect: equalTo("{a + b}")
    }
    }
    ]
    }.perform();
    21
  • Parameterized Testing - Output
    test: A Calculator should add 0 + 0.
    test: A Calculator should add 0 + 1.
    test: A Calculator should add 0 + 2.
    test: A Calculator should add 0 + 3.
    test: A Calculator should add 0 + 4.
    test: A Calculator should add 0 + 5.
    test: A Calculator should add 0 + 6.
    test: A Calculator should add 0 + 7.
    test: A Calculator should add 0 + 8.
    test: A Calculator should add 0 + 9.
    test: A Calculator should add 1 + 0.
    ...
    Test Results: 100 passed, 0 failed, 0 skipped.
    Test run was successful!
    22
  • Parameterized Testing with Assume
    Test {
    say: "A Calculator should"
    var calculator = Calculator {}
    test: [
    for (aInt in [0..9], bInt in [1..9]) {
    var a = aInt as Number;
    var b = bInt as Number;
    [
    Test {
    assume: that(a / b, closeTo(floor(a / b)))
    say: "divide {a} / {b} without a decimal"
    do: function() {calculator.divide(a, b)}
    expect: equalTo("{(a / b) as Integer}")
    },
    Test {
    assume: that(a / b, isNot(closeTo(floor(a / b))))
    say: "divide {a} / {b} with a decimal"
    do: function() {calculator.divide(a, b)}
    expect: equalTo("{a / b}")
    }
    ]
    }
    ]
    }.perform();
    23
  • Parameterized Testing with Assume - Output
    test: A Calculator should divide 0.0 / 1.0 without a decimal.
    test: A Calculator should divide 0.0 / 2.0 without a decimal.
    test: A Calculator should divide 0.0 / 3.0 without a decimal.
    test: A Calculator should divide 0.0 / 4.0 without a decimal.
    test: A Calculator should divide 0.0 / 5.0 without a decimal.
    test: A Calculator should divide 0.0 / 6.0 without a decimal.
    test: A Calculator should divide 0.0 / 7.0 without a decimal.
    test: A Calculator should divide 0.0 / 8.0 without a decimal.
    test: A Calculator should divide 0.0 / 9.0 without a decimal.
    test: A Calculator should divide 1.0 / 1.0 without a decimal.
    test: A Calculator should divide 1.0 / 2.0 with a decimal.
    test: A Calculator should divide 1.0 / 3.0 with a decimal.
    test: A Calculator should divide 1.0 / 4.0 with a decimal.
    test: A Calculator should divide 1.0 / 5.0 with a decimal.
    test: A Calculator should divide 1.0 / 6.0 with a decimal.
    test: A Calculator should divide 1.0 / 7.0 with a decimal.
    test: A Calculator should divide 1.0 / 8.0 with a decimal.
    test: A Calculator should divide 1.0 / 9.0 with a decimal.
    ...
    Test Results: 90 passed, 0 failed, 90 skipped.
    Test run was successful!
    24
  • Run Tests in JUnitPart 1: Extend Test
    public class BasicTest extends Test {}
    public function run() {
    Test {
    say: "A sequence should initially be empty"
    do: function() {
    varsequence:String[];
    return sequence.size();
    }
    expect: equalTo(0)
    }.perform();
    }
    25
  • Run Tests in JUnitPart 2: Create Ant Target
    26
    Run off classes dir
    Exclude inner classes
    <junitdir="${work.dir}"fork="true"showoutput="true">
    <batchtesttodir="${build.test.results.dir}">
    <filesetdir="${build.classes.dir}"excludes="**/*$*.class"
    includes=" **/*?Test.class"/>
    </batchtest>
    <classpathrefid="test.classpath"/>
    <formattertype="brief"usefile="false"/>
    <formattertype="xml"/>
    </junit>
    Include class files ending in Test
  • Run Tests in JUnitPart 3: Execute Ant Script
    27
  • REST or SOAP – Have it your way!
    28
    Sample Enterprise Applications
    Soap bars in Lille, Northern France. 
    http://www.flickr.com/photos/gpwarlow/ / CC BY 2.0
  • Calling a REST Service
    REST URL:
    http://api.meetup.com/rsvps.json/event_id={eventId}&key={apiKey}
    Output:
    { "results": [
    {"zip":"94044","lon":"-122.48999786376953","photo_url":"http://photos1.meetupstatic.com/photos/member/1/4/b/a/member_5333306.jpeg","response":"no","name":"Andres Almiray","comment":"Can't make it :-("}
    ]}
    29
  • JUG Spinner - JSONHandler in 3 Steps
    public class Member {
    public varplace:Integer;
    public varphotoUrl:String;
    public varname:String;
    public varcomment:String;
    }
    varmemberParser:JSONHandler = JSONHandler {
      rootClass: "org.jfxtras.jugspinner.data.MemberSearch “
      onDone: function(obj, isSequence): Void {
        members = (obj as MemberSearch).results;
    }}
    req = HttpRequest {
    location: rsvpQuery
    onInput: function(is: java.io.InputStream) {
    memberParser.parse(is);
    }}
    30
    1
    POJfxO
    2
    JSONHandler
    3
    HttpRequest
  • JUG Prize Spinner Demo
    31
    Featured in:
    Enterprise Web 2.0 Fundamentals
    By Oswald Campesato& Kevin Nilson
  • 32
    Enterprise Widget Tutorial
  • Use Case: Tracking Agile Development
    33
  • Architecture: WidgetFX Framework
    Reasons for choosing WidgetFX:
    Supports Widgets in JavaFX and Java
    Commercial Friendly Open-Source
    Robust Security Model
    Cross-platform Support
    34
  • Design: Using the Production Suite 1
    35
  • Design: Using the Production Suite 2
    36
  • Develop: Binding the Code to Graphics
    Add the FXZ to your project
    Right click and Generate UI stub
    Choose a filename and generate
    Construct a UI Node and add it to the Scene:
    varrallyWidgetUI:RallyWidgetUI = RallyWidgetUI{}
    37
  • Develop: Calling SOAP From JavaFX
    Generate SOAP Stubs off WSDL:
    WSDL2Java -uriRally.wsdl-o src-p rallyws.api
    Create a new Service:
    rallyService= new RallyServiceServiceLocator().getRallyService();
    Invoke the Service from Java or JavaFX:
    QueryResult result = rallyService.query(null, "Iteration", queryString, "Name", true, 0, 100); or JavaFX code:
    38
  • RallyWidget Demo
    39
  • 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/
    40
  • LearnFX and Win at Devoxx
    41
  • 42
    Thank You
    Stephen Chin
    http://steveonjava.com/
    Tweet: steveonjava