SPEAKER‘S COMPANY LOGO
Building Data Rich Interfaces with JavaFX
Stephen Chin Inovis
Building Data Rich Interfaces with JavaFX Stephen Chin Inovis - - PowerPoint PPT Presentation
Building Data Rich Interfaces with JavaFX Stephen Chin Inovis SPEAKERS COMPANY LOGO About the Presenter Director SWE Open-Source Inovis, Inc. JavaFX Hacker MBA Pro JavaFX Author Family Man Belotti Award Java Champion Uber
SPEAKER‘S COMPANY LOGO
Stephen Chin Inovis
SPEAKER‘S COMPANY LOGO
Director SWE Inovis, Inc.
MBA Belotti Award Uber ScrumMaster XP Coach Agile Portfolio Process Speaker
Open-Source JavaFX Hacker
Pro JavaFX Author Java Champion JavaOne Rockstar JFXtras WidgetFX FEST-JavaFX Silicon Valley JavaFX User Group Founder Motorcyclist Family Man
SPEAKER‘S COMPANY LOGO
3
> JavaFX Technology Stack > Data Binding > JavaFX 1.3 Controls > Control Styling > JavaFX 1.3 Layouts > Web Service Integration > JFXtras Data-driven Controls > Apropos Demo > Pro JavaFX Quiz with Prizes!
SPEAKER‘S COMPANY LOGO
JFXtras Project
XControls Swing Handlers XLayouts Wipe
JVM Security APIs Deployment … JavaFX Platform
Controls Layouts Media Web Services Binding CSS
SPEAKER‘S COMPANY LOGO
JavaFX Binding Bind Library Property Change Listeners Callbacks
SPEAKER‘S COMPANY LOGO
> Unidirectional: property: bind object.value property: bind sequence[index] sequence: bind for (v in values) convert(v) > Bijective: property: bind value with inverse > Function: public bound function calculateTotal(subtotal, tax) { return subtotal * (1 + tax); } New in JavaFX 1.3 – All binding is lazy!
SPEAKER‘S COMPANY LOGO
bound function getScore() {[ ScoreLine {line: "Ski Jumping - Individual Norml"} ScoreLine {line: " "} ScoreLine {line: bind " {%-10s medal.type} "} ScoreLine {line: bind "{%-17s medal.name} {%-3s medal.country} {%3.1f medal.score}"} ]} def sb = ScoreBoard { lightColor: bind medal.lightColor lines: bind getScore()
if (e.primaryButtonDown) { medal = medals[(Sequences.indexOf(medals, medal) + 1) mod sizeof medals] } else { FX.exit(); }}}
SPEAKER‘S COMPANY LOGO
JFXtras extension for runtime binding to an existing JavaFX object via reflection. Example: class ReflectionTarget { public var fieldA:String; } def reflectionTarget = ReflectionTarget {fieldA: “A"} def mirror = context.mirrorOf(reflectionTarget); def xbind = XBind.bindWithInverse(mirror, mirror.getType().getVariable("fieldA")); xbind.ref = "B";
What is the value of: reflectionTarget.fieldA?
8
SPEAKER‘S COMPANY LOGO
Prototype by Johannes Schneider: http://blog.cedarsoft.com/ Java to JavaFX PropertyChangeEvents: Just make your Java Bean fire PropertyChangeEvents whenever a property has changed JavaFX to Java Variable Setter: The corresponding setter of your Java object is called PropertyChangeEvents: JavaFX binding updates trigger PropertyChangeEvents JavaFxBridge.bridge(javaModel).to(slider as FXObject).connecting( JavaFxBridge.bind("amount").to("value").withInverse() ); Will be included in the JFXtras 0.8 Release – Feedback on the syntax welcome!
SPEAKER‘S COMPANY LOGO
10
SPEAKER‘S COMPANY LOGO
11
SPEAKER‘S COMPANY LOGO
var list = ["apples", "bananas", "oranges", "pears", "cabbage"]; ScrollView { width: 250 height: 250 managed: false node: VBox { padding: Insets {top: 10, left: 10, bottom: 10, right: 10} spacing: 10 content: [ PasswordBox {promptText: "enter password"} Separator {} ChoiceBox { items: list } ListView { vertical: false items: list } ]}}
ChoiceBox PasswordBox Horizontal List Separator ScrollView
SPEAKER‘S COMPANY LOGO
MenuBar { menus: for (i in [0..4]) Menu { text: "Menu {i}" items: for (j in [0..4]) MenuItem { text: "Menu Item {j}" } } } ToolBar { items: for (i in [0..4]) Button {text: "Button {i}"} } TreeView { root: TreeItem { expanded: true data: "Root" children: for (i in [0..4]) [ TreeItem { data: "Item {i}" }]}}
MenuBar TreeView ToolBar Menu
SPEAKER‘S COMPANY LOGO
VBox { spacing: 20 nodeHPos: HPos.CENTER content: [ Text {content: "Default Styling"} Button {text: "Button"} CheckBox {text: "CheckBox", selected: true} Slider {value: 50} ] layoutInfo: LayoutInfo { margin: Insets {bottom: 20, top: 20, left: 20, right: 20} } }
14
Source: Dean Iverson, http://pleasingsoftware.blogspot.com/2010/04/so-whats-it-all-good-for.html
SPEAKER‘S COMPANY LOGO
.button {
"0,0 0,-50 a 1,1 0 1,0 0,50";
} .check-box:selected *.label {
} .check-box:selected *.mark {
"V8 H7 L 4,5 1,8 H0 V7 L 3,4 0,1 Z"; }
15
Source: Dean Iverson, http://pleasingsoftware.blogspot.com/2010/04/so-whats-it-all-good-for.html
SPEAKER‘S COMPANY LOGO
.slider *.track {
} .slider *.thumb {
"50,75 80,95 70,60 95,40 63,40 Z";
}
16
Source: Dean Iverson, http://pleasingsoftware.blogspot.com/2010/04/so-whats-it-all-good-for.html
SPEAKER‘S COMPANY LOGO
GridLayout > Based on the JFXtras XGrid > In the JavaFX Preview Package Fill > Controls how Nodes expand to take available space Grow/Shrink > Controls how available space is allocated between competing Nodes > Priority values: – NEVER – SOMETIMES – ALWAYS
17
SPEAKER‘S COMPANY LOGO
18
SPEAKER‘S COMPANY LOGO
JUG Prize Spinner
SPEAKER‘S COMPANY LOGO
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\/mem ber\/1\/4\/b\/a\/member_5333306.jpeg","response":"no","name":"Andres Almiray","comment":"Can't make it :-("} ]}
SPEAKER‘S COMPANY LOGO
public class Member { public var place:Integer; public var photoUrl:String; public var name:String; public var comment:String; } var memberParser:JSONHandler = JSONHandler { rootClass: "org.jfxtras.jugspinner.data.MemberSearch “
members = (obj as MemberSearch).results; }} req = HttpRequest { location: rsvpQuery
memberParser.parse(is); }}
POJfxO
JSONHandler
HttpRequest
SPEAKER‘S COMPANY LOGO
JFXtras XTable and XShelf
22
SPEAKER‘S COMPANY LOGO
High Performance Features: > Scrollbar > Image Title > Reflection Effect > Aspect Ratio > Infinite Repeat Integrates With JFXtras Data Providers Automatically Updates on Model Changes
SPEAKER‘S COMPANY LOGO
SPEAKER‘S COMPANY LOGO
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 Styleable via CSS
SPEAKER‘S COMPANY LOGO
def winnerTable = XTableView { rowType: Member {}.getJFXClass(); rows: bind winners columns: columns // optional rowHeight: 50 // optional }
columns = [ XTableColumn { displayName: "#" id: "place" prefWidth: 10 renderer: TextRenderer {} } XTableColumn { displayName: "Photo" id: "photoUrl" prefWidth: 30 renderer: ImageRenderer { missing: placeholder placeholder: placeholder } } XTableColumn { displayName: "Name" id: "name" prefWidth: 300 renderer: TextRenderer {} }]
26
SPEAKER‘S COMPANY LOGO
Agile Project Portfolio Scheduler
27
SPEAKER‘S COMPANY LOGO
Product Management Sales Marketing Operations Support Professional Services Launch Cycle Time > Dev Cycle Time Feature selling becomes impossible (Sales Enablement) Melting Change Managers: 50 changes once a month to 900 changes constantly
Supported Release proliferation Innovator’s Dilemma …in the weeds…
Development
Source: Based on Gat et al, Reformulating the Product Delivery Process, LSSC Conference, April 2010
Source: Based on Gat et al, Reformulating the Product Delivery Process, LSSC Conference, April 2010
SPEAKER‘S COMPANY LOGO
Product Management Sales Marketing Operations Support Professional Services Development
Source: Based on Gat et al, Reformulating the Product Delivery Process, LSSC Conference, April 2010
Internal Technical Debt Loop
External Technical Debt Loop
Enabled Adopted Validated Validated Backlogged Scheduled In Process Deployed
Proposed
Enabled Adopted
Bottleneck
SPEAKER‘S COMPANY LOGO
SPEAKER‘S COMPANY LOGO
> All Binding in JavaFX is ____ – Answer: Lazy > The New Controls in JavaFX 1.3 Are: ____, ____, and ____ – Answer: ChoiceBox, PasswordBox, ScrollView, Separator – Or preview: Menu, Tree, Toolbar > The JavaFX Preview Grid was contributed by the _____ project – Answer: JFXtras
31
SPEAKER‘S COMPANY LOGO
Stephen Chin http://steveonjava.com/ Inovis steve@steveonjava.com tweet: @steveonjava
SPEAKER‘S COMPANY LOGO
33
SPEAKER‘S COMPANY LOGO
34
SPEAKER‘S COMPANY LOGO
35
SPEAKER‘S COMPANY LOGO
36
SPEAKER‘S COMPANY LOGO
37