JavaFx Stage 托盘

JavaFx是Java语言编写的一个用于创建富客户端应用程序的开发工具包。它提供了丰富的图形界面组件和功能,使开发者能够轻松创建具有现代感的桌面应用程序。

在JavaFx中,Stage是顶层容器,表示一个窗口。一般情况下,我们通过Stage来展示应用程序的主界面。然而,有时候我们希望将应用程序最小化到系统托盘中,以便用户可以方便地打开或关闭应用程序。

本文将介绍如何使用JavaFx创建一个具有系统托盘功能的应用程序,并提供代码示例。

1. 导入依赖库

首先,我们需要在项目中导入JavaFx的依赖库。在Maven项目中,可以在pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>15.0.1</version>
    </dependency>
</dependencies>

2. 创建主界面

接下来,我们需要创建应用程序的主界面。这里我们创建一个简单的窗口,并添加一个按钮和一个标签:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        // 创建按钮和标签
        Button button = new Button("最小化到托盘");
        Label label = new Label("Hello, JavaFx!");

        // 创建布局并添加组件
        VBox root = new VBox();
        root.getChildren().addAll(button, label);

        // 创建场景
        Scene scene = new Scene(root, 300, 200);

        // 设置舞台
        primaryStage.setTitle("JavaFx Stage 托盘示例");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

3. 创建托盘图标

现在,我们需要创建系统托盘图标,并为其添加事件。JavaFx提供了SystemTrayTrayIcon两个类来实现这个功能。

import javafx.application.Platform;
import javafx.stage.Stage;

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

public class TrayIconManager {
    private static TrayIcon trayIcon;

    public static void addTrayIcon(Stage primaryStage) {
        if (SystemTray.isSupported()) {
            SystemTray tray = SystemTray.getSystemTray();

            // 创建点击事件
            ActionListener actionListener = e -> {
                Platform.runLater(() -> {
                    primaryStage.show();
                    tray.remove(trayIcon);
                });
            };

            // 创建退出事件
            ActionListener exitListener = e -> {
                Platform.exit();
                tray.remove(trayIcon);
            };

            // 创建托盘图标
            Image image = Toolkit.getDefaultToolkit().getImage("icon.png");
            PopupMenu popupMenu = new PopupMenu();
            MenuItem showItem = new MenuItem("显示");
            MenuItem exitItem = new MenuItem("退出");
            showItem.addActionListener(actionListener);
            exitItem.addActionListener(exitListener);
            popupMenu.add(showItem);
            popupMenu.add(exitItem);
            trayIcon = new TrayIcon(image, "JavaFx Stage 托盘示例", popupMenu);
            trayIcon.setImageAutoSize(true);

            // 添加双击事件
            trayIcon.addActionListener(actionListener);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                System.out.println("托盘图标添加失败");
            }
        }
    }
}

4. 最小化到托盘

最后,我们将按钮的点击事件修改为最小化到托盘,并添加一个方法来调用托盘图标的添加方法:

import javafx.application.Platform;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {
    private Stage primaryStage;

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;

        // 创建按钮和标签
        Button button = new Button("最小化到托盘");
        button.setOnAction(e -> minimizeToTray());
        Label label = new Label("Hello, JavaFx!");

        // 创建布局并添加组件
        VBox root = new VBox();
        root.getChildren().addAll(button, label);

        // 创建场景