• 締切済み

SwingがOSに依存しない理由

SwingはAWTを拡張していると聞きました。 なぜSwingはAWTを使っているのにも関わらず、OSに依存しないで動作できるのですか?

みんなの回答

noname#94983
noname#94983
回答No.2

「OSに依存」というのをどういう意味で使っているのか微妙だが……。 AWTは、内部でOSのAPIを使ってる。例えばボタンを表示する際には、ボタンのピアクラス(ネイティブ環境との橋渡しをするクラス)によってOSのボタンを描画するAPIがコールされ、画面にぱっと表示される。このため、AWTのボタンは、WindowsであればWindowsのボタンの形になる。が、この「ボタンを描く」部分がまるごとネイティブ環境で実行されるため、ボタンの表示そのものにはJavaからタッチできない(なにしろJava側で描いてないから)。 で、Swingはどうしているか。Swingだって、描画は突き詰めればOSのAPIを使って描画している。たとえ仮想マシンだろうがなんだろうが、最終的にWindowsというOSの上で何かが描かれている以上、どこかでWindowsのAPIがコールされているのは当たり前。 ただし、そのアプローチがまったく違う。Swingでは、コンテナ単位でオフスクリーンをもっており、そこにpure Javaな処理で描画を行い、最終的な描画物がコンテナに描画される。AWTのコンポーネントは、それぞれ内部でネイティブなAPIをコールするように作ってあったもんで、Swingのコンポーネントは、AWTコンポーネントのベースとなっているComponentクラス(無色透明でなにも描かない、コンポーネントの土台)を継承して全部作り直している。 このため、例えばボタンを描くときは、APIのボタン描画処理はコールされない。Javaの仮想マシン内に用意されたオフスクリーン上に、Javaの機能を使ってボタンが描かれる(つまり、四角い枠を描いて中を塗ってボタン名を描いて……みたいなことを細かにやってボタンを作ってる)。他のコンポーネントも同じ。 そして最終的に、そのウインドウに表示するオフスクリーンができあがったところで、ばっと画面に表示される。ここんところでは、最終的にOSのAPIが使われている。が、個別のコンポーネントの描画はすべてpure Javaな処理なので、結果としてOSに依存しないGUIが描かれる。また、コンポーネントの描画部分はすべてJava側で行っているため、Javaでそれをカスタマイズすることが可能になっている。

rescue99
質問者

お礼

ありがとうございます。 ウィンドウズだけで使う場合はOSのAPIを直接呼び出した方が高速に表示されると 思うのですが、なぜAWTは遅いんでしょう? ピュアネイティブの方が高速なんですね。 大変ためになりました。

回答No.1

OS依存の部分をオーバーライドするなり拡張しているんじゃないですか。 全部新規で書き直したらSwingとAWTで冗長的なコードがいっぱい発生すると思うし。

rescue99
質問者

お礼

ありがとうございます。 OS依存部分をSwingは自前で用意しているんですね。 オーバーライドでできると素人にもわかりました。 大変参考になりました。

関連するQ&A