刚学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);
}
}
但是有一个地方一直想不明白,就是红色标出的的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);
}
}
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);
}
}
而在创建的时候宽和高都是0,这样赋值在外面时,x,y都成了0,并且getContentPane().add之后不会被重新赋值
如果我说得对麻烦高手过来验证一下大家踊跃参加啊,春哥会保佑大家的!!!