This
short
post on the JPreference API of JFace sums up pretty well why SWT/JFace has
been gaining so much momentum these past years to create Java user interfaces.
I have been using AWT (and later, Swing) since the very first days, and while
I was fascinated by the idea of creating rich interfaces with my language of
choice, it was hard to ignore their shortcoming.
First of all, performance took a long time to become acceptable, and even now
when we have finally reached this point, the bottom line is still that it takes
an awful lot of efforts and expertise to produce an interface in Swing that
looks professional and feels native enough.
There are several reasons for this:
- The MVC model of Swing is a failure. It’s clever,
reasonably-well designed, makes a few needed compromises with the original
MVC idea, but it’s simply not used. Maybe it’s a matter of education
or lack of expertise from the developers, but I hardly see any code that
actually adapts the widget models to their own domain objects. Most of
the code I have seen is a set of helper methods converting DAO’s to the
original models, defeating the separation of view and model.
- Swing is built on AWT, which was not designed to be extended.
Throughout the years, AWT has been retrofitted and patched to support
various Swing requirements (does anyone remember the lightweight/heavyweight
debate that took years to settle?) but at the end of the day, the pyramid
feels cumbersome and shows very little advantages for developers.
- GridBagLayout is an absolute disaster and the perfect example
of something that is completely flawed and violates with a stunning
regularity the principle of least surprise. Whatever layout you are
trying to write, I am betting that you never reached it before a
discouraging number of trials errors (I strongly recommend checking out
JGoodies if you want some quality piece of
Swing software, and I’ll also take this advantage to give a quick shout out
to Romain Guy, who has been proposing a lot of very creative Swing ideas on
his blog).
- Despite its ambition and purpose, Swing is still lacking "real-world"
widgets that would truly save developers valuable time. The
Preferences API above is just an example, but here is another:
wizards. How come Swing doesn’t have any? I have written several
Wizard classes already, and I’m sure I’m not the only one. No wonder
Swing applications still feel clunky and inconsistent. Another example
is the complete lack of integration with native operating systems (e.g. the
system tray in Windows). Sun is finally trying to fix this problem
with JDIC, and it’s about time. And it’s also way too late in my
opinion (maybe we’ll get it in Mustang).
SWT/JFace addresses all of these
concerns.
Granted, part of it comes from hindsight and learning from Swing’s mistakes,
but I have to admit my very profound respect for the OTI team, which created an
amazing UI framework (of course, Eclipse and the RCP should be added to their
credit as well).
SWT/JFace is really the API that doesn’t get in the way of the developer and
that lets you achieve amazing results in record time.
Are there any drawbacks to SWT/JFace?
A couple:
- It is not part of the JDK, so you need an additional download.
- Its non-Windows ports have been criticized for not being of the same
quality as it is on Windows (this is something that has vastly improved
these past months).
You basically have three options for your next GUI application: SWT,
SWT+JFace or RCP. I have no doubt that at least one of these options will
be the perfect match for your work, so be sure to evaluate each carefully before
making a decision.