跪求高手帮忙写一个JAVA手机闹钟程序 实现添加铃声和设置多闹钟

跪求高手帮忙写一个JAVA手机闹钟程序 实现添加铃声和设置多闹钟,第1张

import java.util.*

import java.awt.*

import java.applet.*

import java.text.*

public class AlarmClock extends Applet implements Runnable

{

Thread timer=null//创建线程胡歼timer

Image clockp,gif1,gif2,clock6,clock7//clockp:闹钟的外壳,闹铃和报时鸟

int s,m,h,hh

AudioClip ipAu,danger,chirp

boolean canPaint=true

boolean flag=false

boolean strike=true

int counter=0

int lasts

Image offscreen_buf=null

int i,j,t=0

int timeout=166

int lastxs=0,lastys=0,lastxm=0,lastym=0,lastxh=0,lastyh=0

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

GregorianCalendar cal=new GregorianCalendar()

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

String lastdate=df.format(dummy)

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

Date dat=null

Date timeNow=null

Color fgcol=Color.blue

Color fgcol2=Color.darkGray

Panel setpanel

Color backcolor=Color.pink

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

Button onbutton

Button offbutton

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

Label info1=new Label("欢迎使用定时提醒闹钟"),info2=new Label("")

Label note1=new Label("当前时间:"),note2=new Label("闹钟设置:")

boolean setalerm=false,clickflag=false/猜做让/判断是否响铃和振动

int fixh=0,fixm=0,fixs=0//记录闹钟的定时

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

{

Integer gif_number

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)

setpanel.add(note2)

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

note1.setBackground(backcolor)

note1.setForeground(Color.black)

note2.setBounds(30,180,60,20)

note2.setBackground(backcolor)

note2.setForeground(Color.black)

hlabel1=new Label()

mlabel1=new Label()

slabel1=new Label()

hlabel2=new Label()

mlabel2=new Label()

slabel2=new Label()

//显示当前时间用的文本框

showhour=new TextField("00",5)

showmin=new TextField("00",5)

showsec=new TextField("00",5)

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

sethour=new TextField("00",5)

setmin=new TextField("00",5)

setsec=new TextField("00",5)

//当前时间用的文本框的位置、大小

setpanel.add(showhour)

showhour.setBounds(fieldx,fieldy1,fieldw,fieldh)

showhour.setBackground(Color.white)

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

setpanel.add(hlabel1)

hlabel1.setText("时")

hlabel1.setBackground(backcolor)

hlabel1.setForeground(Color.black)

hlabel1.setBounds(fieldx+fieldw+3,fieldy1,14,20)

fieldx=fieldx+space

//当前时间的分钟文本框的位置、大小

setpanel.add(showmin)

showmin.setBounds(fieldx,fieldy1,fieldw,fieldh)

showmin.setBackground(Color.white)

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

setpanel.add(mlabel1)

mlabel1.setText("分")

mlabel1.setBackground(backcolor)

mlabel1.setForeground(Color.black)

mlabel1.setBounds(fieldx+fieldw+3,fieldy1,14,20)

fieldx=fieldx+space

//当前时间的秒文本框的位置、大小

setpanel.add(showsec)

showsec.setBounds(fieldx,fieldy1,fieldw,fieldh)

showsec.setBackground(Color.white)

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

setpanel.add(slabel1)

slabel1.setText("秒")

slabel1.setBackground(backcolor)

slabel1.setForeground(Color.black)

slabel1.setBounds(fieldx+fieldw+3,fieldy1,14,20)

fieldx=50

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

setpanel.add(sethour)

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

sethour.setBackground(Color.white)

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

setpanel.add(hlabel2)

hlabel2.setText("时")

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("分")

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("秒")

slabel2.setBackground(backcolor)

slabel2.setForeground(Color.black)

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

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

onbutton=new Button("开")

offbutton=new Button("关")

setpanel.add(onbutton)

setpanel.add(offbutton)

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

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

//加入一些附加的信息标签(题头,题尾)

setpanel.add(info1)

info1.setBackground(backcolor)

info1.setForeground(Color.blue)

info1.setBounds(50,50,150,20)

setpanel.add(info2)

info2.setBackground(backcolor)

info2.setForeground(Color.blue)

info2.setBounds(150,280,100,20)

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

add(setpanel)

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

setpanel.setBackground(backcolor)

//获取声音文件

ipAu=getAudioClip(getDocumentBase(),"bells/仙剑.mid")

danger=getAudioClip(getDocumentBase(),"bells/0.mid")

chirp=getAudioClip(getDocumentBase(),"bells/3.mid")

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)//创建Tracke对象

clockp=getImage(getDocumentBase(),"休闲.png")

gif1=getImage(getDocumentBase(),"gif1.gif")

gif2=getImage(getDocumentBase(),"gif2.gif")

clock6=getImage(getDocumentBase(),"clock6.gif")

clock7=getImage(getDocumentBase(),"clock7.gif")

mt.addImage(clockp,i++)

mt.addImage(gif1,i++)

mt.addImage(gif2,i++)

mt.addImage(clock6,i++)

mt.addImage(clock7,i++)

try{mt.waitForAll()}catch(InterruptedException e){}//等待加载结束

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

}

public void paint(Graphics g){//重写paint()方法

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

int xcenter,ycenter

String today

Integer gif_number

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)*18+xcenter)

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

//设置字体和颜色

g.setFont(F)

g.setColor(fgcol)

g.setColor(fgcol2)

g.setColor(getBackground())

g.fillRect(1,1,634,419)

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

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

g.setColor(fgcol2)

g.setColor(getBackground())

g.setColor(fgcol2)

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

g.drawString(today,55,415)

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

g.setColor(fgcol)

//画指针

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

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

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

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

lastxs=xslastys=ys

lastxm=xhlastym=ym

lastxh=xhlastyh=yh

lastdate=today

if(h<12)hh=h//将系统时间变换到0-11区间

else hh=h-12

if(hh==0) strike_times=12//计算整点时钟声数

else strike_times=hh

if((s==0&&m==0)||flag){//判断是否整点,是否是主动刷新

if(counter<strike_times){

flag=true

g.drawImage(gif2,115,35,this)

if(lasts!=s){

if(strike){

counter++

danger.play()//播放闹铃声

}

if(strike)strike=false

else strike=true

}

}

else {

counter=0

flag=false

}

}

else

g.drawImage(gif1,115,35,this)

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

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

timeNow=new Date()

currh=new Integer(timeNow.getHours())

currm=new Integer(timeNow.getMinutes())

currs=new Integer(timeNow.getSeconds())

//判断是否要更新当前显示的时间,这样可以避免文本框出现频率闪动

if(currh.intValue()!=Integer.valueOf(showhour.getText()).intValue())

showhour.setText(currh.toString())

if(currm.intValue()!=Integer.valueOf(showmin.getText()).intValue())

showmin.setText(currh.toString())

if(currs.intValue()!=Integer.valueOf(showsec.getText()).intValue())

showsec.setText(currh.toString())

if(setalerm){ //判断是否设置了闹钟

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

if((currh.intValue()==fixh)&&(currm.intValue()==fixm)&&(currs.intValue()==fixs))

clickflag=true

timedelta=currm.intValue()*60+currs.intValue()-fixm*60-fixs

if((timedelta<60)&&(clickflag==true)){ //若当前时间与闹钟相差时间达到60秒

chirp.play()

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

}

else{

chirp.stop()

clickflag=false

}

}

if(lasts!=s)

ipAu.play()//播放滴答声

lasts=s

if(canPaint){

t+=1

if(t==12)t=0

}

canPaint=false

dat=null

}

public void start(){

if(timer==null){

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

timer.start()

}

}

public void stop(){

timer=null

}

public void run(){

while(timer!=null){

try{timer.sleep(timeout)}catch(InterruptedException e){}

canPaint=true

repaint()//刷新画面

}

timer=null

}

public void update(Graphics g){ //采用双缓冲技术的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)

}

public boolean action(Event evt,Object arg){ //按钮事件处理函数

if(evt.target instanceof Button){

String lable=(String)arg

if(lable.equals("开")){

setalerm=true

//获取输入的时间

fixh=Integer.valueOf(sethour.getText()).intValue()

fixm=Integer.valueOf(setmin.getText()).intValue()

fixs=Integer.valueOf(setsec.getText()).intValue()

clickflag=false

}

if(lable.equals("关")){

setalerm=false

if(chirp!=null)

chirp.stop()

clickflag=false

}

return true

}

return false

}

}

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()

}

}

}

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)

}

}

}

}


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

原文地址: https://outofmemory.cn/yw/12429113.html

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

发表评论

登录后才能评论

评论列表(0条)

保存