1. ホーム
  2. java

[解決済み] paintComponentはどのように機能するのですか?

2022-01-29 09:46:52

質問事項

とても初歩的な質問かもしれませんが、よろしくお願いします。私はちょうどJavaを学び始めたところです

paintComponentメソッドの動作がよくわかりません。何かを描画したい場合、paintComponentメソッドをオーバーライドしなければならないことは知っています。

public void paintComponent(Graphics g)
{
   ...
}

しかし、いつ呼び出されるのでしょうか?object.paintComponent(g)" のようなものは見たことがありませんが、それでもプログラム実行時には描画されています。

また、Graphics パラメータとは何ですか?どこの国のものですか?パラメータは、メソッドが呼び出されたときに供給されなければなりません。しかし、先ほども言ったように、このメソッドが明示的に呼び出されることはないようです。では、誰がこのパラメータを提供するのでしょうか?また、なぜGraphics2Dにキャストしなければならないのでしょうか?

public void paintComponent(Graphics g)
{
    ...
    Graphics2D g2= (Graphics2D) g;
    ...
}

解決方法は?

あなたの質問に対する(非常に)短い答えは、次のとおりです。 paintComponent Java Swing GUIシステムをブラックボックスとして考える方が簡単な場合もあります。

コンポーネントの再描画が必要になるタイミングは、移動、サイズ変更、フォーカスの変更、他のフレームで隠されるなど、さまざまな要因があります。 これらのイベントの多くは、自動的な魔法で検出され paintComponent は、その操作が必要だと判断されたときに、内部で呼び出される。

私は長年Swingを扱ってきましたが、これまで これまで という paintComponent を直接呼び出したり、他のものから直接呼び出されるのを見たことがあります。 一番近いのは repaint() メソッドを使用して、特定のコンポーネントの再描画をプログラムでトリガーします (これは、正しい paintComponent メソッドの下流にあります。

私の経験では paintComponent が直接オーバーライドされることはほとんどありません。 そのような粒度を必要とするカスタム レンダリング タスクがあることは認めますが、Java Swing には(かなり)堅牢な JComponent と Layouts のセットがあり、それらを使用すれば、直接オーバーライドしなくても重い仕事の多くをこなすことができます。 paintComponent . ここで私が言いたいのは、独自のカスタムレンダリングコンポーネントを作ろうとする前に、ネイティブのJComponentsとLayoutsで何かできないか確認することです。