Thursday, December 29, 2011

Sneaking a Peek at JavaFX 2.1 Beta

It was announced earlier this month that the JavaFX 2.1 Developer Preview Edition (early access) for Windows is available for download (previously available for Mac). In the post JavaFX 2.1 early access for Windows (build 06) now available, Jonathan Giles writes as a feedback comment that this new version of JavaFX includes "new charts and a new ComboBox control." He also points out that "there isn’t a public list of highlights yet." Not being known for my patience, I couldn't resist taking a peek at JavaFX 2.1 to see what nice surprises lie in store.

One quick and dirty method I like for a first cut at looking at changes in APIs is to run my simple Groovy script diffVersionsJavadocs.groovy against two versions of Javadoc. The latest version of this simple script is shown next.

diffVersionsJavadocs.groovy
#!/usr/bin/env groovy
// diffVersionsJavadocs.groovy
//
// This simplistic script compares two versions of online Javadoc documentation
// to identify new or removed constructs from one version to the other.
//
// Example comparing Guava Release 10 to Guava Release 11:
//
// Guava Release 10:
//    http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/allclasses-noframe.html
// Guava Release 11:
//    http://docs.guava-libraries.googlecode.com/git/javadoc/allclasses-noframe.html
//
//
// Example comparing JavaFX 2.0 to early access version of JavaFX 2.1 (Windows)
//
// JavaFX 2.0:
//    http://docs.oracle.com/javafx/2.0/api/allclasses-noframe.html
// JavaFX 2.1 (Early Access)
//    file:///C:/javafx-2_1-api/allclasses-noframe.html 

if (args.length < 4)
{
   println "\nUSAGE: diffVersionsJavadocs first_label first_url second_label second_url"
   println "\n\twhere first_label is name of first version"
   println "\t      first_url is URL of Javadoc for first version (usually allclasses-noframe)"
   println "\t      second_label is name of second version"
   println "\t      second_url is URL of Javadoc for second version (usually allclasses-noframe)"
   System.exit(-1)
}
@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')

def firstXml = new XmlParser(new org.ccil.cowan.tagsoup.Parser()).parse(args[1])
def firstUrls = firstXml.'**'.a.@href
def firstLabel = args[0]

def secondXml = new XmlParser(new org.ccil.cowan.tagsoup.Parser()).parse(args[3])
def secondUrls = secondXml.'**'.a.@href
def secondLabel = args[2]

compareSetsOfStrings(secondUrls, secondLabel, firstUrls, firstLabel)

/**
 * Compare first Collection of Strings to second Collection of Strings by
 * identifying which Strings are in each Collection that are not in the other.
 *
 * @param firstStrings First Collection of Strings to be compared.
 * @param firstLabel Name of first collection of Strings.
 * @param secondStrings Second Collection of Strings to be compared.
 * @param secondLabel Name of second collection of Strings.
 */
def void compareSetsOfStrings(
   Collection<String> firstStrings, String firstLabel,
   Collection<String> secondStrings, String secondLabel)
{
   println "Constructs in ${firstLabel} But Not in ${secondLabel}"
   def firstButNotSecond = firstStrings - secondStrings
   printIndentedStrings(firstButNotSecond)

   println "Constructs in ${secondLabel} But Not in ${firstLabel}"
   def secondButNotFirst = secondStrings - firstStrings
   printIndentedStrings(secondButNotFirst)
}


/**
 * Print the provided Strings one per line indented; prints "None" if the
 * provided List of Strings is empty or null.
 *
 * @param strings The Strings to be printed
 */
def void printIndentedStrings(Collection<String> strings)
{
   if (!strings?.isEmpty())
   {
      new TreeSet(strings).each
      {
         println "\t${it}"
      }
   }
   else
   {
      println "\tNone"
   }   
}

In this case, I was not able to find the JavaFX 2.1 API documentation publicly available online, so I downloaded the Windows Developer Preview and used the local JavaFX 2.1 API documentation that is included in the download to compare with the publicly available JavaFX 2.0 API documentation. I ran the script as shown in the next screen snapshot.

For convenience and "searchability" purposes, I have included the script's output as text next. The top section shows what I was mostly interested (new constructs in JavaFX 2.1), but the lower section is interesting because there are a surprising number of constructs that were in JavaFX 2.0 Javadoc that are no longer (at least as of now) in teh JavaFX 2.1 Javadoc.

  • Constructs in JavaFX 2.1 But Not in JavaFX 2.0
    • javafx/beans/WeakListener.html
    • javafx/collections/ObservableSet.html
    • javafx/collections/SetChangeListener.Change.html
    • javafx/collections/SetChangeListener.html
    • javafx/collections/WeakListChangeListener.html
    • javafx/collections/WeakMapChangeListener.html
    • javafx/collections/WeakSetChangeListener.html
    • javafx/concurrent/WorkerStateEvent.html
    • javafx/scene/ParentDesignInfo.html
    • javafx/scene/chart/StackedAreaChart.html
    • javafx/scene/chart/StackedAreaChartBuilder.html
    • javafx/scene/chart/StackedBarChart.html
    • javafx/scene/chart/StackedBarChartBuilder.html
    • javafx/scene/control/ComboBox.html
    • javafx/scene/control/ComboBoxBase.html
    • javafx/scene/control/ControlDesignInfo.html
    • javafx/scene/control/SplitPaneDesignInfo.html
    • javafx/scene/input/ContextMenuEvent.html
    • javafx/scene/input/MouseDragEvent.html
    • javafx/scene/layout/GridPaneDesignInfo.html
    • javafx/scene/layout/PaneDesignInfo.html
    • javafx/stage/DirectoryChooser.html
    • javafx/stage/DirectoryChooserBuilder.html
  • Constructs in JavaFX 2.0 But Not in JavaFX 2.1
    • javafx/concurrent/ServiceBuilder.html
    • javafx/event/EventBuilder.html
    • javafx/event/EventTypeBuilder.html
    • javafx/scene/chart/AxisBuilder.html
    • javafx/scene/chart/CategoryAxisBuilder.html
    • javafx/scene/chart/NumberAxisBuilder.html
    • javafx/scene/chart/ValueAxisBuilder.html
    • javafx/scene/control/AccordionBuilder.html
    • javafx/scene/control/ButtonBaseBuilder.html
    • javafx/scene/control/ButtonBuilder.html
    • javafx/scene/control/CellBuilder.html
    • javafx/scene/control/CheckBoxBuilder.html
    • javafx/scene/control/CheckMenuItemBuilder.html
    • javafx/scene/control/ChoiceBoxBuilder.html
    • javafx/scene/control/ContextMenuBuilder.html
    • javafx/scene/control/ControlBuilder.html
    • javafx/scene/control/CustomMenuItemBuilder.html
    • javafx/scene/control/HyperlinkBuilder.html
    • javafx/scene/control/IndexRangeBuilder.html
    • javafx/scene/control/IndexedCellBuilder.html
    • javafx/scene/control/LabelBuilder.html
    • javafx/scene/control/LabeledBuilder.html
    • javafx/scene/control/ListCellBuilder.html
    • javafx/scene/control/ListViewBuilder.html
    • javafx/scene/control/MenuBarBuilder.html
    • javafx/scene/control/MenuBuilder.html
    • javafx/scene/control/MenuButtonBuilder.html
    • javafx/scene/control/MenuItemBuilder.html
    • javafx/scene/control/MultipleSelectionModelBuilder.html
    • javafx/scene/control/PasswordFieldBuilder.html
    • javafx/scene/control/PopupControlBuilder.html
    • javafx/scene/control/ProgressBarBuilder.html
    • javafx/scene/control/ProgressIndicatorBuilder.html
    • javafx/scene/control/RadioButtonBuilder.html
    • javafx/scene/control/RadioMenuItemBuilder.html
    • javafx/scene/control/ScrollBarBuilder.html
    • javafx/scene/control/ScrollPaneBuilder.html
    • javafx/scene/control/SeparatorBuilder.html
    • javafx/scene/control/SeparatorMenuItemBuilder.html
    • javafx/scene/control/SliderBuilder.html
    • javafx/scene/control/SplitMenuButtonBuilder.html
    • javafx/scene/control/SplitPaneBuilder.html
    • javafx/scene/control/TabBuilder.html
    • javafx/scene/control/TabPaneBuilder.html
    • javafx/scene/control/TableCellBuilder.html
    • javafx/scene/control/TableColumnBuilder.html
    • javafx/scene/control/TablePositionBuilder.html
    • javafx/scene/control/TableRowBuilder.html
    • javafx/scene/control/TableViewBuilder.html
    • javafx/scene/control/TextAreaBuilder.html
    • javafx/scene/control/TextFieldBuilder.html
    • javafx/scene/control/TextInputControlBuilder.html
    • javafx/scene/control/TitledPaneBuilder.html
    • javafx/scene/control/ToggleButtonBuilder.html
    • javafx/scene/control/ToggleGroupBuilder.html
    • javafx/scene/control/ToolBarBuilder.html
    • javafx/scene/control/TooltipBuilder.html
    • javafx/scene/control/TreeCellBuilder.html
    • javafx/scene/control/TreeItemBuilder.html
    • javafx/scene/control/TreeViewBuilder.html
    • javafx/scene/control/cell/PropertyValueFactoryBuilder.html
    • javafx/util/PairBuilder.html

We can see from the output above that there is, as of now, a new DirectoryChooser, the already-mentioned new ComboBox control, two new chart types (StackedBarChart and StackedAreaChart), and several new collections listeners. The long list of constructs that are no longer part of JavaFX (as of now for JavaFX 2.1) are all, probably not coincidentally, "builders." UPDATE: Jonathan has pointed out the "builders" are actually in JavaFX 2.1 and were only omitted at one time from the JavaFX 2.1 Javadoc documentation. Based on this, I have striked-out that portion of the output above.

The Jonathan Giles post warns that this early access beta release of JavaFX 2.1 should not be used for production systems, but it is interesting to get a glimpse of what is to come. Perhaps as important as the new features and classes themselves is the fact that updates are occurring.

6 comments:

Jonathan Giles said...

Thanks for summarising the new API. Also, good catch on the lack of builder API for charts / controls. This is actually an oversight that I will fix now - when we moved to open sourcing this code, we must have missed updating the scripts to generate the builders for the open source code.

Jonathan Giles said...

Actually, the Builders are being generated (and are in the downloaded jfxrt.jar) - they just aren't in the JavaDoc that is generated. I've fixed this now. Again, thanks for pointing this out.

Jonathan Giles said...

Also, just to complete the spamming - we are on a weekly schedule for promoted builds. JavaFX 2.1 b07 is already available for download, and of course the UI controls code is already open source and all development is visible as soon as it is pushed to the repo.

@DustinMarx said...

Jonathan,

Thanks for the updates and for taking the time to write these responses. I have updated my post based on your findings. I also appreciate notice of the newest releases of JavaFX.

I have been a skeptic of JavaFX in the past, but cannot help but be excited about JavaFX since the JavaOne 2010 and 2011 announcements and since starting to use Java FX 2.x.

Dustin

Jonathan Giles said...

At a lower level, it would be very cool if you could improve your script to compare each class (for classes that exist in both releases) to see what has been added or removed between releases. This would reveal a lot more about the changes we're making.

Noel Grandin said...

Eclipse has a set of tools for managing API's.

The tools are here:
http://www.eclipse.org/pde/pde-api-tools/

And instructions for generating an API comparison is here:
http://wiki.eclipse.org/API_Comparison_demo