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进程并没有结束,我们创建的后台线程依然可以继续执行。系统托盘中我们创建了一个图标,它绑定了一个事件,双击托盘图标触发时主窗体将被设置为可见;此外我们还在托盘图标上添加了一个右键弹出菜单,其中包含了一个退出程序的选项。