为什么下面的程序的输出中会把paintComponent()方法中的宽和高给输出2次呢?求正解!!!package drawarcs;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;public class DrawArcs extends JFrame
{
    public DrawArcs()
    {
       add(new ArcsPanel());
    }
    public static void main(String[] args)
    {
        DrawArcs frame = new DrawArcs();
        frame.setTitle("DrawArcs");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
    
}
class ArcsPanel extends JPanel
{
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int xCenter = getWidth()/2;
        int yCenter = getHeight()/2;
        int radius = (int)(Math.min(getWidth(), getHeight())*0.4);
        
        int x = xCenter - radius;
        int y = yCenter - radius;        
        
        g.fillArc(x, y, 2*radius, 2*radius, 0, 30);        
        g.fillArc(x, y, 2*radius, 2*radius, 90, 30);        
        g.fillArc(x, y, 2*radius, 2*radius, 180, 30);       
        g.fillArc(x, y, 2*radius, 2*radius, 270, 30);
        
        System.out.println(getWidth());
        System.out.println(getHeight());
        
    }
}

解决方案 »

  1.   

    帮楼主加点料或说不止两次吧,点一下任务栏就会加一次,好像没什么关系。import java.awt.Graphics;
    import java.awt.Rectangle;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class DrawArcs extends JFrame {
    public DrawArcs() {
    ArcsPanel athread = new ArcsPanel(this);
    add(athread);
    new Thread(athread).start();
    } public static void main(String[] args) {
      DrawArcs frame = new DrawArcs();
      frame.setTitle("DrawArcs");
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(300, 300);
      frame.setVisible(true);
    }
    }class ArcsPanel extends JPanel implements Runnable {
    int xCenter;
    int yCenter;
    int radius;
    DrawArcs main;
    int x;
    int y;
    int number = 0;
    ArcsPanel(DrawArcs main){
    this.main = main;
    }
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    xCenter = getWidth()/2;
    yCenter = getHeight()/2;
    radius = (int) (Math.min(getWidth(), getHeight()) * 0.4);
    x = xCenter - radius;
    y = yCenter - radius;
    g.fillArc(x,y, 2 * radius, 2 * radius,number, 30);
    g.fillArc(x,y, 2 * radius, 2 * radius,number+ 90, 30);
    g.fillArc(x,y, 2 * radius, 2 * radius,number+ 180, 30);
    g.fillArc(x,y, 2 * radius, 2 * radius,number+ 270, 30); }
    @Override
    public void run(){
    while(true){
    repaint();
    number = (number+5)%90;
    try {
    Thread.sleep(40);
    main.validate();
    } catch (InterruptedException e){
    e.printStackTrace();
    }
    }
    }
    }