在 Java 中任务托盘(系统托盘) 图标显示/闪烁
在 Java 中任务托盘(系统托盘本节介绍一个用于显示和闪烁 ) 图标的实用类。
Java SE 6 Mustang 中新增了实用程序类这一特性。 java.awt.SystemTray 、java.awt.TrayIcon 我们将使用一个类。同时还会提供一个示例应用程序,帮助您了解如何使用它。
系统托盘(任务托盘)功能
系统托盘(任务托盘)指的是计算机屏幕右下角排列的小图标。Java SE 6 添加了以下类以启用系统托盘功能。
- java.awt.SystemTray
SystemTray 类表示桌面上的系统托盘。 - java.awt.TrayIcon
TrayIcon 对象表示可以添加到系统托盘的托盘图标。
如何创建闪烁图标
您可以使用以下网站创建闪烁图标。
上传本地图标以创建闪烁图标。
https://www.bannerkoubou.com/anime/
示例申请

示例应用程序使用系统托盘实用程序类 TaskTrayUtil 来实现以下功能。
- 当你启动它的时候任务托盘に图标展示。
- 点击[闪烁按钮]将任务托盘让图标闪烁。
气球上也显示着“放我出去!!”的字样。 - 点击【禁用按钮】将停止图标闪烁。
- 任务托盘单击鼠标左键点击该图标,即可将主窗口移至桌面。
- 任务托盘右键单击该图标以显示默认的弹出菜单。
- 当主窗口最小化时任务托盘储存于。
源代码获取
源代码可从以下位置获取。如果您想编译它,请将以下图标也保存到与源代码相同的位置。
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
* 使用 Java 显示和闪烁任务托盘(系统托盘)图标。
*
* ◆ 本课程概述
TaskTray 类是用于处理任务托盘的实用程序。
* 提供以下功能:
* 在任务栏中显示图标。
* 任务栏中将出现一条弹出消息。
* 使任务托盘闪烁。
*
* ◆ 使用方法
* 将目标 JFrame 类作为参数传递给以下方法。
* ・createTray(JFrame targetFrame)
* ・createTray(final JFrame targetFrame, Image image, PopupMenu menu)
*
*/
public class TaskTrayUtil {
privatestatic JFrame 框架;;
private static PopupMenu defaultMenu;
private static TrayIcon trayIcon;
private static SystemTray tray = SystemTray.getSystemTray();
private static Object INSTANCE_LOCK = new Object();
/**
* 执行示例
* @param args
*/
public static void main(String[] args) {
尝试 {
// 将外观设置为 Windows
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
// 标准图标
final Image img = new ImageIcon(
TaskTrayUtil.class.getResource(
“tray_icon.gif”)).getImage();
最终 JFrame 帧 =
new JFrame("在任务栏中显示并闪烁图标");
frame.setSize(300, 100);
frame.setIconImage(img);
// 当窗口最小化时,将其最小化到任务托盘。
// 添加一个如图所示的 WindowListener 类。
frame.addWindowListener(new WindowAdapter() {
public void windowIconified(WindowEvent e) {
frame.setVisible(false);
}
});
JPanel jPanel = new JPanel();
jPanel.setLayout(new FlowLayout());
jPanel.setSize(new Dimension(219, 70));
// 闪烁图标
最终图像 imgLight =
new ImageIcon(TaskTrayUtil.class.getResource(
“tray_icon_light.gif”)).getImage();
JButton lightButton = new JButton(“点滅”);
lightButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
onAndOffLight(imgLight, null);
displayMessage("消息", "放我出去!!");
}
});
JButton cancelButton = new JButton(“解除”);
cancelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
删除图片(img);
}
});
jPanel.add(lightButton, null);
jPanel.add(cancelButton, null);
frame.add(jPanel);
// 周期结束处理。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 将框架显示在屏幕中央。
frame.setLocationRelativeTo(null);
// 创建任务托盘。
TaskTrayUtil.createTray(frame);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*/
静止的 {
创建弹出菜单();
}
/**
* 生成要在任务栏中显示的默认 PopupMenu 菜单。
以下菜单项可供选择。
* 从任务栏移除
* 将目标应用程序从任务栏中移除,并将其移至桌面。
把它拿出来。
*(激活窗口并将其置于最前面。)
这将终止要关闭的应用程序。
*/
private static void createPopupMenu() {
MenuItem getTrayItem = new MenuItem(“タスクトレイから取り出す”);
getTrayItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
积极的();
}
});
MenuItem exitItem = new MenuItem(“終了”);
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeTrayIcon();
TaskTrayUtil.frame.setVisible(false);
TaskTrayUtil.frame.dispose();
System.exit(0);
}
});
defaultMenu = new PopupMenu();
defaultMenu.add(getTrayItem);
defaultMenu.Add(exitItem);
}
/**
* 创建托盘图标并将其添加到系统托盘。
* 图标上发生的事件监听器设置为 targetFrame
设置为*。
* 此处的事件发生在双击托盘图标时。
* 获取目标应用程序。
* @param targetFrame 目标应用程序
*/
public static void createTray(JFrame targetFrame) {
创建托盘(targetFrame, null, null);
}
/**
* 创建托盘图标并将其添加到系统托盘。
*
* @param targetFrame 目标应用程序
* @param image 要显示为托盘图标的图像。
* 如果为空,则可以使用 getIconImage() 从 targetFrame 获取。
* 图片仅供参考。
* @param menu 要在任务栏中显示的弹出菜单。
* 如果为空,则显示默认的弹出菜单。
*/
public static void createTray(final JFrame targetFrame, Image image,
弹出菜单菜单) {
// 如果不支持系统托盘,则退出。
如果 (!SystemTray.isSupported()) {
返回;
}
TaskTrayUtil.frame = targetFrame;
如果 (image == null) {
image = targetFrame.getIconImage();
}
如果 (menu == null) {
菜单 = 默认菜单;;
}
trayIcon = new TrayIcon(image, targetFrame.getTitle(), menu);
trayIcon.setImageAutoSize(true);
trayIcon.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
如果 (SwingUtilities.isLeftMouseButton(e)) {
积极的();
}
}
});
尝试 {
托盘.添加(托盘图标);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
/**
* 从任务栏中移除图标。
* 此函数必须在应用程序终止时调用。
*/
public static void removeTrayIcon() {
移除托盘图标;;
}
/**
* 让任务栏中的图标闪烁。
* @param msg 如果需要,当点击闪烁图标时
* 设置要显示的消息。
*/
public static void onAndOffLight(Image lightImg, String msg) {
替换图像(lightImg);
ChangeLightImgAdapter 适配 =
new TaskTrayUtil().new ChangeLightImgAdapter(msg);
trayIcon.addMouseListener(adap);
frame.addWindowListener(adap);
}
/**
* 更改任务栏中的图标。
* @param image 仅当图标与当前图标不同时才更改。
*/
public static void replaceImage(Image image) {
同步(实例锁){
if (!image.equals(trayIcon.getImage())) {
trayIcon.setImage(image);
}
}
}
/**
* 更改任务栏中的图标。
* 如果图标由于某种原因闪烁,
似乎必须使用 {@link SystemTray#remove(TrayIcon)} 将其删除。
* @param image 仅当图标与当前图标不同时才更改。
*/
public static void replaceImageWithDelete(Image image) {
同步(实例锁){
if (!image.equals(trayIcon.getImage())) {
移除托盘图标;;
trayIcon.setImage(image);
尝试 {
托盘.添加(托盘图标);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 任务栏中将出现弹出消息。
* @param caption
* @param text
*/
public static void displayMessage(String caption, String text) {
if (caption != null || text != null) {
trayIcon.displayMessage(caption, text,
TrayIcon.MessageType.INFO);
}
}
/**
* 将目标应用程序从任务栏中移除,并将其移至桌面。
把它拿出来。
*/
private static void active() {
// 将帧状态恢复到正常状态。
TaskTrayUtil.frame.setExtendedState(JFrame.NORMAL);
TaskTrayUtil.frame.setAlwaysOnTop(true);
TaskTrayUtil.frame.setVisible(true);
TaskTrayUtil.frame.setAlwaysOnTop(false);
}
/**
* 点击闪烁图标时触发的事件。
* 监听器类。
*/
类 ChangeLightImgAdapter 实现 WindowListener、MouseListener {
字符串 lightImageText;;
public ChangeLightImgAdapter(String lightImageText) {
this.lightImageText = lightImageText;
}
/**
* 当点击任务托盘图标时
* 显示弹出消息。
*/
public void mousePressed(MouseEvent e) {
TaskTrayUtil.displayMessage(null, lightImageText);
}
/**
当目标应用程序激活时,指示灯会闪烁。
* 恢复图标。
*/
public void windowActivated(WindowEvent e) {
TaskTrayUtil.replaceImageWithDelete(TaskTrayUtil.frame
.getIconImage());
TaskTrayUtil.frame.removeWindowListener(this);
TaskTrayUtil.trayIcon.removeMouseListener(this);
}
public void windowClosed(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}
}
