JAVA 闹钟程序

JAVA 闹钟程序,第1张

import java.util.*

import java.awt.*

import java.applet.*

import java.text.*

import java.awt.event.*

public class Alarm extends Applet implements Runnable

{

Thread timer=null//创建线程timer

Image gif1//clockp:闹钟的外壳,闹铃和报时物

boolean setflag=false,stopflag=false,cancelflag=false

Panel setpanel

//获取声音文件

AudioClip ring=getAudioClip(getCodeBase(), "1.mid")

Button setbutton=new Button("SET")

Button cancelbutton=new Button("CANCEL")

Button stopbutton=new Button("STOP")

//响应按钮事件

private ActionListener setli=new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

setflag=true

}

}

private ActionListener cancelli=new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

setflag=true

}

}

private ActionListener stopli=new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

ring.stop()

/渣局/清除的方法

//g.clearRect(83,280,20,30)

}

}

Label note1=new Label("Alarm clock:")

//GregorianCalendar提供的是一个日历式的东东,上面又多了很多的参数,是方便 *** 作了不少。而Date类的功能远不及其,求个和日期有联系的还要自己计算。

GregorianCalendar cal=new GregorianCalendar()

GregorianCalendar cal2=new GregorianCalendar()

SimpleDateFormat df=new SimpleDateFormat("yyyy MM dd HH:mm:ss")//设置时间格式

Date dummy=new Date()//生成Data对象

String lastdate=df.format(dummy)

Font F=new Font("TimesRoman",Font.PLAIN,14)//设置字体格式

Date dat=null

Date timeNow

Color fgcol=Color.blue

Color fgcol2=Color.darkGray

Color backcolor=Color.blue

Label hlabel2,mlabel2,slabel2//显示时间单位时所用的标签(时、分、秒)

int i

int s,m,h

TextField sethour,setmin,setsec//显示当前时间文本框和定时文本框

//在Applet程序中,首先自动调用初始化完成必要的初始化运梁老工作,紧接着自动调用start,在进入执行程序和返回到该页面时被调用,而从旁升该页面转到别的页面时,stop被调用,关闭浏览器时,执行destroy。

public void init()//初始化方法

{

int fieldx=50,fieldy1=120,fieldy2=220,fieldw=30,fieldh=20,space=50//显示时间和定时文本框的定位参数

setLayout(null)//将布局管理器初始化为null

setpanel=new Panel()

setpanel.setLayout(null)

setpanel.add(note1)

note1.setBounds(30,100,60,20)

note1.setBackground(backcolor)

note1.setForeground(Color.black)

//定时用的文本框(时、分、秒)

sethour=new TextField("00",5)

setmin=new TextField("00",5)

setsec=new TextField("00",5)

hlabel2=new Label()

mlabel2=new Label()

slabel2=new Label()

//定时的小时文本框的位置、大小

setpanel.add(sethour)

sethour.setBounds(fieldx,fieldy2,fieldw,fieldh)

sethour.setBackground(Color.white)

//在文本框后加入单位“时”

setpanel.add(hlabel2)

hlabel2.setText("h")

hlabel2.setBackground(backcolor)

hlabel2.setForeground(Color.black)

hlabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20)

fieldx=fieldx+space

//定时的分钟文本框的位置、大小

setpanel.add(setmin)

setmin.setBounds(fieldx,fieldy2,fieldw,fieldh)

setmin.setBackground(Color.white)

//在文本框后加入单位“分”

setpanel.add(mlabel2)

mlabel2.setText("m")

mlabel2.setBackground(backcolor)

mlabel2.setForeground(Color.black)

mlabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20)

fieldx=fieldx+space

//定时的秒文本框的位置、大小

setpanel.add(setsec)

setsec.setBounds(fieldx,fieldy2,fieldw,fieldh)

setsec.setBackground(Color.white)

//在文本框后加入单位“秒”

setpanel.add(slabel2)

slabel2.setText("s")

slabel2.setBackground(backcolor)

slabel2.setForeground(Color.black)

slabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20)

//设置闹钟控制按钮(on,off)

setpanel.add(cancelbutton)

setpanel.add(setbutton)

setpanel.add(stopbutton)

cancelbutton.setBounds(90,180,40,20)

setbutton.setBounds(140,180,40,20)

stopbutton.setBounds(522,180,40,20)

setbutton.addActionListener(setli)

cancelbutton.addActionListener(cancelli)

stopbutton.addActionListener(stopli)

stopbutton.setVisible(false)

//将面板加入当前容器中,并设置面板的大小和背景色

add(setpanel)

setpanel.setBounds(300,1,250,420)

setpanel.setBackground(backcolor)

/*int xcenter,ycenter,s,m,h

//闹钟中心点所在位置

xcenter=145

ycenter=162

s=(int)cal.get(Calendar.SECOND)

m=(int)cal.get(Calendar.MINUTE)

h=(int)cal.get(Calendar.HOUR_OF_DAY)

//初始化指针位置

lastxs=(int)(Math.cos(s*3.14f/30-3.14f/2)*30+xcenter)

lastys=(int)(Math.sin(s*3.14f/30-3.14f/2)*30+ycenter)

lastxm=(int)(Math.cos(m*3.14f/30-3.14f/2)*25+xcenter)

lastym=(int)(Math.sin(m*3.14f/30-3.14f/2)*25+ycenter)

lastxh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*18+xcenter)

lastyh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*18+ycenter)

lasts=s*/

MediaTracker mt=new MediaTracker(this)//为给定组件创建一个跟踪媒体的MediaTracker对象,把图片添加到被跟踪的图片组

//Java允?Sapplet??HTML所在的位置(decument base)下?d?Y料,也允?Sapplet?钠涑淌酱a所在的位置(code base)下?d?Y料。藉由呼叫getDocumentBase()?cgotCodeBase()可得到URL物件。?@些函?????湍阏业侥阆胂螺d的?n案的位置

//clockp=getImage(getDocumentBase(),"11.png")

gif1=getImage(getCodeBase(),"2.gif")

//i为id号

mt.addImage(gif1,i++)

try

{

mt.waitForAll()

}

catch(InterruptedException e)

{}//等待加载结束

resize(600,420)//设置窗口大小

}

//窗口显示有改变的时候调用paint

public void paint(Graphics g)

{//重写paint()方法

int xh,yh,xm,ym,xs,ys,strike_times

int xcenter,ycenter

String today

xcenter=148

ycenter=186

dat=new Date()

//用当前时间初始化日历时间

cal.setTime(dat)

//读取当前时间

s=(int)cal.get(Calendar.SECOND)

m=(int)cal.get(Calendar.MINUTE)

h=(int)cal.get(Calendar.HOUR_OF_DAY)

//换一种时间表达形式

today=df.format(dat)

//指针位置

xs=(int)(Math.cos(s*3.14f/30-3.14f/2)*30+xcenter)

ys=(int)(Math.sin(s*3.14f/30-3.14f/2)*30+ycenter)

xm=(int)(Math.cos(m*3.14f/30-3.14f/2)*25+xcenter)

ym=(int)(Math.sin(m*3.14f/30-3.14f/2)*25+ycenter)

xh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*12+xcenter)

yh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*12+ycenter)

//设置字体和颜色

g.setFont(F)

//前景色

g.setColor(getBackground())//取背景色的

g.drawImage(gif1,75,110,this)

//以数字方式显示年、月、日和时间

g.drawString(today,55,415)

//画指针

g.drawLine(xcenter,ycenter,xs,ys)

g.drawLine(xcenter,ycenter-1,xm,ym)//(x1,y1,x2,y2)

g.drawLine(xcenter-1,ycenter,xm,ym)

g.drawLine(xcenter,ycenter-1,xh,yh)

g.drawLine(xcenter-1,ycenter,xh,yh)

int timedelta//记录当前时间与闹铃定时的时差

Integer currh,currm,currs//分别记录当前的时、分、秒

Date dat2=new Date()

cal2.setTime(dat2)

//读取当前时间

currh=(int)cal2.get(Calendar.SECOND)

currm=(int)cal2.get(Calendar.MINUTE)

currs=(int)cal2.get(Calendar.HOUR_OF_DAY)

//这样做的话说我API已过时

//timeNow=new Date()

//currh=new Integer(timeNow.getHours())

//currm=new Integer(timeNow.getMinutes())

//currs=new Integer(timeNow.getSeconds())

if(setflag)

{ //判断是否设置了闹钟

//判断当前时间是否为闹钟所定的时间

if((currh.intValue()==Integer.valueOf(sethour.getText()).intValue())&&(currm.intValue()==Integer.valueOf(setmin.getText()).intValue())&&(currs.intValue()==Integer.valueOf(setsec.getText()).intValue()))

{

ring.play()

g.drawImage(gif1,83,280,this)

stopbutton.setVisible(true)

}

timedelta=currm.intValue()*60+currs.intValue()-Integer.valueOf(setmin.getText()).intValue()*60-Integer.valueOf(setsec.getText()).intValue()

if((timedelta>=30))

{

//若当前时间与闹钟相差时间超过30秒,闹钟自动停

ring.stop()

//清除的方法

g.clearRect(83,280,20,30)

}

}

dat=null

}

public void start()

{

if(timer==null)

{

timer=new Thread(this)//将timer实例化

timer.start()

}

}

public void stop()

{

timer=null

}

//给创建线程后start之后自动执行的函数

public void run()

{

//在run()方法中,调用repaint()方法,以重绘小程序区,进行时钟显示的更新。接着调用sleep方法让当前线程(也就是我们创建的线程clockthread)睡眠1000毫秒,因为我们每秒钟要更新一下显示,所以让它睡眠1秒

while(timer!=null)

{

try

{

timer.sleep(1000)

}

catch(InterruptedException e)

{}

//调用repaint时,会首先清除掉paint方法之前的画的内容,再调用paint方法

repaint()//刷新画面

}

timer=null

}

//当AWT接收到一个applet的重绘请求时,它就调用applet的 update(),默认地,update() 清除applet的背景,然后调用 paint()。重载 update(),将以前在paint()中的绘图代码包含在update()中,从而避免每次重绘时将整个区域清除

//有两种方法可以明显地减弱闪烁:重载 update()或使用双缓冲。

//使用双缓冲技术:另一种减小帧之间闪烁的方法是使用双缓冲,它在许多动画Applet中被使用。其主要原理是创建一个后台图像,将需要绘制的一帧画入图像,然后调用DrawImage()将整个图像一次画到屏幕上去;好处是大部分绘制是离屏的,将离屏图像一次绘至屏幕上比直接在屏幕上绘制要有效得多,大大提高做图的性能。

// 双缓冲可以使动画平滑,但有一个缺点,要分配一张后台图像,如果图像相当大,这将需要很大一块内存;当你使用双缓冲技术时,应重载 update()。

public void update(Graphics g)

{

Image offscreen_buf=null

//采用双缓冲技术的update()方法

if(offscreen_buf==null)

offscreen_buf=createImage(600,420)

Graphics offg=offscreen_buf.getGraphics()

offg.clipRect(1,1,599,419)

paint(offg)

Graphics ong=getGraphics()

ong.clipRect(1,1,599,419)

ong.drawImage(offscreen_buf,0,0,this)

}

/** Creates a new instance of AlarmClock */

}

环境搭建就不讲了搏巧,直接说开发。

小闹钟程序开发中的要点就是:

1、时间选择对话框(TimePicker)

2、获取闹钟管理器并对其进行设置

3、注册广播接收器

掌握了这两点,写程序就很简单了。

1、新建android项目:Alarm,sdk版本选择2.2,Package name:com.lql.activity,Main Activity:Alarm

2、编写界面:直接修改layout中的main.xml文件,代码如下:

Xml代码

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="center_vertical"

>

<Button

android:id="@+id/timeBtn"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/time"

android:textSize="20sp"

/>

<Button

android:id="@+id/cancelAlarmBtn"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/cancelAlarm"

/>

</LinearLayout>

界面的效果如下:

3、修改Alarm.java这个activity,在该Activity中需要做这样几件事:

获取界面上的两个按钮组件,并给其绑定事件监听器

第一个时间按钮,点击后,显示时间选择对话框(TimePicker),供选择小时和分钟,并设置闹钟

第二个按钮,点击之后需要当前设定的穗银粗闹钟

比较难写的代码就是闹钟设置:

//设置时间

Java代码  

timeBtn.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View arg0) {

Log.d(TAG, "click the time button to set time")

calendar.setTimeInMillis(System.currentTimeMillis())

new TimePickerDialog(Alarm.this,new TimePickerDialog.OnTimeSetListener() {

@Override

public void onTimeSet(TimePicker arg0, int h, int m) {

//更新按钮上的时间

timeBtn.setText(formatTime(h,m))

//设置日历的猜镇时间,主要是让日历的年月日和当前同步

calendar.setTimeInMillis(System.currentTimeMillis())

//设置日历的小时和分钟

calendar.set(Calendar.HOUR_OF_DAY, h)

calendar.set(Calendar.MINUTE, m)

//将秒和毫秒设置为0

calendar.set(Calendar.SECOND, 0)

calendar.set(Calendar.MILLISECOND, 0)

//建立Intent和PendingIntent来调用闹钟管理器

Intent intent = new Intent(Alarm.this,AlarmReceiver.class)

PendingIntent pendingIntent = PendingIntent.getBroadcast(Alarm.this, 0, intent, 0)

//获取闹钟管理器

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE)

//设置闹钟

alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent)

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 10*1000, pendingIntent)

Toast.makeText(Alarm.this, "设置闹钟的时间为:"+String.valueOf(h)+":"+String.valueOf(m), Toast.LENGTH_SHORT).show()

Log.d(TAG, "set the time to "+formatTime(h,m))

}

},calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show()

}

})

代码里面有注释,这里就不多解释了,其中new TimePickerDialog为创建时间选择对话框。为了能够看到效果,我给闹钟添加了重复提醒:alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 10*1000, pendingIntent)。

还要为取消闹钟按钮添加事件监听器:

Java代码  

//取消闹钟按钮事件监听

final Button cancelAlarmBtn = (Button)findViewById(R.id.cancelAlarmBtn)

cancelAlarmBtn.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View arg0) {

Intent intent = new Intent(Alarm.this,AlarmReceiver.class)

PendingIntent pendingIntent = PendingIntent.getBroadcast(Alarm.this, 0, intent, 0)

//获取闹钟管理器

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE)

alarmManager.cancel(pendingIntent)

Toast.makeText(Alarm.this, "闹钟已经取消!", Toast.LENGTH_SHORT).show()

}

})

在点击取消闹钟按钮时,取消之前设置的闹钟,核心代码就4行。

4、编写广播接收器,用来接收闹钟的广播事件,然后进行相关处理,

Java代码  

public class AlarmReceiver extends BroadcastReceiver {

/* (non-Javadoc)

* @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)

*/

@Override

public void onReceive(Context arg0, Intent data) {

Log.d(Alarm.TAG, "the time is up,start the alarm...")

Toast.makeText(arg0, "闹钟时间到了!", Toast.LENGTH_SHORT).show()

}

}

这个代码就很简单了,主要是要继 承 BroadcastReceiver 这个类,然后重写onRecive方法。onRecive方法在闹钟的时间达到之后会执行,在这里我们可以做自己的事情,比如启动某个程序,或者播放铃声,我这里就是简单的提示一下,使用的是Toast。

5、在android的AndroidManifest.xml文件中注册广播接收器:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

Xml代码

package="com.ql.activity"

android:versionCode="1"

android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">

<receiver android:name=".AlarmReceiver" android:process=":remote" />

<activity android:name=".Alarm"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

<uses-sdk android:minSdkVersion="8" />

</manifest>

核心的配置为<receiver android:name=".AlarmReceiver" android:process=":remote" />,这也是闹钟程序的关键,如果不做这个配置,那么时间到了之后,闹钟将不会提示。

接下来就是到模拟器上测试,运行截图如上图。程序源代码见附件。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12408099.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存