Java实现系统托盘
工作需要:用swing做一个数据交换的客户端,要求很简单仅仅是一个系统托盘图标;
在网上搜索一番之后发现了一个写得不错的帖子,于是借来收藏也跟大家分享一下。
?
桌面的系统托盘即当程序最小化或者关闭按钮程序并没有退出,而是最小化在任务状态区域(Windows系统),当鼠标点击那个区域所在的图标有提示以及其他的操作。在 Microsoft Windows 上,它被称为“任务栏状态区域 (Taskbar Status Area)”,在 Gnome 上,它被称为“通知区域 (Notification Area)”,在 KDE 上,它被成为“系统托盘 (System Tray)”。系统托盘由运行在桌面上的所有应用程序共享。
???????jdk1.6?中新增了两个类来实现:SystemTray
?和?TrayIcon,以下为详细介绍:
??????SystemTray
类介绍:?
???????在某些平台上,可能不存在或不支持系统托盘,所以要首先使用SystemTray.isSupported()来检查当前的系统是否支持系统托盘
????SystemTray
可以包含一个或多个 TrayIcon
,可以使用?add(java.awt.TrayIcon)
方法将它们添加到托盘,当不再需要托盘时,使用?remove(java.awt.TrayIcon)
移除它。TrayIcon
由图像、弹出菜单和一组相关侦听器组成。
??????? 每个 Java 应用程序都有一个 SystemTray
实例,在应用程序运行时,它允许应用程序与桌面系统托盘建立连接。SystemTray
实例可以通过getSystemTray ()
方法获得。应用程序不能创建自己的
实例。SystemTray
?
????????TrayIcon类介绍:
??????? TrayIcon
对象表示可以添加到系统托盘
的托盘图标。
可以包含工具提示(文本)、图像、弹出菜单和一组与之关联的侦听器。TrayIcon
?
???????? TrayIcon
可以生成各种 MouseEvent
,并支持添加相应的侦听器,以接收这些事件的通知。TrayIcon
可以自己处理一些事件。例如,默认情况下,在 TrayIcon
上单击鼠标右键时,它将显示指定的弹出菜单。当鼠标悬停到 TrayIcon
上时,它将显示工具提示。
????? 如:TrayIcon(Image?image, String?tooltip, PopupMenu?popup)
??创建带指定图像、工具提示和弹出菜单的 TrayIcon
。
当鼠标放在这个“OK”上的提示
?
当鼠标右键点击“OK”上的显示
?
测试代码如下(注:jdk1.6):
package com.miracle;import java.awt.AWTException;import java.awt.BorderLayout;import java.awt.Image;import java.awt.MenuItem;import java.awt.PopupMenu;import java.awt.SystemTray;import java.awt.Toolkit;import java.awt.TrayIcon;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.net.URL;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;public class SystemTrayDemo extends JFrame { /** * Swing应用程序系统托盘的例子 */ private static final long serialVersionUID = 1L; private TrayIcon trayIcon = null; public SystemTrayDemo() { this.setTitle("系统托盘的例子"); jbInit(); this.setSize(300, 350); //大小 this.setLocation(300, 300); //位置 } public void jbInit() { if (SystemTray.isSupported()) { //检查当前系统是否支持系统托盘 SystemTray tray = SystemTray.getSystemTray();//获取表示桌面托盘区的 SystemTray 实例。 String imgPath = System.getProperty("user.dir")+"\\src\\picture\\icon.jpg"; Image image = Toolkit.getDefaultToolkit().getImage(imgPath); PopupMenu popupMenu = new PopupMenu(); MenuItem exitItem = new MenuItem("退出"); MenuItem openItem = new MenuItem("打开"); openItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showIT(true); System.out.println("右键点击菜单选项打开\n"); } }); exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { System.exit(0); } catch (Exception ex) { ex.printStackTrace(); } } }); popupMenu.add(openItem); popupMenu.add(exitItem); trayIcon = new TrayIcon(image, "系统托盘图标", popupMenu); trayIcon.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { showIT(true); System.out.println("双击系统托盘图标打开\n"); } } }); try { tray.add(trayIcon); // 将 TrayIcon 添加到 SystemTray。 } catch (AWTException e) { System.err.println(e); } } else { System.out.println("你的系统不支持系统托盘"); } ImageIcon icon = new ImageIcon(); try { URL url = new URL("http://img1.qq.com/ent/pics/11436/11436218.jpg"); icon = new ImageIcon(url); } catch (Exception e) { } JButton btn = new JButton(icon); this.setLayout(new BorderLayout()); this.add(btn,BorderLayout.CENTER); this.add(new JButton("North"),BorderLayout.NORTH); this.add(new JButton("South"),BorderLayout.SOUTH); this.add(new JButton("West"),BorderLayout.WEST); this.add(new JButton("East"),BorderLayout.EAST); } public void showIT(boolean visable) { if (this.isVisible() != visable) this.setVisible(visable); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new SystemTrayDemo().setVisible(true); } }); }}?最后附上原文地址http://www.blogjava.net/kissjava/archive/2008/07/30/218654.html
?