The ribbon component is one the major building blocks of the Flamingo component suite. It is designed to work well with the existing core and third-party look-and-feels, adopting the appearance of the current skin / theme. It also provides a collection of extensible UI delegates that allow third-party look-and-feel developers to further tweak the appearance and the functionality of the ribbon component.

Perhaps the biggest addition to the upcoming release 4.3 of Substance look-and-feel are two new painter types, highlight and decoration. The decoration painters come especially handy for “offsetting” the ribbon component from the rest of the application UI. This is, indeed, how the original Office 2007 command bar (f.k.a. Ribbon) looks like under the Black and Blue themes.

The new public SubstanceLookAndFeel.setDecorationType API allows the applications to mark specific visual areas as decoration areas. The current Substance skin then decides how to paint the background of these areas, as well as all the controls that lie inside them. Specifically for the ribbon component, the Substance plugin for Flamingo sets the following decoration types on the ribbon (see below for the screenshots):

  • The ribbon itself is marked as DecorationAreaType.HEADER.
  • The task buttons and task bands are marked as DecorationAreaType.GENERAL.

The first makes the ribbon blend with the title pane, especially under decorated mode. The second makes all the ribbon controls be a) visually different from the title pane and b) provide a slightly different visual appearance than the “real” application area. Let’s see a few screenshots of the ribbon to better understand these two points.

Here is the ribbon under the last Substance release and Autumn skin:

And here is the same ribbon under the latest dev drop of Substance 4.3. Note how the ribbon blends much better with the title pane, clearly delineating the currently selected task:

The old implementation under Coffee Creme skin:

And the new visuals that make the top part of the application look more polished:

Finally, the old visuals under the Business Blue Steel skin:

And the new visuals (see explanation below):

Note that Business Blue Steel defines a separate theme for the DecorationAreaType.GENERAL decoration areas. For ribbon, it helps to make it stand apart from the rest of the application window, but not in a too “aggressive” way. Also note how this theme is applied to all ribbon visuals, including the command buttons, icons, in-ribbon galleries and the usual controls (combo boxes, buttons).

While the “tagging” of various ribbon areas is done by the Substance plugin for Flamingo, the SubstanceLookAndFeel.setDecorationType is public API and open for the application use.

To try the latest Substance and Flamingo visuals on your applications, use:

The version 4.3 of Substance is in feature freeze state, with release candidate scheduled on March 31st, and the final release scheduled on April 14.

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

  • Thierry Lefort shows how to include table cell styling (foregroud / background colors) in the copy / paste operation. He also shows how to use a single view with highlighting and filtering on multiple SwingX components.
  • The OpenJDK community innovators’ challenge has two Swing-related proposals. Clemens Eisserer proposes an XRender pipeline for Java2D, bringing hardware acceleration to the backbone of Swing painting. Roman Kennke and Mario Torre propose restructuring of AWT and Java2D to enable easier porting of AWT to new platforms.
  • Alex Ruiz announced release 0.9 of the FEST-Swing library for functional Swing testing. One of the major internal changes to the library is first support for testing Groovy-based UIs.
  • Hans Muller confirms what many have already guessed. His e-mail on the users mailing list of AppFramework (reference implementation of JSR 296) confirms that the development of this project has been dead since last November and will continue to be so through this summer. The subsequent discussion on the mailing list indicates that it is quite unlikely that somebody will step up and be able to provide leadership that is much needed for JSR-level projects. The inclusion in JDK 7 looks like it’s in jeopardy as well.
  • John O’Connor has an article on Beans Binding (reference implementation of JSR 295). Unfortunately, these two projects are twin victims of JavaFX for the better part of this year, and one could only hope that JavaFX will live up to its promise and to the investment in engineering resources that have been subverted to it.
  • Collin Fagan has an article on the intricacies of JTree and TreeModel APIs. The main reason for these is the fact that Swing has too many ways to accomplish the same thing (instead of one “true” way that may not sit well with “gurus”, but makes sure that the learning curve is much less steeper and the code is much more homogenic). I have addressed this issue last June.

Looks like this year brings a renewed interest in the Synth-based look-and-feels. Synth was introduced back in JDK 5.0, and it was marketed as one of the major upgrade reasons. The marketing would have you believe that every respectable designer will jump in and start cranking out sleek and polished Swing look-and-feels. Unfortunately, Synth was not tested to be well suited for this task, and there is only one production-ready family of look-and-feels that is based on it. Even then, its developers acknowledge that the base Synth implementation is ridden with multiple bugs.

However, things are changing for the better with Nimbus, the new Synth-based look-and-feel that will be part of JavaSE 6 update 10. While originally it was said to be image-based, its developers have settled for mostly Java2D-based rendering, fixing scores of core Synth bugs along the way. Jasper Potts (one of Nimbus developers) had a very interesting announcement a few months back, saying that they are working on a designer tool for Nimbus. While the full details will most probably be revealed at this year’s JavaOne, the tool allows designing the visuals in a Photoshop-like tool (with support for layering, gradients and effects). Then, the tool generates the Java2D code that produces the matching visuals at runtime.

This tool was not the first attempt at Synth designer. Romain Guy had a prototype of such a builder back in 2005. Fred Lavigne worked on such a builder from 2005 to 2006. After that, Patrick Forhan has taken Fred’s code with the intent of continuing the development, but it appears that the initial check in in September 2006 was also the last one. Finally, Luan O’Carroll has a Synth builder in his XUI framework (this branch has not seen any activity in the last six months).

Now, we have another attempt at writing a Synth designer. This time it comes from EaSynth that has announced the availability of version 1.00. While the tool itself is not free, the base EaSynth look-and-feel is available under the Apache license. While any new look-and-feel is welcome, at least for now it looks quite rough around the edges, especially compared with the existing Synthetica themes.

The previous entry on auto-scrolling in Swing applications under the latest development drops of Substance look-and-feel did not show this functionality in action. To get a feel of auto-scroll, click on the button below and click the middle mouse button in either the “Buttons” tab (the first one) or the “Scroll pane” tab after selecting the “Has auto scroll” checkbox in its control panel.

And here is a short video of auto-scroll in action, showing both vertical and horizontal auto-scroll:



Auto-scrolling is a feature that can be found in most mainstream modern applications. Pressing the middle mouse button transfers the application into the auto-scrolling mode. In this mode, moving the mouse down starts scrolling down the contents even when the mouse is no longer moving. The scroll speed depends on the distance between the current mouse location and the mouse press location. This works for all four directions (up, down, left, right).

There are two existing Swing implementations that i’m aware of:

Both approaches have their drawbacks. The first one effectively changes the UI hierarchy and the second one uses a global frame resource, effectively resulting in repainting the entire UI on every scroll (even when the scroll pane is a small part of the application).

Christopher Deckers has already appeared as a guest author on this blog, and he was very helpful during the development cycles of last two versions of Substance look-and-feel. He has found numerous bugs (many thanks) and made numerous suggestions for enhancing existing features and adding new ones (many thanks). One of his “most wanted” features was the support for auto-scrolling, and after a few iterations he has contributed an elegant implementation that does not use a global resource and does not change the UI hierarchy.

The new LafWidget.AUTO_SCROLL client property can be installed on a specific scroll pane or globally on the UIManager. Once it is set to Boolean.TRUE, the corresponding scroll pane(s) will have the auto-scroll mode installed on them. There are two operation modes:

  • Press the middle mouse button and release it. The scroll pane is transferred into the auto-scroll mode. It can be dismissed by clicking the mouse or scrolling the mouse wheel.
  • Press the middle mouse button and start dragging. The auto-scroll is dismissed by releasing the middle mouse button.

The implementation itself installs a mouse listener on the scroll pane, and when the middle mouse button is clicked, it shows the auto-scroll icon wrapped in a popup menu (thus no need for glass pane). In addition to showing the menu, it also installs a global AWTListener that listens to mouse wheel and mouse move events, scrolling the pane as necessary.

This is the last new feature that was added to the version 4.3 of Substance. It is now in feature freeze state. The release candidate is scheduled on March 31st, with the final release scheduled on April 14.