为什么下面的程序的输出中会把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());
}
}
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());
}
}
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();
}
}
}
}