Java Swing缩小到任务托盘执行

![Journey](mermaid journey title Java Swing缩小到任务托盘执行

    section 创建Swing应用程序
    创建一个基本的Java Swing应用程序非常简单。下面是一个简单的示例代码:

    ```java
    import javax.swing.*;
    import java.awt.*;

    public class MyApplication extends JFrame {
        public MyApplication() {
            // 设置窗口属性
            setTitle("My Application");
            setSize(300, 200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // 添加组件
            JLabel label = new JLabel("Hello, World!");
            add(label, BorderLayout.CENTER);
        }

        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                MyApplication app = new MyApplication();
                app.setVisible(true);
            });
        }
    }
    ```

    在这个示例代码中,我们创建了一个简单的窗口,并在其中添加了一个标签显示"Hello, World!"。我们使用`SwingUtilities.invokeLater`方法确保在事件调度线程中进行窗口的创建和显示。最后,我们调用`setVisible(true)`使窗口可见。

    section 缩小到任务托盘
    当我们运行上面的示例代码,窗口将以正常的方式显示在屏幕上。但是,有时我们希望将应用程序缩小到任务托盘,并在需要时再显示出来。下面是一个示例代码,演示如何将Java Swing应用程序缩小到任务托盘:

    ```java
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    public class TrayExample extends JFrame {
        private SystemTray tray;
        private TrayIcon trayIcon;

        public TrayExample() {
            // 设置窗口属性
            setTitle("Tray Example");
            setSize(300, 200);
            setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

            // 添加组件
            JLabel label = new JLabel("Hello, World!");
            add(label, BorderLayout.CENTER);

            // 创建任务托盘
            if (SystemTray.isSupported()) {
                tray = SystemTray.getSystemTray();
                Image image = Toolkit.getDefaultToolkit().getImage("icon.png");

                ActionListener showListener = new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        setVisible(true);
                        setExtendedState(JFrame.NORMAL);
                    }
                };

                ActionListener exitListener = new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        tray.remove(trayIcon);
                        System.exit(0);
                    }
                };

                PopupMenu popupMenu = new PopupMenu();
                MenuItem showItem = new MenuItem("Show");
                showItem.addActionListener(showListener);
                popupMenu.add(showItem);

                MenuItem exitItem = new MenuItem("Exit");
                exitItem.addActionListener(exitListener);
                popupMenu.add(exitItem);

                trayIcon = new TrayIcon(image, "My Application", popupMenu);
                trayIcon.setImageAutoSize(true);

                try {
                    tray.add(trayIcon);
                } catch (AWTException e) {
                    e.printStackTrace();
                }

                addWindowStateListener(new WindowStateListener() {
                    public void windowStateChanged(WindowEvent e) {
                        if (e.getNewState() == ICONIFIED) {
                            setVisible(false);
                        }
                    }
                });
            }
        }

        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                TrayExample app = new TrayExample();
                app.setVisible(true);
            });
        }
    }
    ```

    在上面的示例代码中,我们首先检查系统是否支持任务托盘。然后,我们创建了一个`SystemTray`实例,并使用一个图标初始化了`TrayIcon`。我们还创建了一个弹出菜单,并为"Show"和"Exit"菜单项添加了动作监听器。

    在窗口的`addWindowStateListener`方法中,我们监听窗口状态的变化。当窗口被最小化时,我们将窗口设置为不可见。这样,当我们点击任务托盘的图标时,窗口将重新显示出来。

    最后,我们将`TrayIcon`添加到任务托盘中,并在`setVisible(true)`之前调用`trayIcon.setImageAutoSize(true)`以自动调整图标的大小。

    section 总结
    本文介绍了如何在Java Swing应用程序中将窗口缩小到任务托盘执行。通过使用`SystemTray`和`TrayIcon`类,我们可以方便地实现这一功能。无论是隐藏窗口还是重新显示窗口,任务托盘都为我们提供了一个简洁而优雅的解决方案。

    我们使用了简单的示