展开全部

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("闹钟定时已到!62616964757a686964616fe4b893e5b19e31333361303065");

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) { // 点击设置按钮时弹出设置界面,以模对话框显示

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); // 设置为模窗口,就是说在本弹窗未消失时不允许点击主界面。

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

}

}

}

}

追问

是你做的么

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

用java程序写一个闹钟_java 使用swing制作一个小闹钟,包含以下功能:相关推荐

  1. java jxl 写 excel文件_java采用jxl写入一个Excel文件

    jxl写入一个excel文件. 读取方面请看下面相关链接,上一遍是关于读取excel的. package com.javaer.file; import java.io.File; import ja ...

  2. java程序给输出汉字_java面试题目编写一个java程序,实现拼音转成对应汉字功能。...

    Map> map=new HashMap>(); /** * 录入a */ List as=new ArrayList(); as.add("啊"); as.add(& ...

  3. 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...

  4. java程序 构建mycircle类_Java语言程序设计(十九)对象和类的应用实例

    1.我们定义一个Circle类并使用该类创建对象,我们创建三个圆对象,1.0,25和125,然后显示这三个圆的半径和面积,将第二个对象的半径改为100,然后显示它的新半径和面积.程序清单如下: pac ...

  5. java 页面输出一个页面_java学习之:一个完整页面输出信息的过程(以输出Doctor表中信息为例)...

    最近在练习java程序,总结一下从数据库查询信息并输出到jsp页面的过程.主要数据处理在src.cn.javatest包下面 项目预览 1,配置项目根目录src目录下的druid.properties ...

  6. java程序开发个人笔记_Java程序开发入门笔记

    Java程序开发入门笔记 如果你是这一个错误的话:错误:编码GBK的不可映射字符 这是因为我们编写的代码一般都是utf-8的格式而控制台用的不是utf-8格式所以就会出现中文输出的错误.这个时候我们可 ...

  7. java程序员那些提升_Java程序员如何进行自我提升?

    只有不断积累项目经验以及提高自己的技术,如果一直没有明确自己的职业规划,请扪心自问: 1.我到底适不适合当一名程序员? 2.我到底应不应该一辈子以程序员为职业? 3.我对编程到底持有的是一种什么样的态 ...

  8. java程序阅读填空题_JAVA练习题

    @font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @fo ...

  9. java 程序写出三个类,triangle,lader,circle(简单易懂)

    编写一个Java应用程序,该程序中有三个类:Triangle.Trapezoid和Circle,分别用来刻画"三角形"."梯形"和"圆形". ...

最新文章

  1. 活动目录在构建核心过程中的八个关键点(下)
  2. 【GoLang】tcmalloc jemalloc
  3. Java学习笔记:内部类/匿名内部类的全面介绍
  4. Quartz简单触发
  5. android开发 文件分享到应用,Android开发之——7.0适配之应用之间共享文件(FileProvider)...
  6. phpcmsV9视频模块开发——盛大游戏通行证注册与密码找回
  7. 怎么样用 Google Analytics 区分 Google Shopping 页的流量
  8. Nginx配置HTTPS和HTTP
  9. YOLOX安装及训练
  10. IDEA translation翻译插件报错-》更新TKK失败请检查网络
  11. Kalman Filter— Priori/Posteriori Error Covariance Matrix
  12. MATLAB中神经网络工具箱的使用
  13. 《SysML精粹》学习记录--第三章
  14. Order by 多条件排序
  15. fastq转化成fasta格式
  16. java-数组常用api
  17. Ubuntu16.04 安装docker-ce [傻瓜教程]
  18. 华科再次拿下华为“天才少年”最高薪!201万给到通信应届博士生
  19. 2021.11.17
  20. StringBoot(多数据源的使用)

热门文章

  1. 永磁同步电机控制笔记:永磁同步电机电阻电感磁链常数的测量方法
  2. 抵御即跨站脚本(XSS)攻击
  3. 爬虫百战(一):爬取当当网Top500本五星好评书籍
  4. iOS app瘦身优化之路
  5. 企业为什么要用云电脑办公?
  6. v80八核 android6,高通发布骁龙810八核/808六核64位芯片
  7. .NET 6 WTM layui发布到centos7,验证码不显示问题解决办法
  8. Linux Vim插件管理器Vundle安装和使用
  9. 域名DNS解析发生故障了怎么办?
  10. java将字符串转换为大写或小写