锁定老帖子 主题:托盘闪动消息提醒(有声音+源码)
精华帖 (1) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-14
最后修改:2010-12-14
发一个小例子供大家参考,java实现托盘闪动消息提醒,同时播放声音提醒。源码参见附件。
package com.msg; import java.applet.Applet; import java.applet.AudioClip; import java.awt.AWTException; import java.awt.Image; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.SystemTray; import java.awt.TextArea; import java.awt.TrayIcon; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.MalformedURLException; import java.net.URL; import java.util.Date; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel; /** * * 创建闪动的托盘图像 * @author Everest * */ public class BickerTray extends JFrame implements Runnable { private static final long serialVersionUID = -3115128552716619277L; private SystemTray sysTray;// 当前操作系统的托盘对象 private TrayIcon trayIcon;// 当前对象的托盘 private ImageIcon icon = null; private TextArea ta = null; private static int count = 1; //记录消息闪动的次数 private boolean flag = false; //是否有新消息 private static int times = 1; //接收消息次数 public BickerTray() { this.createTrayIcon();// 创建托盘对象 Image image = this.getToolkit().getImage(getRes("com/img/f32.gif")); this.setIconImage(image); init(); } public URL getRes(String str){ return this.getClass().getClassLoader().getResource(str); } /** * 初始化窗体的方法 */ public void init() { this.setTitle("消息盒子"); ta = new TextArea(""); ta.setEditable(false); this.add(ta); this.setSize(400, 400); //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); // 添加窗口最小化事件,将托盘添加到操作系统的托盘 /*this.addWindowListener(new WindowAdapter() { public void windowIconified(WindowEvent e) { addTrayIcon(); } });*/ addTrayIcon(); this.setVisible(true); } /** * 添加托盘的方法 */ public void addTrayIcon() { try { sysTray.add(trayIcon);// 将托盘添加到操作系统的托盘 setVisible(false); // 使得当前的窗口隐藏 new Thread(this).start(); } catch (AWTException e1) { e1.printStackTrace(); } } /** * 创建系统托盘的对象 步骤: * 1,获得当前操作系统的托盘对象 * 2,创建弹出菜单popupMenu * 3,创建托盘图标icon * 4,创建系统的托盘对象trayIcon */ public void createTrayIcon() { sysTray = SystemTray.getSystemTray();// 获得当前操作系统的托盘对象 icon = new ImageIcon(getRes("com/img/f17.gif"));// 托盘图标 PopupMenu popupMenu = new PopupMenu();// 弹出菜单 MenuItem mi = new MenuItem("打开"); MenuItem exit = new MenuItem("退出"); popupMenu.add(mi); popupMenu.add(exit); // 为弹出菜单项添加事件 mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ta.setText(ta.getText()+"\n==============================================\n 《通知》 今天下午4:00到大礼堂开会。 \n 第"+times+"次接收时间:"+ new Date().toLocaleString()); // 设置通知消息内容 BickerTray.this.setExtendedState(JFrame.NORMAL); BickerTray.this.setVisible(true); // 显示窗口 BickerTray.this.toFront(); //显示窗口到最前端 flag = false; //消息打开了 count = 0; times++; } }); exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); trayIcon = new TrayIcon(icon.getImage(), "消息盒子", popupMenu); /** 添加鼠标监听器,当鼠标在托盘图标上双击时,默认显示窗口 */ trayIcon.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { // 鼠标双击 ta.setText(ta.getText()+"\n==============================================\n 《通知》 今天下午4:00到大礼堂开会。 \n 第"+times+"次接收时间:"+ new Date().toLocaleString()); // 设置通知消息内容 BickerTray.this.setExtendedState(JFrame.NORMAL); BickerTray.this.setVisible(true); // 显示窗口 BickerTray.this.toFront(); flag = false; //消息打开了 count = 0; times++; } } }); } /** * 线程控制闪动 */ public void run() { while (true) { if(flag){ // 有新消息 try { if(count == 1){ // 播放消息提示音 //AudioPlayer p = new AudioPlayer(getRes("file:com/sound/Msg.wav")); //p.play(); p.stop(); try { AudioClip p = Applet.newAudioClip(new URL("file:sound/msg.wav")); p.play(); } catch (MalformedURLException e) { e.printStackTrace(); } } // 闪动消息的空白时间 this.trayIcon.setImage(new ImageIcon("").getImage()); Thread.sleep(500); // 闪动消息的提示图片 this.trayIcon.setImage(icon.getImage()); Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } count++; }else{ // 无消息或是消息已经打开过 this.trayIcon.setImage(icon.getImage()); try { Thread.sleep(20000); flag = true; } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * @param args */ public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); try { UIManager.setLookAndFeel(new SubstanceBusinessBlueSteelLookAndFeel()); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } SwingUtilities.invokeLater(new Runnable() { public void run() { new BickerTray(); } }); } }
运行效果图:
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-15
我试了试真不错,之前我只做到了托盘程序,闪动与声音提示都没成功。
|
|
返回顶楼 | |
发表时间:2010-12-15
最后修改:2010-12-15
怎么是乱码?消息内容 源码里 注释也是乱码
|
|
返回顶楼 | |
发表时间:2010-12-15
yzsunlight 写道 怎么是乱码?消息内容 源码里 注释也是乱码
改一下文件编码格式 |
|
返回顶楼 | |
发表时间:2010-12-15
支持下 SWING越来越强大了
|
|
返回顶楼 | |
发表时间:2010-12-15
托盘图标上右键是乱码怎么解决?
|
|
返回顶楼 | |
发表时间:2010-12-15
yzsunlight 写道 怎么是乱码?消息内容 源码里 注释也是乱码 我的文件编码方式是UTF-8,改一下项目编码方式就正常了。个人建议大家都用UTF-8编码,用GB2312编码只满足国内用户。 |
|
返回顶楼 | |
发表时间:2010-12-15
下载测试了,真不错,准备学习一下源码。
|
|
返回顶楼 | |
发表时间:2010-12-15
好东西~~
将右下角的战争进行到底。。。 |
|
返回顶楼 | |
发表时间:2010-12-15
怎么不用Timer来做定时,用Thread代码既丑陋还不在EDT内。
|
|
返回顶楼 | |