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.BorderLayoutimport 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()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)