平台集成

Swing框架本身是与操作系统无关的,它通过一个称为"轻量级组件"的系统提供UI组件,并且不依赖于平台的本地GUI实现。然而,一个GUI程序不可能完全独立于平台,它肯定也涉及到与平台的集成,Swing则封装了一些通用的方法。

系统托盘集成

Swing中,创建系统托盘图标可以通过SystemTray类和TrayIcon类来实现。SystemTray用于将图标添加到系统托盘,TrayIcon则表示这个图标本身。

package com.gacfox.demo;

import java.awt.AWTException;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Main {
    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // 初始化主界面
                final MainFrame mainFrame = new MainFrame();
                mainFrame
                        .setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
                mainFrame.setVisible(true);

                // 初始化托盘图标
                if (SystemTray.isSupported()) {
                    SystemTray systemTray = SystemTray.getSystemTray();
                    URL iconUrl = getClass().getResource("/icon_sm.png");
                    ImageIcon icon = new ImageIcon(iconUrl);
                    TrayIcon trayIcon = new TrayIcon(icon.getImage(), "系统托盘示例");
                    // 创建一个托盘图标的右键菜单,其中添加一个退出按钮
                    PopupMenu popupMenu = new PopupMenu();
                    MenuItem exitItem = new MenuItem("退出");
                    exitItem.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent arg0) {
                            System.exit(0);
                        }
                    });
                    popupMenu.add(exitItem);
                    trayIcon.setPopupMenu(popupMenu);
                    // 托盘图标双击时设置主窗体可见
                    trayIcon.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent arg0) {
                            mainFrame.setVisible(true);
                        }
                    });
                    try {
                        // 添加到系统托盘
                        systemTray.add(trayIcon);
                    } catch (AWTException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

代码中,我们创建了系统托盘图标。注意这里我们设置主界面窗体的关闭行为是WindowConstants.HIDE_ON_CLOSE,它表示主窗体被关闭时它只是隐藏了,JVM进程并没有结束,我们创建的后台线程依然可以继续执行。系统托盘中我们创建了一个图标,它绑定了一个事件,双击托盘图标触发时主窗体将被设置为可见;此外我们还在托盘图标上添加了一个右键弹出菜单,其中包含了一个退出程序的选项。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap