
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:
When I'm using a Java SWING app, it's not really the way it looks that bothers me - it's the way it feels/handles. You can paint it up to look just like a Windows, but when I'm using it, I can instantly tell it's a Java app, because it's usally running (or shall I say, crawling) about half the speed of my other native apps.
Honestly, Java on the desktop sucks and needs to go away, and .NET along with it. It benefits only developers who want to write cross-platform apps - it has absolutely no benefit to 98% of us who only run one OS full-time. I'm speaking as an end user who is tired of developers making excuses for the piss-poor performance of these languages, virtual machines, or whatever the hell they are. I never run Java apps unless there's absoltuely no other alternatives available. I don't really run .NET apps either, but at least they're a helluva lot more consistant with the way that native apps on Windows behave.
If you want to write cross-platform apps, either do it with C++ bindings or find another way to make them run respectably.