Tuesday May 28, 2013

Virtual Developer Day: Java ME, SE, and EE

It's an exciting time in the Java Jungle! There are a lot of things going on "in Java" right now, and as a result, there are several free webinars scheduled to provide introductions to technologies and concepts you might want to know a bit more about. Just recently, I mentioned the upcoming Introducing Java EE 7 webcast, and now there's another one you'll probably be very interested to attend. The best part(s)? You can attend from your home or workplace and it's completely free! The worst part? You may struggle to decide which track to take - they're all that good.

For this four-hour Virtual Developer Day, here are the tracks and their topics:

Separate dates/times are offered for western and eastern hemispheres; please click this link to learn more and register.

Keep the Java flowing,

Tuesday Feb 26, 2013

How to "Pretty Up" Your JavaFX TableViews

One day you're a happy JavaFX developer, cranking out applications and blissfully providing your application's users with table after table of rich textual information. The next day it happens: your users approach you and ask if there's a way to include a thumbnail of each part in the inventory list. Or a small photo in the contact list/personnel roster. Or a snapshot/graph of the latest conditions for each monitored sensor or weather camera. So now what?

PropertyValueFactory, a convenience implementation of the Callback interface, is typically used to handle the work involved with populating all cells within a single TableColumn. As long as you provide the name of a valid property to the PropertyValueFactory constructor and set the TableColumn's CellValueFactory to the resulting PropertyValueFactory, the cell is populated, TableView adds an observer to the value, and life moves merrily along.

Adding a graphical element to a TableView isn't much harder, actually. The TableColumn's CellFactory handles rendering of the cell's contents, so if you want to place something other than textual content in the cell, you'll need to also set the TableColumn's CellFactory to one of your liking and override the updateItem() method. Let's take a look at a quick example.

I'd always intended to create some small-but-useful Twitter utilities and hadn't really had the opportunity, but a simple Twitter client provides a perfect demonstration of this capability. Here is an example of what a "feed" interface might look like:

For this TableView example, there are only two columns:

  • one for the user, showing the user's picture, name, and screen name
  • one for the tweet

The tweet's text is simply a string property of each MTweet object, but the user information comes from several properties of the MTweet object's associated MUser object. The MTweet's text is properly assigned to the cell's text property per the discussion above, but what about the user information? Per the JavaFX 2.2 docs,

Because by far the most common use case for cells is to show text to a user, this use case is specially optimized for within Cell. This is done by Cell extending from Labeled. This means that subclasses of Cell need only set the text property, rather than create a separate Label and set that within the Cell. However, for situations where something more than just plain text is called for, it is possible to place any Node in the Cell graphic property. Despite the term, a graphic can be any Node, and will be fully interactive. For example, a ListCell might be configured with a Button as its graphic. The Button text could then be bound to the cells item property. In this way, whenever the item in the Cell changes, the Button text is automatically updated.

To display the tweet's text in the "Text" column of our table, a couple lines of code does all that is necessary:

In order to bundle the user information and place it within a single cell, we set the "User Info" column's CellValueFactory in similar fashion to our text column above:

And then we set that column's CellFactory to something along the order of this:

For each cell in that TableColumn, updateItem is called with that cell's contents as the "item", the first parameter. Within our example above, we create a VBox, populate it with the user's photo (Image, via ImageView), name (String) and screen name (String), do a bit of formatting, and assign the VBox to the cell's graphic property. And with that, we're off and running. :-)

There is much more you can do, and this should get the ideas flowing. Here's to prettier apps (better optics?) and happier users!

All the best,

<<< UPDATE 1 >>>

Jonathan Giles, JavaFX team UI Controls tech lead, made a few suggestions for improving the efficiency of the code used above. The points he made were excellent, and I wanted to provide an update that shows revised code that incorporates them. I did leave the original code above, as I'm hoping it helps make a clearer path for those implementing similar code for the first time.

In order to override the TableCell constructor, we'll extend the particular TableCell<MTweet, MUser> class. Doing so allows us to create the VBox, Labels, and ImageView used in our composite user cell once per cell, rather than each time updateItem() is called. While we're at it, we'll also perform formatting/assignment duties in the constructor and avoid repeating those calls. Here is the new derivative class:

Creating the new UserTableCell class means we can update our setCellFactory() method call for our user info column like so:

Thanks to Jonathan Giles (@JonathanGiles) for the suggestions!

All the best,

<<< UPDATE 2 >>>

One more update! This time using an anonymous inner class for the column's cell factory. Same basic functionality, but this is perhaps the tidiest option.

Options are good, as they say...  :-)

All the best,

Monday Dec 31, 2012

Creating a Portable Java/JavaFX Rig using the Raspberry Pi

So you're a mobile/embedded Java developer who just can't get enough time with your devices? Need to get your JDK/JavaFX ARM fix on the go? It's easy and inexpensive to do just that with only a few essential parts:

  • Raspberry Pi
  • Atrix Lapdock, which provides portable keyboard/video/mouse and power for the Raspberry Pi!
  • A few cables and adapters (shown in videos, described in linked article below)
  • SD card (8G or more, Class 6 or higher)
  • Edimax EW-7811Un wi-fi adapter

That's all the hardware you'll need to make some serious, very portable ARM Java magic. Total cost was under $120 when I started this adventure; YMMV.  :-)

There are a few differences between setting up the soft-float (SF) and hard-float (HF) versions of Raspbian, but this recent post covers the basics of getting an OS on the SD card for booting and configuring the Pi. The two key differences between SF and HF configuration to this point:

  1. Overclocking. HF Raspbian allows for easy overclocking from the raspi-config utility. A word of warning, though: The OS devs caution that the maximum overclocking setting has been known to corrupt SD cards, and I've found this to be the case several times. Stepping down one level to the next-to-fastest overclocking setting works a treat.
  2. Wi-fi configuration. SF Debian/Raspbian wi-fi configuration can be best accomplished using the instructions in the aforementioned post. Trying the same thing in HF Raspbian results in a message suggesting the use of the wi-fi graphical configuration tool...and it's even easier. With the Edimax, all I did was boot with both ethernet cable & Edimax connected, sudo su, startx, and run wpa_gui under the Internet menu (WiFi Config on the desktop if not root). Fill in your wi-fi details (I used WPA2/CCMP for my WAP) and then File|Save Configuration when finished. Quick, easy, and done.  :-)

Below are links to a couple of short video tours of my mobile Java/JavaFX "testing rig". I'd embed them directly if the Roller blog software supported it (if someone knows how, please let me know!). After the video links is a link to an article/video I used as a template when I originally made mine. Great stuff, fun, and extremely useful...for me, anyway. Hope you enjoy it!

Video 1: Intro to Raspberry Pi & Atrix Lapdock, Part 1 of 2
Video 2: Follow-on to Raspberry Pi & Atrix Lapdock, Part 2 of 2

Reference article/video

Happy hardware hacking,

Tuesday Dec 18, 2012

Developer Preview of JDK8, JavaFX8 *HARD-FLOAT ABI* for Linux/ARM Now Available!

Just a quick post to spread the good word: the Developer Preview of JDK8 and JavaFX8 for Linux on ARM processors - hard-float ABI - is now available here. Right here.

It's been tested on the Raspberry Pi, and many of us plan to (unofficially) test it on a variety of other ARM platforms. This could be the beginning of something big.

So...what are you still doing here? Go download it already! (Did I mention you could get it here?) :-D

All the best,

Saturday Nov 10, 2012

Polishing the MonologFX API

Earlier this week, I released "into the wild" a new JavaFX 2.x dialog library, MonologFX, that incorporated some elements of DialogFX and new features I'd been working on over time. While I did try to get the API to a point of reasonable completion (nothing is ever truly "finished", of course!), there was one bit of functionality that I'd included without providing any real "polish": that of the button icons.

Good friend and fellow JFXtras teammate José Pereda Llamas suggested I fix that oversight and provide an update (thanks much, José!), thus this post. If you'd like to take a peek at the new streamlined syntax, I've updated the earlier post; please click here if you'd like to review it. If you want to give MonologFX a try, just point your browser to GitHub to download the updated code and/or .jar.

All the best,


The Java Jungle addresses topics from mobile to enterprise Java, tech news to techniques, and anything even remotely related. The goal is to help us all do our work better with Java, however we use it.

Your Java Jungle guide is Mark Heckler, an Oracle Senior Java/Middleware/Core Engineer with development experience in numerous environments. Mark's current work pursuits and passions all revolve around Java and leave little time to blog or tweet - but somehow, he finds time to do both anyway.

Mark lives with his very understanding wife & kids in the St. Louis, MO area.

Stay Connected


« March 2015