学习Java有一段时间了,响应老师的号召,做了这一个动态钟表程序。其中,StillClock.java主要实现钟表的外观,ClockAnimation.java使钟表与系统时间始终保持同步。实现结果如下所示:
下面是具体实现部分:
StillClock.java
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class StillClock extends JPanel
{
private int hour;
private int minute;
private int second;
public StillClock()
{
setCurrentTime();
}
public StillClock(int hour,int minute,int second)
{
this.hour=hour;
this.minute=minute;
this.second=second;
}
public int getHour()
{
return hour;
}
public void setHour(int hour)
{
this.hour=hour;
repaint();
}
public int getMinute()
{
return minute;
}
public void setMinute(int minute)
{
this.minute=minute;
repaint();
}
public int getSecond()
{
return second;
}
public void setSecond(int second)
{
this.second=second;
repaint();
}
//重载paintComponent函数
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
//初始化钟表参数
int clockRadius=(int)(Math.min(getWidth(),getHeight()*0.8*0.5));
int xCenter=getWidth()/2;
int yCenter=getHeight()/2;
//画表盘
g.setColor(Color.black);
g.drawOval(xCenter-clockRadius,yCenter-clockRadius,2*clockRadius,2*clockRadius);
//画表盘的数字和刻度
for(int i=1;i<=12;i++)
{
int xStart=(int)(xCenter+0.9*clockRadius*Math.sin(Math.PI/6*i));
int yStart=(int)(yCenter-0.9*clockRadius*Math.cos(Math.PI/6*i));
int xEnd=(int)(xCenter+clockRadius*Math.sin(Math.PI/6*i));
int yEnd=(int)(yCenter-clockRadius*Math.cos(Math.PI/6*i));
g.setColor(Color.black);
g.drawLine(xStart,yStart,xEnd,yEnd);
Integer integer=new Integer(i);
switch (i)
{
case 1:
g.drawString("1",xStart-5,yStart+5);
break;
case 2:
g.drawString("2",xStart-5,yStart+8);
break;
case 3:
g.drawString("3",xCenter+clockRadius-20,yCenter+5);
break;
case 4:
g.drawString("4",xStart-6,yStart+5);
break;
case 5:
g.drawString("5",xStart-5,yStart);
break;
case 6:
g.drawString("6",xCenter-3,yCenter+clockRadius-15);
break;
case 7:
g.drawString("7",xStart,yStart);
break;
case 8:
g.drawString("8",xStart,yStart);
break;
case 9:
g.drawString("9",xCenter-clockRadius+15,yCenter+5);
break;
case 10:
g.drawString("10",xStart,yStart+5);
break;
case 11:
g.drawString("11",xStart,yStart+5);
break;
case 12:
g.drawString("12",xCenter-6,yCenter-clockRadius+22);
break;
}
}
for(int i=0;i<60;i++)
{
int xStart=(int)(xCenter+0.95*clockRadius*Math.sin(Math.PI/30*i));
int yStart=(int)(yCenter-0.95*clockRadius*Math.cos(Math.PI/30*i));
int xEnd=(int)(xCenter+clockRadius*Math.sin(Math.PI/30*i));
int yEnd=(int)(yCenter-clockRadius*Math.cos(Math.PI/30*i));
g.setColor(Color.black);
g.drawLine(xStart,yStart,xEnd,yEnd);
}
//画秒针
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);
//画分针
int mLength = (int)(clockRadius * 0.60);
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.45);
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.green);
g.drawLine(xCenter, yCenter, xHour, yHour);
//数字显示时间
g.setColor(Color.blue);
g.setFont(new Font("Courier",Font.BOLD,16));
g.drawString(hour+":"+minute+":"+second,(int)(0.8*getWidth()/2),getHeight()-10);
}
//设置当前时间
public void setCurrentTime()
{
//获取当前时间
Calendar calendar=new GregorianCalendar();
this.hour=calendar.get(Calendar.HOUR_OF_DAY);
this.minute=calendar.get(Calendar.MINUTE);
this.second=calendar.get(Calendar.SECOND);
}
public Dimension getPreferredSize()
{
return new Dimension(200,200);
}
}
ClockAnimation.java
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class ClockAnimation extends StillClock{
public ClockAnimation()
{
Timer timer=new Timer(1000,new TimerListener());
timer.start();
}
private class TimerListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
setCurrentTime();
repaint();
}
}
/**
* @param args
*/
public static void main(String[] args) {
JFrame frame=new JFrame("ClockAnimation");
ClockAnimation clock=new ClockAnimation();
frame.add(clock);
frame.setSize(300,350);
frame.setLocationRelativeTo(null);//center
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
分享到:
相关推荐
在Java编程语言中,开发一个钟表程序涉及到多个核心概念和技术。这个名为"TimeWatch"的项目显然旨在创建一个能够显示当前时间(小时、分钟、秒)并可能包含日历功能的应用。以下是一些关键的知识点,它们是构建这样...
在这个项目中,“java图形时钟[源码][附图]”提供了实现一个动态显示当前时间的Java程序的源代码。这个程序可能使用了Java Swing或JavaFX库来构建GUI,并通过定时器更新时钟的显示。 首先,我们来了解一下Java ...
总之,这个"Java圆形时钟,钟表源码"项目涵盖了Java时间处理、GUI设计、事件驱动编程和线程同步等多个重要概念,对于初学者来说,这是一个绝佳的学习资源,可以实际操作并理解这些核心Java技术。通过阅读和分析源...
8. **事件驱动编程**:Java GUI是事件驱动的,用户操作(如点击按钮)会产生事件,程序通过注册事件监听器来响应这些事件。例如,设置闹钟或更换背景图的按钮都需要添加相应的事件处理器。 9. **异常处理**:在处理...
在Java编程语言中,创建一个钟表或者闹钟程序是一项有趣的实践任务,它涉及到图形用户界面(GUI)设计、事件处理、线程管理和多媒体播放等多个知识点。以下将详细阐述这些关键概念。 首先,我们需要使用Java的Swing...
7. **事件驱动编程**: GUI库通常采用事件驱动模型,如按钮点击事件、窗口关闭事件等。在时钟程序中,可能需要监听用户的操作,如启动/停止时钟。 8. **日期与时间API**: Java提供`java.util.Date`、`java.time`...
总结来说,这款C#编写的钟表小程序虽然简单,但它涵盖了C#语言的诸多关键概念,包括基本语法、面向对象编程、Windows Forms应用、线程管理、事件驱动编程以及UI设计。通过这个实例,开发者可以深入理解并实践这些...
Java时钟代码设计涉及到多个Java核心技术,包括GUI(图形用户...综上所述,这个Java时钟程序综合运用了Java的GUI编程、多线程、音频处理、动画效果和事件处理等技术,为用户提供了一个富有创意且功能丰富的时钟应用。
1. Java 2D图形编程,特别是Graphics2D API的使用。 2. javax.swing.Timer类的运用,以及事件驱动编程的概念。 3. Swing组件的使用,如JButton,以及事件监听器的实现。 4. 线程管理,理解多线程环境下的并发操作。 ...
对于初次接触图形编程的人来说,这可能包括理解事件驱动编程,如事件监听器和回调函数,以及如何在屏幕上绘制元素,如数字和指针。 标签"show"可能指的是这个程序的核心特性,即它的主要功能是展示信息,这里是时间...
在编程领域,模拟时钟通常涉及时间的显示,它以指针的形式代表小时、分钟和秒,与我们日常生活中看到的传统钟表相似。这种项目可以作为学习图形用户界面(GUI)设计和事件驱动编程的一个很好的实践。 根据描述,...
时钟的动态显示和时间更新需要通过编程语言来实现,如JavaScript、Python或Processing等。对于网页应用,HTML和CSS用于构建基本结构和样式,而JavaScript则负责实时更新时间并驱动动画。在桌面应用或移动应用中,...