
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:
Well, I think most of what should be said about widgets, was already said. But there is one thing that keeps anoing me: people keep craping about java beeing slow. Well people, java is not slow. True, the GUI can often be slow(ish). Who cares if you can push buttons faster than you can think? But java itself is not at all slow. Sure, you need some more memory to get the most out of it, but who cares, it's cheap as hell! In a lot of core OO tasks, java is even faster that C++!
In the end, it's not about subjective speed, but about efficiency.