
JAVA初心者です、宜しくお願いします。
参考書で、Swingについて以下のようなコメントを見つけました、ただ何故そうなのかの理由を書いていません。
以下の内容はどのような理由からそうなるのでしょうか。
「Swing コンポーネントでは、メソッドpaintは推奨されていません。
paintComponentをプログラムから呼び出してはいけません。描画をしたい場合は、 paintComponent をオーバー
ライドしたクラスの repaint() メソッドを呼び出します。
Swing コンポーネント上に描画するには、 描画したいコンポーネントのクラスを継承したクラスで、
メソッド paintComponent(Graphics g) をオーバーライドし、 パラメータで渡された g に対して Graphics
クラスのメソッドで描画をします。
オーバーライドした paintComponent の先頭で、このコンポーネントの土台を描画するために、
super.paintComponent(g) を呼び出しておきます。」
宜しくお願いします。
No.1ベストアンサー
- 回答日時:
Swingでは、コンポーネントの描画はかなり複雑になっている。
AWTでは、repaintが呼ばれると、updateが呼ばれた後、paintが呼ばれる。が、Swingでは、paing内で更にpaintComponentによってコンポーネントが描画され、それからpaintBorderでボーダーが描画され、最後にpaintChildrenによって内包するコンポーネントの描画が呼び出される、という仕組みになっている。したがって、paintをオーバーライドしてしまうとその中で呼ばれる各種描画メソッドが呼ばれなくなり、コンポーネントの描画が正しく行われなくなる可能性がある。このため、何かを描画したい場合には、paint内の、コンポーネント描画のために用意されているpaintComponentをオーバーライドして描画を行う。ただし、これもsuperにメソッドを送るのを忘れると本来の描画が正しくなされないため、かならずsuper.paintComponentしないといけない。
また、このように複雑に描画が行われるため、全体を再描画する場合にはかならずrepaintしないといけない。途中のメソッドを呼び出すと、全体の描画が正しく行われない可能性がある。
要するに、AWTの場合は、paintは描画処理の末端のメソッドであり、「プログラマが勝手に使っていいメソッド」として用意されていて、そこではコンポーネントのクラスでは何も処理が実装されていなかった。ところがSwingでは、paintは末端の何もしていないメソッドではなくなり、その内部でコンポーネントの描画に必要なメソッドの呼び出しなどが細かく実行されるようになった。このために、すべてのメソッドが正しく実行されるように注意してコードを書かないといけなくなった、ということ。やれ、「このメソッドはオーバーライドするな」とか「これは最初にsuperに送れ」とかというのは、すべて「あらかじめ設計されたとおり、描画のためのメソッドが正しい順にすべてきちんと実行される」ようにするためのマナー、ということ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaで文字の角度を変えて表示...
-
VB.NETのSendMessageを教えてく...
-
SwingのpaintComponent(...
-
ドラッグして矩形を描くには
-
SwingとEDT(イベントディスパッ...
-
C# リストビューの特定のセルの...
-
canvasで表示されてる画像を1...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
DataGridViewでセルクリックイ...
-
JSPで<SELECT>の中にDBから持っ...
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
javascriptからjavaを呼び出したい
-
フォームの存在をチェックする方法
-
複数の変数を宣言する時、同時...
-
Javaプログラムからポップアッ...
-
VBAのWindowオブジェクトとWork...
-
boolean型のフィールドとゲッタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
Java、jPanelに描画する
-
VB.NETのSendMessageを教えてく...
-
SwingとEDT(イベントディスパッ...
-
C# DataGridView のCellPaintin...
-
Javaで文字の角度を変えて表示...
-
JAVAでの背景画像表示
-
複数画像表示切り替え Visual c++
-
イベントディスパッチングスレ...
-
C# リストビューの特定のセルの...
-
iアプリ作成 画像を描画できない
-
BMP画像を画像処理して連続に表...
-
SwingWorkerに関して
-
canvasで表示されてる画像を1...
-
アクセスで他アプリから復帰し...
-
GDI+で描画した画像を消去する...
-
重なった要素上でのイベントで...
-
ドラッグして矩形を描くには
-
Androidで画像の中で指定した範...
-
requestanimationframeを一斉に...
おすすめ情報