JavaFX隐藏到托盘

在 JavaFX 应用程序中,有时我们希望将应用程序最小化到系统托盘中,以便用户可以方便地将其恢复到前台。本文将介绍如何在 JavaFX 中实现将应用程序隐藏到系统托盘的功能,并提供代码示例供参考。

为什么要隐藏到托盘

隐藏到系统托盘中的应用程序可以在后台运行,节省任务栏空间,同时仍然可以通过托盘图标访问应用程序的功能。这样可以提高用户体验,同时方便用户随时打开应用程序。

实现方法

在 JavaFX 中,实现将应用程序隐藏到系统托盘的功能,通常需要以下几个步骤:

  1. 创建系统托盘图标
  2. 添加托盘图标的菜单
  3. 实现最小化到托盘的功能
  4. 实现从托盘恢复应用程序的功能

接下来我们将逐步介绍如何实现这些步骤。

步骤一:创建系统托盘图标

我们可以使用 javafx.awt.SystemTray 类来创建系统托盘图标。以下是一个简单的示例代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TrayIconExample {

    public static void main(String[] args) {
        if (SystemTray.isSupported()) {
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("icon.png");
            PopupMenu popup = new PopupMenu();

            MenuItem menuItem = new MenuItem("Exit");
            menuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });

            popup.add(menuItem);

            TrayIcon trayIcon = new TrayIcon(image, "JavaFX TrayIcon Example", popup);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
步骤二:添加托盘图标的菜单

在上面的示例代码中,我们使用 PopupMenu 类创建了一个简单的弹出菜单,并将其与托盘图标关联起来。用户可以通过点击托盘图标来打开这个菜单,执行相应的操作。

步骤三:最小化到托盘

要实现将应用程序最小化到系统托盘,我们需要监听窗口的最小化事件,并在事件发生时将应用程序隐藏到托盘。以下是一个简单的示例代码:

stage.setIconified(true);
  • 1.
步骤四:从托盘恢复应用程序

当用户点击托盘图标时,我们可以通过监听鼠标事件来实现从托盘恢复应用程序。在菜单项的事件处理代码中,我们可以使用以下代码恢复应用程序的窗口:

stage.setIconified(false);
stage.show();
  • 1.
  • 2.

完整示例

下面是一个完整的 JavaFX 应用程序示例,其中包含了将应用程序隐藏到系统托盘的功能:

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

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TrayIconDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX TrayIcon Demo");

        Button btn = new Button();
        btn.setText("Minimize to Tray");
        btn.setOnAction(e -> {
            primaryStage.setIconified(true);
        });

        Scene scene = new Scene(btn, 300, 250);
        primaryStage.setScene(scene);

        if (SystemTray.isSupported()) {
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("icon.png");
            PopupMenu popup = new PopupMenu();

            MenuItem menuItem = new MenuItem("Restore");
            menuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    primaryStage.setIconified(false);
                    primaryStage.show();
                }
            });

            MenuItem exitItem = new MenuItem("Exit");
            exitItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });

            popup.add(menuItem);
            popup.add(exitItem);

            TrayIcon trayIcon = new TrayIcon(image, "JavaFX TrayIcon Demo", popup);

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.