文档

Java™ 教程
隐藏目录
如何使用系统托盘
路径: 使用Swing创建GUI
课程: 使用其他Swing功能

如何使用系统托盘

系统托盘是桌面的一个特殊区域,用户可以访问当前正在运行的程序。不同的操作系统可能会以不同的方式来称呼此区域。在Microsoft Windows上,系统托盘被称为任务栏状态区域,而在GNU网络对象模型环境(GNOME)桌面中,它被称为通知区域。在K桌面环境(KDE)中,此区域被称为系统托盘。然而,在每个系统上,托盘区域由桌面上运行的所有应用程序共享。

在Java™ SE版本6中引入的java.awt.SystemTray类表示桌面的系统托盘。可以通过调用静态方法SystemTray.getSystemTray()来访问系统托盘。在调用此方法之前,可以使用静态方法isSupported()来检查是否支持系统托盘。如果此平台不支持系统托盘,则isSupported()方法返回false。如果应用程序尝试在这种情况下调用getSystemTray()方法,则该方法将抛出java.lang.UnsupportedOperationException异常。

应用程序无法创建SystemTray类的实例。只能存在一个在此类中创建的单个实例,并且可以使用getSystemTray()方法获得此实例。

系统托盘包含一个或多个托盘图标,可以使用add(java.awt.TrayIcon)方法将它们添加到托盘中。当不再需要它们时,可以使用remove(java.awt.TrayIcon)方法将它们移除。


注意: 如果操作系统或Java运行时确定无法将图标添加到系统托盘,则add()方法可能会抛出AWTException异常。例如,在X-Window桌面上,如果系统托盘不存在,将抛出AWTException异常。

TrayIcon类的功能不仅限于在托盘中显示的图标。它还包括文本工具提示、弹出菜单、气球消息和一组与之关联的监听器。一个TrayIcon对象生成各种鼠标事件,并支持添加相应的监听器以接收这些事件的通知。TrayIcon类本身处理一些事件。例如,默认情况下,当在托盘图标上执行右键单击时,它会显示指定的弹出菜单。当执行双击时,TrayIcon对象生成一个ActionEvent来启动一个应用程序。当鼠标指针悬停在托盘图标上时,会显示工具提示。图标图像会自动调整大小以适应在托盘上为图像分配的空间。

以下示例使用AWT包开发,演示了SystemTray和TrayIcon类的功能。

带有打开弹出菜单的系统托盘

不幸的是,TrayIcon类的当前实现对Swing弹出菜单(JPopupMenu类)的支持有限,并且不能让应用程序使用javax.swing包的所有功能。针对这个问题的解决方案在Bug Database中有描述,参见Bug ID 6285881


试一下: 
  1. bulb.gif图像文件放入image目录。编译并运行示例,参考示例索引
  2. 系统托盘中会出现托盘图标。
    托盘图标
  3. 双击托盘图标启动相应的应用程序。对话框将被显示。
  4. 将鼠标指针悬停在托盘图标上并点击鼠标右键。弹出菜单出现。
  5. 选择“设置自动大小”复选框菜单项。注意图标的外观如下所示。
    调整后的托盘图标
  6. 选择“设置工具提示”复选框菜单项。将鼠标指针悬停在托盘图标上。工具提示出现。
  7. 选择“关于”菜单项。对话框出现。关闭对话框。
  8. 选择任意一个“显示”子菜单项。每个菜单项都会显示一个特定类型的消息对话框:错误、警告、信息或标准。
  9. 使用“退出”菜单项退出应用程序。

以下代码片段展示了如何向系统托盘添加托盘图标并应用弹出菜单:

...
        //检查系统是否支持系统托盘
        if (!SystemTray.isSupported()) {
            System.out.println("系统不支持系统托盘");
            return;
        }
        final PopupMenu popup = new PopupMenu();
        final TrayIcon trayIcon =
                new TrayIcon(createImage("images/bulb.gif", "托盘图标"));
        final SystemTray tray = SystemTray.getSystemTray();
       
        // 创建弹出菜单组件
        MenuItem aboutItem = new MenuItem("关于");
        CheckboxMenuItem cb1 = new CheckboxMenuItem("设置自动调整大小");
        CheckboxMenuItem cb2 = new CheckboxMenuItem("设置工具提示");
        Menu displayMenu = new Menu("显示");
        MenuItem errorItem = new MenuItem("错误");
        MenuItem warningItem = new MenuItem("警告");
        MenuItem infoItem = new MenuItem("信息");
        MenuItem noneItem = new MenuItem("无");
        MenuItem exitItem = new MenuItem("退出");
       
        //将组件添加到弹出菜单
        popup.add(aboutItem);
        popup.addSeparator();
        popup.add(cb1);
        popup.add(cb2);
        popup.addSeparator();
        popup.add(displayMenu);
        displayMenu.add(errorItem);
        displayMenu.add(warningItem);
        displayMenu.add(infoItem);
        displayMenu.add(noneItem);
        popup.add(exitItem);
       
        trayIcon.setPopupMenu(popup);
       
        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("无法添加托盘图标.");
        }
...

这个示例的完整代码可以在TrayIconDemo.java文件中找到。该示例还使用了bulb.gif图片文件。

消除对应用Swing组件的限制将使开发人员能够添加诸如JMenuItem(带有图像)、JRadioButtonMenuItemJCheckBoxMenuItem等组件。

SystemTray API

SystemTray类中只能创建一个实例。

方法 目的
add 向系统托盘添加托盘图标。一旦添加,托盘图标将在系统托盘中显示。托盘图标在托盘中显示的顺序未指定,它取决于平台和实现。
getSystemTray 获取代表桌面托盘区域的 SystemTray 实例。该方法在每个应用程序中始终返回相同的实例。在某些平台上,可能不支持系统托盘。使用 isSupported() 方法检查系统托盘是否受支持。
isSupported 返回当前平台是否支持系统托盘的信息。除了显示托盘图标外,最低限度的系统托盘支持包括弹出菜单(参见 TrayIcon.setPopupMenu(PopupMenu) 方法)或操作事件(参见 TrayIcon.addActionListener(ActionListener))。

TrayIcon API

一个 TrayIcon 对象表示可以添加到系统托盘的托盘图标。一个 TrayIcon 对象可以有一个工具提示(文本)、一个图像、一个弹出菜单以及一组关联的监听器。

方法 目的
setImageAutoSize 设置自动调整大小属性。自动调整大小确定托盘图像是否自动调整大小以适应在托盘上为图像分配的空间。默认情况下,自动调整大小属性设置为 false
setPopupMenu 为此 TrayIcon 对象设置弹出菜单。如果弹出菜单为 null,则不会与此 TrayIcon 对象关联任何弹出菜单。
setToolTip 为此 TrayIcon 对象设置工具提示字符串。当鼠标悬停在图标上时,工具提示将自动显示。将工具提示设置为 null 将删除任何工具提示文本。在某些平台上,显示的工具提示字符串可能会被截断;可以显示的字符数取决于平台。

使用SystemTray API的示例

示例 描述 备注
TrayIconDemo 本节 在系统托盘中创建托盘图标,并向托盘图标添加弹出菜单。

上一页:如何创建闪屏页面
下一页:使用其他Swing功能解决常见问题