`
xwz0528
  • 浏览: 45331 次
  • 性别: Icon_minigender_1
  • 来自: 日照
社区版块
存档分类
最新评论

Java图形编程与事件驱动----动态钟表

阅读更多

    学习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写的钟表程序

    在Java编程语言中,开发一个钟表程序涉及到多个核心概念和技术。这个名为"TimeWatch"的项目显然旨在创建一个能够显示当前时间(小时、分钟、秒)并可能包含日历功能的应用。以下是一些关键的知识点,它们是构建这样...

    java图形时钟[源码][附图]

    在这个项目中,“java图形时钟[源码][附图]”提供了实现一个动态显示当前时间的Java程序的源代码。这个程序可能使用了Java Swing或JavaFX库来构建GUI,并通过定时器更新时钟的显示。 首先,我们来了解一下Java ...

    Java圆形时钟,钟表源码.rar

    总之,这个"Java圆形时钟,钟表源码"项目涵盖了Java时间处理、GUI设计、事件驱动编程和线程同步等多个重要概念,对于初学者来说,这是一个绝佳的学习资源,可以实际操作并理解这些核心Java技术。通过阅读和分析源...

    java实现时钟

    8. **事件驱动编程**:Java GUI是事件驱动的,用户操作(如点击按钮)会产生事件,程序通过注册事件监听器来响应这些事件。例如,设置闹钟或更换背景图的按钮都需要添加相应的事件处理器。 9. **异常处理**:在处理...

    java钟,闹钟 时钟程序

    在Java编程语言中,创建一个钟表或者闹钟程序是一项有趣的实践任务,它涉及到图形用户界面(GUI)设计、事件处理、线程管理和多媒体播放等多个知识点。以下将详细阐述这些关键概念。 首先,我们需要使用Java的Swing...

    java十大经典案例——时钟显示

    7. **事件驱动编程**: GUI库通常采用事件驱动模型,如按钮点击事件、窗口关闭事件等。在时钟程序中,可能需要监听用户的操作,如启动/停止时钟。 8. **日期与时间API**: Java提供`java.util.Date`、`java.time`...

    C#语言编写的钟表小程序

    总结来说,这款C#编写的钟表小程序虽然简单,但它涵盖了C#语言的诸多关键概念,包括基本语法、面向对象编程、Windows Forms应用、线程管理、事件驱动编程以及UI设计。通过这个实例,开发者可以深入理解并实践这些...

    java时钟代码及报告

    Java时钟代码设计涉及到多个Java核心技术,包括GUI(图形用户...综上所述,这个Java时钟程序综合运用了Java的GUI编程、多线程、音频处理、动画效果和事件处理等技术,为用户提供了一个富有创意且功能丰富的时钟应用。

    java 做的时钟 可放大缩小

    1. Java 2D图形编程,特别是Graphics2D API的使用。 2. javax.swing.Timer类的运用,以及事件驱动编程的概念。 3. Swing组件的使用,如JButton,以及事件监听器的实现。 4. 线程管理,理解多线程环境下的并发操作。 ...

    show_clock.rar_show

    对于初次接触图形编程的人来说,这可能包括理解事件驱动编程,如事件监听器和回调函数,以及如何在屏幕上绘制元素,如数字和指针。 标签"show"可能指的是这个程序的核心特性,即它的主要功能是展示信息,这里是时间...

    analogclock

    在编程领域,模拟时钟通常涉及时间的显示,它以指针的形式代表小时、分钟和秒,与我们日常生活中看到的传统钟表相似。这种项目可以作为学习图形用户界面(GUI)设计和事件驱动编程的一个很好的实践。 根据描述,...

    制作的卡通时钟

    时钟的动态显示和时间更新需要通过编程语言来实现,如JavaScript、Python或Processing等。对于网页应用,HTML和CSS用于构建基本结构和样式,而JavaScript则负责实时更新时间并驱动动画。在桌面应用或移动应用中,...

Global site tag (gtag.js) - Google Analytics