package Q1;
/*
*类1
*@此类创建钟表窗体组件
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ClockApp extends JFrame implements ActionListener{
StillClock clock=new StillClock();
JPanel controlpanel=new JPanel();//controlpanel控制面板
JButton pause=new JButton("暂停");
JButton resume=new JButton("继续");
BorderLayout layout=new BorderLayout();
ClockApp()
{
setLayout(layout);
setTitle("时钟程序");
setSize(new Dimension(400,400));//Dimension外形尺寸
Container content=this.getContentPane();
controlpanel.add(pause);
controlpanel.add(resume);
content.add(clock,layout.CENTER);
content.add(controlpanel,layout.SOUTH);
pause.addActionListener(this);
resume.addActionListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(pause))
{
clock.stop();
}
if(e.getSource().equals(resume))
{
clock.start();
}
}
}
package Q1;
/*
*类2
*继承父类 Timer类
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.*;
import javax.swing.*;
public class Clock extends Timer{
public Clock(int delay, ActionListener listener) {
super(delay, listener);
}
}
package Q1;
/*
*类3
*设计静态钟表,以及时分秒针的状态,并初始化其位置
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;public class StillClock extends Canvas implements ActionListener{//停止的钟表
Line2D secondLine=new Line2D.Double(0,0,0,0);
Line2D minuteLine=new Line2D.Double(0,0,0,0);
Line2D hourLine=new Line2D.Double(0,0,0,0);
ClockControl clockcontrol=new ClockControl();
Clock clock;
StillClock()
{
clock=new Clock(1000,this);
clock.start();
}
public void paint(Graphics g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.fillOval(190, 140, 20, 20);//用颜色填充钟表
drawLine(g2d);
drawPoint(g2d);
this.setBackground(Color.DARK_GRAY);
}
public void actionPerformed(ActionEvent e) {
repaint();
}
void start()
{
clock.start();
}
void stop()
{
clock.stop();
}
void drawLine(Graphics2D g2d)
{
clockcontrol.update();
secondLine.setLine(200,150,clockcontrol.getPonintSX() ,clockcontrol.getPonintSY());
minuteLine.setLine(200,150,clockcontrol.getPonintMX() ,clockcontrol.getPonintMY());
hourLine.setLine(200,150,clockcontrol.getPonintHX() ,clockcontrol.getPonintHY());
g2d.setColor(Color.RED);
BasicStroke sbs=new BasicStroke(3,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
g2d.setStroke(sbs);
g2d.draw(secondLine);
g2d.setColor(Color.green);
BasicStroke mbs=new BasicStroke(5,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
g2d.setStroke(mbs);
g2d.draw(minuteLine);
g2d.setColor(Color.BLUE);
BasicStroke hbs=new BasicStroke(7,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
g2d.setStroke(hbs);
g2d.draw(hourLine);
}
void drawPoint(Graphics2D g2d)
{
double x[]=clockcontrol.getPointX();
double y[]=clockcontrol.getPointY();
for(int i=0;i<60;i++)
{
g2d.setColor(Color.RED);
if(i%5==0)
{
if(i==0)
g2d.drawString(""+12,(int)x[i], (int)y[i]);
else
g2d.drawString(""+i/5,(int)x[i], (int)y[i]);
}
g2d.drawString(clockcontrol.getTimeString(), 150, 300);
g2d.setColor(Color.BLACK);
g2d.fillOval((int)x[i], (int)y[i], 4, 4);
}
}
}
package Q1;
/*
*类4
*设计核心部分,时分秒针相互关系,以及在面板上显示出当前时间。
*/
import java.awt.Dimension;
import java.util.*;
public class ClockControl {
double pointSX[] = new double[60];
double pointSY[] = new double[60];
double pointMX[] = new double[60];
double pointMY[] = new double[60];
double pointHX[] = new double[60];
double pointHY[] = new double[60];
double pointX[]=new double[60];
double pointY[]=new double[60];
int hour, minute, second;
ClockControl() {
pointX[0]=0;
pointY[0]=-120;
pointSX[0]=0;
pointSY[0]=-100;
pointMX[0]=0;
pointMY[0]=-90;
pointHX[0]=0;
pointHY[0]=-70;
double angle=6*Math.PI/180;
for(int i=0;i<59;i++)
{
pointX[i+1]=pointX[i]*Math.cos(angle)-Math.sin(angle)*pointY[i];
pointY[i+1]=pointY[i]*Math.cos(angle)+Math.sin(angle)*pointX[i];
pointSX[i+1]=pointSX[i]*Math.cos(angle)-Math.sin(angle)*pointSY[i];
pointSY[i+1]=pointSY[i]*Math.cos(angle)+Math.sin(angle)*pointSX[i];
pointHX[i+1]=pointHX[i]*Math.cos(angle)-Math.sin(angle)*pointHY[i];
pointHY[i+1]=pointHY[i]*Math.cos(angle)+Math.sin(angle)*pointHX[i];
pointMX[i+1]=pointMX[i]*Math.cos(angle)-Math.sin(angle)*pointMY[i];
pointMY[i+1]=pointMY[i]*Math.cos(angle)+Math.sin(angle)*pointMX[i];
}
for(int i=0;i<60;i++)
{
pointSX[i]+=200;
pointSY[i]+=150;
pointMX[i]+=200;
pointMY[i]+=150;
pointHX[i]+=200;
pointHY[i]+=150;
pointX[i]+=200;
pointY[i]+=150;
}
}
void update() {
Date nowdate = new Date();
String datestr = nowdate.toString();
hour = Integer.parseInt(datestr.substring(11, 13));
minute = Integer.parseInt(datestr.substring(14, 16));
second = Integer.parseInt(datestr.substring(17, 19));
}
double getPonintSY() {
return pointSY[second];
}
double getPonintSX() {
return pointSX[second];
}
double getPonintHX() {
return pointHX[hour%12*5+minute/12];
}
double getPonintHY() {
return pointHY[hour%12*5+minute/12];
}
double getPonintMX() {
return pointMX[minute];
}
double getPonintMY() {
return pointMY[minute];
}
double[] getPointX()
{
return pointX;
}
double[] getPointY()
{
return pointY;
}
String getTimeString()
{
String str="现在时间:"+hour+":"+minute+":"+second;
return str;
}
}
package Q1;
/*
*类5
*创建测试、运行主函数
*/
public class Test {
public static void main(String[] args) {
ClockApp a=new ClockApp();
}
}