Interview on jaxenter.de

I was interviewed by Hartmut Schlosser of jaxenter.de last week and this week the article was published (in German) on their website. You can find it here: https://jaxenter.de/javafx-java9-javascript-56083. The interview was embedded in the “JavaFX Sixpack” series that tries to evaluate the potential of JavaFX. Hartmut was kind enough to also include information on my two commercial JavaFX frameworks CalendarFX and FlexGanttFX.

JavaFX Tip 25: Use FXSampler!

The Problem

As a framework developer it is essential to have an easy way to individually test the appearance of and the interaction with each custom control. I really hate it when I first have to open five different screens before I finally get to my new control so that I can test it. Not only is it annoying but it also costs too much time. When doing UI work you constantly make changes to your controls and look at the impact of those changes. If a single change roundtrip (code, launch, test) takes 5 minutes then you can only squeeze 12 change iterations into an hour, making slow progress. If it takes 1 minute then you are looking at 60 iterations and fast progress. As simple as that.

The Solution

Luckily the ControlsFX project contains a very nice subproject called FXSampler, which is a generic sampler application for any JavaFX framework. I am currently using it for FlexGanttFX and CalendarFX. The screens below show the individual CalendarFX samples in a hierarchical tree structure on the left-hand side. The selected sample shows up in the center pane. In this case it is showing the view used for visualizing a calendar entry on a weekday. The property sheet on the right-hand side allows the user to edit the properties of the selected control. It should be noted that the right-hand side can show any kind of control for interacting with the sample, it doesn’t have to be a property sheet. However, very often the property sheet is the fastest way of coming up with a good way of manipulating the control.

The center pane has several tabs. The first one shows the actual sample. The second one displays the javadocs / API of the control. Ideally each sample shows exactly the API of the featured control and not just the index page of the entire framework API. Which page gets loaded into this tab can be configured individually for each sample.

The next tab is used for showing source code. This can be any code that you find relevant for the sample but in my case I always show the code of the sample itself.

Tab number four contains CSS styling information that is relevant for the selected sample. If your control overrides the getUserAgentStylesheet() method then the tab should display the stylesheet that is returned by this method. In CalendarFX all controls inherit from CalendarFXControl which does override this method and always returns “calendar.css”. So in this case there is only a single large CSS file and that is what is being displayed here.

The Setup

For my frameworks and projects I usually work with a multi-module Maven setup and add a separate module just for the samples. The pom.xml file of this module has to contain a dependency to FXSampler like this:

[fusion_builder_container hundred_percent=”yes” overflow=”visible”][fusion_builder_row][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]

<dependency>
   <groupId>org.controlsfx</groupId>
   <artifactId>fxsampler</artifactId>
   <version>1.0.9</version>
</dependency>

The next thing needed is a class that represents the sampler project. The class has to implement the fxsampler.FXSamplerProject interface. It is used to specify a project name, a base package, and a welcome page. The code below shows the implementation of this interface as it was done for CalendarFX.

[/fusion_builder_column][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]

package com.calendarfx.demo;

import fxsampler.FXSamplerProject;
import fxsampler.model.WelcomePage;

public class CalendarFXSamplerProject implements FXSamplerProject {

   @Override
   public String getProjectName() {
      return "CalendarFX";
   }

   @Override
   public String getSampleBasePackage() {
      return "com.calendarfx.demo";
   }

   @Override
   public WelcomePage getWelcomePage() {
      return new CalendarFXSamplerWelcome();
   }
}

Welcome Page

The welcome page is optional and allows you to specify a title for the sampler and to show a UI that will be presented to the user when the sampler application starts up. The CalendarFX sampler shows a simple “about message”.

Base Package

FXSampler will use the “base package” to find all classes that are samples. FXSampler will place the samples found in the base package at the top of the navigation tree on the left-hand side of its window. Samples found in sub packages will end up in a tree node. The image below shows the package structure of the CalendarFX sampler project.

The base package for CalendarFX is com.calendarfx.demo and because the “day entry view” sample was found inside the entries package it means that the sample will be displayed in a tree node called “Entries”. The next image shows how the navigation tree reflects the package structure.

You will notice that the samples are all prefixed with “Hello…”. This is simply a convention I inherited from the ControlsFX project. There is no technical reason for it.

The Samples

A class becomes a sample if it implements the fxsampler.Sample interface. But it is even better if the class extends from fxsampler.SampleBase. The clever thing about this class is that it extends from Application, which means that each sample can also be run standalone.

A sample defines / contains the following things:

  • The name of the sample (in our example “Day Entry View”).
  • A short description of the sample / the control (what does it do? what is it used for?).
  • The name of the project that is belongs to.
  • The project version (e.g. 8.4.0).
  • A node that will be placed in the center pane and that displays the custom control.
  • A control panel for manipulating / interacting with the sample (right-hand side, often a property sheet).
  • The position of the control panel divider handle (based on the width requirements of the control panel).
  • The URL to the JavaDocs (I always point to the docs on my server).
  • The URL to the stylesheet that is relevant for the sample.
  • The URL to the source code of the sample.
  • A flag to indicate if the sample is currently visible (good for hiding samples that are still work-in-progress).

The Launcher

To run the sampler project we need a class with a main() method that extends the JavaFX Application class. Luckily FXSampler ships a class called fxsampler.FXSampler. For CalendarFX it looks like this:

[/fusion_builder_column][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]

package com.calendarfx.demo;

import fxsampler.FXSampler;
import javafx.stage.Stage;

public class CalendarFXSampler extends FXSampler {

   @Override
   public void start(Stage primaryStage) throws Exception {
      super.start(primaryStage);
   }

   public static void main(String[] args) {
      FXSampler.main(args);
   }
}

You will notice that the launcher does not reference / instantiate any specific sampler project. You would normally expect to see the  launcher create an instance of CalendarFXSamplerProject but its’ main() method simply delegates to the main() method of FXSampler. So how does it find anything?

The Service Provider

The answer is simple but not something that every Java developer has encountered in their day to day coding routine. FXSampler finds the sampler project because it will be registered as a “service provider”. This is done by adding a file to the directory META-INF/services. The file name has to be fxsampler.FXSamplerProject. Inside the file we add the full class name of the sampler project. FXSampler can now lookup all service providers that implement the FXSamplerProject and instantiate them. This allows FXSampler to show the samples found in several JARs at the same time. If I wanted to I could create a single application showcasing the samples found in FlexGanttFX, CalendarFX, and ControlsFX at the same time. The image below shows the location of the service provider file and its content inside the CalendarFXSampler module.

The Executable

When you download CalendarFX or FlexGanttFX you will see that the distributions include the sampler projects (inside “demos” folder). They were added as executable / runnable JAR files. The required Maven configuration for building them looks like this:

[/fusion_builder_column][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]

<build>
   <plugins>
      <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <version>2.4</version>
         <configuration>
            <finalName>sampler-demo</finalName>
            <appendAssemblyId>false</appendAssemblyId>
            <descriptorRefs>
               <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
               <manifest>
                  <mainClass>com.calendarfx.demo.CalendarFXSampler</mainClass>
               </manifest>
            </archive>
         </configuration>
         <executions>
            <execution>
               <id>make-samples</id>
               <phase>package</phase>
               <goals>
                  <goal>single</goal>
               </goals>
            </execution>
         </executions>
      </plugin>
   </plugins>
</build>

Conclusion

I highly recommend using FXSampler and making it a habbit to add a sample for every custom control you write, no matter if you are a working on a framework or an application. The benefits of being able to quickly test a control in a controlled environment greatly outweighs the overhead of creating and maintaining the sample.

Happy coding everyone![/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

JavaFX Real-World Apps: SkedPal

skedpal logo v152

A new entry in the “Real World Applications” series. This time it is SkedPal, an application for managing a busy person’s life intelligently. I have been consulting the SkedPal team in matters related to JavaFX and also when they made the decision to start using the CalendarFX framework for their calendar requirements. Below you can see a couple of screenshots of this attractive application. If you want to try it out yourself then you can simply register on the SkedPal website and download the desktop client (they also have mobile clients).

Screen Shot 2016-04-01 at 10.17.33

Screen Shot 2016-04-01 at 11.24.25

Screen Shot 2016-04-01 at 11.24.10

I have asked Saied ArBabian, the found of SkedPal to answer a couple of questions related to their product, their development, and (of course) their use of and thoughts about JavaFX.

General Questions

What is the name of your product / project?

SkedPal

Who are your users / customers?

SkedPal is a publicly downloadable application made for busy professionals who need to schedule their work in order to better manage their time.

What is the purpose of your software? What are its benefits?

SkedPal’s key objective is to assist busy professionals to deliver their projects on time by scheduling all their work intelligently. It’s a SOA cloud-based application that includes a Narrow Artificial Intelligence scheduling engine in the cloud with a JavaFX client for the desktop and an iOS companion app.

Is the application operational? If yes, since when. If not when do you plan to go live?

We’re in public Beta since 2014. We’re into our 3rd pivot and getting closer to the sweet spot for our users.

Development

How did you get the necessary JavaFX Know-How into your team? (Consultants, Internal / External training courses)?

The team was familiar with Swing and it didn’t take too long to get on board with JavaFX in order to deliver the first version. The training process was internal.

With which version of JavaFX did you start? 1, 2, 8?

Started with version 2.

When did you start developing the application and how long did it take?

We have released two versions so far, and we’re in the middle of our third version. We started in late 2013, and had our first version released in Oct 2014. The second version was released in Jun 2015.

How many developers worked on it? In total and on the UI.

5 Developers in total. 2 exclusively on the UI.

How big is the application? Lines of code, Number of classes.

Lines of Code: 132,000, No. of Classes: 860

How big is the JavaFX client? Lines of code, Number of classes.

Lines of Code: 76,000, No. of Classes: 548

Why did you choose JavaFX as frontend technology? And very importantly: why did you not choose HTML / Web?

Our team’s experience was primarily in Java so in order to immediately get started to deliver a front-end application, it was a natural decision to go for JavaFX. In hindsight, a stronger developer community as it exists for HTML/Web could have been a huge help.

Was it difficult to convince decision makers to agree on JavaFX?

No, decisions in startups are made faster and easier than in enterprise environments.

What were the biggest challenges / problems / issues / bugs you faced in the JavaFX part and how did you solve them?

The high memory consumption of JavaFX was particularly a trouble area for us. The only way to resolve it was to consider the performance constraints in our next iteration design and limit our design to what works.

Which 3rd-party products / frameworks / tools (open source and commercial) did you use and why did you choose them?

Initially we used the MiG Java Calendar which was based on Swing code, and then we switched to CalendarFX for its better UI design and use of JavaFX instead of Swing. We developed our own MVVM framework to support our Service Oriented Architecture. It turned out to be a huge project of its own, and we might open source it at some point to contribute to the JavaFX developer community.

Did you mix JavaFX and Swing code?

Initially yes when we used MiG Java Calendar.

Outlook

Would you use JavaFX again for your next project? Please elaborate why or why not.
Which recommendations do you have related to JavaFX for other companies / projects?

We have made a significant investment in JavaFX technology both in terms of team’s experience over the years, as well as development of a complex MVVM framework. This is a strong reason to stay with JavaFX. On the other hand, we really envy the strong developer community that exists for the web apps and we can see how fast development can become once you have access to such communities with large portfolio of open source codes.

In addition, we’re facing severe issues when our users do not opt to update their client to the latest version. Distribution of JavaFX applications for Internet users is a lot more challenging than web based applications.

Which features would you like to see being added to JavaFX?

We’d like to see better performance (speed and memory.)

Do you plan to provide a mobile version of your application or a mobile addition?

We already have a native (Objective C) iOS app integrated into our SOA architecture. The mobile app and the JavaFX desktop apps work in tandem very well in our MVVM framework.

FlexGanttFX 1.6 Released

Version 1.6 of FlexGanttFX has been released today. It contains the usual bug fixes and minor enhancements but also several new controls. It can be downloaded here.

Gantt Chart Lite

When doing some consulting at Emirates Airlines in Dubai the users and I came to the conclusion that the Gantt chart in their application doesn’t really need a tree table view on its left-hand side. All it was used for was to show the name of the resource in each row. The users complained about the wasted space as every pixel on the screen matters for their work. So we decided to get rid of the table. Fortunately the GanttChart control in FlexGanttFX supports different “display modes”. One of them (DisplayMode.TABLE_ONLY) hides the table view. We started with that but then realized that we could save memory, increase performance, and simplify the API if we got rid of the tree table view altogether. So a new control was born and it is called GanttChartLite, which inherits from the new base class called GanttChartBase. The “lite” version only consists of the timeline and the graphics area. The screenshot below shows you the result of this work.

Capture

Containers

A new Gantt chart control also requires new containers for synchronizing multiple instances of it. The already existing “dual” and “multi” Gantt chart containers are now mirrored by “dual lite” and “multi lite” containers. While working on the containers it became obvious that a third container type would be useful: the “quad” container displays four Gantt charts at the same time and synchronizes the timeline scrolling between the two charts on the left-hand side and the two charts on the right-hand side. The screenshot below shows the new “quad lite” container as shown by the sampler application.

screenshot

The new container also implements a set of convenience methods that make it easy to toggle the visibility of the charts inside of it. The methods are called showSingleChart(), showHorizontalSplitScreen(), showVerticalSplitScreen(), showAllFour(). The transition between these states is done with an animation, so charts slide in and out very nicely.

The following is the complete list of the containers that ship with FlexGanttFX 1.6:

  • DualGanttChartContainer
  • DualGanttChartLiteContainer
  • MultiGanttChartContainer
  • MultiGanttChartLiteContainer
  • QuadGanttChartContainer
  • QuadGanttChartLiteContainer

Filtering

A feature that was requested a few times before was “activity filtering”. One way to accomplish this is to place activities on different layers and then show / hide the layers. However, sometimes the layers are already used for other purposes, e.g. to place “my” activities on top of the activities of “others”. So a more explicit way of filtering was needed. In version 1.6 a predicate-based filter was added to the graphics control.

GraphicsBase.setActivityFilter(Predicate filter);

This filter acts only on the UI layer, it does not have any impact on the activity repositories in any way. The repositories still return all activities but the UI uses the filter predicate to decide if an activity should be painted or not.

Bugs

The following are the fixed bugs that were reported:

  • [fusion_builder_container hundred_percent=”yes” overflow=”visible”][fusion_builder_row][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”][FLEXFX-202] – GraphicsHeader taken only when creating Skin
  • [FLEXFX-277] – Activity “lost” if dragged to a timeline horizon boundary
  • [FLEXFX-292] – Marker lines have wrong height when graphics area resizes
  • [FLEXFX-294] – Dragged activity sometimes not drawn at cursor location
  • [FLEXFX-297] – Link rendering broken when target outside viewport
  • [FLEXFX-298] – Deleting activities with links does not work properly

New Features

Features that were requested and implemented:

  • [FLEXFX-291] – Activity Filter
  • [FLEXFX-295] – Add property to enable / disable the lasso functionality
  • [FLEXFX-296] – Containers for synchronizing multiple graphics (Dual/MultiGanttChartLiteContainer)

Improvements

General nice-to-have improvements:

  • [FLEXFX-103] – Remove timeline completely from Gantt charts with a position other than FIRST or ONLY.
  • [FLEXFX-299] – Fire single event while setting activity selection

Misc

This new release of FlexGanttFX defines a dependency to the latest ControlsFX release, version 8.40.11. However, the framework should work fine with older versions of ControlsFX, too. 8.40.10 for sure. 8.40.9 would require some testing.[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

FlexGanttFX 1.5 Released

The maintenance release 1.5 of FlexGanttFX has been released today. It contains several bug fixes and enhancements. The complete list can be found below. To download this version simply follow this link.

Release Notes – FlexGanttFX – Version Release 1.5.0

Bug

  • [fusion_builder_container hundred_percent=”yes” overflow=”visible”][fusion_builder_row][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”][FLEXFX-198] – Activity link is shown incorrectly when one of the activities is out of view
  • [FLEXFX-236] – Rendering of a link between adjacent activities
  • [FLEXFX-260] – Unable to load Gantt with the same dateline when it is already loaded. Like a refresh.
  • [FLEXFX-267] – Correct Visible Time in FlexGantt
  • [FLEXFX-271] – Marker lines stay visible when no rows in Gantt chart
  • [FLEXFX-272] – Vertical cursor line not visible on all gantts for multi container
  • [FLEXFX-273] – Vertical cursor not visible in multi Gantt chart container
  • [FLEXFX-274] – ChartLayout.toString() throws NPE
  • [FLEXFX-276] – Unused rows of tree table views have wrong height
  • [FLEXFX-283] – Exception thrown when mixing with Swing / Drag and Drop
  • [FLEXFX-285] – TimeTracker starts tracking when calling setDelay()
  • [FLEXFX-288] – Impossible to perform same activity editing operation twice without first moving the mouse
  • [FLEXFX-290] – Memory leak in ScaleLayer draw

New Feature

  • [FLEXFX-279] – Add toggle to disable automatic redrawing of activities after repository change events.

Improvement

  • [FLEXFX-107] – Do not create link nodes if they will not be visible anyways
  • [FLEXFX-259] – InnerLinesLayer: support line dashes
  • [FLEXFX-280] – ActivityBase ID uses slow UUID identifier
  • [FLEXFX-281] – Support horizontal scrolling with mouse wheel
  • [FLEXFX-282] – Improve performance in model classes.
  • [FLEXFX-284] – Use “shortcut” modifier instead of hard-code CTRL key
  • [FLEXFX-286] – Vertical dragging of activities is very slow
  • [FLEXFX-287] – Bad rendering performance when dragging activities with DnD.

[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

Never too old to learn!

Yesterday (March 16th) I celebrated my 47th birthday. I am now packing a solid 20 years of work experience and a masters degree in computer science. Still I managed to screw up bad.

A potential customer of mine, who is currently evaluating FlexGanttFX for their application, contacted me and argued that the initial model creation takes too long. 22 seconds to be precise. I asked them to send me a standalone demo and when I ran it I could confirm that it takes a long time to create the model. After further investigation I realized that they were creating over 5 million objects (activities that will be placed on the timeline). All of these objects are then inserted into a balanced binary interval tree. When I saw that I basically told them to stop evaluating FlexGanttFX because it will not be able to handle these many objects and that object creation and the tree modifications do take their time. So the basic message I sent was “Go somewhere else. Fu.. off!”.

However, they also included a snapshot of the profiler they used and I could see that most of the time was spent inside the constructor of the base model class “ActivityBase” and not inside the tree modifications (which I found surprising). After some more research I realized that it was primarily the creation of the activity ID, which is of type String and uses UUID.randomUUID(). So I replaced this logic with a simple counter of type Long. After this change the total time went from 22 seconds to 8. Nice! But it got even better.

To be on the safe side I made sure that the start and end times of my activities are initialized with Instant.now(). However, there was no need for that as those times are usually passed to the activity in the constructor or after creation by calling setStart/EndTime(). After this change the total loading time went down to 7 seconds.

Since the problem at hand was to create a lot of objects very fast I decided to change the initial heap size allocated to the program to 2 Gigabytes. This brought down the loading time to 2 seconds.

From 22 seconds to 2 after 10 minutes of work, not bad! However, quite embarrassing considering the initial “Fu.. off!” 🙂

 

FlexGanttFX 1.4.0 Released!

I am very happy to announce that I have released version 1.4.0 of FlexGanttFX for JavaFX. This release contains bug fixes and small improvements. I am glad to say that FlexGanttFX has proven itself in the field and is operational in various large enterprise applications. Some of its more prominent users are:

  • Emirates Airlines
  • European Broadcasting Union
  • Airbus
  • PSI Poland

The following are a couple of screenshots from these applications.

ScreenShot005

PSI Poland

Bildschirmfoto 2015-12-19 um 12.28.15

European Broadcasting Union

Gantt-Split-4up

Emirates Airlines

mintpage

MINT Software Systems

 

JavaFX Real-World Apps: PSI Advanced Scheduling and Monitoring

I am happy to announce that there is a new entry for the “Real-World Apps” list. The company PSI has developed an application for “advanced scheduling and monitoring”.

csm_psi-logo_10dd240e3c

The software will be used by the manufacturing industry. The screenshots look quite polished and attractive. PSI is one of the earliest adopters of FlexGanttFX, my JavaFX framework for visualizing schedules of any kind.

PSIasm_01

PSI – Operation Gantt

PSIasm_02

PSI – Operation Detail

PSIasm_03

PSI – Production Order

PSIasm_04

PSI – Report

PSIasm_05

PSI – Structural Gantt

As usual I have done an interview with the developers. Michal Bocian (Development Manager) and Dobieslaw Chabrzyk (MES Product Manager) of PSI were kind enough to provide the answers.

General Questions

What is the name of your product / project?

PSI Advanced Scheduling and Monitoring

Who are your users / customers?

Customers: manufacturing industry in following areas:

  • Serial production
  • Metal re-working
  • Made-to-order constructions

Users:

  • Production schedulers
  • Shop floor stuff
  • Production managers

What is the purpose of your software? What are its benefits?

Purpose:

  • Scheduling and execution monitoring of production process

Benefits:

  • Reduce manufacturing costs
  • Reduce work in process
  • Improve customer service
  • Lower implementation and maintenance costs compared to existing IT solutions

Is the application operational? If yes, since when. If not when do you plan to go live?

Official go to market is planned for April 2016.

How big is the budget for your project?

A few hundred thousand euros.

Development

How did you get the necessary JavaFX Know-How into your team? (Consultants, Internal / External training courses)?

Mostly from the Internet (StackOverflow, Official APIs etc).

With which version of JavaFX did you start? 1, 2, 8?

JavaFX 8.

When did you start developing the application and how long did it take?

We started the development around April 2014. The development lasts till now.

How many developers worked on it? In total and on the UI.

We have 5 developers working on both server and client side.
We have 1 developer who is adjusting our CSS.

How big is the application? Lines of code, Number of classes.

230,000 Lines of Code, 2000 Classes.

How big is the JavaFX client? Lines of code, Number of classes.

190,000 Lines of Code, 1600 Classes.

Why did you choose JavaFX as frontend technology? And very importantly: why did you not choose HTML / Web?

PSI is specialized in creating applications based on the Java platform. JavaFX is the natural successor of Swing. We were considering HTML / Web for the frontend – but because of limited performance we had to give up for now. Our application needs to hold about 500,000 complex domain objects in memory to perform extraordinary parallel calculations on them.

Was it difficult to convince decision makers to agree on JavaFX?

No, it was easy. Our company is specialized in Java technology – especially in Swing. JavaFX is the choice for company like ours.

What were the biggest challenges / problems / issues / bugs you faced in the JavaFX part and how did you solve them?

We’ve found some bugs in JavaFX but none of them were critical nor major. We reported them on JavaFX’s bugtracker, and we are waiting for the fixes. Meanwhile we did some temporary workarounds.

Which 3rd-party products / frameworks / tools (open source and commercial) did you use and why did you choose them?

  • FlexGanttFX – because of modularity, quality and performance.
  • Eclipse E4 – because of window manager and dependency injection.

Did you mix JavaFX and Swing code?

We’ve tried it once, but we had to give up. It is stable when used in static layouts, but when the user tries to perform complex interactions with the UI, many unusual bugs take place.

Outlook

Would you use JavaFX again for your next project? Please elaborate why or why not.

In our case JavaFX was the only choice we had. Our application needs a lot of memory and it has to be multithreaded. If you combine these two requirements with the server written in JavaEE – JavaFX is the only choice. If our application had different non-functional requirements we would probably create our application in HTML/Web.

Which recommendations do you have related to JavaFX for other companies / projects?

If you consider JavaFX as your potential platform, check if all the special and non-standard UI requirements are meet.

Which features would you like to see being added to JavaFX?

At the moment we are suffering from a lack of good date and time picker.

Do you plan to provide a mobile version of your application or a mobile addition?

Yes, but since our product needs a lot of resources, we plan to deliver simplified application (e.g. without interactive Gantt chart).