web-dev-qa-db-ja.com

SwingでのPaint、paintComponent、paintComponentsの違い

Java SwingのPaint()paintComponent()paintComponents()の実際の違いは何ですか?

Oracleのドキュメントで説明されている内容を理解しようとしましたが、明確ではありません。

28
  • AWT、Paint()をオーバーライドします。
  • Swingトップレベルコンテナー(例:JAppletJFrameJWindowJDialog ..)、オーバーライドPaint()。しかし、TLCでペイントする理由はいくつかあります。おそらく別の質問の主題です。
  • Swingの残りの部分では、paintComponent()をオーバーライドします。
  • オーバーライドも明示的なpaintComponents()の呼び出しもせず、必要に応じてAPIに呼び出してもらいます。

メソッドをオーバーライドするときは必ず_@Override_表記も使用してください。

これを行うと、JFramepaintComponent(..)をオーバーライドしようとする問題が示唆されます(このようなメソッドはありません)。

36
Andrew Thompson

興味があるかもしれません AWTとSwingでのペイント

見積もり:

AWTの軽量コンポーネントに適用されるルールは、Swingコンポーネントにも適用されます。たとえば、描画するときに、Paint()が呼び出されます。ただし、Swingは、Paint()呼び出しを、次の順序:

 protected void paintComponent(Graphics g)
protected void paintBorder(Graphics g)
protected void paintChildren(Graphics g)

Swingプログラムは、Paint()をオーバーライドする代わりにpaintComponent()をオーバーライドする必要があります。 APIで許可されていますが、通常はpaintBorder()またはpaintComponents()をオーバーライドする理由はありません(そうする場合は、何をしているのかを確認してください)。この因数分解により、プログラムは、拡張する必要がある絵の部分のみをオーバーライドすることが容易になります。たとえば、これは前述のAWTの問題を解決します。この問題では、super.Paint()の呼び出しに失敗すると、軽量の子が表示されませんでした。

17
Avrom