1
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));
        }
    }
}

次に、 Board オブジェクトがインスタンス化される JFrame 拡張クラス

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();
    }
}

私はこのような行を見ることを期待していました:new Board().paint(graphicsObject)だから、実際にこの行が実行される場所または適切な方法で実際にpaint(Graphics g)関数が呼び出される場所?!

4

2 に答える 2

5

paint() への呼び出しスタックをたどりたい場合は、new Throwable().printStackTrace()orThread.dumpStack()を記述するだけで、呼び出しスタックをたどることができます。

そうでなければ、見てくださいRepaintManager.addDirtyRegion(JComponent, int, int, int, int);

とにかく、画面にペイントするときは、決して paint/paintComponent/paintXXX メソッドを呼び出してはいけません。のみ呼び出しますrepaint()

メソッド paintComponent(Graphics) または paint(Graphics) が呼び出される「いつ」に依存することはできません。

于 2012-10-12T14:57:52.983 に答える
4

paintたとえば、コンポーネントが表示されるようになったとき (初めて、またはウィンドウを最小化した後など)、またはウィンドウのサイズが変更されたときなど、基本的にコンポーネントのコンテンツを変更する必要があるときはいつでも、Swing によって自動的に呼び出されます。塗られる。paint強制したい場合は、代わりに呼び出すpaint必要があります。repaint

このリンクは役に立つかもしれません

PSpaintによって呼び出されるメソッドのコードは、によって拡張されるクラスにsuper.paint(g)存在します(クラスによって拡張されます)。JComponentJPanelBoard

于 2012-10-12T14:51:08.010 に答える