发一个小例子供大家参考,java实现托盘闪动消息提醒,同时播放声音提醒。
1.package com.msg;
2.
3.import java.applet.Applet;
4.import java.applet.AudioClip;
5.import java.awt.AWTException;
6.import java.awt.Image;
7.import java.awt.MenuItem;
8.import java.awt.PopupMenu;
9.import java.awt.SystemTray;
10.import java.awt.TextArea;
11.import java.awt.TrayIcon;
12.import java.awt.event.ActionEvent;
13.import java.awt.event.ActionListener;
14.import java.awt.event.MouseAdapter;
15.import java.awt.event.MouseEvent;
16.import java.awt.event.WindowAdapter;
17.import java.awt.event.WindowEvent;
18.import java.net.MalformedURLException;
19.import java.net.URL;
20.import java.util.Date;
21.
22.import javax.swing.ImageIcon;
23.import javax.swing.JFrame;
24.import javax.swing.SwingUtilities;
25.import javax.swing.UIManager;
26.import javax.swing.UnsupportedLookAndFeelException;
27.
28.import org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel;
29.
30.
31./**
32. *
33. * 创建闪动的托盘图像
34. * @author Everest
35. *
36. */
37.public class BickerTray extends JFrame implements Runnable {
38.
39. private static final long serialVersionUID = -3115128552716619277L;
40.
41. private SystemTray sysTray;// 当前操作系统的托盘对象
42. private TrayIcon trayIcon;// 当前对象的托盘
43.
44. private ImageIcon icon = null;
45. private TextArea ta = null;
46.
47. private static int count = 1; //记录消息闪动的次数
48. private boolean flag = false; //是否有新消息
49. private static int times = 1; //接收消息次数
50.
51. public BickerTray() {
52. this.createTrayIcon();// 创建托盘对象
53. Image image = this.getToolkit().getImage(getRes("com/img/f32.gif"));
54. this.setIconImage(image);
55. init();
56. }
57.
58. public URL getRes(String str){
59. return this.getClass().getClassLoader().getResource(str);
60. }
61.
62. /**
63. * 初始化窗体的方法
64. */
65. public void init() {
66. this.setTitle("消息盒子");
67. ta = new TextArea("");
68. ta.setEditable(false);
69. this.add(ta);
70. this.setSize(400, 400);
71. //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
72. this.setLocationRelativeTo(null);
73. // 添加窗口最小化事件,将托盘添加到操作系统的托盘
74. /*this.addWindowListener(new WindowAdapter() {
75. public void windowIconified(WindowEvent e) {
76. addTrayIcon();
77. }
78. });*/
79. addTrayIcon();
80. this.setVisible(true);
81. }
82.
83. /**
84. * 添加托盘的方法
85. */
86. public void addTrayIcon() {
87. try {
88. sysTray.add(trayIcon);// 将托盘添加到操作系统的托盘
89. setVisible(false); // 使得当前的窗口隐藏
90. new Thread(this).start();
91. } catch (AWTException e1) {
92. e1.printStackTrace();
93. }
94. }
95.
96. /**
97. * 创建系统托盘的对象 步骤:
98. * 1,获得当前操作系统的托盘对象
99. * 2,创建弹出菜单popupMenu
100. * 3,创建托盘图标icon
101. * 4,创建系统的托盘对象trayIcon
102. */
103. public void createTrayIcon() {
104. sysTray = SystemTray.getSystemTray();// 获得当前操作系统的托盘对象
105. icon = new ImageIcon(getRes("com/img/f17.gif"));// 托盘图标
106. PopupMenu popupMenu = new PopupMenu();// 弹出菜单
107. MenuItem mi = new MenuItem("打开");
108. MenuItem exit = new MenuItem("退出");
109. popupMenu.add(mi);
110. popupMenu.add(exit);
111. // 为弹出菜单项添加事件
112. mi.addActionListener(new ActionListener() {
113. public void actionPerformed(ActionEvent e) {
114. ta.setText(ta.getText()+"\n==============================================\n 《通知》 今天下午4:00到大礼堂开会。 \n 第"+times+"次接收时间:"+ new Date().toLocaleString()); // 设置通知消息内容
115. BickerTray.this.setExtendedState(JFrame.NORMAL);
116. BickerTray.this.setVisible(true); // 显示窗口
117. BickerTray.this.toFront(); //显示窗口到最前端
118. flag = false; //消息打开了
119. count = 0; times++;
120. }
121. });
122. exit.addActionListener(new ActionListener() {
123. public void actionPerformed(ActionEvent e) {
124. System.exit(0);
125. }
126. });
127. trayIcon = new TrayIcon(icon.getImage(), "消息盒子", popupMenu);
128. /** 添加鼠标监听器,当鼠标在托盘图标上双击时,默认显示窗口 */
129. trayIcon.addMouseListener(new MouseAdapter() {
130. public void mouseClicked(MouseEvent e) {
131. if (e.getClickCount() == 2) { // 鼠标双击
132. ta.setText(ta.getText()+"\n==============================================\n 《通知》 今天下午4:00到大礼堂开会。 \n 第"+times+"次接收时间:"+ new Date().toLocaleString()); // 设置通知消息内容
133. BickerTray.this.setExtendedState(JFrame.NORMAL);
134. BickerTray.this.setVisible(true); // 显示窗口
135. BickerTray.this.toFront();
136. flag = false; //消息打开了
137. count = 0; times++;
138. }
139. }
140. });
141. }
142.
143. /**
144. * 线程控制闪动
145. */
146. public void run() {
147. while (true) {
148. if(flag){ // 有新消息
149. try {
150. if(count == 1){
151. // 播放消息提示音
152. //AudioPlayer p = new AudioPlayer(getRes("file:com/sound/Msg.wav"));
153. //p.play(); p.stop();
154. try {
155. AudioClip p = Applet.newAudioClip(new URL("file:sound/msg.wav"));
156. p.play();
157. } catch (MalformedURLException e) {
158. e.printStackTrace();
159. }
160. }
161. // 闪动消息的空白时间
162. this.trayIcon.setImage(new ImageIcon("").getImage());
163. Thread.sleep(500);
164. // 闪动消息的提示图片
165. this.trayIcon.setImage(icon.getImage());
166. Thread.sleep(500);
167. } catch (Exception e) {
168. e.printStackTrace();
169. }
170. count++;
171. }else{ // 无消息或是消息已经打开过
172. this.trayIcon.setImage(icon.getImage());
173. try {
174. Thread.sleep(20000);
175. flag = true;
176. } catch (InterruptedException e) {
177. e.printStackTrace();
178. }
179. }
180. }
181. }
182.
183. /**
184. * @param args
185. */
186. public static void main(String[] args) {
187. JFrame.setDefaultLookAndFeelDecorated(true);
188. try {
189. UIManager.setLookAndFeel(new SubstanceBusinessBlueSteelLookAndFeel());
190. } catch (UnsupportedLookAndFeelException e) {
191. e.printStackTrace();
192. }
193.
194. SwingUtilities.invokeLater(new Runnable() {
195. public void run() {
196. new BickerTray();
197. }
198. });
199. }
200.
201.}