急需要一个简单的JAVA闹钟程序

急需要一个简单的JAVA闹钟程序,下面是小要求:设计的要求:(1)主界面能显示闹钟响铃启动时间(一个闹钟就可以了),进入闹铃的设置按钮;(2)在闹铃的设置界面能设置和取消... 急需要一个简单的JAVA闹钟程序,下面是小要求:
设计的要求:
(1)主界面能显示闹钟响铃启动时间(一个闹钟就可以了),进入闹铃的设置按钮;
(2)在闹铃的设置界面能设置和取消闹钟提醒,设置响铃时间;
(3)最好每行代码旁边都有解释之类的,因为本人小白,这个程序到时候还要讲解给老师听的。
急需要啊各位朋友,能做出来的发我邮箱:lfr118@sina.com,收到可用后一定把积分给你!!好的话再追加积分!!
也不需要每行代码都要有解释,关键的一些难以弄懂的地方给个解释就行了
展开
 我来答
duoloniori
推荐于2017-09-19 · TA获得超过456个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:233万
展开全部

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

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

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

梦随飞花
2014-12-11 · TA获得超过190个赞
知道小有建树答主
回答量:87
采纳率:0%
帮助的人:60.6万
展开全部
额,你很急着要么。。我倒是可以写一个啦。但是我在实习,就是白天没什么时间做了,晚上可以。。(我才不是为了什么财富值,我是为了锻炼自己,恩,哈哈)。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pieryon
2014-12-12 · 知道合伙人数码行家
pieryon
知道合伙人数码行家
采纳数:14410 获赞数:166873
获取软件设计师高级职称 万达金融最佳创新奖

向TA提问 私信TA
展开全部
你好,我费了一上午才给你写完,请看代码:

import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.applet.AudioClip;
//
public class WakeUp extends JApplet implements Runnable, ActionListener {
DteTimePanel dtTimePane = new DteTimePanel();//时间面盘
JLabel lblWakeUpTime = new JLabel("唤醒时间");//唤醒时间
JTextField txtWakeUpTime = new JTextField("20:33", 5);//文本设置要唤醒的时刻和次数
JTextField txtSound = new JTextField("train.wav");//声音文件
JTextField txtSrchRadio =
new JTextField("http://www.radio-locator.com/");
JComboBox cboxPickRadio = new JComboBox();
JButton btnStartStop = new JButton("Start");
JButton btnSrchRadio = new JButton("Find");
JButton btnPlayRadio = new JButton("Play");
JTextField txtStatusInfo = new JTextField("状态消息");

AudioClip alarmSound;
Thread thrSound;
int ckHour;
int ckMin;
Calendar ckDate;
boolean doCheck = false;

public void init() {
alarmSound = getAudioClip(getCodeBase(), txtSound.getText());
JPanel panOuter = new JPanel();
GridLayout gridlay1 = new GridLayout(3, 1);
panOuter.setLayout(gridlay1);

panOuter.add(dtTimePane);

JPanel panWakeUpTime = new JPanel();
FlowLayout flow1 = new FlowLayout(FlowLayout.LEFT);
panWakeUpTime.setLayout(flow1);
panWakeUpTime.add(lblWakeUpTime);
panWakeUpTime.add(txtWakeUpTime);

JPanel panButtons = new JPanel();
GridLayout gridlay2 = new GridLayout(1, 3);
panButtons.setLayout(gridlay2);
panButtons.add(btnSrchRadio);
panButtons.add(btnPlayRadio);
btnStartStop.addActionListener(this);
panButtons.add(btnStartStop);

JPanel panSetAlarmTime = new JPanel();
GridLayout gridlay3 = new GridLayout(2, 2);
panSetAlarmTime.setLayout(gridlay3);
panSetAlarmTime.add(panWakeUpTime);
panSetAlarmTime.add(panButtons);
panSetAlarmTime.add(txtSound);
panSetAlarmTime.add(txtSrchRadio);
panOuter.add(panSetAlarmTime);

cboxPickRadio.addItem("radio station 1");
cboxPickRadio.addItem("radio station 2");
cboxPickRadio.addItem("radio station 3");
cboxPickRadio.setEditable(true);

JPanel panBottom = new JPanel();
GridLayout gridlay4 = new GridLayout(2, 1);
panBottom.setLayout(gridlay4);
panBottom.add(cboxPickRadio);
panBottom.add(txtStatusInfo);
panOuter.add(panBottom);

setContentPane(panOuter);
repaint();
}

public void start() {
String s1 = txtWakeUpTime.getText();
ckHour = Integer.parseInt(s1.substring(0, 2));
ckMin = Integer.parseInt(s1.substring(3, 5));
ckDate = new GregorianCalendar();
Calendar cal = new GregorianCalendar();
int mm = cal.get(Calendar.MONTH);
int dd = cal.get(Calendar.DAY_OF_MONTH);
int yy = cal.get(Calendar.YEAR);
ckDate.set(yy, mm, dd, ckHour, ckMin, 00);
if (ckDate.compareTo(cal) < 0) ckDate.add(Calendar.DATE, 1);

if (thrSound == null) {
thrSound = new Thread(this);
thrSound.start();
}
}

public void stop() {
doCheck = false;
if (thrSound != null) {
if (alarmSound != null)
alarmSound.stop();
thrSound = null;
}
}

public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) { }

GregorianCalendar currtime = new GregorianCalendar();

if (doCheck)
if (ckDate.compareTo(currtime) < 0) {
runTheSound();
}
}
}

public void runTheSound() {
doCheck = false;
if (alarmSound != null)
alarmSound.loop();
}

public void actionPerformed(ActionEvent evt) {

if (evt.getSource().equals(btnStartStop)) {
if (btnStartStop.getText().equals("Start")) {
btnStartStop.setText("Stop");
txtStatusInfo.setText("Alarm process started");
doCheck = true;
start();
} else if (btnStartStop.getText().equals("Stop")) {
btnStartStop.setText("Start");
txtStatusInfo.setText("Alarm process has been stopped.");
stop();
}
}
}
}

class DteTimePanel extends JPanel {
String lastTime = "";

public void paint(Graphics screen) {
GregorianCalendar xday = new GregorianCalendar();
String xtime = xday.getTime().toString();

Color fgColor = new Color(40, 120, 160);
Font type = new Font("Monospaced", Font.BOLD, 20);
screen.setFont(type);
screen.setColor(getBackground());
screen.drawString(lastTime, 5, 15);
screen.setColor(fgColor);
screen.drawString(xtime, 5, 15);
lastTime = xtime;
repaint();
}
}

请记得采纳哦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
easysoft_bj
2014-12-19 · TA获得超过378个赞
知道大有可为答主
回答量:7349
采纳率:0%
帮助的人:2248万
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
晨___曦
2014-12-10 · TA获得超过320个赞
知道小有建树答主
回答量:325
采纳率:100%
帮助的人:121万
追问
老师说了,有跟网上差不多的直接挂。。。
追答
谁会闲的没事编闹钟程序玩啊,你别说100肉,1000肉都没人愿意动
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式