580 likes | 705 Views
Alexander Casall | Saxonia Systems AG. The Implementation of a Digital Task Board for Distributed Scrum with JavaFX. CON7840. Hi there ... Alexander Casall Saxonia Systems AG sialcasa. ... topics for today . What we are doing Why we use JavaFX How we use JavaFX. Open.
E N D
Alexander Casall | Saxonia Systems AG The Implementation of a Digital Task Board for Distributed ScrumwithJavaFX CON7840
Hi there ... Alexander Casall Saxonia Systems AG sialcasa
... topicsfortoday ... Whatwearedoing WhyweuseJavaFX HowweuseJavaFX
Open In Progress Done Sprint Start
In Progress Done Open Sprint End
? 2x
... touch ‘n syncit ... Scrum Board Requirements
Scrum BoardRequirements Essential Requirements Multiple synchronized Clients 3rd Party (Scrum) Backends Multi Touch Prototypingwithtrainees
... ithurts ... Swing Prototype - LessonsLearned
Scrum BoardSwing - LessonsLearned Dynamic elementimplementationisinconvenient Nomultitouchsupport / gesturerecognition Layouting / Styling withcode Write a lotofcodeto do simple things Migration toJavaFX (Beta 2.2)
JavaFXvs Swing Case Study – Asynchronouslyloadingan Image
Swing http://www.oracle.com/technetwork/articles/javase/swingworker-137249.html
JavaFX Loadimage in thebackground ? ?
Hint: JavaFXintroduces PropertiesBinding StringProperty StringProperty Binding String String High Level API StringProperty a = newSimpleStringProperty(); StringProperty b = newSimpleStringProperty(); a.bind(b);
Hint: JavaFXintroduces PropertiesEventListeners NotificationforChanges (Events) respond StringProperty a = newSimpleStringProperty(); a.addListener(newChangeListener<String>(){ @Override publicvoidchanged(ObservableValue<? extends String> source, String oldVal, String newVal){ System.out.println(oldVal,newVal); } }); StringProperty String
JavaFX Loadimage in thebackground Event drivenescalation Visualizetheprogress
ScrumBoard in action: YouTube Video
Short stopGuess ... HowmanyLOC forscaling? hugePaneWithStories.setScaleX(0.2); • hugePaneWithStories.setScaleY(0.2);
ProgressBar • Circle • Rectangle • ScrollPane • VBox PanetaskPane = newTaskPane(task); taskPane.setOnTouchMoved(newEventHandler<TouchEvent>(){ @Override publicvoid handle(TouchEventevent){ calculateScaleOfTask(event.getTouchPoints()); } }); • StackedBarChart chart.setRotate(90);
node.setOnSwipeRight(…); Shape Shape Rezizable Shape • node.setOnScroll(…); • node.setOnRotate(…); • node.setOnZoom(…); Hint [CON1760] by Jim Weaver
... andnowlet‘s do somemagic ... Custom ComponentExample
Scrum BoardCustom component – Filter for an assignee Task 2 Michael isassigned Task 1 Alex isassigned Alex null ObjectProperty<UserFX> filteredUser
Scrum BoardCustom component – Filter for an assignee ... so whatdoesthatmean in code... Task 2 Michael isassigned iftask.getAssignee() == filteredUser.get() thenopacity = 1.0 elseopacity = 0.5 iffilteredUser.get() == null thenopacity = 1.0 Task 1 Alex isassigned Alex ObjectProperty<UserFX> filteredUser
Scrum BoardCustom component – Filter for an assignee Option 1 – Property Binding
Scrum BoardCustom component – Filter for an assignee StringProperty StringProperty Binding String String ... Yeabindingworkswithpropertiesofthe same datatype...
Scrum BoardCustom component – Filter for an assignee ... so whataboutbindingwith different datatypes ...
Scrum BoardCustom component – Filter for an assignee Binding with different datatypes IntegerProperty StringProperty Binding Low Level API String Integer Whenachangesthebindingreevaluates Mapthe Data whichisprovidedbythebinding Usethebinding
Scrum BoardCustom component – Filter for an assignee ... andwhatwewanttoachieveis ... iftask.getAssignee() == filteredUser.get() thenopacity = 1.0 elseopacity = 0.5 iffilteredUser.get() == null thenopacity = 1.0 filteredUserProperty opacityProperty Binding UserFX Double
Scrum BoardCustom component – Filter for an assignee WhenfilteredUserchangesthebinding will reevaluate Returns a valuewhichisusedasthenewopacity
Scrum BoardCustom component – Filter for an assignee Option 2 – EventListeners
Scrum BoardCustom component – Filter for an assignee ... andwhatwewanttoachieveis ... iftask.getAssignee() == filteredUser.get() thenopacity = 1.0 elseopacity = 0.5 iffilteredUser.get() == null thenopacity = 1.0 settheopacity opacityProperty filteredUserProperty UserFX Double
Scrum BoardCustom component – Filter for an assignee WhenfilteredUserchangeswechangetheopacity Set theopacity
ScrumBoard in sync: YouTube Video
SynchronizationPrinciple Remote Binding DoubleProperty DoubleProperty Double Double
SynchronizationPrinciple Client Client Presentation Model (FX) PresentationModel (FX) Server Bidirectional Binding Bidirectional Binding PresentationModel (FX)
SynchronizationPrinciple Client 1 DoublePropertypositionX; DoublePropertypositionX; Server Bidirectional Binding DoublePropertypositionY; DoublePropertypositionY;
SynchronizationPrinciple Client 1 Client 2 DoublePropertypositionX; DoublePropertypositionX; DoublePropertypositionX; Server Bidirectional Binding DoublePropertypositionY; DoublePropertypositionY; DoublePropertypositionY;
SynchronizationImplementation SharedPresentation Model
SynchronizationImplementation Server Create PropertyBased Model Create the Server Escalation Start
SynchronizationImplementation Client Create Client Oncereceived, youcanuseit Connect
Synchronization remote databinding simple API Contribute https://github.com/saxsys/SynchronizeFX