发一个小例子供大家参考,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.}