super.paintComponent(g)
は何をしますか(特にpaintComponent()メソッド内に配置する場合)?これまでにSO=)でこれを尋ねている人を見かけないのには驚きです。
私はJavaグラフィックスに関する私の学校のノートを掘り下げます、それがこのコード行で言及した唯一のものは"do not delete"
。
しかし、私はここ数週間、Java paintComponent()メソッドを実践して縛っています。これまでのところ、コードにその行を含めていません。すべてがうまくいくようです(これまでのところ)。そう..
質問:
- それは何をするためのものか?
paintComponent
メソッドをオーバーライドしていないかのようにコンポーネントを出力します。たとえば、背景色を設定している場合、これは通常、拡張するクラスによってペイントされます。
- いつ使用する必要がありますか?
コンポーネント全体をペイントしない場合に使用します。ペイントしないパーツは「透けて」見えます。つまり、スーパークラスにそれらのパーツをペイントさせる必要があります。たとえば、背景色の例のように:コンポーネントの中央に円を描くだけの場合、super.paintComponent
は、背景色が円の周りに描かれていることを確認します。
コンポーネントの全領域をdoペイントする場合、super.paintComponentペイントの上にペイントするため、superを呼び出す意味がありません。 paintComponent。
- PaintComponent()に書き込むことでどのような利点がありますか?
それはそれを置く唯一の論理的な場所です。 paintComponent
は、コンポーネントをペイントする必要があるときに呼び出されます。前述のように、コンポーネント全体を自分でペイントしない場合は、super.paintComponent
輝く部分にペイントします。
ドキュメンテーションpaintComponent
はかなりよく言っています:
[...]スーパーの実装を呼び出さない場合は、不透明なプロパティを尊重する必要があります。つまり、このコンポーネントが不透明な場合は、背景を不透明ではない色で完全に埋める必要があります。不透明なプロパティを尊重しない場合、視覚的なアーティファクトが表示される可能性があります。
ほとんどの標準Swingコンポーネントは、そのルックアンドフィールが個別の「UI Delegate」オブジェクトによって実装されています。 super.paintComponent(g)を呼び出すと、グラフィックスコンテキストがコンポーネントのUIデリゲートに渡され、パネルの背景が描画されます。このプロセスの詳細については、前述のSDN記事の「Painting and the UI Delegate」というタイトルのセクションを参照してください。