刚学java,做一个静止的钟,以下是成功的程序。
但是有一个地方一直想不明白,就是红色标出的的x,y的地方,
为什么一定要在paintComponent里面赋值才行,
把那两行写在外面,运行的时候x,y都会被当做0.
各位大大看在春哥的份上帮小弟一把,谢谢。过程基本可以忽略,主要就是x,y两个变量赋值地点的问题。package Clock;
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class PrimalClock extends JPanel{
public PrimalClock(){
setCurrentTime();
}
public PrimalClock(int hour,int minute,int second){
this.hour = hour;
this.minute = minute;
this.second = second;
}
public void setCurrentTime(){
Calendar c = new GregorianCalendar();
this.hour = c.get(Calendar.HOUR_OF_DAY);
this.minute = c.get(Calendar.MINUTE);
this.second = c.get(Calendar.SECOND);
}
public int hour;
public int minute;
public int second;
public void paintComponent(Graphics g){
int x = getWidth()/2;
int y = getHeight()/2;
int r1 = (int)(Math.min(getWidth(), getHeight())*0.4);
int r2 = (int)(Math.min(getWidth(), getHeight())*0.45);
int hourR = r1/2;
int minuteR = r1*3/4;
int secondR = r1*4/5;
int hourX = (int)(x+hourR*Math.sin((hour%12+minute/60.0)/6*Math.PI));
int minuteX = (int)(x+minuteR*Math.sin((minute/60.0)*2*Math.PI));
int secondX = (int)(x+secondR*Math.sin((second/60.0)*2*Math.PI));
int hourY = (int)(y-hourR*Math.cos((hour%12+minute/60.0)/6*Math.PI));
int minuteY = (int)(y-minuteR*Math.cos((minute/60.0)*2*Math.PI));
int secondY = (int)(y-secondR*Math.cos((second/60.0)*2*Math.PI));
super.paintComponent(g);
g.setColor(Color.BLACK);
g.drawOval(x-r1, y-r1, 2*r1, 2*r1);
g.drawOval(x-r2, y-r2, 2*r2, 2*r2);
g.drawString("12", x-5, y-r1+12);
g.drawString("9", x-r1+5, y-5);
g.drawString("6", x-5, y+r1-5);
g.drawString("3", x+r1-5, y-5);
g.setColor(Color.RED);
g.drawLine(x, y, hourX, hourY);
g.setColor(Color.BLUE);
g.drawLine(x, y, minuteX, minuteY);
g.setColor(Color.GREEN);
g.drawLine(x, y, secondX, secondY);
}
}

解决方案 »

  1.   

    楼主应该先把格式排好,你这样大家看的很累的。我也是新手看不懂,帮你排下格式吧package Clock;
    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    public class PrimalClock extends JPanel{
    public PrimalClock(){
    setCurrentTime();
    }
    public PrimalClock(int hour,int minute,int second){
    this.hour = hour;
    this.minute = minute;
    this.second = second;
    }
    public void setCurrentTime(){
    Calendar c = new GregorianCalendar();
    this.hour = c.get(Calendar.HOUR_OF_DAY);
    this.minute = c.get(Calendar.MINUTE);
    this.second = c.get(Calendar.SECOND);
    }
    public int hour;
    public int minute;
    public int second;
    public void paintComponent(Graphics g){
    int x = getWidth()/2;
    int y = getHeight()/2; int r1 = (int)(Math.min(getWidth(), getHeight())*0.4);
    int r2 = (int)(Math.min(getWidth(), getHeight())*0.45);
    int hourR = r1/2;
    int minuteR = r1*3/4;
    int secondR = r1*4/5;
    int hourX = (int)(x+hourR*Math.sin((hour%12+minute/60.0)/6*Math.PI));
    int minuteX = (int)(x+minuteR*Math.sin((minute/60.0)*2*Math.PI));
    int secondX = (int)(x+secondR*Math.sin((second/60.0)*2*Math.PI));
    int hourY = (int)(y-hourR*Math.cos((hour%12+minute/60.0)/6*Math.PI));
    int minuteY = (int)(y-minuteR*Math.cos((minute/60.0)*2*Math.PI));
    int secondY = (int)(y-secondR*Math.cos((second/60.0)*2*Math.PI));
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.drawOval(x-r1, y-r1, 2*r1, 2*r1);
    g.drawOval(x-r2, y-r2, 2*r2, 2*r2);
    g.drawString("12", x-5, y-r1+12);
    g.drawString("9", x-r1+5, y-5);
    g.drawString("6", x-5, y+r1-5);
    g.drawString("3", x+r1-5, y-5);
    g.setColor(Color.RED);
    g.drawLine(x, y, hourX, hourY);
    g.setColor(Color.BLUE);
    g.drawLine(x, y, minuteX, minuteY);
    g.setColor(Color.GREEN);
    g.drawLine(x, y, secondX, secondY);
    }
    }
      

  2.   

    我的Eclipse出问题了  楼主自己编辑一下吧
      

  3.   

    猜想。放外面就是说jpanel对象刚new出来,但是ui还没构建好,所以得不到宽和高
      

  4.   

    7楼你的猜想听上去蛮有道理的,受你启发我忽然想到会不会是在add()之后JPanel才会去计算paintComponent(Graphics g),同时根据frame的板式重新赋值宽和高,
    而在创建的时候宽和高都是0,这样赋值在外面时,x,y都成了0,并且getContentPane().add之后不会被重新赋值
    如果我说得对麻烦高手过来验证一下大家踊跃参加啊,春哥会保佑大家的!!!