web-dev-qa-db-ja.com

super.paintComponent(g)は何をしますか?

super.paintComponent(g)は何をしますか(特にpaintComponent()メソッド内に配置する場合)?これまでにSO=)でこれを尋ねている人を見かけないのには驚きです。

私はJavaグラフィックスに関する私の学校のノートを掘り下げます、それがこのコード行で言及した唯一のものは"do not delete"

しかし、私はここ数週間、Java paintComponent()メソッドを実践して縛っています。これまでのところ、コードにその行を含めていません。すべてがうまくいくようです(これまでのところ)。そう..

質問:

  1. それは何をするためのものか?
  2. いつ使用する必要がありますか?
  3. PaintComponent()に書き込むことでどのような利点がありますか?
17
user3437460
  1. それは何をするためのものか?

paintComponentメソッドをオーバーライドしていないかのようにコンポーネントを出力します。たとえば、背景色を設定している場合、これは通常、拡張するクラスによってペイントされます。

  1. いつ使用する必要がありますか?

コンポーネント全体をペイントしない場合に使用します。ペイントしないパーツは「透けて」見えます。つまり、スーパークラスにそれらのパーツをペイントさせる必要があります。たとえば、背景色の例のように:コンポーネントの中央に円を描くだけの場合、super.paintComponentは、背景色が円の周りに描かれていることを確認します。

コンポーネントの全領域をdoペイントする場合、super.paintComponentペイントの上にペイントするため、superを呼び出す意味がありません。 paintComponent。

  1. PaintComponent()に書き込むことでどのような利点がありますか?

それはそれを置く唯一の論理的な場所です。 paintComponentは、コンポーネントをペイントする必要があるときに呼び出されます。前述のように、コンポーネント全体を自分でペイントしない場合は、super.paintComponent輝く部分にペイントします。

ドキュメンテーションpaintComponentはかなりよく言っています:

[...]スーパーの実装を呼び出さない場合は、不透明なプロパティを尊重する必要があります。つまり、このコンポーネントが不透明な場合は、背景を不透明ではない色で完全に埋める必要があります。不透明なプロパティを尊重しない場合、視覚的なアーティファクトが表示される可能性があります。

15
aioobe

Java Painting Tutorial から:

ほとんどの標準Swingコンポーネントは、そのルックアンドフィールが個別の「UI Delegate」オブジェクトによって実装されています。 super.paintComponent(g)を呼び出すと、グラフィックスコンテキストがコンポーネントのUIデリゲートに渡され、パネルの背景が描画されます。このプロセスの詳細については、前述のSDN記事の「Painting and the UI Delegate」というタイトルのセクションを参照してください。

3
Kevin Workman