用java程序写一个闹钟_java 使用swing制作一个小闹钟,包含以下功能:
展开全部
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制作一个小闹钟,包含以下功能:相关推荐
- java jxl 写 excel文件_java采用jxl写入一个Excel文件
jxl写入一个excel文件. 读取方面请看下面相关链接,上一遍是关于读取excel的. package com.javaer.file; import java.io.File; import ja ...
- java程序给输出汉字_java面试题目编写一个java程序,实现拼音转成对应汉字功能。...
Map> map=new HashMap>(); /** * 录入a */ List as=new ArrayList(); as.add("啊"); as.add(& ...
- 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...
玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...
- java程序 构建mycircle类_Java语言程序设计(十九)对象和类的应用实例
1.我们定义一个Circle类并使用该类创建对象,我们创建三个圆对象,1.0,25和125,然后显示这三个圆的半径和面积,将第二个对象的半径改为100,然后显示它的新半径和面积.程序清单如下: pac ...
- java 页面输出一个页面_java学习之:一个完整页面输出信息的过程(以输出Doctor表中信息为例)...
最近在练习java程序,总结一下从数据库查询信息并输出到jsp页面的过程.主要数据处理在src.cn.javatest包下面 项目预览 1,配置项目根目录src目录下的druid.properties ...
- java程序开发个人笔记_Java程序开发入门笔记
Java程序开发入门笔记 如果你是这一个错误的话:错误:编码GBK的不可映射字符 这是因为我们编写的代码一般都是utf-8的格式而控制台用的不是utf-8格式所以就会出现中文输出的错误.这个时候我们可 ...
- java程序员那些提升_Java程序员如何进行自我提升?
只有不断积累项目经验以及提高自己的技术,如果一直没有明确自己的职业规划,请扪心自问: 1.我到底适不适合当一名程序员? 2.我到底应不应该一辈子以程序员为职业? 3.我对编程到底持有的是一种什么样的态 ...
- java程序阅读填空题_JAVA练习题
@font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @fo ...
- java 程序写出三个类,triangle,lader,circle(简单易懂)
编写一个Java应用程序,该程序中有三个类:Triangle.Trapezoid和Circle,分别用来刻画"三角形"."梯形"和"圆形". ...
最新文章
- 活动目录在构建核心过程中的八个关键点(下)
- 【GoLang】tcmalloc jemalloc
- Java学习笔记:内部类/匿名内部类的全面介绍
- Quartz简单触发
- android开发 文件分享到应用,Android开发之——7.0适配之应用之间共享文件(FileProvider)...
- phpcmsV9视频模块开发——盛大游戏通行证注册与密码找回
- 怎么样用 Google Analytics 区分 Google Shopping 页的流量
- Nginx配置HTTPS和HTTP
- YOLOX安装及训练
- IDEA translation翻译插件报错-》更新TKK失败请检查网络
- Kalman Filter— Priori/Posteriori Error Covariance Matrix
- MATLAB中神经网络工具箱的使用
- 《SysML精粹》学习记录--第三章
- Order by 多条件排序
- fastq转化成fasta格式
- java-数组常用api
- Ubuntu16.04 安装docker-ce [傻瓜教程]
- 华科再次拿下华为“天才少年”最高薪!201万给到通信应届博士生
- 2021.11.17
- StringBoot(多数据源的使用)