paint(Graphics g)函数被调用但我不知道在哪里?

You*_*ans 1 java swing

package donut;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;

import javax.swing.JPanel;


public class Board extends JPanel{

    public void paint(Graphics g)
    {
      super.paint(g);

      Graphics2D g2 = (Graphics2D) g;

      RenderingHints rh =
            new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                               RenderingHints.VALUE_ANTIALIAS_ON);

      rh.put(RenderingHints.KEY_RENDERING,
             RenderingHints.VALUE_RENDER_QUALITY);

      g2.setRenderingHints(rh);

      Dimension size = getSize();
      double w = size.getWidth();
      double h = size.getHeight();

      Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130);
      g2.setStroke(new BasicStroke(1));
      g2.setColor(Color.gray);


      for (double deg = 0; deg < 360; deg += 5) {
          AffineTransform at =
              AffineTransform.getTranslateInstance(w / 2, h / 2);
          at.rotate(Math.toRadians(deg));
          g2.draw(at.createTransformedShape(e));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后 实例化JFrame扩展类,其中Board对象被实例化

package donut;

import javax.swing.JFrame;


public class Donut extends JFrame {


    public Donut() {

        add(new Board());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(360, 310);
        setLocationRelativeTo(null);
        setTitle("Donut");
        setVisible(true);
    }

    public static void main(String[] args) {
        new Donut();
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待看到像这样的线:new Board().paint(graphicsObject)所以实际上这条线被执行或者以适当的方式在哪里实际paint(Graphics g)调用函数?

Gui*_*let 5

如果你想跟随调用堆栈paint(),只需写new Throwable().printStackTrace()Thread.dumpStack(),这将允许你跟随调用堆栈.

否则,看看 RepaintManager.addDirtyRegion(JComponent, int, int, int, int);

无论如何,当你画到屏幕上时,你永远不应该调用paint/paintComponent/paintXXX方法.只打电话repaint().

你不能依赖"when"你的方法paintComponent(Graphics)或paint(Graphics)将被调用.