Steve On Java

Hacking JavaFX and Java with Agility
  • rss
  • Home
  • About
  • Contact
  • SvJugFX
  • Prize Spinner

Launching Hyperlinks from JavaFX (including Mobile)

steveonjava | March 4, 2010

Creating hyperlinks in JavaFX should be in the category of things that are trivially easy, but is complicated by various factors, such as deployment mode and Java version. First I will go into detail on all the different permutations of how you can launch links in a browser and under what circumstances each will work. Next I will give you a nice packaged solution that you can use as a library (if you are impatient, just skip to The Easy Way Out now).  Finally, I will show how you can do the same thing for JavaFX Mobile applications.

A Tale of 3 APIs

There are 3 different ways that you can launch hyperlinks in Java/JavaFX. Unfortunately, none of them work in all circumstances, so you need to know when to call each. Here is a quick reference table:

AppletStageExtensionWeb Start BasicServiceDesktop.browse
Works in AppletYesYesYes
Works in Web StartNoYesYes
Works in ApplicationNoNoYes
Works on Java 1.5YesYesNo
Can Set TargetYesNoNo
Default Target_self_blank_self

AppletStageExtension

The first option is to use the JavaFX AppletStageExtension. This is only available if you are running as an Applet, but also gives you the most control over how the hyperlink is launched.  In addition to a URL you can also specify a target, which can be any of the standard HTML targets including the following (excerpted from the AppletStageExtension javadocs):

Target ArgumentDescription
"_self"Show in the window and frame that contain the applet.
"_parent"Show in the applet’s parent frame. If the applet’s frame has no parent frame, acts the same as “_self”.
"_top"Show in the top-level frame of the applet’s window. If the applet’s frame is the top-level frame, acts the same as “_self”.
"_blank"Show in a new, unnamed top-level window.
nameShow in the frame or window named name. If a target named name does not already exist, a new top-level window with the specified name is created, and the document is shown there.

Web Start BasicService

The second option is to use the Web Start BasicService.  This works from both JavaFX Applets and Web Start applications, but does not let you specify the HTML target.  It is effectively the same as using the AppletStageExtension with a target of “_blank”.

Here is a small code excerpt showing how you would call the Web Start BasicService from your JavaFX code:

def basicService = ServiceManager.lookup("javax.jnlp.BasicService") as BasicService;
basicService.showDocument(new URL(url));

Desktop.browse

The third option is to use the new Desktop class introduced in Java 1.6.  This works from Applet, Web Start applications, and Standard Execution (within a desktop Frame).  Unfortunately, it did not exist in Java 1.5, so it won’t work from JavaFX without a little hacking.

The quick and dirty hack is to modify your JavaFX distribution to include the rt.jar from Java 1.6 as explained in this earlier post.  The only problem with this is you also have to get all the other developers on your project to do the same (and redo this on every upgrade).

The friendlier approach is to use reflection to check and see if the Desktop class is available, and then invoke the methods dynamically.  There is quite a bit more boilerplate code, but it will allow you to compile with a plain vanilla JavaFX installation, and also handle the odd case where someone is trying to run JavaFX under 1.5.  (Which is unsupported on Windows/Unix, but happens to be the only option for the poor lost souls with 32 bit chips who have been abandoned by Apple).

Since the code is easier to follow without reflection, I will show that first:

Desktop.getDesktop().browse(new URI(url));

And here is the munged version with reflection:

try {
    def desktopClazz = Class.forName("java.awt.Desktop");
    def desktop = desktopClazz.getMethod("getDesktop").invoke(null);
    def browseMethod = desktopClazz.getMethod("browse", [URI.class] as java.lang.Class[]);
    browseMethod.invoke(desktop, new URI(url));
} catch (e) {
    println("Upgrade to Java 6 or later to launch hyperlinks: {url}");
}

The Easy Way Out

When things are easy to do, they will get done right.  To make sure that JavaFX applications do not fall prey to broken and inconsistent linking, I put together a library for JFXtras that takes care of all the plumbing for you.

There is a new JFXtras class called BrowserUtil that has a very simple API:

BrowserUtil.browse(url);

or

BrowserUtil.browse(url, target);

It is that simple…  Conversion of string URLs to URL or URI objects, selection of the correct API based on your deployment mode, and failover modes based on the Java version are all included.

In addition, I created an extended Hyperlink called the XHyperlink.  This behaves identically to the built-in control, with the addition of simple configuration of URL navigation (this is what hyperlinks are designed for, right?)  The usage of the XHyperlink class is as follows:

XHyperlink {
    text: "Oracle's Homepage", url: "http://oracle.com/"}
}

All of this functionality will be included in the JFXtras 0.6 release.  If you need it now, you can build off the head of our repo.  Otherwise we are working on a release, which I will announce on this blog shortly which you can follow.

What about JavaFX mobile?

None of these desktop techniques actually work on a mobile device, so this is not a 100% solution yet.

Fortunately, there is also a solution for JavaFX Mobile if you are willing to delve in to the Java ME APIs.  To do this you first need to get a handle to the MIDlet like this:

def midlet = com.sun.javafx.runtime.adapter.MIDletAdapter.getMidlet();

And then you can call platformRequest to launch a browser on the mobile device:

midlet.platformRequest(url);

Note: This requires use of private APIs, so this may not work in future JavaFX releases.

It is not possible to merge this in with the desktop solution, because the JavaFX Mobile libraries do not exist on the desktop platform (and vice versa), but it is relatively easy to use this technique yourself by copying and pasting the above code sample into a helper function in your application.

 
Comments
2 Comments »
Categories
JavaFX, JavaFX Mobile, jfxtras
Tags
hyperlinks, JavaFX, JavaFX Mobile, jfxtras
Comments rss Comments rss
Trackback Trackback

JFXtras 0.6 Preview Available!

steveonjava | November 25, 2009

Happy Thanksgiving from the JFXtras team!  While everyone else is celebrating the holiday with friends and family, we are going to be busy finishing up the 0.6 release.

Wild turkey in LaConner, WA taken by stevevoght

In case you have some spare time between meals and celebration, you can join in the fun too by trying out the JFXtras 0.6 preview release, which can be downloaded here:

http://code.google.com/p/jfxtras/downloads/list

There is a whole slew of new functionality including the following under Common:

  • Layouts – Changes to the Grid API in preparation for inclusion in the JavaFX Soma release, and also added animation support to all the layouts.
  • Sphere – Pseudo 3D sphere created for the Groovy showdown with Andrey Almiray.
  • Gear – New shape from Steve Bixby.
  • ManualResizableRectangle – Very useful shape from Yannick’s post.
  • JXScene – Pedro’s improved API for Swing integration.
  • PaintUtil, HSBColor, new gradients – Liu’s magic paint classes
  • Custom Paints – From Jeff Friesen’s excellent article on Custom Paints.
  • Custom Cursors – From Jeff Friesen’s excellent article on Custom Cursors.
  • Wipe Library – A transition library from Simon Morris’ JavaFX in Action book.
  • XMap – A bindable Map implementation for JavaFX.
  • XStore – David Armitage’s simple persistence for JavaFX variables using dependency injection.
  • ImageCache – Caching of JavaFX images for building high performance applications contributed by Joshua Marinacci.
  • XEDT – Simplified event thread mangement for JavaFX infrastructure classes (Warning: Use the JavaFX Task API instead unless you know exactly what you are doing)

And the rest under a new Controls jar:

  • XTableView – I am still working on this, but it is very useful already as demonstrated by Jim Weaver’s SpeedReaderFX application.
  • XTreeView – Jim Clarke’s Tree Control.
  • XCalendarPicker – Tom’s excellent calendar control.
  • XPane – A titled region with rounded corners developed by Dean Iverson.
  • XPicker – David Armitage did some great work on this…  Check out his demo on the JFXtras website.
  • XShelfView – A high performance Display Shelf control implementation with support for reflection, titles, and a scrollbar as showcased on JFXStudio.
  • XSpinnerWheel – A prize spinner wheel that makes use of pseudo 3D effects as showcased in the JUG Prize Spinner application.
  • XMenu – Pure JavaFX Menu developed by Jonathan Giles (this version will be replaced by the official Sun Menu control when it becomes available).
  • XPasswordBox – Control from Liu to create a password field.
  • XMultiLineTextBox – Till’s control for editing multiple lines of text.
  • XSwingTable – From John Freeman, this gives you all the power of a JTable directly from JavaFX code.

For this release we decided to go with a new naming convention to differentiate our classes from the built-in JavaFX layouts and controls.  Most of the classes are now prefixed with an “X” for jfXtras.  This will make migration slightly more painful now, but prevent future collisions and name changes down the road.

There is also a new version of JFXtras Test.  This is the final version that will be released under this name (it is being merged with FEST-JavaFX), but it required an update to work with the new naming convention and to add some much-needed JUnit Runner support (see my Devoxx Conference Presentation for more details).

I probably missed a few things along the way here.  You can find the definitive list in the online JavaFXDoc:

http://jfxtras.googlecode.com/svn/site/javadoc/release-0.6/index.html

Please feel free to download the jars and give the preview release a try.  We are putting the finishing touches on several of the layouts and controls, so expect a final release in a week or so.

Happy Thanksgiving!

 
Comments
16 Comments »
Categories
Announcements, JavaFX, jfxtras
Tags
controls, JavaFX, jfxtras, layouts
Comments rss Comments rss
Trackback Trackback

Devoxx Conference Session Slides

steveonjava | November 24, 2009

Overall I was very impressed with Devoxx.  Everything including the movie theater venue, quality of the speakers, and professionalism of the attendees was top-notch.  Stephan Janssen definitely puts on quite an amazing show!

As a follow-up to my second Devoxx session, here is the full slide deck I presented:

Both this and the university session will be available on the Parleys.com beta site shortly, so you will be able to watch both sessions from the comfort of your home.

Now back to coding on the JFXtras 0.6 release with an announcement to be posted here very shortly…

 
Comments
2 Comments »
Categories
JavaFX, jfxtras, presentation
Tags
devoxx, JavaFX, jfxtras
Comments rss Comments rss
Trackback Trackback

Watch WidgetFX and JFXtras at the SDForum

steveonjava | August 5, 2009

Last night I presented at the SDForum Java SIG to a very engaged and enthusiastic crowd.  This was the longest presentation to date, but the audience was great, and even stayed afterwards to ask questions.  Also, Rich Rein was an outstanding host, inviting us out to drink beers until midnight after the event (I hope his wife wasn’t upset!)

This is my last presentation gig until Devoxx at the end of the year, but I was able to get a great screencast recording of the session, which you can watch in full resolution on blip.tv:

Please enable Javascript and Flash to view this Blip.tv video.

Note: The end of the presentation got cut off due to a technical glitch in Camtasia, but to their credit it recovered the bulk of the recording on restart.

You can also browse the slide decks at your own pace in PDF format:

Part A (JFXtras): SuperchargingWithJFXtras-SDForum

Part B (WidgetFX): SuperchargingWithWidgetFX-SDForum

I hope you enjoy the video and slides!

 
Comments
1 Comment »
Categories
Events, JavaFX, jfxtras, widgetfx
Tags
JavaFX, jfxtras, presentation, sdforum, widgetfx
Comments rss Comments rss
Trackback Trackback

JFXtras Community Site Launched!

steveonjava | July 21, 2009

jfxtras_portal_mockup_community_version_03

I am proud to announce the official launch of the JFXtras Community Site.  This site is a resource for the entire JavaFX community, and open for participation by all.

Just like the JFXtras open-source library has been helping improve the JavaFX Platform, this site is focused on helping to expand and grow the JavaFX Community.  Some things you can do on the site today include:

Explore -

Boundisizer-screenshot-300

The JFXtras Samples section is the largest JavaFX example repository outside of Sun, and is specifically focused on teaching JavaFX concepts from beginner to advanced.  Some of the featured samples include:

  • Amy Fowler’s Boundisizer – Learn how to transform and manipulate nodes like a champ from Amy Fowler, the acclaimed layout expert on the JavaFX team.
  • Music Explorer FX – You may not have won the 25 thousand dollar prize, but you can learn from the expert.  Sten Anderson has posted his winning entry, and promised to share the full source code shortly (no pressure, Sten!)
  • Particle-O-Rama – Josh Marinacci, JavaFX evangelist and Rockstar1, creates another visual extravaganza with his super-customizable particle demo.
  • Generating Graphs from Hudson – Mark Macumber posted a great mash-up of the JavaFX 1.2 Charting support to display Hudson build status.

The site is completely self-service, and provides free hosting of open-source JavaFX samples, so create an account and start contributing your own samples to grow the community!


1. Yes, it is official, Joshua Marinacci and I are JavaOne Rockstars!  Josh and I received the JavaOne Rockstar award for having a top ranked JavaOne session this year (thanks to everyone who attended our WidgetFX Session!)

Learn -

Through a collaborative effort from all the JavaFX book authors, we will be able to bring you the full set of samples from all 5 of the JavaFX books.  All the source code will be made available under a commercial-friendly open-source license, and the samples will be easily browseable online categorized by topic.

cover-100 JavaFXRIA-cover-100EssentialJavafx-cover-100 JavaFXInAction-cover-100JavaFXDevGuide-cover-100

What is on your bookshelf?

This includes all of the samples from Pro JavaFX Platform, which is finally out in print! — The full realization that I was an author didn’t come until this morning when my copies arrived… for a brief moment the gaping hole in my life for the past six months seemed (almost) worth it.

The Sun JavaFX and Essential JavaFX books have been out since JavaOne and are great references to get started coding in JavaFX.  These samples should be available within the next couple weeks.

Finally, the JavaFX in Action and JavaFX Developer’s Guide books are both due out later this year, and will post samples as soon as it makes sense to.

Research -

jfxtras_portal_mockup_community_version_22

There is also a new section called JFXtras Links brought to you by Jonathan Giles, famous for his weekly desktop links of the week feature on his blog.  The plan is to aggregate and categorize all the best JavaFX links and resources in a single place.

This section is still in its infancy, so please give us feedback and contribute links that you find valuable.

About the Site -

The JFXtras Community Site is built on the principles of collaboration and agility, and is backed by technologies that make this possible.  Everything is 100% Java from the application server (Tomcat) to the portal engine (Liferay).  Also, wherever possible customization and design was done via the online portal user interface so that future changes to the site (both minor and major) can be done by the community.

Most importantly, the JFXtras Community Site will be what you make of it.  Just like everything else we do on the JFXtras project, we are open to new ideas and ways of doing things.  If you have a great idea for how to improve one of the existing sections, or something else we should add to the site, let us know, or better yet, help us make it happen!

 
Comments
7 Comments »
Categories
Announcements, JavaFX, Liferay, jfxtras
Tags
community, JavaFX, jfxtras, Liferay
Comments rss Comments rss
Trackback Trackback

Speaking at the Oakland Java SIG

steveonjava | July 6, 2009

I will be presenting at the Oakland Java SIG on July 15th.  The topic is “Supercharging Your JavaFX Programs with WidgetFX and JFXtras,” and will include some brand new content based on the WidgetFX 1.2 and JFXtras 0.5 releases.

As usual, I will incur some significant demo risk for the sake of showing some jaw-dropping demo awesomeness!  You will either be totally impressed or get a good laugh at my expense…

If you are in the SF Bay Area, be sure to drop by and check it out!

 
Comments
1 Comment »
Categories
Events, JavaFX, jfxtras, widgetfx
Tags
jfxtras, oakland java sig, presentation, widgetfx
Comments rss Comments rss
Trackback Trackback

JFXtras 0.5 Release Announcement

steveonjava | June 22, 2009

I am pleased to announce the 0.5 release of JFXtras.  This release updates the project with JavaFX 1.2 support, plus includes a major overhaul of the Shapes, Borders, and Layouts.

You can grab the latest bits here:
http://code.google.com/p/jfxtras/downloads/list

And browse the Javadoc online.

Pure JavaFX Shapes

Why should you care that we spent months re-implementing all the Shapes from scratch in pure JavaFX code?  Well, here are a few reasons:

  1. JavaFX 1.2 Compatibility - The JavaFX scene graph was pretty-much rewritten from the ground up in the 1.2 release, so porting the old Shape code was non-trivial.
  2. Mobile Deployment - Yes, you can now draw stars, balloons, and reuleaux triangles on your new HTC Diamond.  (What, you didn’t pick up a JavaFX Mobile device at JavaOne?  Your loss…)
  3. Richard Bair said to do it…  Rich isn’t the sort of guy you say no to, and he was pretty adament about the fact that we shouldn’t be hacking the scene graph directly.  Well, now we aren’t.  (although don’t let him know about our new hack to embed JavaFX in Swing…)

You can try out the new shapes by running the DrawJFXtras sample program from the Pro JavaFX Platform book (which has an entire chapter dedicated to the JFXtras project and other JavaFX FOSS):

Draw JFXtras Sample Application

Draw JFXtras Sample Application

Note:  When playing with the demo be careful using the balloon and rounded rectangle shapes.  They trigger a nasty bounds-detection bug that we still haven’t tracked down.

Thanks to my coworker, Steve Bixby for doing the rewrite in his spare time.  He was looking for a little project to learn JavaFX, and went way above and beyond!

Redesigned Borders

We also redesigned the JFXtras Borders from scratch.  Here are some of the new and noteworthy improvements:

  • Read the rest of this entry »
 
Comments
5 Comments »
Categories
Announcements, JavaFX, jfxtras
Tags
borders, jfxtras, layouts, release, shapes
Comments rss Comments rss
Trackback Trackback

JFXtras Core 0.4 Release – Borders, Scrolling, Constraints, JSON Handler, and More!

steveonjava | April 13, 2009

I am pleased to announce the 0.4 release of the JFXtras project.  This is a pretty significant release for the project, which includes quite a bit of new functionality, as well as a new project subdivision.

The JFXtras project has been split into the following three subprojects:

  • JFXtras Core – Contains everything you need to quickly and easily build rich JavaFX applications.  This includes Layouts, UI Controls, Shapes, Borders, Utilities, etc.
  • JFXtras Test – This provides a comprehensive unit and UI test suite along with wrappers for running from the command line or a visual client (coming soon).
  • JFXtras Samples – This is a new project dedicated to providing high quality JavaFX samples to teach the language and bootstrap innovation.  More on this coming in the next few weeks, but if you are interested in contributing or helping out let me know.

The release today is for JFXtras Core, which is now Java 1.5 compatible, and includes some brand new features courtesy of Jim Clarke.  This includes a wide assortment of styleable Borders:

New JFXtras Borders Support

New JFXtras Borders Support

As well as:

  • Styleable ScrollBars and ScrollViews
  • A JSON Handler to automagically populate JavaFX objects from a remote connection

Which is in addition to a whole slew of other cool features including:

  • A new Constraints system for specifying how nodes are laid out with a uniform API
  • Significant updates to the JFXtras Grid
  • New resizable layouts including: ResizableCustomNode, ResizableImageView, ResizableMediaView, ResizableHBox, ResizableVBox, and updates to ResizableRectangle
  • A new version of the Shapes library
  • An ImageFix class that resolves backgroundLoading issues and an ImageUtility class to help with common operations
  • Defect fixes for Shapes, Dialogs, and others

You can download the latest bits here:  http://code.google.com/p/jfxtras/downloads/list.  And also browse the online Javadocs.

Thanks to the whole JFXtras crew for putting together another huge release!

 
Comments
1 Comment »
Categories
Announcements, JavaFX
Tags
JavaFX, jfxtras, release
Comments rss Comments rss
Trackback Trackback

JFXtras 0.3 Release

steveonjava | February 17, 2009

The JFXtras 0.3 release is out with full support for JavaFX 1.1, as well as JavaFX MigLayout support.  You can download the latest bits here:

http://code.google.com/p/jfxtras/downloads/list

Since JavaFX 1.1 is not binary compatible with the 1.0 JavaFX release, if you are doing any development with JavaFX 1.1 you will need to upgrade to the newly released version 0.3 of JFXtras.  Similarly, if you want to do any development on legacy JavaFX 1.0 applications, you will need to stick with JFXtras 0.2 or earlier.

The major feature in this release is the inclusion of a MigLayout wrapper that gives you all the power of MigLayout from within a native JavaFX syntax (a big thanks to Dean Iverson for making this happen).  Here is an example of Mig Docking in action:

MigLayout Docking Test

MigLayout Docking Test

The intent is to keep both the JFXtras Grid and MigLayout as fully supported options for JavaFX layout.  The choice is yours which one to use!

Some other changes that went into this release as well include:

  • Modified permissions in JFXWorker, JFXException, and JFXDialog from public-init to public-init protected
  • Fixed alwaysOnTop support and added an icon workaround to JFXDialog
  • Deprecated CacheSafeGroup now that the underlying bug has been fixed

This release made it in roughly 5 days total, but only 2 business days after the JavaFX 1.1 Release.  Special thanks to Keith Combs for packaging up the release!  :)

 
Comments
2 Comments »
Categories
JavaFX
Tags
jfxtras, release
Comments rss Comments rss
Trackback Trackback

Publications

The most comprehensive book on the JavaFX Platform!

Free Refcard covering JavaFX 1.2

Categories

  • Announcements (11)
  • contest (3)
  • Events (14)
  • JavaFX (29)
  • JavaFX Mobile (1)
  • jfxtras (9)
  • Liferay (2)
  • presentation (4)
  • pro javafx (2)
  • SvJugFx (6)
  • Uncategorized (21)
  • Video (2)
  • widgetfx (9)

Affiliations

Awards

2009 JavaOne Rock Star!

rss Comments rss valid xhtml 1.1 design by jide powered by Wordpress get firefox