如何使用系统托盘

系统托盘是桌面的专用区域,用户可以在其中访问当前正在运行的程序。在各种 os 上,可能会以不同的方式引用此区域。在 Microsoft Windows 上,系统托盘称为“任务栏状态区域”,而在 GNU 网络对象模型环境(GNOME)桌面上则称为“通知区域”。在 K Desktop Environment(KDE)上,此区域称为系统托盘。但是,在每个系统上,托盘区域由桌面上运行的所有应用程序共享。

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

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

系统托盘包含一个或多个托盘图标,这些图标已使用add(java.awt.TrayIcon)方法添加到了托盘中。如果不再需要使用remove(java.awt.TrayIcon)方法,可以将其删除。

Note:

如果 os 或 Java 运行时确定无法将图标添加到系统托盘,则add()方法可以引发AWTException。例如,如果桌面上不存在系统托盘,则 X-Window 桌面将抛出AWTException

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

下面的演示是使用 AWT 软件包开发的,演示了 SystemTray 和 TrayIcon 类的功能。

系统任务栏带有打开的弹出菜单

不幸的是,TrayIcon类的当前实现对 Swing 弹出菜单(JPopupMenu类)提供了有限的支持,并且无法使应用程序使用javax.swing包的所有功能。错误数据库中描述了此问题的解决方案,请参见错误 ID 6285881

Try this:

  • bulb.gif图像文件放在image目录中。编译并运行示例,请查阅example index

  • 托盘图标将出现在系统托盘中。

纸盒图标图像

  • Double 击任务栏图标以启动相应的应用程序。将显示对话框。

  • 将鼠标指针悬停在任务栏图标上,然后单击鼠标右键。出现弹出菜单。

  • 选择设置自动尺寸复选框菜单项。请注意,图标外观如下更改。

托盘图标图像已调整大小

  • 选择设置工具提示复选框菜单项。将鼠标指针悬停在任务栏图标上。出现工具提示。

  • 选择关于菜单项。出现对话框。关闭对话框。

  • 选择任何“显示”子菜单项。这些项目中的每一个都会显示特定类型的消息对话框:错误,警告,信息或标准。

  • 使用退出菜单项退出应用程序。

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

...
        //Check the SystemTray is supported
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        final PopupMenu popup = new PopupMenu();
        final TrayIcon trayIcon =
                new TrayIcon(createImage("images/bulb.gif", "tray icon"));
        final SystemTray tray = SystemTray.getSystemTray();
       
        // Create a pop-up menu components
        MenuItem aboutItem = new MenuItem("About");
        CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
        CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");
        Menu displayMenu = new Menu("Display");
        MenuItem errorItem = new MenuItem("Error");
        MenuItem warningItem = new MenuItem("Warning");
        MenuItem infoItem = new MenuItem("Info");
        MenuItem noneItem = new MenuItem("None");
        MenuItem exitItem = new MenuItem("Exit");
       
        //Add components to pop-up menu
        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("TrayIcon could not be added.");
        }
...

该演示的完整代码位于TrayIconDemo.java文件中。该演示还使用了bulb.gif图片文件。

消除当前应用 Swing 组件的限制,开发人员可以添加JMenuItem(带有图像),JRadioButtonMenuItemJCheckBoxMenuItem之类的组件。

SystemTray API

只能存在SystemTray类中创建的单个实例。

MethodPurpose
add将托盘图标添加到系统托盘。添加后,托盘图标在系统托盘中变为可见。没有指定图标在托盘中的显示 Sequences-它取决于平台和实现。
getSystemTray获取表示桌面托盘区域的SystemTray实例。此方法始终为每个应用程序返回相同的实例。在某些平台上,可能不支持系统托盘。使用isSupported()方法检查系统托盘是否受支持。
isSupported返回有关当前平台是否支持系统托盘的信息。除了显示任务栏图标,最小的系统任务栏支持还包括一个弹出菜单(请参见TrayIcon.setPopupMenu(PopupMenu)方法)或一个动作事件(请参见TrayIcon.addActionListener(ActionListener))。

TrayIcon API

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

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

使用 SystemTray API 的示例

下表列出了使用添加到系统托盘中的托盘图标的示例。

ExampleWhere DescribedNotes
TrayIconDemoThis section在系统任务栏中创建任务栏图标,向任务栏图标添加一个弹出菜单。