JavaFX11 系统托盘

在使用 JavaFX 进行桌面应用开发时,有时候需要将应用程序的图标显示在系统托盘中,以便用户方便地进行操作。本文将介绍如何在 JavaFX11 中实现系统托盘的功能,并提供相应的代码示例。

系统托盘功能

系统托盘是操作系统中的一个小图标,通常显示在屏幕的边缘或任务栏上,用于快速访问应用程序的功能或通知用户相关信息。在 JavaFX 中,可以通过 javafx.stage.Stagejavafx.application.Platform 类来实现系统托盘功能。

实现步骤

以下是实现系统托盘功能的步骤:

  1. 创建 TrayIcon 对象并设置图标
  2. 创建 PopupMenu 对象并添加菜单项
  3. 设置系统托盘的动作
  4. 将应用程序最小化到系统托盘

代码示例

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Menu;
import javafx.scene.control.ContextMenu;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.awt.*;
import java.awt.TrayIcon.MessageType;

public class SystemTrayExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }

        SystemTray tray = SystemTray.getSystemTray();
        Image image = new Image(getClass().getResourceAsStream("icon.png"));
        TrayIcon trayIcon = new TrayIcon(image, "JavaFX System Tray");
        trayIcon.setImageAutoSize(true);

        PopupMenu popup = new PopupMenu();

        MenuItem openItem = new MenuItem("Open");
        openItem.addActionListener(e -> {
            Platform.runLater(() -> {
                primaryStage.setIconified(false);
                primaryStage.show();
            });
        });

        MenuItem exitItem = new MenuItem("Exit");
        exitItem.addActionListener(e -> {
            tray.remove(trayIcon);
            Platform.exit();
        });

        popup.add(openItem);
        popup.add(exitItem);

        trayIcon.setPopupMenu(popup);

        trayIcon.addActionListener(e -> {
            Platform.runLater(() -> {
                primaryStage.setIconified(false);
                primaryStage.show();
            });
        });

        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
        }

        primaryStage.initStyle(StageStyle.UTILITY);
        primaryStage.setOnCloseRequest(event -> {
            primaryStage.hide();
            event.consume();
        });

        StackPane root = new StackPane();
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

甘特图

gantt
    title 系统托盘功能实现甘特图
    section 创建并设置图标
        完成创建TrayIcon对象并设置图标                : done, 2022-01-01, 1d
    section 创建并添加菜单项
        完成创建PopupMenu对象并添加菜单项            : done, 2022-01-02, 1d
    section 设置系统托盘的动作
        完成设置系统托盘的动作                      : done, 2022-01-03, 1d
    section 最小化应用程序到系统托盘
        完成应用程序最小化到系统托盘                : done, 2022-01-04, 1d

状态图

stateDiagram
    [*] --> TrayIcon
    TrayIcon --> PopupMenu
    PopupMenu --> MenuItem
    MenuItem --> TrayIcon

通过以上步骤和代码示例,我们可以在 JavaFX11 中实现系统托盘功能,让用户可以方便地访问应用程序的功能。希望这篇文章能帮助你更好地了解和使用 JavaFX 中的系统托盘功能!