首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

一个时钟代码求解,先多谢

2012-04-01 
一个时钟代码求解,先谢谢各位高手import java.awt.Colorimport java.awt.Containerimport java.awt.Grap

一个时钟代码求解,先谢谢各位高手
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.Timer;
import javax.swing.JApplet;
import javax.swing.JPanel;


public class ClockPanel extends JPanel implements ActionListener{
//JPanel(LayoutManager flowLayout);
//FlowLayout mylayout=new FlowLayout();
//FlowLayout exLayout=new FlowLayout(FlowLayou.LEFT);
//setLayout(exLayout);
private int hour;
private int minute;
private int second;
private int year;
ClockPanel()
{
//Timer timer=new Timer(1000,this);
//timer.start();
//方法1,每秒响应
int delay=1000;
ActionListener taskPerformer=new ActionListener(){
public void actionPerformed(ActionEvent e){
repaint();
}
};
new Timer(delay,taskPerformer).start();
//方法2,每秒响应

}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
setCurrentTime();
int clockRadius=55; //圆的半径
int xCenter=70;
int yCenter=55;
g.drawOval(15, 0, 2*clockRadius, 2*clockRadius);
//画一个可以包含矩形的圆,前2个参数是坐标值,后面2个参数是矩形的长和宽
g.drawString("12", xCenter-7, yCenter-clockRadius+12);
g.drawString("9",xCenter-clockRadius+3,yCenter+5);
g.drawString("3", xCenter+clockRadius-10, yCenter+5);
g.drawString("6", xCenter-3, yCenter+clockRadius-3);
g.drawString("1", xCenter+20, yCenter-clockRadius+20);
g.drawString("2", xCenter+38, yCenter-clockRadius+38); //表盘上的12个数字,后面2个参数是坐标
g.drawString("4", xCenter+40, yCenter+clockRadius-25);
g.drawString("5", xCenter+20, yCenter+clockRadius-10);
g.drawString("7", xCenter-28, yCenter+clockRadius-10);
g.drawString("8", xCenter-45, yCenter+clockRadius-25);
g.drawString("10", xCenter-45, yCenter-clockRadius+38);
g.drawString("11", xCenter-30, yCenter-clockRadius+20);

int sLength=(int)(clockRadius*0.8);//秒针的长度
int xSecond=(int)(xCenter+sLength*Math.sin(second*(2*Math.PI/60))); //作用不明
int ySecond=(int)(yCenter-sLength*Math.cos(second*(2*Math.PI/60)));//作用不明
g.setColor(Color.RED);
g.drawLine(xCenter,yCenter,xSecond,ySecond);//画一条线,前面2个参数是坐标值,后面2个参数表示线的2个端点 ps:绘制一条连接由坐标对指定的两个点的线条。
int mLength=(int)(clockRadius*0.6);
int xMinute=(int)(xCenter+mLength*Math.sin(minute*(2*Math.PI/60)));
int yMinute=(int)(yCenter+mLength*Math.cos(minute*(2*Math.PI/60)));
g.setColor(Color.BLUE);
g.drawLine(xCenter, yCenter, xMinute, yMinute);
int hLength=(int)(clockRadius*0.4);
int xHour=(int)(xCenter+hLength*Math.sin((hour%12+minute/60.0)*(2*Math.PI/12)));
int yHour=(int)(yCenter+hLength*Math.cos((hour%12+minute/60.0)*(2*Math.PI/12)));
g.setColor(Color.BLACK);
g.drawLine(xCenter,yCenter,xHour,yHour);
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss E");
g.drawString(sdf.format(d),20,150);
}
private void setCurrentTime() {
// TODO Auto-generated method stub
//用GregorianCalendar获得当前时间
Calendar cal=new GregorianCalendar();
this.hour=cal.get(Calendar.HOUR_OF_DAY);
this.minute=cal.get(Calendar.MINUTE);
this.second=cal.get(Calendar.SECOND);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
repaint();

}

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JFrame;

//import javax.swing.JApplet;
//import javax.swing.JFrame;


//
//public class ClockApplet extends JApplet
//{
//public void init()
//{
////ClockPanel cp=new ClockPanel();
////add(cp);
////JFrame f=new JFrame();
////f.add(cp);
////f.setTitle("备忘录");
////f.setSize(300,200);
////f.setLocation(400,300);
////f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
////f.setVisible(true);
//ClockPanel cp=new ClockPanel();
//add(cp);
//
//}
//}
public class ClockApplet
{
public static void main(String[]args)
{
JFrame f=new JFrame();
ClockPanel cp=new ClockPanel();
f.add(cp);
f.setTitle("备忘录");
  f.setSize(160,728);
  f.setLocation(400,0);
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  f.setVisible(true);
 
}
}


我是按照书本打的代码,原本是对的!但,我想修改一下窗口和时钟的大小,结果,就变成现在这样,时钟里面的时间错误了!还有就是我注释里写了有些地方不明白的!那个数学公式的,我不明白,可怜的我是一个文科生,看不明白啊!希望各位可以解释一下!谢谢吖!

[解决办法]

探讨
引用:
你说不明白的地方,是计算秒针在你画的时钟上的终点坐标的。起点是时钟的中间,通过起点,到终点画线,那就是秒针。
至于你说的时间不对,那肯定是你改了其中一个参数,别的关联的参数没有改变引起的,我建议你debug一下看看。

debug是怎么操作的。。抱歉啊!我是一个新手,刚学,很多东西都不会!可以解释一下
int xSecond=(i……

[解决办法]
int xMinute=(int)(xCenter+mLength*Math.sin(minute*(2*Math.PI/60)));
int yMinute=(int)(yCenter-mLength*Math.cos(minute*(2*Math.PI/60)));//你的这一句变成加法了,小时那里也是,所以分针和时针有问题
[解决办法]
int sLength=(int)(clockRadius*0.8);//秒针的长度
int xSecond=(int)(xCenter+sLength*Math.sin(second*(2*Math.PI/60)));
int ySecond=(int)(yCenter-sLength*Math.cos(second*(2*Math.PI/60)));
g.setColor(Color.RED);
g.drawLine(xCenter,yCenter,xSecond,ySecond);//画一条线,前面2个参数是起点坐标值,后面2个参数是终点坐标值。
int mLength=(int)(clockRadius*0.6);
int xMinute=(int)(xCenter+mLength*Math.sin(minute*(2*Math.PI/60)));
int yMinute=(int)(yCenter-mLength*Math.cos(minute*(2*Math.PI/60)));
g.setColor(Color.BLUE);
g.drawLine(xCenter, yCenter, xMinute, yMinute);
int hLength=(int)(clockRadius*0.4);
int xHour=(int)(xCenter+hLength*Math.sin((hour%12+minute/60.0)*(2*Math.PI/12)));
int yHour=(int)(yCenter-hLength*Math.cos((hour%12+minute/60.0)*(2*Math.PI/12)));

测试正确.
[解决办法]
这里三个针计算方法都是一样的,秒针对就按照秒针的
因为角度起算从0点整开始,顺时针方向
因此是用cos来得y坐标(y坐标向下为正,得到的y方向偏移量取反再相加),sin得x坐标

热点排行