3

paintメソッド:

Invoked by Swing to draw components. Applications should not invoke paint directly, 
but should instead use the repaint method to schedule the component for redrawing.

This method actually delegates the work of painting to three protected methods: 
paintComponent, paintBorder, and paintChildren. They're called in the order listed 
to ensure that children appear on top of component itself. Generally speaking,
the component and its children should not paint in the insets area allocated to the
border. Subclasses can just override this method, as always. A subclass that just 
wants to specialize the UI (look and feel) delegate's paint method should just 
override paintComponent.

Parameters:
    g the Graphics context in which to paint

public void paint(Graphics g)

paint()オーバーライドするのではなく、代わりにオーバーライドすることを何度も読みましpaintComponent()た。上記のように、ドキュメントではpaintComponent()、UI を特殊化する場合はオーバーライドすることも提案されています。

そのため、コードをトレースして、その理由を確認したかったのです。

 protected void paintComponent(Graphics g) 
 {
     if (ui != null) 
     {
         Graphics scratchGraphics = (g == null) ? null : g.create();

         try 
         {
             ui.update(scratchGraphics, this);
         }
         finally 
         {
             scratchGraphics.dispose();
         }
     }
 }

トレースする方法はたくさんありますが、簡潔にするために、次のようにしますupdate()

public void update(Graphics g, JComponent c) 
{
    if (c.isOpaque()) 
    {
        g.setColor(c.getBackground());
        g.fillRect(0, 0, c.getWidth(),c.getHeight());
    }

    paint(g, c);
}

のオーバーロードされたバージョンpaint()が呼び出されpaint()、それ自体が を呼び出しますpaintComponent()。だから、ここで何が起こっているのかを正確に把握しようとしているだけだと思います。私は Swing を初めて使用します。多くのクラスがあり、特に一般的に GUI の使用に関する知識が限られているため、それらすべてをトレースするのはかなり困難です。

これらのメソッドは常に相互に呼び出しを行っているため、画面上に画像が表示されているように見えますか? もしそうなら、paint()代わりにオーバーライドすると、なぜそんなに重要なのpaintComponentですか? アプリケーションの場合、ドキュメントではpaint()直接呼び出すことを勧めておらず、代わりにrepaint(). paint()つまり、基本的に、paintComponent()repaint()、 などの全体的な関係について洞察を得ようとしているだけです。

4

1 に答える 1