🎀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启动流程分析(一) ...
随机推荐
- Java中StringBuilder类常用的几个方法
StringBuilder类 StringBuilder 类是 Java 中用于处理可变字符串的类,它提供了在字符串内部进行修改的方法,相比之下,String 类是不可变的,每次对字符串做修改都会创建 ...
- Maven:目前的部分技术
- ADC温敏电阻测温
一.ADC采样电路 使用热敏电阻与连续逼近型寄存器 (SAR) 模数转换器 (ADC) 直接监测温度的电路.温度检测电路使用负温度系数 (NTC) 热敏电阻与电阻串联构成分压器. 参考电压:VCC 分 ...
- Goh:一款Go语言的预编译快速模板引擎。(Benchmark排名第一)
https://github.com/OblivionOcean/Goh Goh 是一款Go语言的预编译快速模板引擎. English | 简体中文 目录 特性 性能测试 安装 使用 语法 特性 预编 ...
- Q:Win10关闭内存压缩功能
微软在Win10中就已经启用了内存压缩机制,在Win11当中继续了这一设定. 通过任务管理器查看. taskmgr ·通过命令行查看. 使用系统管理员权限,打开PowerShell,然后输入以下命令: ...
- 本地一键运行大模型神器Ollama + DeepSeek R1尝鲜指南
本地一键运行大模型神器Ollama + DeepSeek R1尝鲜指南 作为AI领域的弄潮儿,你是否苦恼于云端大模型API的高昂成本?想在本机零门槛体验顶尖开源模型?这篇保姆级教程将带你解锁「Olla ...
- 零基础使用AI辅助编写易简历小程序的一些心得体会
春节期间利用了一点时间体验了Copilot开发了一个小程序,先说结论: AI只是AI,并不能取代程序员. 你能做的,AI能做的更快:你不能做的,AI就大概率会糊弄你. 开发小程序的背景就是本身有一个易 ...
- DW005 - ArgoDB基础
第1章 Argo基础 1.1 ArgoDB对象 说明 在ArgoDB中,可以使用常见的数据库对象,包括数据库(Database),表(Table),视图(View)和函数(Function) 可以使用 ...
- 读论文-协同过滤技术综述(A Survey of Collaborative Filtering Techniques)
前言 今天读的一篇论文题目为<协同过滤技术综述>(A Survey of Collaborative Filtering Techniques),文章发表于<人工智能研究进展> ...
- 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进 ...