java开发之闹钟的实现代码
项目结构:
效果图一:
效果图二:
效果图三:
关于闹钟:
Alarm hongten v1.0
使用说明:
此文件夹中包括:
src文件夹 存放图片和声音文件夹,使用程序的时候,请不要删除此文件夹
alarm.jar 主要的功能程序jar包(要求安装jdk1.5或以上版本)
ReadMe.txt 说明文档
1.菜单功能说明
文件—— >
上传铃声(还没实现)
退出 功能:退出程序
工具—— >
截图工具 功能:进行截图
更改背景 功能:更改背景
帮助—— >
关于程序 功能:查看程序说明
2.设置闹表
2.1.可以在响铃时间里设置闹表时间
2.2.还可以用快速设置,+1表示在系统时间的基础上增加一分钟,-1表示在系统时间的基础上减去一分钟 (+5,+30,-5,-30同样原理)
3.提示铃声
可以选择铃声类型,进行试听,试听是时候可以停止(该功能还没完善)
4.系统托盘
4.1.在主窗体隐藏的时候,单击左键,主窗体可以显示出来;
4.2.在主窗体隐藏的时候,单击右键,可以进行功能选择:退出,恢复主窗体可见,截图
4.3.在设置的闹表时间剩下30秒是时候,系统会自动提示信息(电脑右下角会弹出消息提示框)
4.4.在设置更改背景的时候,同样会弹出提示信息(所有的提示信息会自动隐退)
下面是代码部分
==========================================================
/Alarm/src/com/b510/main/AlarmMain.java
代码如下:
package com.b510.main;
import com.b510.ui.main.MyAlarm;
/**
*
* @author Hongten
*/
public class AlarmMain {
public static void main(String[] args) {
new MyAlarm("Alarm hongten v-1.0");
}
}
/Alarm/src/com/b510/menu/AlarmBackground.java
代码如下:
package com.b510.menu;
/**
* @author Hongten
*
* @time 2012-3-4 2012
*/
public class AlarmBackground {
/**
* 默认的背景图片
*/
private static String BACKGROUND_DEFAULT="src/image/background.png";
/**
* 水果系列
*/
private static String BACKGROUND_FRUIT="src/image/background1.png";
/**
* 自行车系列
*/
private static String BACKGROUND_BICK="src/image/background2.png";
/**
* 背景图片的list
*/
private static String[] backgroundList={BACKGROUND_DEFAULT,BACKGROUND_FRUIT,BACKGROUND_BICK};
/**
* 获取背景图片的list的长度
* @return 返回背景图片的list的长度
*/
public static int getBackgroundListSize(){
return backgroundList.length;
}
public static String getBackground(int bg){
return backgroundList[bg];
}
}
/Alarm/src/com/b510/menu/AlarmFile.java
代码如下:
package com.b510.menu;
/**
*
* @author Hongten
* 菜单-文件
*/
public class AlarmFile {
/**
* 退出程序
*/
public static void exit(){
System.exit(0);
}
}
/Alarm/src/com/b510/menu/AlarmHelp.java
代码如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.b510.menu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import com.b510.ui.main.MyAlarm;
/**
*
* @author Hongten 菜单-帮助
*/
public class AlarmHelp extends JFrame {
/**
* 版本号
*/
private static final long serialVersionUID = 5248482602468160509L;
public AlarmHelp(String title) {
super(title);
initComponents();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
AlarmHelp.this.setVisible(false);
}});
}
/**
*关闭按钮
*/
private JButton closeButton = new JButton();
/**
* 应用程序名称
*/
javax.swing.JLabel appTitleLabel = new javax.swing.JLabel();
/**
* 版本号 前
*/
javax.swing.JLabel versionLabel = new javax.swing.JLabel();
/**
* 版本号
*/
javax.swing.JLabel appVersionLabel = new javax.swing.JLabel();
/**
* 主页 前
*/
javax.swing.JLabel homepageLabel = new javax.swing.JLabel();
/**
* Homepage
*/
javax.swing.JLabel appHomepageLabel = new javax.swing.JLabel();
/**
* 说明
*/
javax.swing.JLabel appDescLabel = new javax.swing.JLabel();
/**
* 图片
*/
javax.swing.JLabel imageLabel = new javax.swing.JLabel();
private void initComponents() {
this.setVisible(true);
// 设置大小不能变
setResizable(false);
this.setLocation(MyAlarm.pointX+60, MyAlarm.pointY+190);// 设置窗体的初始位置
closeButton.addMouseListener(new MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
closeButton.setIcon(new ImageIcon("src/image/biao2.png"));
}
public void mouseExited(MouseEvent evt){
closeButton.setIcon(new ImageIcon("src/image/biao.png"));
}
});
appTitleLabel.setFont(appTitleLabel.getFont().deriveFont(
appTitleLabel.getFont().getStyle() | java.awt.Font.BOLD,
appTitleLabel.getFont().getSize() + 4));
appTitleLabel.setText("应用程序名称:"); // NOI18N
appTitleLabel.setName("appTitleLabel"); // NOI18N
versionLabel.setFont(versionLabel.getFont().deriveFont(
versionLabel.getFont().getStyle() | java.awt.Font.BOLD));
versionLabel.setText("版本号:"); // NOI18N
versionLabel.setName("versionLabel"); // NOI18N
appVersionLabel.setText("1.0"); // NOI18N
appVersionLabel.setName("appVersionLabel"); // NOI18N
homepageLabel.setFont(homepageLabel.getFont().deriveFont(
homepageLabel.getFont().getStyle() | java.awt.Font.BOLD));
homepageLabel.setText("主页:"); // NOI18N
homepageLabel.setName("homepageLabel"); // NOI18N
appHomepageLabel.setText("http://www.cnblogs.com/hongten"); // NOI18N
appHomepageLabel.setName("appHomepageLabel"); // NOI18N
appDescLabel.setText("这是一个小应用程序,闹钟"); // NOI18N
appDescLabel.setName("appDescLabel"); // NOI18N
imageLabel
.setIcon(new ImageIcon("src/image/about.png")); // NOI18N
imageLabel.setName("imageLabel"); // NOI18N
closeButton
.setIcon(new ImageIcon("src/image/biao.png"));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout
.setHorizontalGroup(layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout
.createSequentialGroup()
.addComponent(imageLabel)
.addGap(18, 18, 18)
.addGroup(
layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(
javax.swing.GroupLayout.Alignment.LEADING,
layout
.createSequentialGroup()
.addGroup(
layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
versionLabel)
.addComponent(
homepageLabel))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
appVersionLabel)
.addComponent(
appHomepageLabel)))
.addComponent(
appTitleLabel,
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
appDescLabel,
javax.swing.GroupLayout.Alignment.LEADING,
javax.swing.GroupLayout.DEFAULT_SIZE,
266,
Short.MAX_VALUE)
.addComponent(
closeButton))
.addContainerGap()));
layout
.setVerticalGroup(layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(imageLabel,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addGroup(
layout
.createSequentialGroup()
.addContainerGap()
.addComponent(appTitleLabel)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
appDescLabel,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
versionLabel)
.addComponent(
appVersionLabel))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
homepageLabel)
.addComponent(
appHomepageLabel))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED,
19, Short.MAX_VALUE)
.addComponent(closeButton)
.addContainerGap()));
pack();
}
}
/Alarm/src/com/b510/menu/AlarmTools.java
代码如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.b510.menu;
import mai.capture.DesktopCapture;
/**
*
* @author Hongten
* 菜单-工具
*/
public class AlarmTools {
/** 定义截图功能 */
@SuppressWarnings("unused")
private static DesktopCapture deskTopCapture;
/**
* 截图
*/
public static void screenshot(){
deskTopCapture=new DesktopCapture();
}
}
/Alarm/src/com/b510/ui/main/MyAlarm.java
代码如下:
package com.b510.ui.main;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import com.b510.menu.AlarmBackground;
import com.b510.menu.AlarmFile;
import com.b510.menu.AlarmHelp;
import com.b510.menu.AlarmTools;
/**
*
* @author Hongten
*/
public class MyAlarm extends JFrame implements ActionListener {
/**
*+1
*/
private javax.swing.JButton add1;
/**
* +30
*/
private javax.swing.JButton add30;
/**
* +5
*/
private javax.swing.JButton add5;
/**
* 时
*/
private javax.swing.JComboBox dorp_down_hours;
/**
* 分
*/
private javax.swing.JComboBox dorp_down_minute;
/**
* 秒
*/
private javax.swing.JComboBox drop_down_second;
/**
* 试听
*/
private javax.swing.JButton listening_test;
/**
* 试听-停止
*/
private javax.swing.JButton listening_test_stop;
/**
* 主Panel
*/
private javax.swing.JPanel mainPanel;
/**
* 菜单bar
*/
private javax.swing.JMenuBar menuBar;
/**
* -1
*/
private javax.swing.JButton minus1;
/**
* -30
*/
private javax.swing.JButton minus30;
/**
* -5
*/
private javax.swing.JButton minus5;
/**
* 当前时间
*/
private javax.swing.JLabel now;
/**
* 铃声
*/
private javax.swing.JComboBox ring_setup;
/**
* 截屏
*/
private javax.swing.JMenuItem screenshot;
/**
* 更改背景图片
*/
private javax.swing.JMenuItem changeBackground;
/**
* 停止
*/
private javax.swing.JButton stop;
/**
* 工具
*/
private javax.swing.JMenu tools;
/**
* 帮助
*/
private javax.swing.JMenu help;
/**
* 关于
*/
private javax.swing.JMenuItem about;
/**
* 退出
*/
private javax.swing.JMenuItem exit;
/**
* 上传铃声
*/
private javax.swing.JMenuItem uploadRing;
/**
* wenjian
*/
private javax.swing.JMenu file;
/**
* 结果,即剩余时间
*/
private JLabel result;
/**
* 分割线
*/
private javax.swing.JSeparator line;
/**
* 变量-->小时
*/
private String h;
/**
* 变量-->分钟
*/
private String m;
/**
* 变量-->秒
*/
private String s;
/**
* 线程的一个标志
*/
private boolean running = true;
/**
* 定义图盘图盘标志
*/
public boolean iconed = false;
/**
* 背景图片选择标志
*/
private int background = 0;
/**
* 获取result的秒数
*/
private int secondOfResult;
/**
* 更改背景图片的标志
*/
private boolean flagOfBackground = false;
/**
* MyAlarm的X坐标
*/
public static int pointX = 0;
/**
* MyAlarm的Y坐标
*/
public static int pointY = 0;
/** 定义托盘 */
MyTray myTray;
/**
* 版本号
*/
private static final long serialVersionUID = -6601825053136983041L;
public MyAlarm(String title) {
this.setTitle(title);
init();
}
/**
* 初始化背景图片
*/
public void initMainPanel() {
mainPanel = new JPanel() {
private static final long serialVersionUID = 1L;
protected void paintComponent(Graphics g) {
ImageIcon icon = new ImageIcon(AlarmBackground
.getBackground(background));
g.drawImage(icon.getImage(), 0, 0, 545, 463, null);
}
};
}
/**
* 主界面初始化
*/
public void init() {
initMainPanel();
now = new javax.swing.JLabel();
stop = new javax.swing.JButton();
add1 = new javax.swing.JButton();
add5 = new javax.swing.JButton();
add30 = new javax.swing.JButton();
minus1 = new javax.swing.JButton();
minus5 = new javax.swing.JButton();
minus30 = new javax.swing.JButton();
listening_test = new javax.swing.JButton();
listening_test_stop = new javax.swing.JButton();
dorp_down_hours = new javax.swing.JComboBox();
dorp_down_minute = new javax.swing.JComboBox();
drop_down_second = new javax.swing.JComboBox();
ring_setup = new javax.swing.JComboBox();
menuBar = new javax.swing.JMenuBar();
file = new javax.swing.JMenu();
uploadRing = new javax.swing.JMenuItem();
exit = new javax.swing.JMenuItem();
tools = new javax.swing.JMenu();
screenshot = new javax.swing.JMenuItem();
changeBackground = new javax.swing.JMenuItem();
help = new javax.swing.JMenu();
about = new javax.swing.JMenuItem();
line = new javax.swing.JSeparator();
result = new javax.swing.JLabel();
mainPanel.setName("mainPanel"); // NOI18N
result.setForeground(Color.RED);
result.setName("result");
result.setVisible(false);
now.setFont(now.getFont().deriveFont(
now.getFont().getStyle() | java.awt.Font.BOLD,
now.getFont().getSize() + 70));
now.setName("now"); // NOI18N
// 时间监听器,得到系统时间和设置好时间后,得到剩余时间
timeListener();
stop.setText("stop"); // NOI18N
stop.setName("stop"); // NOI18N
// 初始化的时候是不可见的
stop.setVisible(false);
stop.addActionListener(this);
add1.setText("+1"); // NOI18N
add1.setName("add1"); // NOI18N
add1.addActionListener(this);
add5.setText("+5"); // NOI18N
add5.setName("add5"); // NOI18N
add5.addActionListener(this);
add30.setText("+30"); // NOI18N
add30.setName("add30"); // NOI18N
add30.addActionListener(this);
minus1.setText("-1"); // NOI18N
minus1.setName("minus1"); // NOI18N
minus1.addActionListener(this);
minus5.setText("-5"); // NOI18N
minus5.setName("minus5"); // NOI18N
minus5.addActionListener(this);
minus30.setText("-30"); // NOI18N
minus30.setName("minus30"); // NOI18N
minus30.addActionListener(this);
listening_test.setText("试听"); // NOI18N
listening_test.setName("listening_test"); // NOI18N
listening_test.addActionListener(this);
listening_test_stop.setText("停止"); // NOI18N
listening_test_stop.setName("listening_test_stop"); // NOI18N
listening_test_stop.addActionListener(this);
dorp_down_hours.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "关闭", "00", "01", "02", "03", "04", "05", "06",
"07", "08", "09", "10", "11", "12", "13", "14", "15",
"16", "17", "18", "19", "20", "21", "22", "23" }));
dorp_down_hours.setName("dorp_down_hours"); // NOI18N
dorp_down_hours.addActionListener(this);
dorp_down_minute.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "关闭", "00", "01", "02", "03", "04", "05", "06",
"07", "08", "09", "10", "11", "12", "13", "14", "15",
"16", "17", "18", "19", "20", "21", "22", "23", "24",
"25", "26", "27", "28", "29", "30", "31", "32", "33",
"34", "35", "36", "37", "38", "39", "40", "41", "42",
"43", "44", "45", "46", "47", "48", "49", "50", "51",
"52", "53", "54", "55", "56", "57", "58", "59" }));
dorp_down_minute.setName("dorp_down_minute"); // NOI18N
dorp_down_minute.addActionListener(this);
drop_down_second.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "关闭", "00", "01", "02", "03", "04", "05", "06",
"07", "08", "09", "10", "11", "12", "13", "14", "15",
"16", "17", "18", "19", "20", "21", "22", "23", "24",
"25", "26", "27", "28", "29", "30", "31", "32", "33",
"34", "35", "36", "37", "38", "39", "40", "41", "42",
"43", "44", "45", "46", "47", "48", "49", "50", "51",
"52", "53", "54", "55", "56", "57", "58", "59" }));
drop_down_second.setName("drop_down_second"); // NOI18N
drop_down_second.addActionListener(this);
ring_setup.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
"铃声一", "铃声二", "铃声三", "铃声四", "铃声五", "铃声六", "铃声七" }));
ring_setup.setName("ring_setup"); // NOI18N
// 主要的布局
omponentLayout();
menuBar.setName("menuBar"); // NOI18N
file.setText("文件"); // NOI18N
file.setName("file"); // NOI18N
uploadRing.setText("上传铃声"); // NOI18N
uploadRing.setName("uploadRing"); // NOI18N
uploadRing.addActionListener(this);
file.add(uploadRing);
file.add(line);
exit.setText("退出");
exit.setName("exit"); // NOI18N
exit.addActionListener(this);
file.add(exit);
menuBar.add(file);
tools.setText("工具"); // NOI18N
tools.setName("tools"); // NOI18N
screenshot.setText("截图工具"); // NOI18N
screenshot.setName("screenshot"); // NOI18N
screenshot.addActionListener(this);
tools.add(screenshot);
changeBackground.setText("更改背景");
changeBackground.setName("changeBackground");
changeBackground.addActionListener(this);
tools.add(changeBackground);
menuBar.add(tools);
help.setText("帮助"); // NOI18N
help.setName("help"); // NOI18N
about.setText("关于软件");
about.setName("about"); // NOI18N
about.addActionListener(this);
help.add(about);
menuBar.add(help);
this.add(mainPanel);
setJMenuBar(menuBar);
this.setVisible(true);
this.setSize(550, 516);
// this.pack();
this.setLocationRelativeTo(null);
this.setResizable(false);
// this.setLocation(470, 250);
// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 当点击"-"最小化按钮时,系统会最小化到托盘
addWindowListener(new WindowAdapter() {
public void windowIconified(WindowEvent e) {
iconed = true;
setVisible(false);
}
public void windowClosing(WindowEvent e) {
// 当点击"X"关闭窗口按钮时,会询问用户是否要最小化到托盘
// 是,表示最小化到托盘,否,表示退出
int option = JOptionPane.showConfirmDialog(MyAlarm.this,
"是否最小化到托盘?", "提示:", JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.YES_OPTION) {
iconed = true;
MyAlarm.this.setVisible(false);
} else {
AlarmFile.exit();
}
}
});
// 初始化自定义托盘
myTray = new MyTray(MyAlarm.this);
}
/**
* 组件的布局,不要轻易动啊
*/
private void omponentLayout() {
javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(
mainPanel);
mainPanel.setLayout(mainPanelLayout);
mainPanelLayout
.setHorizontalGroup(mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
mainPanelLayout
.createSequentialGroup()
.addContainerGap(170, Short.MAX_VALUE)
.addGroup(
mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
mainPanelLayout
.createSequentialGroup()
.addComponent(
result)
.addContainerGap())
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
mainPanelLayout
.createSequentialGroup()
.addComponent(
now,
javax.swing.GroupLayout.DEFAULT_SIZE,
483,
Short.MAX_VALUE)
.addContainerGap())
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
mainPanelLayout
.createSequentialGroup()
.addGroup(
mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
mainPanelLayout
.createSequentialGroup()
.addComponent(
dorp_down_hours,
javax.swing.GroupLayout.PREFERRED_SIZE,
74,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
dorp_down_minute,
javax.swing.GroupLayout.PREFERRED_SIZE,
65,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
drop_down_second,
javax.swing.GroupLayout.PREFERRED_SIZE,
62,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
stop))
.addGroup(
mainPanelLayout
.createSequentialGroup()
.addComponent(
add1)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
add5)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
add30)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
minus1)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
minus5)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
minus30))
.addGroup(
mainPanelLayout
.createSequentialGroup()
.addComponent(
ring_setup,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
listening_test)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
listening_test_stop)))
.addGap(
73,
73,
73))))));
mainPanelLayout
.setVerticalGroup(mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
mainPanelLayout
.createSequentialGroup()
.addGap(120, 120, 120)
.addComponent(result)
.addGap(24, 24, 24)
.addComponent(
now,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addGap(36, 36, 36)
.addGroup(
mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
dorp_down_hours,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
dorp_down_minute,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
drop_down_second,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(stop))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(add1)
.addComponent(add5)
.addComponent(add30)
.addComponent(minus1)
.addComponent(minus5)
.addComponent(minus30))
.addGap(13, 13, 13)
.addGroup(
mainPanelLayout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
ring_setup,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
listening_test)
.addComponent(
listening_test_stop))
.addGap(58, 58, 58)));
}
/**
* 时间监听器,得到系统时间和设置好时间后,得到剩余时间
*/
public void timeListener() {
new Thread(new Runnable() {// 设置一个线程
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
initMainPanel();
now.setText(now());// 得到系统时间
result.setText(surplus_time());// 得到剩余时间
}
}
}).start();
}
/**
* 播放声音的监听器
*/
public void myListener() {
new Thread(new Runnable() {// 设置一个线程
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
executeSound();// 播放声音
}
}
}).start();
}
/**
* 获取返回结果
*
* @return result值
*/
public String surplus_time() {
String r = null;
// 获取系统时,分,秒
int h = getHour();
int m = getMunite();
int s = getSecond();
// 获取设置的响铃时间
int dh = 0;
int dm = 0;
int ds = 0;
if (dorp_down_hours.getSelectedIndex() != 0) {
dh = dorp_down_hours.getSelectedIndex() - 1;
}
if (dorp_down_minute.getSelectedIndex() != 0) {
dm = dorp_down_minute.getSelectedIndex() - 1;
}
if (drop_down_second.getSelectedIndex() != 0) {
ds = drop_down_second.getSelectedIndex() - 1;
}
int hour = dh - h;
int min = dm - m;
int sec = ds - s;
if (hour == 0) {
if (min == 0) {
if (sec == 0) {
r = "时间到了哦!";
}
if (sec < 0) {
hour += 23;
min += 59;
sec += 59;
}
}
if (min < 0) {
hour += 23;
if (sec < 0) {
min -= 1;
sec += 59;
}
min += 60;
}
if (min >= 0) {
if (sec < 0 || sec == 0) {
min -= 1;
sec += 59;
}
if (sec > 0) {
// sec=sec;
}
}
}
if (hour < 0) {
if (min <= 0) {
if (sec <= 0) {
hour -= 1;
min += 59;
sec += 59;
}
}
if (min > 0) {
if (sec <= 0) {
min -= 1;
sec += 59;
}
}
hour += 24;
}
if (hour > 0) {
if (min == 0) {
if (sec <= 0) {
hour -= 1;
min += 59;
sec += 59;
}
}
if (min < 0) {
if (sec < 0) {
min -= 1;
sec += 59;
}
min += 60;
hour -= 1;
}
if (min > 0) {
if (sec < 0 || sec == 0) {
min -= 1;
sec += 59;
}
}
}
if (sec == 30 && min == 0 && hour == 0) {
setSecondOfResult(sec);
}
r = new String("剩:" + hour + "时" + min + "分" + sec + "秒");
if (hour == 0 && min == 0 && sec < 0) {
r = "时间到了哦!";
}
// result.setText(r);
return r;
}
public int getSecondOfResult() {
return secondOfResult;
}
public void setSecondOfResult(int sec) {
this.secondOfResult = sec;
}
public boolean getFlagOfBackground() {
return flagOfBackground;
}
public void setFlagOfBackground(boolean flag) {
this.flagOfBackground = flag;
}
/**
* 时间到了的时候就播放声音
*/
public void executeSound() {
// 获取系统时,分,秒
int h = getHour();
int m = getMunite();
int s = getSecond();
// 获取设置的响铃时间
int dh = 0;
int dm = 0;
int ds = 0;
if (dorp_down_hours.getSelectedIndex() != 0) {
dh = dorp_down_hours.getSelectedIndex() - 1;
}
if (dorp_down_minute.getSelectedIndex() != 0) {
dm = dorp_down_minute.getSelectedIndex() - 1;
}
if (drop_down_second.getSelectedIndex() != 0) {
ds = drop_down_second.getSelectedIndex() - 1;
}
int hour = dh - h;
int min = dm - m;
int sec = ds - s;
if (hour == 0 && min == 0 && sec == 0) {
// 主窗体设置为可见
setVisible(true);
// 设置窗口前端显示
setExtendedState(JFrame.NORMAL);
setAlwaysOnTop(true);
// 播放声音
new Thread(new AlarmSound(ring_setup.getSelectedIndex())).start();
// 震动
shack();
}
}
/**
* 得到系统时间当前时间,并返回
*
* @return 返回系统当前时间
*/
public String now() {
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int min = calendar.get(Calendar.MINUTE);
int sec = calendar.get(Calendar.SECOND);
// 小于10的时候,在前面加0
String h = hour < 10 ? "0" : "";
String m = min < 10 ? "0" : "";
String s = sec < 10 ? "0" : "";
String current = new String(h + hour + ":" + m + min + ":" + s + sec);
return current;
}
/**
* 布局下面的按钮和下拉选项的监听器
*/
@SuppressWarnings("deprecation")
@Override
public void actionPerformed(ActionEvent e) {
/**
* 获取dorp_down_hours,dorp_down_minute,drop_down_second的值
*/
if (e.getSource() == dorp_down_hours) {
valueJudgment();
}
if (e.getSource() == dorp_down_minute) {
valueJudgment();
}
if (e.getSource() == drop_down_second) {
valueJudgment();
}
if (e.getSource() == stop) {
stopActionPerformed();
}
if (e.getSource() == add1) {
add1Action();
myListener();
}
if (e.getSource() == add5) {
add5Action();
myListener();
}
if (e.getSource() == add30) {
add30Action();
myListener();
}
if (e.getSource() == minus1) {
minus1Action();
myListener();
}
if (e.getSource() == minus5) {
minus5Action();
myListener();
}
if (e.getSource() == minus30) {
minus30Action();
myListener();
}
AlarmSound alarmSound = new AlarmSound(ring_setup.getSelectedIndex());
Thread alarmThread = new Thread(alarmSound);
if (e.getSource() == listening_test) {
// 试听
if (!alarmThread.isAlive()) {
alarmThread.start();
}
if (running) {
alarmThread.resume();
}
listening_test.setEnabled(false);
}
if (e.getSource() == listening_test_stop) {
// 停止试听
listening_test.setEnabled(true);
if (running) {
alarmThread.suspend();
}
running = !running;
}
if (e.getSource() == uploadRing) {
// 上传文件
}
if (e.getSource() == exit) {
// 退出程序
AlarmFile.exit();
}
if (e.getSource() == screenshot) {
// 主窗体隐藏
iconed = true;
MyAlarm.this.setVisible(false);
// 开始截图
AlarmTools.screenshot();
}
if (e.getSource() == changeBackground) {
changeBG();
}
if (e.getSource() == about) {
pointX = getMyAlarmX();
pointY = getMyAlarmY();
new AlarmHelp("关于程序");
}
}
/**
* 更改背景图片</br> 当点击工具-- >更改背景,这里就可以处理更改背景图片
*/
private void changeBG() {
setFlagOfBackground(true);
if (background < AlarmBackground.getBackgroundListSize()) {
iconed = true;
setVisible(false);
if (background != AlarmBackground.getBackgroundListSize() - 1) {
++background;
} else {
background = 0;
}
initMainPanel();
}
}
/**
* 点击-30按钮的时候执行的动作
*/
private void minus30Action() {
isHMSZero();
if (dorp_down_minute.getSelectedIndex() - 30 < 0) {
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() + 30);// 60-30
if (dorp_down_hours.getSelectedIndex() == 0) {
dorp_down_hours.setSelectedIndex(24);// 设置为23
} else {
// 小时数-1
dorp_down_hours.setSelectedIndex(dorp_down_hours
.getSelectedIndex() - 1);
}
} else {
// 分钟数-30
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() - 30);
}
valueJudgment();
}
/**
* 点击-5按钮的时候执行的动作
*/
private void minus5Action() {
isHMSZero();
if (dorp_down_minute.getSelectedIndex() - 5 < 0) {
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() + 55);// 60-5
if (dorp_down_hours.getSelectedIndex() == 0) {
dorp_down_hours.setSelectedIndex(24);// 设置为23
} else {
// 小时数-1
dorp_down_hours.setSelectedIndex(dorp_down_hours
.getSelectedIndex() - 1);
}
} else {
// 分钟数-5
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() - 5);
}
valueJudgment();
}
/**
* 点击-1按钮的时候执行的动作
*/
private void minus1Action() {
isHMSZero();
if (dorp_down_minute.getSelectedIndex() - 1 == 0) {
dorp_down_minute.setSelectedIndex(60);// 设置为59
if (dorp_down_hours.getSelectedIndex() == 0) {
dorp_down_hours.setSelectedIndex(24);// 设置为23
} else {
// 小时数-1
dorp_down_hours.setSelectedIndex(dorp_down_hours
.getSelectedIndex() - 1);
}
} else {
// 分钟数-1
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() - 1);
}
valueJudgment();
}
/**
* 判断dorp_down_hours,dorp_down_minute,drop_down_second当前是否为0,即:"关闭"
*/
private void isHMSZero() {
// 如果小时数还没有设置,那么就设置为当前小时数
if (dorp_down_hours.getSelectedIndex() == 0) {
dorp_down_hours.setSelectedIndex(getHour() + 1);
}
// 如果分钟数还没有设置,那么就设置为当前分钟数
if (dorp_down_minute.getSelectedIndex() == 0) {
dorp_down_minute.setSelectedIndex(getMunite() + 1);
}
// 如果秒钟还没有设置,那么就设置为当前秒钟
if (drop_down_second.getSelectedIndex() == 0) {
drop_down_second.setSelectedIndex(getSecond());
}
}
/**
* 点击+30按钮的时候执行的动作
*/
private void add30Action() {
isHMSZero();
if (dorp_down_minute.getSelectedIndex() + 30 > 60) {
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() - 30);// +30-60
if (dorp_down_hours.getSelectedIndex() > 23) {
dorp_down_hours.setSelectedIndex(1);// 设置为00
} else {
// 小时数+1
dorp_down_hours.setSelectedIndex(dorp_down_hours
.getSelectedIndex() + 1);
}
} else {
// 分钟数+30
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() + 30);
}
valueJudgment();
}
/**
* 点击+5按钮的时候执行的动作
*/
private void add5Action() {
isHMSZero();
if (dorp_down_minute.getSelectedIndex() + 5 > 60) {
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() - 55);// +5-60
if (dorp_down_hours.getSelectedIndex() > 23) {
dorp_down_hours.setSelectedIndex(1);// 设置为00
} else {
// 小时数+1
dorp_down_hours.setSelectedIndex(dorp_down_hours
.getSelectedIndex() + 1);
}
} else {
// 分钟数+5
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() + 5);
}
valueJudgment();
}
/**
* 点击+1按钮的时候执行的动作
*/
private void add1Action() {
isHMSZero();
if (dorp_down_minute.getSelectedIndex() + 1 > 60) {
dorp_down_minute.setSelectedIndex(1);// 设置为00
if (dorp_down_hours.getSelectedIndex() > 23) {
dorp_down_hours.setSelectedIndex(1);// 设置为00
} else {
// 小时数+1
dorp_down_hours.setSelectedIndex(dorp_down_hours
.getSelectedIndex() + 1);
}
} else {
// 分钟数+1
dorp_down_minute.setSelectedIndex(dorp_down_minute
.getSelectedIndex() + 1);
}
valueJudgment();
}
/**
* 给h,m,s三个变量赋值,并判断他们的值
*/
private void valueJudgment() {
h = dorp_down_hours.getSelectedItem().toString();
m = dorp_down_minute.getSelectedItem().toString();
s = drop_down_second.getSelectedItem().toString();
hsmCheck();
}
/**
* 检查时,分,秒的值,如果都不是"关闭",那么</br>
*
* <li>stop按钮要显示出来</li><br/>
* <li>result要显示出来剩余时间</li><br/>
* <li>ring_setup要设置为不可用</li> <li>listening_test按钮为不可用</li> <li>
* listening_test_stop按钮为不可用</li>
*/
private void hsmCheck() {
if (h != "关闭" && m != "关闭" && s != "关闭") {
stop.setVisible(true);
result.setVisible(true);
ring_setup.setEnabled(false);
listening_test.setEnabled(false);
listening_test_stop.setEnabled(false);
}
}
/**
* stop按钮的动作: <li>
* 把dorp_down_hours,dorp_down_minute,drop_down_second的值设置为"关闭"</li> <li>
* 隐藏result</li> <li>ring_setup设置为可用</li> <li>listening_test按钮为可用</li> <li>
* listening_test_stop按钮为可用</li> <li>stop按钮设置为不可见</li><li>停止声音播放</li>
*/
private void stopActionPerformed() {
dorp_down_hours.setSelectedIndex(0);
dorp_down_minute.setSelectedIndex(0);
drop_down_second.setSelectedIndex(0);
result.setVisible(false);
ring_setup.setEnabled(true);
listening_test.setEnabled(true);
listening_test_stop.setEnabled(true);
// 这里要停止声音
stop.setVisible(false);
}
/**
* 获取当前小时数
*
* @return 返回当前小时数
*/
private int getHour() {
return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
}
/**
* 获取当前分钟数
*
* @return 返回当前分钟数
*/
private int getMunite() {
return Calendar.getInstance().get(Calendar.MINUTE);
}
/**
* 获取当前秒钟数
*
* @return 返回当前秒钟数
*/
private int getSecond() {
return Calendar.getInstance().get(Calendar.SECOND);
}
/**
* 实现震动功能
*/
public void shack() {
Point p = MyAlarm.this.getLocation();
int x = (int) p.getX();
int y = (int) p.getY();
for (int i = 0; i < 5000; i++) {
MyAlarm.this.setLocation(x - 5, y);
MyAlarm.this.setLocation(x, y + 5);
MyAlarm.this.setLocation(x + 5, y);
MyAlarm.this.setLocation(x, y - 5);
}
MyAlarm.this.setLocation(x, y);
}
/**
* 获取MyAlarm的X坐标
*
* @return 返回MyAlarm的X坐标
*/
public int getMyAlarmX() {
return (int) getLocation().getX();
}
/**
* 获取MyAlarm的Y坐标
*
* @return 返回MyAlarm的Y坐标
*/
public int getMyAlarmY() {
return (int) MyAlarm.this.getLocation().getY();
}
/**
* 闹铃类
*
* @author Hongten
*
* @time 2012-3-2 2012
*/
class AlarmSound implements Runnable {
private String temAlarm;
private String alarm0Path = "src/image/sound/alarm0.wav";//
private String alarm1Path = "src/image/sound/alarm1.wav";//
private String alarm2Path = "src/image/sound/alarm2.wav";//
private String alarm3Path = "src/image/sound/alarm3.wav";//
private String alarm4Path = "src/image/sound/alarm4.wav";//
private String alarm5Path = "src/image/sound/alarm5.wav";//
private String alarm6Path = "src/image/sound/alarm6.wav";//
private String alarm7Path = "src/image/sound/alarm7.wav";//
private String alarm8Path = "src/image/sound/alarm8.wav";//
public AlarmSound(int a) {
switch (a) {
case 0:
temAlarm = alarm0Path;
break;
case 1:
temAlarm = alarm1Path;
break;
case 2:
temAlarm = alarm2Path;
break;
case 3:
temAlarm = alarm3Path;
break;
case 4:
temAlarm = alarm4Path;
break;
case 5:
temAlarm = alarm5Path;
break;
case 6:
temAlarm = alarm6Path;
break;
case 7:
temAlarm = alarm7Path;
break;
case 8:
temAlarm = alarm8Path;
break;
}
}
// 读取声音文件,并且播放出来
public void run() {
File soundFile = new File(temAlarm);
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (Exception e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (Exception e) {
e.printStackTrace();
return;
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[512];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream
.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
}
}
}
/Alarm/src/com/b510/ui/main/MyTray.java
代码如下:
package com.b510.ui.main;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import com.b510.menu.AlarmFile;
import com.b510.menu.AlarmTools;
public class MyTray implements ActionListener, MouseListener {
private Image icon;// 图标
private TrayIcon trayIcon;
private SystemTray systemTray;// 系统托盘
private MyAlarm myAlarm; // 托盘所属主窗体
private PopupMenu pop = new PopupMenu(); // 弹出菜单
// 菜单选项
/** 截图 */
private MenuItem screenshot = new MenuItem("ScreenShot");
/** 还原 */
private MenuItem open = new MenuItem("Restore");
/** 退出*/
private MenuItem exit =new MenuItem("Exit");
public MyTray(MyAlarm myAlarm) {
this.myAlarm = myAlarm;
// 得到托盘的图标
icon = new ImageIcon(this.getClass().getClassLoader().getResource(
"image/mytray.png")).getImage();
if (SystemTray.isSupported()) {
systemTray = SystemTray.getSystemTray();
// 设置鼠标经过图标时,显示的内容
trayIcon = new TrayIcon(icon, "open Alarm", pop);
pop.add(screenshot);
pop.add(open);
pop.add(exit);
// 添加系统托盘
try {
systemTray.add(trayIcon);
} catch (AWTException e1) {
e1.printStackTrace();
trayIcon.addMouseListener(this);
}
}
displayInfoListener();
trayIcon.addMouseListener(this);
exit.addActionListener(this);
open.addActionListener(this);
screenshot.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==exit){
//退出系统
AlarmFile.exit();
}else if (e.getSource() == open) {
// 单点击菜单中的"还原"选项时,还原窗口
//displayInfo();
//trayIcon.displayMessage("温馨提示", "hello,world", TrayIcon.MessageType.INFO);
myAlarm.iconed = false;
friendListSet(true);
} else if (e.getSource() == screenshot) {
// 但点击“截图”选项时,进行截图
AlarmTools.screenshot();
}
}
@Override
public void mouseClicked(MouseEvent e) {
// 但鼠标点击一次的时候,进行弹出窗口
if (e.getClickCount() == 1 && e.getButton() != MouseEvent.BUTTON3) {
if (!myAlarm.isVisible()) {
friendListSet(true);
} else {
friendListSet(false);
}
}
// 但鼠标点击两次的时候,进行弹出窗口
// 如果窗口有显示,则隐藏窗口,否则显示窗口
if (e.getClickCount() == 2 && e.getButton() != MouseEvent.BUTTON3) {
if (!myAlarm.isVisible()) {
friendListSet(true);
} else {
friendListSet(false);
}
}
}
/**
* 设置friendList的可见性
*/
private void friendListSet(boolean flag) {
myAlarm.setVisible(true);
myAlarm.setExtendedState(JFrame.NORMAL);
}
public void displayInfoListener() {
new Thread(new Runnable() {// 设置一个线程
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
if(myAlarm.getSecondOfResult()==30){
trayIcon.displayMessage("温馨提示","距闹钟设置时间还剩:\n00 时 00 分 " +myAlarm.getSecondOfResult() + " 秒",TrayIcon.MessageType.INFO);
myAlarm.setSecondOfResult(29);
}
if(myAlarm.getFlagOfBackground()){
trayIcon.displayMessage("温馨提示","您已经更改了背景,点击托盘图标\n可以看到效果,右键托盘图标\n可以进行功能选择。",TrayIcon.MessageType.INFO);
myAlarm.setFlagOfBackground(false);
}
}
}
}).start();
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
/Alarm/src/com/b510/ui/up/AlarmShowNow.java
package com.b510.ui.up;
import java.util.Calendar;
/**
*
* @author Hongten
* 主界面区-显示现在的时间
*/
public class AlarmShowNow {
/**
* 获得系统的当前时间,并返回
* @return 返回系统当前时间
*/
public static String now() {
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int min = cal.get(Calendar.MINUTE);
int sec = cal.get(Calendar.SECOND);
String current = new String(hour+ ":" + min + ":" + sec);
return current;
}
public static void main(String args[]){
System.out.println(now());
}
}
附件下载