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 */

}

写了一个,也尽量在你可能不懂的地方添加注释了。不过其实注释越多不见得越好,因为有时你太在意注释反而没弄清整体的代码结构。

import java.awt.BorderLayout

import java.awt.FlowLayout

import java.awt.Font

import java.awt.Frame

import 蠢桥java.awt.GridLayout

import 核州java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.awt.event.KeyEvent

import java.awt.event.KeyListener

import java.io.IOException

import java.text.DateFormat

import java.text.SimpleDateFormat

import java.util.Calendar

import java.util.Timer

import java.util.TimerTask

import javax.sound.sampled.AudioInputStream

import javax.sound.sampled.AudioSystem

import javax.sound.sampled.Clip

import javax.sound.sampled.LineEvent

import javax.sound.sampled.LineListener

import javax.sound.sampled.LineUnavailableException

import javax.sound.sampled.UnsupportedAudioFileException

import javax.swing.JButton

import javax.swing.JDialog

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JPanel

import javax.swing.JTextField

/**

 * 闹钟主界面

 */

public class AlarmClock extends JFrame implements ActionListener {

private static final int LOOP_COUNT = 5 // 重复播放的次数

private JLabel labelClock, labelAlarm, labelNextAlarm

private JButton btnSet, btnClose

private SetDialog setDialog

private JPanel topPanel, alarmPanel

private Timer timer

private Clip clip

private Calendar alarmCal

private boolean timeReached = true

private DateFormat df = new SimpleDateFormat("HH : mm")

public AlarmClock() {

super("闹钟")

}

public void launch() {

setSize(400, 300)

setVisible(true)

setDefaultCloseOperation(EXIT_ON_CLOSE)

getContentPane().setLayout(new BorderLayout()) // 利用边界布局将界面分割成上中下三部分

labelAlarm = new JLabel("闹钟定时已到!")

btnClose = 带氏猛new JButton("确定")

labelNextAlarm = new JLabel() // 指示下一次闹钟时间

alarmPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)) // 顶部提示栏提示闹钟时间已到,和确定按钮

alarmPanel.add(labelAlarm)

alarmPanel.add(btnClose)

topPanel = new JPanel(new GridLayout(2, 1))

topPanel.add(alarmPanel)

topPanel.add(labelNextAlarm)

alarmPanel.setVisible(false) // 初始隐藏顶部提示栏

labelClock = new JLabel()

Font font = new Font(Font.SERIF, Font.PLAIN, 48) // 中间的倒计时文本用大号字体展示

labelClock.setFont(font)

labelClock.setHorizontalAlignment(JLabel.CENTER) // 文本居中

btnSet = new JButton("设置")

getContentPane().add(topPanel, BorderLayout.NORTH) // 界面顶部

getContentPane().add(labelClock, BorderLayout.CENTER) // 界面中部

getContentPane().add(btnSet, BorderLayout.SOUTH) // 界面底部

btnSet.addActionListener(this) // 设置按钮的点击事件

btnClose.addActionListener(this) // 顶部确定按钮的点击事件

setLocationRelativeTo(null) // 界面居中

setDialog = new SetDialog(this) // 初始化设置对话框

try { // 初始化闹钟声音

// 目前发现wav格式的文件是可以支持的,mp3不支持

AudioInputStream ais = AudioSystem.getAudioInputStream(

AlarmClock.class.getResource("/res/alarm.wav"))

clip = AudioSystem.getClip()

clip.open(ais)

ais.close()

int loop = LOOP_COUNT <= 0 ? 1 : LOOP_COUNT

final long totalFrames = ais.getFrameLength() * loop

clip.addLineListener(new LineListener() {

@Override

public void update(LineEvent e) {

// 当闹钟音乐播放结束时,自动隐藏顶部提示栏

if(e.getFramePosition() >= totalFrames) {

stopAlarm()

}

}

})

} catch (UnsupportedAudioFileException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

} catch (LineUnavailableException e) {

e.printStackTrace()

}

initTimer()

}

public static void main(String[] args) {

new AlarmClock().launch() // 启动主界面

}

@Override

public void actionPerformed(ActionEvent e) {

Object source = e.getSource()

if(source == btnSet) { // 点击设置按钮时d出设置界面,以模对话框显示

setDialog.setVisible(true)

} else if(source == btnClose) { // 点击顶部确定按钮时隐藏顶部提示栏

stopAlarm()

}

}

private void initTimer() {

timer = new Timer() // 初始化倒计时任务

// 开始倒计时

timer.scheduleAtFixedRate(new TimerTask() {

@Override

public void run() {

Calendar cal = Calendar.getInstance()

int hour = cal.get(Calendar.HOUR_OF_DAY)

int min = cal.get(Calendar.MINUTE)

int sec = cal.get(Calendar.SECOND)

// 设置倒计时文本

labelClock.setText(String.format("%02d : %02d : %02d", hour, min, sec))

if(null != alarmCal && !timeReached) {

int alarmHour = alarmCal.get(Calendar.HOUR_OF_DAY)

int alarmMin = alarmCal.get(Calendar.MINUTE)

if(alarmHour == hour && alarmMin == min) { // 到时间时播放声音

timeReached = true

System.out.println("Time over")

startAlarm()

}

}

}

}, 0, 1000L) // 每隔1秒刷新倒计时文本

}

/**

 * 开始计时

 * @param hour

 * @param minute

 */

public void startTimer(int hour, int minute) {

alarmCal = Calendar.getInstance()

alarmCal.set(Calendar.HOUR_OF_DAY, hour)

alarmCal.set(Calendar.MINUTE, minute)

labelNextAlarm.setText("下次闹钟时间:" + df.format(alarmCal.getTime()))

timeReached = false

}

/**

 * 取消倒计时任务

 */

public void cancelTimer() {

labelNextAlarm.setText("")

alarmCal = null

}

private void startAlarm() { // 开始播放提示音

if(null != clip) {

alarmPanel.setVisible(true) // 显示顶部提示栏

clip.setFramePosition(0) // 将音频帧重置为第0帧

clip.loop(LOOP_COUNT) // 开始循环播放

}

labelNextAlarm.setText("")

}

private void stopAlarm() { // 停止播放提示音

if(null != clip && clip.isRunning()) {

clip.stop() // 结束播放

}

labelNextAlarm.setText("")

alarmPanel.setVisible(false) // 隐藏顶部提示栏

}

/**

 * 闹钟设置页面

 */

class SetDialog extends JDialog implements KeyListener, ActionListener {

private JLabel labelHour, labelMin

private JTextField textHour, textMin

private JPanel mainPanel, labelPanel, buttonPanel

private JButton btnOk, btnCancel, btnBack

private Calendar cal = Calendar.getInstance()

public SetDialog(Frame frame) {

super(frame)

setTitle("设置")

setModal(true) // 设置为模窗口,就是说在本d窗未消失时不允许点击主界面。

setSize(300, 150)

// 显示时分

labelHour = new JLabel("时")

labelMin = new JLabel("分")

labelHour.setHorizontalAlignment(JLabel.CENTER)

labelMin.setHorizontalAlignment(JLabel.CENTER)

textHour = new JTextField()

textMin = new JTextField()

// 上面的部分用网格布局将各组件以2x2的格子放进去

labelPanel = new JPanel(new GridLayout(2, 2))

labelPanel.add(labelHour)

labelPanel.add(labelMin)

labelPanel.add(textHour)

labelPanel.add(textMin)

// 时分输入框添加按键监听,只允许输入数字

textHour.addKeyListener(this)

textMin.addKeyListener(this)

// 初始化按钮

btnOk = new JButton("确定")

btnCancel = new JButton("取消")

btnBack = new JButton("返回")

// 下面的按钮依次居中放进去

buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER))

buttonPanel.add(btnBack)

buttonPanel.add(btnCancel)

buttonPanel.add(btnOk)

// 初始化主面板,将主面板分割为上下两部分

mainPanel = new JPanel(new BorderLayout())

mainPanel.add(labelPanel, BorderLayout.CENTER) // 上面显示时分的组件

mainPanel.add(buttonPanel, BorderLayout.SOUTH) // 下面排列三个按钮

setContentPane(mainPanel)

// 设置按钮监听

btnBack.addActionListener(this)

btnOk.addActionListener(this)

btnCancel.addActionListener(this)

cal.add(Calendar.HOUR, 1) // 默认设置为当前时间加1小时的整点时间

cal.set(Calendar.MINUTE, 0)

int hour = cal.get(Calendar.HOUR_OF_DAY)

int min = cal.get(Calendar.MINUTE)

textHour.setText(String.format("%02d", hour))

textMin.setText(String.format("%02d", min))

setLocationRelativeTo(frame)

}

@Override

public void keyPressed(KeyEvent arg0) {

}

@Override

public void keyReleased(KeyEvent arg0) {

}

@Override

public void keyTyped(KeyEvent e) {

int keyChar = e.getKeyChar()                 

            if(keyChar >= KeyEvent.VK_0 && keyChar <= KeyEvent.VK_9){

            }else{ // 如果输入的不是数字则屏蔽输入

                e.consume() //关键,屏蔽掉非法输入  

            } 

}

@Override

public void actionPerformed(ActionEvent e) {

Object source = e.getSource()

if(source == btnOk) { // 如果点击了确定按钮,则开始计时

int hour = 0, min = 0

try {

hour = Integer.parseInt(textHour.getText())

} catch (NumberFormatException e1) {

}

try {

min = Integer.parseInt(textMin.getText())

} catch (NumberFormatException e1) {

}

startTimer(hour, min)

setVisible(false)

} else if(source == btnCancel) { // 点击取消按钮时取消计时

cancelTimer()

setVisible(false)

} else if(source == btnBack) { // 点击返回按钮时什么也不做,直接关闭设置界面

setVisible(false)

}

}

}

}

用到的音频文件是wav格式的,你要注意mp3格式的是肯定不行的,其它格式行不行你可以自己试试。wav文件我传到附件上吧,你如果觉得太大的话也可以自己弄一个放到指定目录,记得重命名或修改代码,然后再重新编译运行。

import java.awt.*

import java.awt.event.*

import java.util.*

import javax.swing.*

import javax.swing.Timer

public class Clock extends JFrame implements ActionListener {

public final int HEIGTH = 200, L0 = 50, T0 = 50,N=8

public final double RAD = Math.PI / 180.0

int x, y, old_X, old_Y, r, x0, y0, w, h, ang

int sdo, mdo, hdo, old_M, old_H, hh, mm, ss

int delay = 1000

Calendar now

String st, alarm, Items1, Items2,str[]

JButton jb

JComboBox jc1, jc2, jc3

JLabel jl1, jl2, jl3, jl4

JMenu jm1, jm2, jm3, jm4

JMenuBar jmb

JMenuItem jmi1, jmi2, jmi3, jmi4, jmi5, jmi6, jmi7, jmi8, jmi9,jmi10

JTextField jtf1, jtf2, time

JPanel jp1, jp2, jp3

Timer timer

TimeZone tz = TimeZone.getTimeZone("JST")

Toolkit toolkit=Toolkit.getDefaultToolkit()

/**

* <br>

* 方法说明:实现ActionListener类必须过载的方法

*/

public static void main(String[] args) {

Clock cp = new Clock()

cp.setVisible(true)

}

Clock() {

super("Java闹钟!")

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)

setSize(550, 700)

setVisible(true)

Container contentPane = getContentPane()

jp2 = new JPanel()

jmb = new JMenuBar()

jm1 = new JMenu("背景颜色设置 ", true)

jmi1 = new JMenuItem("外圈颜色")

jmi1.addActionListener(this)

jmi1.setActionCommand("color1")

jm1.add(jmi1)

jmi2 = new JMenuItem("闹钟边线颜色")

jmi2.addActionListener(this)

jmi2.setActionCommand("color2")

jm1.add(jmi2)

jmi3=new JMenuItem("底盘颜色")

jmi3.addActionListener(this)

jmi3.setActionCommand("color3")

jm1.add(jmi3)

jmi4=new JMenuItem("系统时间背静颜色")

jmi4.addActionListener(this)

jmi4.setActionCommand("color4")

jm1.add(jmi4)

jmb.add(jm1)

jm2 = new JMenu("指针颜色设置 "洞友, true)

jmi5 = new JMenuItem("缺颤迹秒针颜色")

jmi5.addActionListener(this)

jmi5.setActionCommand("color5")

jm2.add(jmi5)

jmi6 = new JMenuItem("分伏并针颜色")

jmi6.addActionListener(this)

jmi6.setActionCommand("color6")

jm2.add(jmi6)

jmi7 = new JMenuItem("时针颜色")

jmi7.addActionListener(this)

jmi7.setActionCommand("color7")

jm2.add(jmi7)

jmb.add(jm2)

jm3 = new JMenu("闹铃声音设置 ", true)

jmi8 = new JMenuItem("响铃1")

jmi8.addActionListener(this)

jmi8.setActionCommand("ring1")

jm3.add(jmi8)

jmi9 = new JMenuItem("静音")

jmi9.addActionListener(this)

jmi9.setActionCommand("ring2")

jm3.add(jmi9)

jmb.add(jm3)

jm4 = new JMenu("帮助", true)

jmi10=new JMenuItem("使用说明")

jmi10.addActionListener(this)

jmi10.setActionCommand("help")

jm4.add(jmi10)

jmb.add(jm4)

jp2.add(jmb)

contentPane.add(jp2, BorderLayout.NORTH)

jp3 = new JPanel()

jl1 = new JLabel("闹铃时间")

jl1.setFont(new Font("楷体_GB2312", Font.BOLD, 18))

time = new JTextField("00:00", 5)

alarm = time.getText()

jb = new JButton("修改闹铃时间")

jb.addActionListener(this)

jb.setActionCommand("CC")

jp3.add(jl1)

jp3.add(time)

jp3.add(jb)

contentPane.add(jp3, BorderLayout.SOUTH)

ClockPanel clock = new ClockPanel()

contentPane.add(clock, BorderLayout.CENTER)

// 窗体添加事件监听,监听秒表的触发

ActionListener taskPerformer = new ActionListener() {

public void actionPerformed(ActionEvent evt) {

repaint()

}

}

new Timer(delay, taskPerformer).start()

}

/**

* <br>

* 方法说明:绘制图形

*/

Color C1 = Color.lightGray// 外圈颜色

Color C2 = Color.black// 边线颜色

Color C3 = Color.magenta// 内盘颜色

Color C4 = Color.blue// 背景颜色

Color C5 = Color.yellow// 秒针颜色

Color C6 = Color.green// 分针颜色

Color C7 = Color.red//时针颜色

public class ClockPanel extends JPanel {

public void paint(Graphics g) {

h = getSize().height - 200

// 绘制圆形

g.setColor(C1)

g.fillOval(L0 + 30, T0 + 30, h - 60, h - 60)

g.setColor(C2)

g.drawOval(L0 + 31, T0 + 31, h - 62, h - 62)

g.setColor(C3)

g.fillOval(L0 + 50, T0 + 50, h - 100, h - 100)

g.setColor(C2)

g.drawOval(L0 + 51, T0 + 51, h - 102, h - 102)

r = h / 2 - 30

x0 = 30 + r - 5 + L0

y0 = 30 + r - 5 - T0

ang = 60

for (int i = 1i <= 12i++) {

x = (int) ((r - 10) * Math.cos(RAD * ang) + x0)

y = (int) ((r - 10) * Math.sin(RAD * ang) + y0)

g.drawString("" + i, x, h - y)

ang -= 30

}

x0 = 30 + r + L0

y0 = 30 + r + T0

g.drawString("指针式时钟", 215, 200)

// 获取时间

now = Calendar.getInstance()

hh = now.get(Calendar.HOUR_OF_DAY)// 小时

mm = now.get(Calendar.MINUTE)// 分钟

ss = now.get(Calendar.SECOND)// 秒

g.setColor(C4)

g.fillRect(5, 550, 150, 30)// 填充的矩形

g.setColor(C6)

if (hh <10)

st = "0" + hh

else

st = "" + hh

if (mm <10)

st = st + ":0" + mm

else

st = st + ":" + mm

if(alarm.equals(st))

{

if(toolkit!=null)

toolkit.beep()

else {}

}

if (ss <10)

st = st + ":0" + ss

else

st = st + ":" + ss

{

g.setFont(new Font("华文楷体", Font.BOLD, 16))

g.drawString("系统时间:" + st, 10, 570)

}

// 计算时间和图形的关系

sdo = 90 - ss * 6

mdo = 90 - mm * 6

hdo = 90 - hh * 30 - mm / 2

// 擦除秒针

if (old_X >0) {

g.setColor(C3)

} else {

old_M = mdo

old_H = hdo

}

// 绘制秒针

g.setColor(C5)

x = (int) ((r - 26) * Math.cos(RAD * sdo) + x0)

y = (int) ((r - 26) * Math.sin(RAD * sdo) + y0) - 2 * T0

g.drawLine(x0, y0, x, (h - y))

old_X = x

old_Y = y

// 擦除分针和时针

if (mdo != old_M) {

g.setColor(C3)

old_M = mdo

}

if (hdo != old_H) {

g.setColor(C3)

old_H = hdo

}

// 绘制分针

g.setColor(C6)

x = (int) ((r - 50) * Math.cos(RAD * mdo) + x0)

y = (int) ((r - 50) * Math.sin(RAD * mdo) + y0) - 2 * T0

g.drawLine(x0, y0, x, (h - y))

// 绘制时针

g.setColor(C7)

x = (int) ((r - 90) * Math.cos(RAD * hdo) + x0)

y = (int) ((r - 90) * Math.sin(RAD * hdo) + y0) - 2 * T0

g.drawLine(x0, y0, x, (h - y))

} // end paint

}

// 闹铃时间的判断及实现

// 闹铃声音的实现

public void actionPerformed(ActionEvent e) {

// JMenuItem m = (JMenuItem) e.getSource()

if (e.getActionCommand() == "CC") {

int newHou, newMin

char c

String getTime = JOptionPane.showInputDialog(this, "请输入闹铃时间格式如:", "00:00")

repaint()

//如果撤消设置时间,就什么打印null

if(getTime==null)

System.out.println(getTime)

// dispose()

judge: if (getTime != null) {

//打印输入的设置的时间

System.out.println(getTime)

// 判断输入的是不是5位字符

if (getTime.length() != 5) {

JOptionPane.showMessageDialog(time, "格式错误\n请按格式输入5位数字", "Error",

JOptionPane.ERROR_MESSAGE)

repaint()

break judge

}

// 判断输入的是不是数字

for (int i = 0i <(getTime.length())i++) {

c = getTime.charAt(i)

if (i == 2 &&!Character.isDigit(c))

continue

// 判断当前字符,如果不是数字则跳出该事件

if (i != 2 &&!Character.isDigit(c)) {

JOptionPane.showMessageDialog(this, "格式错误\n请按格式输入5位数字",

"Error",JOptionPane.ERROR_MESSAGE)

repaint()

break judge

}

}

char[] hour = { getTime.charAt(0), getTime.charAt(1) }

char[] minute = { getTime.charAt(3), getTime.charAt(4) }

newHou = Integer.parseInt(String.valueOf(hour))

newMin = Integer.parseInt(String.valueOf(minute))

if (newHou >= 24 || newHou <0) {

JOptionPane.showMessageDialog(this, "格式错误\n小时应该是不小于0不大于23的正数",

"Error", JOptionPane.ERROR_MESSAGE)

repaint()

break judge

}

if (newMin >= 60 || newHou <0) {

JOptionPane.showMessageDialog(this, "格式错误\n分钟应该是小于60的正数", "Error",

JOptionPane.ERROR_MESSAGE)

repaint()

break judge

}

new SetTime(newHou, newMin)

}

}

if (e.getActionCommand() == "ring1") {

toolkit=Toolkit.getDefaultToolkit()

}

if(e.getActionCommand() == "ring2"){

System.out.println("静音")

toolkit=null

}

if (e.getActionCommand() == "color1") {

String color

Color c

System.out.println("color1")

color = JOptionPane.showInputDialog(this, "请输入喜欢的外圈颜色(0--255)", "128")

if (color == null) {

} else {

if (Integer.parseInt(color) <0

|| Integer.parseInt(color) >255)

JOptionPane.showInputDialog(this, "请输入喜欢的外圈颜色(0--255)", "128")

else {

c = new Color(Integer.parseInt(color))

C1 = c

}

}

}

if(e.getActionCommand() == "color2"){

String color

Color c

System.out.println("color2")

color = JOptionPane.showInputDialog(this, "请输入喜欢的边线颜色(0--255)", "128")

if(color==null){}

else{if (Integer.parseInt(color) <0|| Integer.parseInt(color) >255)

JOptionPane.showInputDialog(this, "请输入喜欢的边线颜色(0--255)", "128")

else {

c = new Color(Integer.parseInt(color))

C2 = c

}

}

}

if(e.getActionCommand() == "color3"){

String color

Color c

System.out.println("color3")

color = JOptionPane.showInputDialog(this, "请输入喜欢的内盘颜色(0--255)", "128")

if(color==null){}

else{if (Integer.parseInt(color) <0|| Integer.parseInt(color) >255)

JOptionPane.showInputDialog(this, "请输入喜欢的内盘颜色(0--255)", "128")

else {

c = new Color(Integer.parseInt(color))

C3 = c

}

}

}

if(e.getActionCommand() == "color4"){

String color

Color c

System.out.println("color4")

color = JOptionPane.showInputDialog(this, "请输入喜欢的背景颜色(0--255)", "128")

if(color==null){}

else{if (Integer.parseInt(color) <0|| Integer.parseInt(color) >255)

JOptionPane.showInputDialog(this, "请输入喜欢的背景颜色(0--255)", "128")

else {

c = new Color(Integer.parseInt(color))

C4 = c

}

}

}

if(e.getActionCommand() == "color5"){

String color

Color c

System.out.println("color5")

color = JOptionPane.showInputDialog(this, "请输入喜欢的秒针颜色(0--255)", "128")

if(color==null){}

else{if (Integer.parseInt(color) <0|| Integer.parseInt(color) >255)

JOptionPane.showInputDialog(this, "请输入喜欢的秒针颜色(0--255)", "128")

else {

c = new Color(Integer.parseInt(color))

C5 = c

}

}

}

if(e.getActionCommand() == "color6"){

String color

Color c

System.out.println("color6")

color = JOptionPane.showInputDialog(this, "请输入喜欢的分针颜色(0--255)", "128")

if(color==null){}

else{if (Integer.parseInt(color) <0|| Integer.parseInt(color) >255)

JOptionPane.showInputDialog(this, "请输入喜欢的分针颜色(0--255)", "128")

else {

c = new Color(Integer.parseInt(color))

C6 = c

}

}

}

if(e.getActionCommand() == "color7"){

String color

Color c

System.out.println("color7")

color = JOptionPane.showInputDialog(this, "请输入喜欢的时针颜色(0--255)", "128")

if(color==null){}

else{if (Integer.parseInt(color) <0|| Integer.parseInt(color) >255)

JOptionPane.showInputDialog(this, "请输入喜欢的时针颜色(0--255)", "128")

else {

c = new Color(Integer.parseInt(color))

C7 = c

}

}

}

if(e.getActionCommand() == "help"){

String help

help = JOptionPane.showInputDialog(this, "输入quit退出该闹钟的使用", "这是运行在Java中的指针式时钟")

if(help.equals("quit"))

dispose()

else {}

// timer.restart()

}

}

class SetTime {

String Hour

String Minute

public SetTime() { }

public SetTime(int hour, int minute) {

// 当时间参数小于10的时候在前面添加字符0

if (hour <10) {

Hour = "0" + String.valueOf(hour)

} else {

Hour = "" + String.valueOf(hour)

}

if (minute <10) {

Minute = "0" + String.valueOf(minute)

} else {

Minute = "" + String.valueOf(minute)

}

alarm = Hour + ":" + Minute

time.setText(alarm)

repaint()

}

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存