javafx系统托盘SystemTray实现

javaFX 窗口关闭后最小化到系统托盘的实现方式,应用FXTrayIcon,彻底告别java awt javaFX 应用FXTrayIcon方式实现最小化到系统托盘 阅读详情

直接调用 MySystemTray.getInstance().listen(stage);  即可

如果你关闭 aStage 打开了 bStage , 系统托盘需要重新监听bStage:   MySystemTray.getInstance().listen(bStage);

关闭窗口的时候可以调用 MySystemTray.getInstance().hide(stage);

 

简单粗暴,直接上代码:

/**
 * 自定义系统托盘(单例模式)
 */
public class MySystemTray {

    private static MySystemTray instance;
    private static MenuItem showItem;
    private static MenuItem exitItem;
    private static TrayIcon trayIcon;
    private static ActionListener showListener;
    private static ActionListener exitListener;
    private static MouseListener mouseListener;
    private Logger logger = LoggerFactory.getLogger(MySystemTray.class);

    static{
        //执行stage.close()方法,窗口不直接退出
        Platform.setImplicitExit(false);
        //菜单项(打开)中文乱码的问题是编译器的锅,如果使用IDEA,需要在Run-Edit Configuration在LoginApplication中的VM Options中添加-Dfile.encoding=GBK
        //如果使用Eclipse,需要右键Run as-选择Run Configuration,在第二栏Arguments选项中的VM Options中添加-Dfile.encoding=GBK
        showItem = new MenuItem("打开");
        //菜单项(退出)
        exitItem = new MenuItem("退出");
        //此处不能选择ico格式的图片,要使用16*16的png格式的图片
        URL url = MySystemTray.class.getResource("/static/images/my.png");
        Image image = Toolkit.getDefaultToolkit().getImage(url);
        //系统托盘图标
        trayIcon = new TrayIcon(image);
        //初始化监听事件(空)
        showListener = e -> Platform.runLater(() -> {});
        exitListener = e -> {};
        mouseListener = new MouseAdapter() {};
    }

    public static MySystemTray getInstance(){
        if(instance == null){
            instance = new MySystemTray();
        }
        return instance;
    }

    private MySystemTray(){
        try {
            //检查系统是否支持托盘
            if (!SystemTray.isSupported()) {
                //系统托盘不支持
                logger.info(Thread.currentThread().getStackTrace()[ 1 ].getClassName() + ":系统托盘不支持");
                return;
            }
            //设置图标尺寸自动适应
            trayIcon.setImageAutoSize(true);
            //系统托盘
            SystemTray tray = SystemTray.getSystemTray();
            //弹出式菜单组件
            final PopupMenu popup = new PopupMenu();
            popup.add(showItem);
            popup.add(exitItem);
            trayIcon.setPopupMenu(popup);
            //鼠标移到系统托盘,会显示提示文本
            trayIcon.setToolTip("提示文本");
            tray.add(trayIcon);
        } catch (Exception e) {
            //系统托盘添加失败
            logger.error(Thread.currentThread().getStackTrace()[ 1 ].getClassName() + ":系统添加失败", e);
        }
    }

    /**
     * 更改系统托盘所监听的Stage
     */
    public void listen(Stage stage){
        //防止报空指针异常
        if(showListener == null || exitListener == null || mouseListener == null || showItem == null || exitItem == null || trayIcon == null){
            return;
        }
        //移除原来的事件
        showItem.removeActionListener(showListener);
        exitItem.removeActionListener(exitListener);
        trayIcon.removeMouseListener(mouseListener);
        //行为事件: 点击"打开"按钮,显示窗口
        showListener = e -> Platform.runLater(() -> showStage(stage));
        //行为事件: 点击"退出"按钮, 就退出系统
        exitListener = e -> {
            System.exit(0);
        };
        //鼠标行为事件: 单机显示stage
        mouseListener = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //鼠标左键
                if (e.getButton() == MouseEvent.BUTTON1) {
                    showStage(stage);
                }
            }
        };
        //给菜单项添加事件
        showItem.addActionListener(showListener);
        exitItem.addActionListener(exitListener);
        //给系统托盘添加鼠标响应事件
        trayIcon.addMouseListener(mouseListener);
    }

    /**
     * 关闭窗口
     */
    public void hide(Stage stage){
        Platform.runLater(() -> {
            //如果支持系统托盘,就隐藏到托盘,不支持就直接退出
            if (SystemTray.isSupported()) {
                //stage.hide()与stage.close()等价
                stage.hide();
            } else {
                System.exit(0);
            }
        });
    }

    /**
     * 点击系统托盘,显示界面(并且显示在最前面,将最小化的状态设为false)
     */
    private void showStage(Stage stage){
        //点击系统托盘,
        Platform.runLater(() -> {
            if(stage.isIconified()){ stage.setIconified(false);}
            if(!stage.isShowing()){ stage.show(); }
            stage.toFront();
        });
    }
}

Spring Boot 整合JavaFX 的核心知识点 阅读详情

相关推荐

javaFx 系统最小化托盘(及其避坑)、开机自启动

注意事项1.直接使用第一个参考资料中的MinWindow类即可。2.图片链接,我的放在了这个路径下3. 配置pom文件4、系统最小化托盘后,创建桌面快捷方式后,点击快捷方式或.exe,发现会重复打开多个窗口。

qq_25137131的博客 1081

SpringBoot整合JavaFX进行桌面应用开发

FXML是一种以XML的格式表示JavaFX界面对象的文件,FXML文件中的每一个元素可以映射到JavaFX中的一个类,每个FXML元素的属性或者其子元素都可以映射为该对应JavaFXML类的属性。

路漫漫其修远兮,吾将上下而求索 1万+

JavaFX+Jfoenix 学习笔记(十)--系统托盘及解决中文乱码问题

前言 桌面应用少不了要用到系统托盘,但是JavaFX并没有给我们提供系统托盘(至少我没找见),不过也不要紧,我们可以用java.awt.SystemTray。 1、创建系统托盘,并添加显示、隐藏、退出按钮 // 我们的自定义系统托盘 class MySysTray { private TrayIcon trayIcon = null; private Timeline timel...

足信方为的博客 4725

springBoot+javaFX 10分钟搭建完整的桌面应用程序

springBoot+javaFX 10分钟搭建完整的桌面应用程序 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,M

qq_39840323的博客 9442

OpenHarmony 4.1/5.0 Beta上手:如何用ArkUI在非华为设备上开发你的第一个“鸿蒙”应用

本文详细介绍了如何在非华为设备上使用ArkUI开发OpenHarmony应用,涵盖从设备选型、环境搭建到应用部署的全流程。通过实战案例展示ArkTS语言在开源鸿蒙生态中的应用,帮助开发者突破设备限制,构建跨平台鸿蒙应用。

weixin_33704234的博客 365

Tessent MBIST SDC

主要是两个PROC,tessent_constrain_${design_name}_mentor_ijtag_non_modal和tessent_constrain_${design_name}_mentor_memory_bist_modal。其中,Memory/MBIST controller/MEM Interface可以从func_clk_1来(用func_clk_1和func_clk_2的高频时钟),如图中红色线。其中,SIB和BAP用ijtag_tck的clock,如图绿色线。

po_poo的博客 1988

java systemtray 乱码_JavaFx2 实现系统托盘SystemTray

packagecom.ceadeal.javafxboot.ctrl;importjava.awt.Image;importjava.awt.MenuItem;importjava.awt.PopupMenu;importjava.awt.SystemTray;importjava.awt.Toolkit;importjava.awt.TrayIcon;importjava.awt.event.A...

weixin_33375360的博客 668

Latex在VSCODE中编译报错`Recipe terminated with error. Retry building the project.

Latex在VSCODE中编译报错Recipe terminated with error. Retry building the project. 1 报错提示: Recipe terminated with error 2 报错原因 大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况 3 解决方案 请按照如下方式进行系统变量的添加 对windows,win+R 然后输入sysdm.cpl 在高级中选择环境变量 找到path环境变量,将txtlive中

呆呆象呆呆的博客 3万+

java swing 最小化到托盘_如何最小化靠近系统托盘的javafx阶段?

坐落在启动方法下列财产Platform.setImplicitExit(false);然后设置上紧密事件secondaryStage.setOnCloseRequest(event -> {// Your code here});为了使ystem托盘尝试以下代码://Check the SystemTray is supportedif (!SystemTray.isSupported())...

weixin_36160225的博客 386

Android车载应用开发与分析(11)- 车载Android应用开发入门指南

将时间回退到2017年我大学刚毕业时,彼时移动互联网就已经开始退潮,各大个培训机构也纷纷停止了Android相关的培训,曾经热火朝天的应用开发从那时起,就开始走向下坡路,小程序以及众多跨平台框架也让市场对Android原生开发的需求逐年降低,市场需求的降低也造就了Android开发的面试变得史无前例的“卷”。 终于我在2019年选择离开了互联网,投身当时还不是非常火热的车载Android领域继续从事Android原生开发。而这一年中国首个外商独资的整车制造项目,“...

linkwj的博客 1万+

STM32F4驱动ES8388音频芯片的I²S时钟与DMA流设计

I²S(Inter-IC Sound)是一种广泛应用于嵌入式音频系统的同步串行总线协议,其核心在于精确的时钟同步与稳定的数据流传输。理解I²S时钟树结构(含MCLK、SCLK、WS生成逻辑)和分频机制,是保障CD级音质(如44.1kHz/16bit)的基础;而DMA双缓冲技术则解决了实时音频播放中数据供给连续性的关键工程问题。在STM32F4等Cortex-M4平台中,需协同配置PLLI2S锁相环、I²S预分频寄存器(I2SxPR)及DMA循环模式,同时兼顾ES8388等Codec芯片的I²C初始化时序与寄

weixin_35390379的博客 244

Java实现桌面播放功能

本文作者:suxingrui 本文链接:https://blog.youkuaiyun.com/suxingrui/article/details/80210586 版权声明:本文为原创文章,转载请注明出处。 翻了翻以前实现的一些例子,发现一例用Java实现的桌面播放功能(支持Windows 7/10),效果如下: 虽说是用Java实现的,但归根到底还是调用Windows底层的AP...

suxingrui的专栏 1050

C++(Qt)软件调试---Windows下Qt使用dump定位崩溃位置(1)

在C++/Qt程序崩溃时,往往很难找到崩溃的原因,如果是稳定复现的问题还好,但是多数情况遇见的问题是随机出现的,这时想要快速找到问题并解决就需要通过dump文件定位崩溃位置。

mahuifa的博客 1万+

java systemtray_ava SystemTray类(系统托盘)和TrayIcon类(托盘图标)

利用SystemTray类可以访问系统托盘,每个Java应用程序在运行时都会被分配一个该类的实例,可以通过该类的静态方法getSystemTray()获得。某些系统可能不支持系统托盘功能,此时可以通过静态方法isSupported()判断当前系统是否支持该功能,如果支持则返回true,否则返回false。通过方法add(TrayIcon trayIcon)可以为当前应用程序添加托盘图标到系统托盘;...

weixin_36431035的博客 617

QT-Creator安装教程(windows)

本文介绍了Qt的下载安装步骤:1)通过镜像源下载安装包;2)运行exe文件时使用命令行参数指定镜像地址;3)在安装过程中选择路径和自定义安装组件,包含QT5和QT6版本的详细安装说明;4)安装后可继续添加扩展包或卸载组件。重点提示了QT6必须勾选的关键组件,并提供了组件管理的操作方法。

qq_53545309的博客 3105

RAG面试内容整理-7. 多轮问答与上下文拼接策略

在对话式的RAG应用中,多轮问答需要处理上下文相关性问题:用户的提问往往依赖于之前的对话内容。为正确理解用户每一轮的问题,系统需要保留和传递对话历史信息。

不务正业的猿 376

JavaFX系统托盘进阶指南:自定义无边框窗口解决中文乱码与样式难题

本文详细介绍了JavaFX系统托盘的进阶实现方案,通过自定义无边框窗口解决传统AWT系统托盘常见的中文乱码与样式问题。文章提供了完整的代码示例,展示如何利用JavaFX的Stage和CSS实现美观、跨平台的系统托盘菜单,同时解决了编码问题和样式限制,为Java桌面应用开发提供了实用解决方案。

mongodb5scout的博客 676

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【亲测免费】 探索跨平台的系统托盘解决方案:SystemTray

探索跨平台的系统托盘解决方案:SystemTray 项目简介 SystemTray 是一个专业的、跨平台的 Java 库,为 Swing/AWT 提供了系统托盘的支持,并在 Linux、Unix、Windows 和 MacOS 上实现了原生功能。它解决了各种操作系统和桌面环境下的兼容问题,以及在不同平台上实现一致的用户体验的挑战。 项目技术分析 SystemTray 自动检测并选择最适合当前操作系...

gitblog_00054的博客 768

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SystemTray和TrayIcon

ystemTray 类表示桌面的系统托盘。在 Microsoft Windows 上,它被称为“任务栏状态区域 (Taskbar Status Area)”,在 Gnome 上,它被称为“通知区域 (Notification Area)”,在 KDE 上,它被成为“系统托盘 (System Tray)”。系统托盘由运行在桌面上的所有应用程序共享。在某些平台上,可能不存在或不支持系统托盘,在

xxinchao的专栏 882

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java fx 添加系统托盘图标 右键退出

效果图 悬停: ​​ SystemTray tray = SystemTray.getSystemTray(); PopupMenu pm = new PopupMenu(); //设置图标 BufferedImage image = ImageIO.read(Main.clas...

qq_34651026的博客 1215

java托盘图标变白在linux,为什么用java实现windows系统托盘图标总是不显示出来

为什么用java实现windows系统托盘图标总是不显示出来我用JAVA写了个系统拖盘,不过图标总是不显示出来只有弹出菜单和提示下面是我写的代吗public class TraySystem extends JFrame{SystemTray tray ;TrayIcon trayicon;Image image;PopupMenu pop;public TraySystem(){this.set...

weixin_42355387的博客 397

JDK6.0的新特性之一:Desktop和SystemTray类

在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀...

cmuc21661的博客 158

java托盘菜设置样式_java实现系统托盘示例

import java.awt.AWTException;import java.awt.MenuItem;import java.awt.PopupMenu;import java.awt.SystemTray;import java.awt.TrayIcon;import java.awt.event.ActionEvent;import java.awt.event.ActionListen...

weixin_32816613的博客 164

14. 13. 6. 系统托盘使用 Using system tray

import java.awt.Image; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.SystemTray; import java.awt.Toolkit; import

Python-java-tutorial 1479

Java程序实现系统托盘菜单

Java 1.6 引进的SystemTray(托盘菜单)。 (SystemTray 、TrayIcon)用来实现Java托盘菜单,详细代码: import java.awt.FlowLayout; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.Sys...

weixin_33777877的博客 83

解决Java程序的托盘图标在Windows任务栏重建后丢失的问题(使用SystemTray类创建托盘图标)...

JavaSE 1.6提供了java.awt.SystemTray类用于方便地创建托盘图标.但在Windows平台下当explorer崩溃时托盘图标会丢失.如果是本地代码或.Net平台的程序则可以很简单地获取TaskbarCreated消息并重新添加托盘图标.但在Java程序中无法直接访问Windows消息.解决方法是通过JNI调用本地代码安装消息钩子捕获TaskbarCreated消息并...

dazun5550的博客 309
上一篇: javafx最小化后右键关闭窗口,再点击系统托盘无法显示界面
下一篇: Service exit with a return value of 143, jsvc -wait 10, tomcat使用liquibase超时
why_su
博客等级 码龄10年 86粉丝 38原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值