つまり、AWTツールキットがあります。これは、すべてのウィンドウ管理と描画を行うレイヤーです。JVM内でネイティブプラットフォーム固有のコードを呼び出しています。また、java2dの描画も担当します。加速されたdirectxまたはopenglパイプラインを使用できます。
その上にSwingが開発されています。Swingは、実際にはすべてのボタンとすべてのオブジェクトをプレーンなJavaコードで描画します。描画は、コンポーネントの描画方法を決定する現在のルックアンドフィールに合わせて処理されます。したがって、ペイントメソッドをオーバーライドして、問題なく追加することができます。
MetalとNimusLaFは100%java2dで描画されるため、それらの中には、コンポーネントを描画するためのdrawRectangleやdrawLineなどがあります。Windows、GTKなどのネイティブのルックアンドフィールは、現在のオペレーティングシステムのテーマにアクセスして、ネイティブウィジェットに似たものを描画します。そのため、必ずしもネイティブアプリケーションのように見えるとは限りません。
たとえばEclipseで使用されるSWTなどのJava用の他のGUIツールキットもあります。それが行っているのは、AWTからウィンドウを取得し、それに100%ネイティブウィジェットを配置することです。OSとの統合がはるかに優れており、見た目も良く、動作も速く、メモリの使用量も少なくて済みます。ただし、これを使用すると、OS固有のネイティブライブラリを使用してアプリケーションを配布する必要があり、Swingと比較してカスタマイズ性が低くなります。