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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Androidで画像の中で指定した範...
-
SwingのpaintComponent(...
-
GDI+で描画した画像を消去する...
-
画面のちらつきの原因が知りた...
-
Java、jPanelに描画する
-
getGraphics()の意味を教えて...
-
Canvas等の図形を移動する時,直...
-
C# リストビューの特定のセルの...
-
JAVAでの背景画像表示
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
オブジェクト指向プログラミン...
-
生成したインスタンスを削除す...
-
変数名の付け方
-
servletからjspへオブジェクト...
-
レコード件数の表示
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
String.containsの反対機能はあ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
JAVAでの背景画像表示
-
C# DataGridView のCellPaintin...
-
C# リストビューの特定のセルの...
-
重なった要素上でのイベントで...
-
画面のちらつきの原因が知りた...
-
Androidで画像の中で指定した範...
-
複数画像表示切り替え Visual c++
-
Labelコントロールの背景をグラ...
-
VS Treeview のデザイン変更
-
描画処理が実行されない
-
GDI+で描画した画像を消去する...
-
canvasで表示されてる画像を1...
-
このプログラミングをどう組み...
-
ドラッグして矩形を描くには
-
getGraphics()の意味を教えて...
-
DirectXのスプライト機能で3D回転
-
Canvas等の図形を移動する時,直...
-
Exception occurred during eve...
おすすめ情報