🎀SpringBoot启动创建系统托盘及功能
简介
SpringBoot启动时,创建系统托盘,提供打开主程序及退出功能。
实现
- 启动类添加构造函数
public TjtoolApplication() {
initUI();
}
private void initUI() {
if (SystemTray.isSupported()) {// 判断系统是否托盘
TrayIcon icon = new TrayIcon(Toolkit.getDefaultToolkit()
.getImage(TjtoolApplication.class.getClassLoader().getResource("main.jpg")));// 创建一个托盘图标对象
icon.setToolTip("爬虫服务已开启");
icon.setImageAutoSize(true);
PopupMenu menu = new PopupMenu();// 创建弹出菜单
MenuItem item1 = new MenuItem("打开"); // 添加一个用于打开的按钮
item1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Runtime.getRuntime().exec("cmd /c start http://localhost:8080/");
} catch (IOException e2) {
e2.printStackTrace();
}
}
});
menu.add(item1);// 添加弹出菜单到托盘图标
MenuItem item = new MenuItem("退出"); // 添加一个用于退出的按钮
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(item);// 添加弹出菜单到托盘图标
icon.setPopupMenu(menu);
SystemTray tray = SystemTray.getSystemTray();// 获取系统托盘
try {
tray.add(icon);
} catch (AWTException e1) {
e1.printStackTrace();
} // 将托盘图表添加到系统托盘
icon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {// 处理鼠标双击
try {
Runtime.getRuntime().exec("cmd /c start http://localhost:8080/");
} catch (IOException e) {
e.printStackTrace();
}
}
super.mouseClicked(evt);
}
});
}
}
其中具体功能菜单可根据自己需求进行修改完善
- 修改启动函数
public static void main(String[] args) {
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(TjtoolApplication.class).headless(false)
.run(args);
EventQueue.invokeLater(() -> {
ctx.getBean(TjtoolApplication.class);
});
}
- 全量代码
package com.tool;
import java.awt.AWTException;
import java.awt.EventQueue;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class TjtoolApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(TjtoolApplication.class).headless(false)
.run(args);
EventQueue.invokeLater(() -> {
ctx.getBean(TjtoolApplication.class);
});
// 启动打开默认浏览器访问
try {
Runtime.getRuntime().exec("cmd /c start http://localhost:8080/");
} catch (Exception e) {
e.printStackTrace();
}
}
public TjtoolApplication() {
initUI();
}
private void initUI() {
if (SystemTray.isSupported()) {// 判断系统是否托盘
TrayIcon icon = new TrayIcon(Toolkit.getDefaultToolkit()
.getImage(TjtoolApplication.class.getClassLoader().getResource("main.jpg")));// 创建一个托盘图标对象
icon.setToolTip("爬虫服务已开启");
icon.setImageAutoSize(true);
PopupMenu menu = new PopupMenu();// 创建弹出菜单
MenuItem item1 = new MenuItem("打开"); // 添加一个用于打开的按钮
item1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Runtime.getRuntime().exec("cmd /c start http://localhost:8080/");
} catch (IOException e2) {
e2.printStackTrace();
}
}
});
menu.add(item1);// 添加弹出菜单到托盘图标
MenuItem item = new MenuItem("退出"); // 添加一个用于退出的按钮
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(item);// 添加弹出菜单到托盘图标
icon.setPopupMenu(menu);
SystemTray tray = SystemTray.getSystemTray();// 获取系统托盘
try {
tray.add(icon);
} catch (AWTException e1) {
e1.printStackTrace();
} // 将托盘图表添加到系统托盘
icon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {// 处理鼠标双击
try {
Runtime.getRuntime().exec("cmd /c start http://localhost:8080/");
} catch (IOException e) {
e.printStackTrace();
}
}
super.mouseClicked(evt);
}
});
}
}
}
- 其中
main.jpg存放位置

用途
在项目启动时,会自动在系统右下角创建系统托盘图标;
当我们使用springboot+vue开发了本地使用插件时,并且在启动时隐藏命令行窗口启动,这时用户想关联程序需要在进程中关闭,较麻烦
可以使用这种方式,在系统托盘中添加图标,并携带退出功能
可能遇到的问题
- 托盘的中文乱码
- Eclipse中
右键项目->Run AS ->Run Configurations ->Arguments->VM arguments中添加
-Dfile.encoding=gbk

- IDEA中
Edit Configurations -> Build and Run ->Add VM options
-Dfile.encoding=GB18030
结束
🎀SpringBoot启动创建系统托盘及功能的更多相关文章
- 使用QT创建系统托盘
使用QT来创建一个系统托盘,事实上是一件很简单的事.为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一.但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比 ...
- 命令行启动win7系统操作部分功能
control.exe /name microsoft.folderoptions 启动资源管理器的 文件夹属性 选项卡 control.exe /name Microsoft.AddHardware ...
- 用Qt写软件系列四:定制个性化系统托盘菜单
导读 一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验.毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满.界面设计需综合考虑审美学.心理学.设计学等多因素, ...
- QT系统托盘应用程序
在QT中QSystemTrayIcon类提供了创建系统托盘程序的功能. QSystemTrayIcon类为系统托盘中的应用程序提供图标.现代操作系统通常会在桌面上提供一个称为系统托盘(system t ...
- Electron实用技巧-开机启动时隐藏主窗口,只显示系统托盘
# 1 在桌面软件中,开机自启动是很常见的功能,在electron中也提供了很好的支持,以下是主要代码: //应用是否打包if (app.isPackaged) { //设置开机启动 app.se ...
- Win10使用自带功能创建系统映像备份时D盘被包含进去问题的解决
在使用Windows10系统时,使用Windows自带功能创建系统映像备份文件时碰到了一些问题,所以在此记录一下. 创建系统映像文件的步骤,如下: 1.打开 控制面板 -> 选择 系统和安全 - ...
- (三)SpringBoot启动过程的分析-创建应用程序上下文
-- 以下内容均基于2.1.8.RELEASE版本 紧接着上一篇(二)SpringBoot启动过程的分析-环境信息准备,本文将分析环境准备完毕之后的下一步操作:ApplicationContext的创 ...
- SpringBoot启动流程解析
写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...
- SpringBoot启动原理分析
用了差不多两年的SpringBoot了,可以说对SpringBoot已经很熟了,但是仔细一想SpringBoot的启动流程,还是让自己有点懵逼,不得不说是自己工作和学习的失误,所以以此文对Spring ...
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
随机推荐
- MySQL系统命令
原文链接:https://blog.liuzijian.com/post/34b3b940-c053-9d75-06e2-07a2e7aeedc3.html 登录命令 mysql -h 主机 -P 端 ...
- WinForm实现无边框窗体的拖动
一个登录窗体,FormBorderStyle属性设置为None,打开后不能挪动位置,有时候会妨碍使用,有点恶心.网上找了段内容,实现拖动效果: #region 无边框拖动效果,Form被Picture ...
- win10安装MongoDB 5.0
1.首先去官网下载安装包:https://www.mongodb.com/try?tck=docs_navbar 2.安装过程一路下一步就行,选择complete安装,可以勾选安装Compass工具 ...
- 数字先锋 | 央企首批!天翼云助力中国石化率先完成全尺寸DeepSeek国产化部署!
自2025年春节以来,DeepSeek的全新开源推理模型在全球范围内迅速走红,成为各界关注的焦点,同时引发国产AI发展浪潮.众多国内企业相继接入DeepSeek系列模型,以提升企业智能化水平,加速业务 ...
- 『Python底层原理』--Python整数为什么可以无限大
整数类型是编程中最常见的数据类型之一,但它的实现细节却鲜为人知. 与其他语言不同,Python 的整数是任意精度的,这意味着它们可以无限大,仅受限于内存. 这种特性使得 Python 在处理大整数时非 ...
- 八米云-ESXi虚拟机安装教程
疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 准备阶段: 八米云启动U盘(制作方法可参看<制 ...
- 数据挖掘 | 数据隐私(3) | 差分隐私 | 差分隐私概论(上)(Intro to Differential Privacy 1)
L3-Intro to Differential Privacy 从这节课开始就要介绍差分隐私算法了. 随机响应(Randomized Response) 场景提出 假若你是某一门课的教授,你希望统计 ...
- C/C++ GOTO妙用
目录 GOTO 语句 跳出多层循环 循环首次部分跳过 GOTO 语句 C/C++ 的 goto 语句用来在一个函数内进行任意跳转,用起来也是很方便.示例如下: int a() { int x = 0, ...
- 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进 ...
- js发送get 、post请求
前言 我们经常会用到js发送网络请求,这里用到XMLHttpRequest,主要是为了考虑早期的IE.分为三步:创建需要的对象.连接和发送.接收. GET请求 var httpRequest = ne ...