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

  • Thierry Lefort kicks off the week with an implementation of lazy loading tree. It handles quite a few scenarios with a very simple approach, but the code overhead could be a little better (having only one SwingWorker and one listener would be welcome, especially for large trees that warrant such a functionality).
  • Albireo is a new Eclipse incubation project. It aims to simplify the task of combining Swing and SWT components, and at first stage focuses on allowing seamless embedding of Swing component in SWT applications (as opposed to the DJ project that allows integrating native components in Swing applications). The project is lead by Gordon Hirsch and Bruno Haible, and you can follow all the intricacies of bridging the two UI toolkits at the mailing lists. If you want to learn more about this project, come to session 211 and session 549 at EclipseCon (March 17-20 at Santa Clara).
  • On a related subject, QT Jambi AWT bridge allows integrating AWT / Swing and QWidget components (both ways). Eskil Blomfeldt has announced the availability of Windows pre-built binaries.
  • David Qiao of JIDE blogs about bringing a piece of Vista functionality into the JIDE tables. I have done a similar thing about a year ago, bringing two Vista features to Swing trees (part 1 and part 2).
  • And finally, Thierry Lefort wraps up the week with the discussion of reusing the same filter on multiple JXTable components from SwingX component suite.

The entry on translucent and shaped windows in Swing has generated quite a lot of discussion and interest. It appears that readers were interested in per-pixel translucency and soft clipping for shaped windows, and Anthony has provided a few tips on how to achieve this. So, pending an official guide / tutorial from the AWT team (hint hint), here is my take.

Soft clipped per-pixel translucent window

What you see here is a JWindow with soft-clipped top-left and top-right corner and pixel-level translucency in the bottom half. In addition to Anthony’s instructions, i have used the following:

The source code is here. I’m pretty sure that it’s not the best (and not the most readable), but it shows the potential. You’re more than welcome to use this code as a starting point (don’t forget to credit Chris, Romain and Sebastien if you’re reusing it).

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

  • Probably the biggest news of the week come from the latest b12 drop of JDK 6.0 update 10. As reported earlier, it provides support for native text rasterization on Windows, as well as translucent and shaped windows. This thread from java.net forums has more information on the native text rasterization, and the earlier blog entry describes the APIs to create translucent and shaped windows. Don’t skip the comments section that has quite a lot of additional information on performance and pixel-level translucency (for soft clipping shaped windows, for example).
  • While these two features are in the latest development builds of 6u10, a lot of applications can benefit from this functionality in JDK 5.0. The native text rasterization is available under Substance look-and-feel and its Bramble plugin (using SWT), and Christophe writes about using JNA for pixel-level translucent windows.
  • Jan Haderka writes about the latest stable 0.9.2 release of SwingX component suite library. The SwingX team has been very active lately, fixing a lot of bugs and providing very swift and professional response to user queries. Hope it won’t take too long before the official 1.0 release (JavaOne anyone? :) )
  • On a related subject, Thierry Lefort continues to explore the SwingX components. His latest entry shows how to combine the JXTipOfTheDay component with Rome RSS parser to display an RSS feed as a tip of the day.
  • As a “challenge” from one of Thierry’s earlier entries, Jeanette Winzenburg (the mastermind behind quite a few SwingX components) explores the renderer and highlight capabilities of the JXTable component.
  • Patrick Gotthardt has announced the official 1.1 release of the Pgs look-and-feel.
  • David Qiao of JIDE has announced the 2.2.2 release of JIDE components. I really wish that they had time to maintain an active blog to showcase the new features as they are made available. While the latest entry on rotating icons is quite useful, the previous “real” one was back in December. And on a related note, David will hold a birds of feather session at this year’s JavaOne. The topic is “Workaround Swing bugs” and he is looking for feedback on the bugs you would like to be discussed.
  • Andres Almiray continues making the graphics development easier for Groovy heads. This week he takes a stab at balloon shapes, multiline text and text alignment.

Since this article was written in 2008, all the functionality discussed below has been exposed as officially supported public APIs. See the conversion table at the end of this documentation page for full information.

I first spotted it about a month ago, and today’s build 12 of JDK 6.0u10 delivers on the promise – translucent and shaped windows with core Java classes only!

So, what do you do? First, head over to the JDK6 space at java.net and install 6u10 build 12. After that, you need to point to that install from your project (either IDE or a build script). As Richard mentioned in his Javaposse’s spot, Sun couldn’t publish the relevant APIs in a java.* or javax.* package since officially 6u10 is still not considered a major release. So, the APIs are in com.sun.awt.AWTUtilities. Of course, this may change its place (like Nimbus did), but you can at least start exploring it.

There are a few public static methods in this class, and since the signatures are self-explanatory, you don’t really need the source code. For starters, the inner Translucency enum has three values:

  • PERPIXEL_TRANSPARENT – ability to create a shaped window
  • TRANSLUCENT – ability to create a translucent window
  • PERPIXEL_TRANSLUCENT – ability to create a translucent shaped window

To test support for a specific translucency mode, use AWTUtilities.isTranslucencySupported(Translucency) API. To test whether the specific GraphicsConfiguration supports translucency, use AWTUtilities.isTranslucencyCapable(GraphicsConfiguration) API. This Java class is a simple test utility that illustrates the usage of these two methods. Best thing – even on my Windows 2003 server machine these APIs return true!

Once you know that a specific translucency mode is supported, it’s time to create a shaped and / or translucent window. Let’s start with a simple frame with a few controls (Simple window – java class). Here is how it looks like, with a button, a check box, a radio button and a progress bar:

Simple window screenshot

Let’s make it shaped (Shaped window – java class). For this, we use AWTUtilities.setWindowShape(Window, Shape). It’s hard to say without seeing the code, but the window has to be undecorated – call JFrame.setDefaultLookAndFeelDecorated(true). Otherwise the window is shown in usual rectangular shape. It would be nice to have a boolean return value that indicates a success of the operation. Here is how our window looks now:

Shaped window screenshot

Let’s make a translucent window (Translucent window – Java class). For this, we use AWTUtilities.setWindowOpacityWindow, float). As you can see, the translucency factor is global, and (at least for now) you can not control translucency of each pixel. Here is how our window looks like with 50% opacity:

Translucent window screenshot

And you can combine both calls to have a translucent and shaped window (Translucent shaped window – Java class):

Translucent shaped window screenshot

There are a few other additional public methods in AWTUtilities:

  • getWindowOpacity(Window)
  • getWindowShape(Window)
  • setWindowOpaque(Window, boolean)
  • isWindowOpaque(Window)

I think that the only two things that i’m missing is the per-pixel translucency support and soft-clipping of shaped windows (this would depend on the first item).

Congratulations to the AWT team for making this happen!