简介

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. Java中StringBuilder类常用的几个方法

    StringBuilder类 StringBuilder 类是 Java 中用于处理可变字符串的类,它提供了在字符串内部进行修改的方法,相比之下,String 类是不可变的,每次对字符串做修改都会创建 ...

  2. 0424-字节输出流FileOutputStream

    package A10_IOStream; import java.io.FileOutputStream; import java.io.IOException; import java.util. ...

  3. 让你看懂dart中静态成员和继承

    静态属性和静态方法 在dart中,我们可以通过关键字 static来定义静态属性和静态方法. 需要注意的是: 静态方法不能访问非静态属性[结论1] 非静态方法可以访问静态成员[结论2] 我们通过下面的 ...

  4. 共促数字经济高质量发展,天翼云出席2024 IDC中国年度盛典!

    9月11日,2024 IDC中国年度盛典暨颁奖典礼在上海盛大启幕.本次峰会以「AI时刻,欢迎来到下一个大事件」为主题,汇聚行业专家.意见领袖,深度探讨生成式AI.中国企业出海.创新业务模式.科技可持续 ...

  5. TiDB体系架构

    本文分享自天翼云开发者社区<TiDB体系架构>,作者:x****n 如图所示,TiDB体系中三大组成部分:PD.TiDB Server.TiKV 1.PD:负责产生全局的TSO时间.控制R ...

  6. 「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!

    > 由于网页编辑器简陋,无法实现原文档的精心排版,如需原文档可联系... 序 「ximagine」在本篇文章中将介绍「荒岛」目前所使用的显示器测试流程及标准,我们主要使用Calman.Displ ...

  7. 使用browser-use进行数据爬取实战记录

    前言 前面的文章介绍了browser-use的基本使用,今天带来的分享是使用browser-use进行一次数据爬取的实战(不过还是demo级别的). 使用到的三个玩法分别是使用自己的浏览器.定义输出结 ...

  8. C# Web下的类库 项目中获取程序的运行路径

    System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase

  9. 【Unity】光照解决方案笔记

    [Unity]光照解决方案笔记 https://docs.unity.cn/cn/2022.3/Manual/BestPracticeLightingPipelines.html 确定对象显示效果的三 ...

  10. mybatis - [07] 模糊查询

    题记部分 (1)mapper类 List<User> getUserLike(String value); (2)mapper.xml <!-- 写法1 --> <sel ...