• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SwingのpaintComponent()メソッドについて)

SwingのpaintComponent()メソッドについて

このQ&Aのポイント
  • Swingのコンポーネントでは、paintメソッドの使用は推奨されていません。代わりに、paintComponentをオーバーライドしたクラスのrepaint()メソッドを呼び出すべきです。
  • Swingでは、描画するために継承したクラスでpaintComponent(Graphics g)メソッドをオーバーライドし、Graphicsクラスのメソッドを使用して描画を行います。
  • オーバーライドしたpaintComponentメソッドの先頭で、super.paintComponent(g)を呼び出しておくことで、コンポーネントの土台を描画することができます。

質問者が選んだベストアンサー

  • ベストアンサー
noname#94983
noname#94983
回答No.1

Swingでは、コンポーネントの描画はかなり複雑になっている。AWTでは、repaintが呼ばれると、updateが呼ばれた後、paintが呼ばれる。が、Swingでは、paing内で更にpaintComponentによってコンポーネントが描画され、それからpaintBorderでボーダーが描画され、最後にpaintChildrenによって内包するコンポーネントの描画が呼び出される、という仕組みになっている。 したがって、paintをオーバーライドしてしまうとその中で呼ばれる各種描画メソッドが呼ばれなくなり、コンポーネントの描画が正しく行われなくなる可能性がある。このため、何かを描画したい場合には、paint内の、コンポーネント描画のために用意されているpaintComponentをオーバーライドして描画を行う。ただし、これもsuperにメソッドを送るのを忘れると本来の描画が正しくなされないため、かならずsuper.paintComponentしないといけない。 また、このように複雑に描画が行われるため、全体を再描画する場合にはかならずrepaintしないといけない。途中のメソッドを呼び出すと、全体の描画が正しく行われない可能性がある。 要するに、AWTの場合は、paintは描画処理の末端のメソッドであり、「プログラマが勝手に使っていいメソッド」として用意されていて、そこではコンポーネントのクラスでは何も処理が実装されていなかった。ところがSwingでは、paintは末端の何もしていないメソッドではなくなり、その内部でコンポーネントの描画に必要なメソッドの呼び出しなどが細かく実行されるようになった。このために、すべてのメソッドが正しく実行されるように注意してコードを書かないといけなくなった、ということ。やれ、「このメソッドはオーバーライドするな」とか「これは最初にsuperに送れ」とかというのは、すべて「あらかじめ設計されたとおり、描画のためのメソッドが正しい順にすべてきちんと実行される」ようにするためのマナー、ということ。

eiji_0035
質問者

お礼

logger_manさん、有り難うございました、今後とも宜しくお願いします

関連するQ&A

専門家に質問してみよう