# Java: GUI Alternatives

## The problems

After a little experience, it isn't difficult to build a Graphical User Interface (GUI) in Java, but it is hard to get something that is easy to maintain and is flexible. Many styles of GUI programming simply don't scale well.

### Separation of concerns

- BAD: Mix logic and interface. This is a typical style for small student programs. The code to perform the action of a button is in the button's action listener. This does NOT scale well as programs get bigger.
- GOOD: Separate GUI from logic. As programs grow larger, it's essential to separate the GUI interface processing from the logic. This is easy to do by putting the interface and logic in separate classes. Some GUI generators below help accomplish this.

### Some GUI programming alternatives

1. Use Drag and Drop GUI editors. Many IDEs (NetBeans, Eclipse (only SWT), JBuilder, ...) have GUI editors and there are also numerous standalone products. They don't always enforce separation of interface and logic, but it's usually easy to do. I've used NetBeans with good results.
2. Alternatives to Swing and AWT. You don't have to use the Java GUI libraries to build your GUI. There are alternatives.
   - SWT - () - IBM's alternative that produces a more native-like appearance and higher performance, at the expense of portability. Opinions vary on how well SWT accomplishs its goals.
   - Bouy - (buoy.sourceforge.net/) - A public domain alternative. This looks very nice, but I haven't taken the time to try it out yet.

     > "Buoy is a library for creating user interfaces in Java programs. It is built on top of Swing, but provides a completely new set of classes to represent graphical components. It offers many advantages over using Swing directly, including:

     > - A much simpler, cleaner, and more consistent API
     > - A better mechanism for laying out interface components
     > - A far more powerful event handling mechanism, which is based on dynamic binding of arbitrary methods as event listeners
     > - Built in support for serializing user interfaces as XML, then reconstructing them again

3. Use Flash or JavaScript+HTML for the GUI. Why should your interface be in Java? You can use existing GUI technologies like Flash or JavaScript+HTML (check out Sun's LiveConnect, which should already be installed with your version of Java) to interact with your Java program.
4. Describe the GUI in some other language (eg, XML). This approach is described below in the XUL (XML User interface Language) philosophy.

## The XUL philosophy

Everyone says that interfaces should be separated from the logic of the program, and one of the most promising approaches is to represent the GUI in a markup language (think HTML forms with a full set of widgets). The Mozilla XUL group (see link below) has been one of the most active in proposals in this area, altho the actual offerings don't seem quite ready for prime time. Some good links to start with follow.

- XML User Interface Language (XUL) Links (xul.sourceforge.net/links.html)
- JDesktop Network Components shows that Sun is thinking about these issues.
- XUL News Wire has links to a lot of approaches.

I've tried SwiXML and Thinlet, both of which read an XML file to build the GUI at execution time. On small test programs I really liked them. They're not quite mature yet (eg, weak documentation). I'm currently evaluating Swixml.

Take a look at XUL and Java. It seems obvious to me for some comments by Karsten Lentzsch of JGoodies for some criteria that might be used in evaluating this not-entirely-obvious technology.

Microsoft has announced XAML, an XML description of user interfaces (and much more) for the upcoming "Avalon" system (see below). It looks like Microsoft may take the lead in this area; and I wouldn't be surprised if their work sets the future direction. Java's Java Desktop Network Components (JNDC) (see www.javadesktop.org/articles/JDNC/index.html, Java Desktop Network Components) shows some philisophical interest in XUL.

## XUL based and other GUI generator schemes

I didn't look closely at most of these, but this gives the idea that a lot of people would like to make this work. My goal is to find something that makes simple programs simpler, ie something for student programs. Some of these frameworks may be very good for simplifying large programs, but

SwixML | www.swixml.org - I've tried Swixml with mixed feelings. On one hand, it forced a very nice separation of presentation from other concerns, and it worked well. One the other hand, there was a lack of documentation and error reporting that made development very time-consuming. If you put in the time to become an expert, this may be a rewarding approach. Open source.
Thinlet | www.thinlet.com - Open source. The author's philosophy is aim it at handheld devices. This is worth a look if you're interested in something small, and not based on Swing. I liked the previous version, but haven't looked at the new version.
JGraphAppKit | freshmeat.net/projects/jgraphappkit/ \ - Interprets XML files to build menus and toolbars. Small footprint. Free for single developers, otherwise must buy site license. I haven't looked at it yet.
Luxor | luxor-xul.sourceforge.net \ - It's very hard to focus on this. It's strange that examples from different authors look completely unrelated in how one uses Luxor. This may be good, but it requires more time that I have right now to sort out what's happening. Open source.
SwingML | swingml.sourceforge.net - Open source. Looks good, but it isn't obvious how to connect the GUI to a Java application. Seems to be oriented toward Applet server communication. Nice demo. Last update Aug 2003.
AUIML | www.alphaworks.ibm.com/tech/auiml (Abstract User Interface Markup Language Toolkit). Includes an interface builder, and same interface can be used either as Swing or HMTL servlet. Works with the Eclipse Visual Editor.
RIB | www.alphaworks.ibm.com/tech/rib - Reflexive User Interface Builder -- Another IBM approach using XML to represent a Swing / SWT user interface.
xmlgui | xmlgui.tigris.org - Interesting, but little documentation. Has editor. Defines additional useful widgets. Has been used in real project so probably works ok. Not appropriate for simplifying student programs. Open source.
SpeedGJ | www.wsoftware.de/SpeedJG - I'm looking for free student tools. Might be good, but at $70 I'm not going to check it out.
xWidglets | xwidglets.secretgate.com - GUI editor produces XML UI representation. Free download includes editor, gui engine, documentation. The web site is in French, but at least some of the screenshots show English menus. It's not clear how this is used as an interface to a Java application (my interest), but an example is given using JavaScript. I haven't tried it.
FormBuilder | The SwingEmpire FormBuilder GUI editor builds on the excellent JGoodies layouts, but it doesn't seem mature yet. I'm not sure.
SMaker | www.vienas.ch/smaker/index.html - Looks plausible, but it's not free and the cost isn't on the website.
XUI [1] | xui.sourceforge.net - Open source. Seems to be actively worked on. Doesn't appear to make small programs simpler. This is not the same as the XUI project listed below.
XUI [2] | geekkit.bcit.ca/xui/ - Not the same as the XUI project above. I haven't really looked at it yet.
XMLTalk | sourceforge.net/projects/xmltalk - Target is handhelds. Open source.
KoalaGML | koalagml.sourceforge.net - Open source. Inactive?
Ultrid | www.ultrid.com - There is active development on this project. My first look at it had left a lot of Java details unexplained, but there's a lot more there now. Supports many layouts including table layout, spash screens, wizards, localization, and much more. Also strong support for various scripting languages. Worth a look. It appears to be free (beta 0.7.5), but without source.

There are related efforts, such as

XAML | Microsoft's new XAML technology can be used to specify GUI (and much more) design in XML, and the tags directly map into C# classes and other MS languages. Take a look at this MSDN article - msdn.microsoft.com/msdnmag/issues/04/01/Avalon.
XUL | www.xulplanet.com/ - XUL is a spinoff of the Mozilla browser user interface project that has inspired many similar projects. This is somewhat of an umbrella organization for XML interfaces.
XForms | www.w3.org/TR/xforms may define sufficiently enhanced XML forms that can be used for program interfaces, but ...
BML | Bean Markup Language www.alphaworks.ibm.com/tech/bml/
JEasy | www.jeasy.de - $49
JBeaver | www.ratundtat.com
text2gui | www.tacosoftware.com/products/text2gui Uses resource bundles to store the GUI description in text. Can easily internationalize. Looks interesting. Not free.

### GUI Editors

jvider | www.jvider.com - $69
JFormDesigner | www.jformdesigner.com - 129 Euros. Has some very nice features.
JGB | Java GUI Builder jgb.sourceforge.net - Open source. Inactive?
LayoutBuilder | www.jdc-software.com - Free 30-day trial, $20
Atris | sourceforge.net/projects/atrisframework - Open source.
Foam | www.computersinmotion.com $100, 15-day free trial. Didn't look interesting enough to download.
Qt Designer | www.trolltech.com/products/qt/designer.html can produce a .ui file that can be run thru UICompiler (uic.sourceforge.net). I've tried this combination, and was unable to get it working without errors, perhaps because on Windows the only free version of Qt Designer (2.3) is old and didn't play well with UICompiler.

### Alternatives to Swing

Altho Swing (or the older AWT) is the standard for a Java GUI, there are alternatives. These alternatives exist because some are smaller and/or faster than the very general, but large and somewhat sluggish Swing library.

SWT | Standard Widget Toolkit, www.eclipse.org. This free GUI library from IBM provides an interface to the native system GUI (currently Windows and GNOME). The advantages are a more responsive user experience, and the Eclipse GUI editor for uses SWT, not Swing. The disadvantages are a different API so your programs can't simply be changed from Swing to SWT, and it isn't as portable, at least until versions are available for more systems. It's possible to compile completely native (no virtual machine!) programs for Linux.
SwingWT | swingwt.sourceforge.net. This free GUI implementation provides a Swing compatible API, but uses SWT for the implementation. Because it's compatible with Swing, it's easy to try this out.
BambooKit | www.bambookit.com. Light-weight XML-based GUI good for small devices.
Zaval | www.zaval.org. Another light-weight GUI.

### Another approach

UIHierarchy tries to capture the hierarchical nature of layouts by providing classes that reflect this nicely. Has links to similar efforts.