Here are some Swing links that you might have missed during this week:

  • Jasper Potts posted an update on the Nimbus development progress. The screenshot shows the support for the different component sizes (using the same client properties as the latest Aqua drop). As the comments point out, there are quite a few visual inconsistencies which will be hopefully addressed (small and mini scroll bars, inconsistent scaling of arrow icons across different controls, small and mini indeterminate progress bars and text field shadows are among these).
  • The latest drop of Dolphin addresses bug 6438179, providing correct implementation of tray service availability on Unix platforms. Backport to Update N highly desired.
  • Danno Ferrin kicks off the slew of Groovy-related items with his overview of new Swing features in Groovy 1.5.
  • Andres Almiray is back with a few postings of his own. Starting with CSS support in Swing / Groovy applications, he provides a little more information (and a screenshot) on GraphicsPad, and finishes off with updates on builders for WingS and Jide.
  • Geertjan Wielenga blogs about integrating a YouTube player inside NetBeans IDE. A sad tribute to the lack of open-source video playback components in Java (he is using the commercial WebRenderer library). This is still on top of my wishlist for 2008, and is still foolish to hope for.

Using visual UI designers

December 7th, 2007

If you ever needed an argument against using a visual UI designer that enforces any logic on the code it creates, here it is:

In JBuilder 2007 CodeGear/Borland has completely dropped GUI editing support for the jbinit() stuff. So anyone who needs to update their old code need to rewrite it from scratch (which is a major risk) or handcraft it.

By show of hands – who would have thought in 1997 2000 (when JBuilder pretty much ruled the Java IDE landscape) that this could happen? Are you sure that NetBeans will outlive all the code that is being created by it as we speak? And by the way, the only complete visual UI editor that doesn’t impose any logic on the code it edits and is able to parse out even the most complicated custom forms that i have thrown at it comes from Instantiations. Now if only they could reduce the memory footprint from 400MB to something a little bit more realistic…

Two weeks ago i wrote about the first drop of Bramble plugin for Substance look-and-feel, which provides support for native text rendering in Swing applications. Today, it’s time to look at the actual implementation and see how it all works together.

Unlike SWT that passes the painting requests to the underlying native APIs, Swing handles all the painting itself (unless we’re talking about Windows and GTK look-and-feels under Mustang, which have their own set of problems). Swing’s greatest flexibility is in its “layered” approach to rendering the components (see this PDF presentation that shows one of the possible effects that are extremely easy to achieve with Swing UI delegates). Take, for example, painting a button. It’s all done in independent layers which are then composited together using the powerful Java2D APIs:

  • Background
  • Icon
  • Text
  • Focus
  • Border

What happens when you want to provide custom rendering for one of these layers (text in our case)? Just override the relevant paint method and provide the logic there (not touching any other pixels). Seems easy, but since SWT has its own painting model dictated by the OS, it’s not. The main difference between text rendering in AWT / Java2D and SWT is that the later expects the background pixels to be fully specified (as detailed in this discussion on the platform-swt-dev mailing list and this discussion on the eclipse.swt.forum).

And as it turns out, this complicates the logic of plugging the SWT text rendering into the Swing painting pipeline, but the end result is most certainly worth it. I’ve already posted a few screenshots, and here is one more:

The first two rows (labels and text fields) are rendered by Swing (Vista + Mustang), while the last two rows are rendered by SWT / native code. While for labels the difference might not be that big, for the digits it is simply staggering (at least for the default Vista Segoe UI font). So, what do we have to do in order to have the native text rendering in Swing?

The current implementation has three stages:

  1. Filling the component bounds with the background color. The actual color depends on the component kind and component opacity (can come from the parent container).
  2. Painting all the overlay / highlight layers. List cells have rollover / selection highlights. Text components have multiple highlights depending on the text selection mode.
  3. Painting all the texts. There can be more than one with different fonts and colors. Menus have the menu text and accelerator text. Sliders have multiple labels. Text components have multiple selected and unselected sections.

The pure Swing implementation doesn’t have to be concerned with combining the results of these three stages together, since Java2D’s drawString method can operate on a translucent / transparent image (with questionable results in some cases, or otherwise there would be no need for this entry). The native text rendering expects all the background pixels to be filled before it can paint the text. Depending on the actual component, this can make the nice and structured Swing UI delegate implementation a little bit more coupled. This is especially true for such complex components as lists, trees, tables, combo boxes, sliders and all types of text components.

In addition to this limitation, there are technical issues with integrating Java2D and SWT rendering. What is the flow here?

  • Java2D code paints the component background and overlay / highlight layers on an AWT image
  • An SWT image is created from the pixels of the AWT image
  • AWT font and color settings are use to create the matching SWT text layout
  • SWT text layout is used to paint the text on the SWT image
  • Another AWT image is created from the pixels of the SWT image (which at this point contains the background, overlay / highlight layers and the texts)
  • This AWT image is painted back on the Java2D Graphics that is passed to the UI delegate

All these steps might add significant overhead to the overall painting performance, especially considering that text elements are pretty much everywhere in a common UI. The first drop that was available two weeks ago had some big performance issues on large lists and tables. This has been addressed by clipping the compositing area to only the necessary rectangle. In addition, there are minor differences between the two UI toolkits. For example, AWT uses pixels and SWT uses points. This means that the font size needs to be converted to maintain the visual results. In addition, most SWT resources need to be explicitly disposed (much like Java’s streams, for example, that need to be explicitly closed).

The components that are supported in the latest drop of Bramble plugin:

  • Buttons, toggle buttons, check boxes and radio buttons
  • All menu elements, including menus and menu items
  • Tabbed panes
  • Labels including the default cell renderers for trees, tables, lists and uneditable combo boxes
  • Text fields and formatted text fields with simple documents, including default editors for editable combo boxes
  • Decorated title panes for frames, dialogs, internal frames and desktop icons
  • Slider labels
  • Table headers
  • Tooltips
  • Components from the Flamingo component suite such as command buttons and ribbon

If you’re interested in testing this implementation, you need to do the following:

  • Download the substance-bramble.jar here and add it to the classpath of your application.
  • Add the org.eclipse.swt.win32 jar to the classpath of your application. Bramble distribution bundles this jar from Eclipse 3.2.1 in the ‘lib’ folder.
  • Extract the matching swt-win32.dll and add it to the java.library.path of your runtime configuration. Bramble distribution bundles this DLL from Eclipse 3.2.1 in the ‘lib’ folder.
  • Configure your application to run under the latest 4.2dev drop of Substance look and feel.

If you run into any issues with components mentioned above or custom cell renderers / editors, i would be more than interested hearing about it. The plugin is distributed under the Eclipse Public License (EPL).

Here are some Swing links that you might have missed during the last two weeks:

  • Continuing the theme of Swing-“powered” applications running on JVM but written in another language, Shawn Crowley addresses the viability of JRuby as a realistic candidate for authoring complex desktop applications. It’s great to see that his experience is largely positive and he has no regrets in choosing this platform.
  • Tim Dalton continues his series on building GUIs in Scala. This time, the “usual suspect” of UI demoes – a simple calculator.
  • And to top off this part, Andres Almiray revisits his library of Groovy builders as the Groovy 1.1 release approaches. The entry on GraphicsBuilder is talking about adding mouse and keyboard support, and the entry on JideBuilder makes sure that it is updated and functional. The last entry is on GraphicsPad, which begs just two questions – what is it, and where are the screenshots?
  • Jan Erik Paulsen continues his experiments with Photoshop Express clone, and is trying to come up with a new Substance-based skin. Dubbed “Titanium White”, it looks quite similar to the core Business skin from Substance with round button shaper.
  • Alex Potochkin has technical details on the Rainbow application that we used for our join JavaOne presentation last year. As you can see, this application is still alive (hint-hint), and is still used by both of us to improve the libraries that it is using (JXLayer for Alex and Flamingo for me).

And a few product announcements as well:

  • The JPen project is a library for accessing pen/digitizer tablets and pointing devices.
  • Alex Ruiz has announced the release 0.7.0 of the FEST-Swing UI testing library.
  • Dave Gilbert has announced the bugfix release 1.0.8 of JFreeChart charting library.
  • Wolfgang Zitzelsberger has announced the release 2.6.0 of Synthetica look-and-feel. If you thought your favorite library was customizable, take a look at the customization documentation – with ten new client properties, this release has broken the 300 mark :)