![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
No.1ベストアンサー
- 回答日時:
OS依存の部分をオーバーライドするなり拡張しているんじゃないですか。
全部新規で書き直したらSwingとAWTで冗長的なコードがいっぱい発生すると思うし。
ありがとうございます。
OS依存部分をSwingは自前で用意しているんですね。
オーバーライドでできると素人にもわかりました。
大変参考になりました。
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でそれをカスタマイズすることが可能になっている。
ありがとうございます。
ウィンドウズだけで使う場合はOSのAPIを直接呼び出した方が高速に表示されると
思うのですが、なぜAWTは遅いんでしょう?
ピュアネイティブの方が高速なんですね。
大変ためになりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 赤べこの首が揺れるのが可愛いと言いたいのですが、 I like Akabeko very much 1 2022/07/03 21:14
- Java javaでパソコンの内臓カメラや内臓マイクの映像や音をリアルタイムで映し出した 1 2022/07/09 14:02
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- Chrome(クローム) おすすめのGoogle Chromeの拡張機能 スクリーンショットをを教えてください 1 2022/05/18 19:56
- CPU・メモリ・マザーボード デスクトップPCのOS(C:)の空き領域がどんどん減ります。 9 2022/12/12 09:24
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
- Excel(エクセル) ドキュメントに保存していたエクセルのファイルが開きません。 2 2022/12/02 09:38
- デスクトップパソコン キャプチャーボードDRECAP DC-HC4のドライバー 1 2022/05/30 15:40
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- その他(OS) Windows7が出た頃に使っていたPCは、現在と比べ性能が低いです。 低い性能のWindows7P 9 2022/04/23 03:21
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
Javaからパイプでデータ送信しG...
-
OpenLayersの描画を固定で表示...
-
MFCでMSペイントみたいなツー...
-
getGraphics()の意味を教えて...
-
エクセルVBAで、条件に一致する...
-
「天声人語」をインターネット...
-
C#でほかのファイルにある自作...
-
ArrayListのgetメソッドが実行...
-
servletからjspへオブジェクト...
-
NTPサーバーへのアクセス
-
C#「オブジェクト参照が必要で...
-
execute()
-
LISTBOXの内容が更新されま...
-
packageとimport の違いって?
-
javaで、、、
-
命名規約は連番でいいのか?
-
JSPでclassのimport
-
ポータブル電源を買おうと思う...
-
Alertの自動制御
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETのSendMessageを教えてく...
-
VB.NET フォーム上に描いたグ...
-
JAVAでの背景画像表示
-
C# DataGridView のCellPaintin...
-
C# リストビューの特定のセルの...
-
GDI+で描画した画像を消去する...
-
複数画像表示切り替え Visual c++
-
canvasで表示されてる画像を1...
-
アクセスで他アプリから復帰し...
-
Java、jPanelに描画する
-
Javaで文字の角度を変えて表示...
-
描画してもウィンドウをリサイ...
-
getGraphics()の意味を教えて...
-
Canvas等の図形を移動する時,直...
-
ドラッグして矩形を描くには
-
C#のGraphicsクラスについてです。
-
このプログラミングをどう組み...
-
画面のちらつきの原因が知りた...
-
Androidで画像の中で指定した範...
-
Labelコントロールの背景をグラ...
おすすめ情報