🎀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 类是不可变的,每次对字符串做修改都会创建 ...
- 0424-字节输出流FileOutputStream
package A10_IOStream; import java.io.FileOutputStream; import java.io.IOException; import java.util. ...
- 让你看懂dart中静态成员和继承
静态属性和静态方法 在dart中,我们可以通过关键字 static来定义静态属性和静态方法. 需要注意的是: 静态方法不能访问非静态属性[结论1] 非静态方法可以访问静态成员[结论2] 我们通过下面的 ...
- 共促数字经济高质量发展,天翼云出席2024 IDC中国年度盛典!
9月11日,2024 IDC中国年度盛典暨颁奖典礼在上海盛大启幕.本次峰会以「AI时刻,欢迎来到下一个大事件」为主题,汇聚行业专家.意见领袖,深度探讨生成式AI.中国企业出海.创新业务模式.科技可持续 ...
- TiDB体系架构
本文分享自天翼云开发者社区<TiDB体系架构>,作者:x****n 如图所示,TiDB体系中三大组成部分:PD.TiDB Server.TiKV 1.PD:负责产生全局的TSO时间.控制R ...
- 「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
> 由于网页编辑器简陋,无法实现原文档的精心排版,如需原文档可联系... 序 「ximagine」在本篇文章中将介绍「荒岛」目前所使用的显示器测试流程及标准,我们主要使用Calman.Displ ...
- 使用browser-use进行数据爬取实战记录
前言 前面的文章介绍了browser-use的基本使用,今天带来的分享是使用browser-use进行一次数据爬取的实战(不过还是demo级别的). 使用到的三个玩法分别是使用自己的浏览器.定义输出结 ...
- C# Web下的类库 项目中获取程序的运行路径
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
- 【Unity】光照解决方案笔记
[Unity]光照解决方案笔记 https://docs.unity.cn/cn/2022.3/Manual/BestPracticeLightingPipelines.html 确定对象显示效果的三 ...
- mybatis - [07] 模糊查询
题记部分 (1)mapper类 List<User> getUserLike(String value); (2)mapper.xml <!-- 写法1 --> <sel ...