• 締切済み

SwingがOSに依存しない理由

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

  • Java
  • 回答数2
  • ありがとう数4

みんなの回答

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

  • SWINGでアプレット使えますか?

    GUIの作成において、SWINGはAWTよりも「OSに依存しない」「動作が軽い」など多くのメリットがあることを知り、SWINGにとても興味があります。 そこで質問ですが、アプレットの作成において、私が読んだ解説サイトの全てが「java.awt.*」をインポートしていました。 もしかして、SWINGではアプレット開発ってできないのでしょうか? 最近JAVAをはじめたので、質問に少々おかしな点があるかもしれませんが、どうか目にみてやって下さいm(_ _)m

  • Swingは軽量コンポーネントについて

     今日は、JAVA Swing勉強中の初心者です。  本を読むとAWTは重量コンポーネント、Swingは軽量コンポーネント(一部重量コンポーネントもある)と 書かれていますが、これは一体何を意味するものでしょうか。  読んでても良く分からないのですが、重量コンポーネントはOSに近い所で動作する、軽量コンポーネントはその逆、、、  この内容について、プログラムを組む人間は何に気をつけなければならないのでしょうか。  どうも重量コンポーネントだから動作が重たいとか、遅いとか、メモリの消費が多いとかという解説も 見当たらないし、また、どちらが動作的に速いのか、遅いのか、OSへの負担が大きいのかも書いていません。 (読んでる本が悪すぎるのかも知れないですが。。。。)  だから、AWTを使うときはどのように気をつけなければとか、Swingを書くときにどうしなければならないとかの記述 も、色々と調べてもどの本にも書いていませんが、だから一体何がどうなのでしょうか。    そもそも、重量コンポーネント、軽量コンポーネントとは何を表すもので、だから何がどうなるのでしょうか。  動作的なものについての記述なのでしょうか。  宜しくお願いします。

    • ベストアンサー
    • Java
  • Eclipseを入れたら、Swingは使えない?

    Swingは本に載っていましたが、いざEclipseを入れたら、 EclipseはSTWを使うと書いていました。 Swingを使うのには、Java純正のNetBeanでなければならないのですか? あと、Swingはなぜawtのパッケージもインポートしないといけないのですか?

    • ベストアンサー
    • Java
  • SwingとAWTは一緒に使えますか?

    1つのプログラム内でSwingとAWTは一緒に使えますか? クラスが違えば使えるでしょうか? それともどちらか一方に統一したほうが良いでしょうか? AWTとSwingだったらどちらを使いこなせたほうが良いでしょうか? よろしくお願いします!

    • ベストアンサー
    • Java
  • AWTとSwingについて

    AWTとSwingを同じウィンドウで使うことはできますか?また、同じプログラムの中で使うことは、できますか?教えてください。

    • ベストアンサー
    • Java
  • swingのボタンをもう少し小さくしたい。

    javaを学習している者です。 swingを使って学習しているのですが、awtと比べて圧倒的にボタン(JButton)を大きくしないと文字が表示されないと思うのですが、awtくらいに小さくしてボタンに文字を表示させる方法はないでしょうか? よろしくお願いします。

  • SwingとAWTの違いがわかりません。

    SwingとAWTの違いがわかりません。 あなたはどちらを使いたいですか?その理由も教えていただけるとうれしいです。

    • ベストアンサー
    • Java
  • javaのawtとswing

    色々なサイトを参考にしながらswingでjavaのプログラムを作成していたのですが、awtかswingをチェックしないで作成していたのに途中で気づきました。 import javax.swing.*; public class Test extends JFrame{ となっているのでswingになっていると思うのですが、他に見分け方(これ入ってたらswingなわけが無いだろう)みたいなものはありますか?

  • Swing Swing Swing 楽譜

    笑ってこらえての番組で、吹奏楽のコーナーがあり、Swing Swing Swing という曲を演奏していましたが、この曲の楽譜はでていますか?

  • swing AWTのみ使用で時刻取得後、ラベルへ貼る方法

    swing AWTのみ使用して現在時刻を取得しラベルへ貼りつける方法を教えてください。

    • ベストアンサー
    • Java