dポイントプレゼントキャンペーン実施中!

SwingはAWTを拡張していると聞きました。

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

A 回答 (2件)

OS依存の部分をオーバーライドするなり拡張しているんじゃないですか。



全部新規で書き直したらSwingとAWTで冗長的なコードがいっぱい発生すると思うし。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2009/03/04 17:06

「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でそれをカスタマイズすることが可能になっている。
    • good
    • 0
この回答へのお礼

ありがとうございます。

ウィンドウズだけで使う場合はOSのAPIを直接呼び出した方が高速に表示されると
思うのですが、なぜAWTは遅いんでしょう?

ピュアネイティブの方が高速なんですね。

大変ためになりました。

お礼日時:2009/03/06 15:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!