简介

SpringBoot启动时,创建系统托盘,提供打开主程序及退出功能。

实现

  1. 启动类添加构造函数
    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);
}
});
}
}

其中具体功能菜单可根据自己需求进行修改完善

  1. 修改启动函数
    public static void main(String[] args) {
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(TjtoolApplication.class).headless(false)
.run(args);
EventQueue.invokeLater(() -> {
ctx.getBean(TjtoolApplication.class);
});
}
  1. 全量代码
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);
}
});
}
}
}
  1. 其中main.jpg存放位置

用途

在项目启动时,会自动在系统右下角创建系统托盘图标;

当我们使用springboot+vue开发了本地使用插件时,并且在启动时隐藏命令行窗口启动,这时用户想关联程序需要在进程中关闭,较麻烦

可以使用这种方式,在系统托盘中添加图标,并携带退出功能

可能遇到的问题

  1. 托盘的中文乱码
  • Eclipse中

    右键项目->Run AS ->Run Configurations ->Arguments->VM arguments中添加
-Dfile.encoding=gbk

  • IDEA中

    Edit Configurations -> Build and Run ->Add VM options
-Dfile.encoding=GB18030

结束

🎀SpringBoot启动创建系统托盘及功能的更多相关文章

  1. 使用QT创建系统托盘

    使用QT来创建一个系统托盘,事实上是一件很简单的事.为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一.但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比 ...

  2. 命令行启动win7系统操作部分功能

    control.exe /name microsoft.folderoptions 启动资源管理器的 文件夹属性 选项卡 control.exe /name Microsoft.AddHardware ...

  3. 用Qt写软件系列四:定制个性化系统托盘菜单

    导读 一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验.毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满.界面设计需综合考虑审美学.心理学.设计学等多因素, ...

  4. QT系统托盘应用程序

    在QT中QSystemTrayIcon类提供了创建系统托盘程序的功能. QSystemTrayIcon类为系统托盘中的应用程序提供图标.现代操作系统通常会在桌面上提供一个称为系统托盘(system t ...

  5. Electron实用技巧-开机启动时隐藏主窗口,只显示系统托盘

    # 1 在桌面软件中,开机自启动是很常见的功能,在electron中也提供了很好的支持,以下是主要代码: //应用是否打包if (app.isPackaged) {  //设置开机启动  app.se ...

  6. Win10使用自带功能创建系统映像备份时D盘被包含进去问题的解决

    在使用Windows10系统时,使用Windows自带功能创建系统映像备份文件时碰到了一些问题,所以在此记录一下. 创建系统映像文件的步骤,如下: 1.打开 控制面板 -> 选择 系统和安全 - ...

  7. (三)SpringBoot启动过程的分析-创建应用程序上下文

    -- 以下内容均基于2.1.8.RELEASE版本 紧接着上一篇(二)SpringBoot启动过程的分析-环境信息准备,本文将分析环境准备完毕之后的下一步操作:ApplicationContext的创 ...

  8. SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...

  9. SpringBoot启动原理分析

    用了差不多两年的SpringBoot了,可以说对SpringBoot已经很熟了,但是仔细一想SpringBoot的启动流程,还是让自己有点懵逼,不得不说是自己工作和学习的失误,所以以此文对Spring ...

  10. SpringBoot启动流程分析(六):IoC容器依赖注入

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

随机推荐

  1. Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5

    大家好,我是编程乐趣. 行业诸多大佬一直在说:"‌2025年将是AI应用元年‌",虽然说大佬的说法不一定对,但AI趋势肯定没错的. 对于我们程序员来说,储备AI应用开发技能,不管对 ...

  2. StarUML画流程图

    一.新建流程图 1.1 新建流程图 1.2 左侧操作符介绍 Flow:顾名思义就是流,用来从一个操作流向下一个操作. Process: 过程 Terminator:用在结束的时候. Dicision: ...

  3. Vue3 数据响应式原理与高效数据操作全解析

    一.Vue3 数据响应式原理 (一)Proxy 替代 Object.defineProperty 在 Vue2 中,数据响应式是通过 Object.defineProperty 实现的.这种方法虽然能 ...

  4. [FJOI2016] 建筑师 题解

    显然有一个 \(dp\) 思路.设 \(f_{i,j}\) 表示现在修了 \(i\) 栋楼,从第一栋楼外侧能看到 \(j\) 栋楼的方案数,显然有: \[f_{i,j}=\begin{cases}[i ...

  5. [WC2014] 紫荆花之恋 题解

    啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊. 因为没有在最开始的时候将所有点设置为已经重构的,所以直接 \(R15-R70\) 间卡了两三天. 似乎也是我第一次大规模使用指针了. 这道题假如只有 ...

  6. 微信小程序之java服务端获取openid

    微信小程序越来越热,最近团队写了一个小程序,这篇博客我将讲一下怎么通过java服务端获取到用户的openid. api文档的授权登陆地址: http://developers.weixin.qq.co ...

  7. Azure Databricks - [02] 常用SQL

    查看当前所在catalog:select current_catalog(); 创建catalog:create catalog if not exists harley_test; 创建表 crea ...

  8. TypeError: Cannot read properties of null (reading 'level')

    一.分析问题 1.一个下拉框组件的更新由另一个下拉框组件控制被动更新列表,子级下拉框的值是由父级下拉框的值调用接口获取,每次父级下拉框值的改变都会改变子级下拉框的数据源也就是会改变子级下拉框的opti ...

  9. PVE 配置显卡直通

    博客链接:PVE 配置显卡直通 配置 Device: Dell PowerEdge T630 CPU: Intel(R) Xeon(R) E5-2696 v4 x2 GPU 1: Matrox Ele ...

  10. 使用form-create生成表单组件

    FormCreate 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持5个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂的 ...