
Java Swing comes with "pluggable look-and-feel technology", which essentially boils down to the fact that interfaces can be "skinned" (although this is simplifying a tad) and is therefore, extremely flexible. By default, Java ships with a cross-platform look-and-feel (LAF), which means your apps can look consistent across all platforms, or LAFs that mimic the look of a specific platform, say Windows, for example. However, one of the chief complaints of Java desktop applications is its "look". It basically stems from two issues:
The problem with the Java GUI falls into two areas
1) The Metal look and feel has never looked good, not even when it was first released. It's always made a bad impression. With its dark tones, poorly rendered non-standard fonts and unattractive widget sets, it makes an instant bad impression. Ocean has fixed the colour issue, but none of the others.
2) A lot of Swing developers go so far with the MVC paradigm, but fail to make the final jump: that is, to run the business logic in a separate thread, so the GUI can remain responsive. The reason for this is bad documentation from Sun. The Swing developers created the "SwingWorker" class many years ago, but it's never been included in Swing, nor has it been mentioned in official Sun documentation, which for its part does not highlight the need for multi-threaded GUIs enough.
Consequently, a lot of Swing apps freeze at every button press for no good reason.
There are two easy fixes to this
1) Use the system's default look and feel by default. All applications have minor differences (especially on Windows), so users won't mind the minor differences introduced by Java, but the vast majority of users do not like Metal.
2) With the default look and feels, use the standard system fonts.
3) Enable, as a priority, anti-aliased fonts; however allow this behaviour to be customised (e.g. to exclude the 9-13pt range)
4) Add to the official Swing classes a helper class to officially encourage developers to multi-thread their GUIs. A really good starting point is the FoxTrot API: http://foxtrot.sourceforge.net/
What's really a crying shame is that none of this is particularly hard, Sun has simple been (characteristically) shooting itself in the foot. LAFs like Alloy and applications like DBVisualizer (http://www.dbvis.com) show that it's possible to create powerful, responsive desktop applications with Java. It's just a matter of focus and education.