Java Notes

Alternate Layout Managers

GridBagLayout? By far the most useful layout concept is using a flexible table-like style. This is almost universally accepted as the standard way to arrange components.

Java's first attempt at this, GridBagLayout, can be amazingly awkward to use, and the final results aren't always wonderful. The newer (as of Java 6) GroupLayout may be an improvement, but still has usability issues, and it's main use seems to be the layout used by the NetBeans Matisse GUI editor.

Look elsewhere. Some independently developed layout managers are better, either because they are much easier to use, or because they do a better job (or both!). Below are some popular, free, layout managers. They fall into two main categories: rectangular table-oriented layouts, and "Other".

Table-oriented Layouts

JGoodies Form layout may be the best. TableLayout and HIGLayout are good and easy to use.

JGoodies Form layout
The JGoodies offerings have some of the best layout tools. Most of them are free, but they also offer some for-pay products. Here's how Karsten Lentzsch, the author, described it in a comp.lang.java.gui posting.

The free JGoodies Forms layout system has been designed to good design quickly. Besides a powerful and flexible layout manager, there are helper classes (non-visual) builders, a tutorial, layout tips&tricks, etc. guide you through visual design and its implementation in Java.

Many developers have reported that the Forms has turned their UI work into kind-of joy, where they were frustrated with the GBL before.

The pure Forms layout system targets primarily source coders; however, a design goal was the simple integration with visual builder tools that help you save time or improve the design. There are now some visual builders that are worth a look - open the Forms' README.html and see the "Visual Builders" section in the sidebar.

Hope this helps. Best regards,
Karsten Lentzsch

URL: www.jgoodies.com/freeware/forms/index.html
TableLayout
I've used TableLayout with satisfaction. It's easier than GridBagLayout, yet accomplishes much the same thing. Free. From their site:

TableLayout is a layout manager that provides all the power of GridBagLayout, but is simple and easy to use. TableLayout simplifies the creation of graphical user interfaces by providing an intuitive and powerful way to specify where components are placed and how they are resized. TableLayout makes it easy to write professional user interfaces quickly and easily.

TableLayout is a free layout manager. You may use it in any commercial or non-commercial project. There are no royalties or license fees. You may subclass any class in the TableLayout package. You may unjar or rejar the classes and source files as you wish. The only restriction is that you may not distribute modified versions of the TableLayout source. This is to prevent confusion about what TableLayout does and to give credit to the author.


URL: www.clearthought.info/software/TableLayout/

Interview with TableLayout creator Daniel Barbalace

HIGLayout
HIGLayout is similar to GridBagLayout in that there are rows and columns of variable heights and widths, and some may expand.
HIGLayout Tutorial
MigLayout
Looks like a nice, easy, layout manager. The licensing issues may not be completely firm, but it's basically free. Has a very nice WebStart demo. Looks good. A good overview is in the JavaLobby article at www.javalobby.org/articles/miglayout/ .
www.miglayout.com
PageLayout
I haven't had a chance to try this newer layout (Java 5). The example in their documentation is one of those ugly pieces made to show the features, not to show a good layout. Looks rather complicated, but it might be good anyway.
pagelayout.sourceforge.net/
RiverLayout
In the words of David Ekholm it is "both simple to use and highly flexible", and it appears to be exactly that. He uses it in his very popular JAlbum program. It's worth checking out.
URL: www.datadosen.se/riverlayout
SGLayout
URL: http://www.javaworld.com/javaworld/javatips/jw-javatip129.html
GuideLayout
Make for use with the XuiEditor, but perhaps useful alone.
Introducing the GuideLayout, Part II: Java
MultisplitPane
MultiSplitPane: Splitting Without Nesting is an attractive approach on constructing split panes. This is not a layout, but a way to create split panes without nesting. It is a more appropriate solution to many of the problems that are commonly solved with nested layouts.
UIHierarchy
Hierarchical layout. Captures the hierarchical nature of layouts by providing classes that reflect this nicely.
URL: sourceforge.net/projects/uihierarchy/

Layouts based on XML

An interesting approach is to represent a GUI in XML. Because a GUI is a nested hierarchy, this is a reasonable approach. There are two very successful demonstrations of this: XAML from Microsoft, and Flex from Adobe. Neither of these works with Java, but Adobe may be planning to to do something like this with Apollo, which promises to provide a Flex GUI while the remainder of the program is in Java.

SwiXML
A different approach is to use XML to represent your layout. SwiXML is one interesting package for doing this. I've used it a couple of times, and it was fairly convenient, but it didn't really solve the layout problem very well. It provides an interesting alternative. Read more about it at today.java.net/pub/a/today/2006/02/21/building-guis-with-swixml.html. or check out java-source.net/open-source/xml-user-interface-toolkits for a more complete list.
gui4j - www.gui4j.org/
"gui4j is a framework for describing Java Swing GUIs completely in XML."

"The graphical user interface is created dynamically based on the XML definitions. Each GUI window is associated with exactly one top-level XML file. Each XML file can dynamically include other XML files to support complex GUI definitions. Each XML file is associated with a java object that acts as both a Controller and a Model for the GUI. There is a strong layer separation between the GUI and the Controller: GUI definitions in the XML files can access all Java methods of the Controller, but Java methods cannot access any GUI elements directly. Events are used to trigger changes in the GUI."

More

There are other possibilities that I haven't really looked at closely.