SWT 中实现最小化到托盘图标,并只能通过托盘的弹出菜单关闭程序

SWT 3.0 开始引入了 Tray,可以在系统栏放置你的程序图标了
本程序实现的功能有:

  1. 点击窗口的最小化或关闭按钮都是隐藏窗口–任务栏里不显示,不退出程序
  2. 窗口隐藏时,任务栏无图标,系统栏有图标;窗口处于显示状态时则恰好相反
  3. 窗口隐藏时可通过单击系统栏图标或点击系统栏的 “显示窗口” 菜单显示窗口
  4. 程序只能通过点击系统栏的 “退出程序” 菜单项退出,窗口的 X 按钮无效
import org.eclipse.swt.SWT
import org.eclipse.swt.events.*
import org.eclipse.swt.widgets.*fun main() {TrayExample.show()
}/*** SWT 3.0 开始引入了 Tray,可以在系统栏放置你的程序图标了* 本程序实现的功能有四:* 1. 点击窗口的最小化或关闭按钮都是隐藏窗口--任务栏里不显示,不退出程序* 2. 窗口隐藏时,任务栏无图标,系统栏有图标;窗口处于显示状态时则恰好相反* 3. 窗口隐藏时可通过单击系统栏图标或点击系统栏的 "显示窗口" 菜单显示窗口* 4. 程序只能通过点击系统栏的 "退出程序" 菜单项退出,窗口的 X 按钮无效*/
object TrayExample {fun show() {val display = Display()//禁用掉了最大化按钮val shell = Shell(display, SWT.SHELL_TRIM xor SWT.MAX)shell.text = "TrayExample"//取系统中预置的图标,省得测试运行时还得加个图标文件shell.image = display.getSystemImage(SWT.ICON_WORKING)//构造系统栏控件val tray = display.systemTrayval trayItem = TrayItem(tray, SWT.NONE)//程序启动时,窗口是显示的,所以系统栏图标隐藏trayItem.visible = falsetrayItem.toolTipText = shell.texttrayItem.addSelectionListener(SelectionListener.widgetSelectedAdapter {toggleDisplay(shell, tray)})val trayMenu: Menu = getTrayMenu(shell, tray)//在系统栏图标点击鼠标右键时的事件,弹出系统栏菜单trayItem.addMenuDetectListener { trayMenu.isVisible = true }trayItem.image = shell.image//注册窗口事件监听器shell.addShellListener(object : ShellAdapter() {//点击窗口最小化按钮时,窗口隐藏,系统栏显示图标override fun shellIconified(e: ShellEvent) {toggleDisplay(shell, tray)}//点击窗口关闭按钮时,并不终止程序,而时隐藏窗口,同时系统栏显示图标override fun shellClosed(e: ShellEvent) {e.doit = false //消耗掉原本系统来处理的事件toggleDisplay(shell, tray)}})shell.setSize(320, 240)center(shell)shell.open()while (!shell.isDisposed) {if (!display.readAndDispatch()) {display.sleep()}}display.dispose()}
}private fun getTrayMenu(shell: Shell, tray: Tray): Menu {val trayMenu = Menu(shell, SWT.POP_UP)val showMenuItem = MenuItem(trayMenu, SWT.PUSH)showMenuItem.text = "显示窗口(&s)"//显示窗口,并隐藏系统栏中的图标showMenuItem.addSelectionListener(SelectionListener.widgetSelectedAdapter {toggleDisplay(shell, tray)})trayMenu.defaultItem = showMenuItemMenuItem(trayMenu, SWT.SEPARATOR)//系统栏中的退出菜单,程序只能通过这个菜单退出val exitMenuItem = MenuItem(trayMenu, SWT.PUSH)exitMenuItem.text = "退出程序(&x)"exitMenuItem.addSelectionListener(object : SelectionAdapter() {override fun widgetSelected(event: SelectionEvent) {shell.dispose()}})return trayMenu
}/*** 窗口是可见状态时,则隐藏窗口,同时把系统栏中图标删除* 窗口是隐藏状态时,则显示窗口,并且在系统栏中显示图标** @param shell 窗口* @param tray 系统栏图标控件*/
private fun toggleDisplay(shell: Shell, tray: Tray) {shell.isVisible = !shell.isVisibletray.getItem(0).visible = !shell.isVisibleif (shell.visible) {shell.minimized = falseshell.setActive()}
}/*** 窗口居中显示** @param shell 要显示的窗口*/
private fun center(shell: Shell) {val monitor = shell.monitorval bounds = monitor.boundsval rect = shell.boundsval x = bounds.x + (bounds.width - rect.width) / 2val y = bounds.y + (bounds.height - rect.height) / 2shell.setLocation(x, y)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第2章 Node.js基础】2.7 Node.js 的流(一)可写流

🌈可写流 🚀什么是可写流 可写流是对数据被写入的目的地的一种抽象。 所有可写流都实现了 stream.Writable类定义的接口。 可写流的例子包括,也都是实现了可写流接口的双工流 客户端的 HTTP 请求、服务器的HTTP 响应、fs 的写入流、zlib…

【第2章 Node.js基础】2.6 Node.js 的Buffer数据类型

Buffer数据类型 文章目录 Buffer数据类型什么是Buffer数据类型Buffer 的特点 创建Buffer实例Buffer用于编码转换将Buffer 实例转换为JSON 对象Buffer实例基本操作1. 写入Buffer实例:2. 从Buffer实例读取数据:3. Buffer实例合并: 4. Buffer实例…

Android Jetpack的组件介绍,常见组件解析

jetpack组件有哪些 Android Jetpack是一个集成Android应用程序组件的一站式解决方案。它使开发人员能够专注于他们的应用程序的真正创新部分,而不会受到Android平台特定的限制。Jetpack组件可分为四个类别: 架构组件(Architecture Componen…

从流程优化到经营提效,法大大电子签全面助力智慧零售升级

在新零售模式下,“商业综合体、百货商场、连锁商超、连锁便利店、线上电商平台”等各类商业零售企业借助数字化的手段来改造和重塑传统零售流程和逻辑,实现全面数字化转型,包括线上线下一体化、全场景覆盖、全链条联通、全渠道经营、客户服务…

【ASP.NET】Hello World

文章目录 1. 几个概念2. 搭建开发环境2.1 .NET SDK2.2 IDE & Editor 3 First Project3.1 步骤3.2 模板3.3 项目结构3.4 请求的处理流程 Reference Link 1. 几个概念 .NET 是一个平台,包括 .NET Framework、.NET Core、ASP.NET、C#等,可以构建桌面、W…

【python】Django——连接mysql数据库

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——连接mysql数据库 连接MySQL数据库…

ddrnet 分割学习笔记

目录 修改后可以加载预训练: 训练自己的数据代码: 默认分割后特征下采样8倍,最后用上采样恢复到原图; 修改后可以加载预训练: import math import torch import numpy as np import torch.nn as nn import torch.nn.functional as F from torch.nn import init from …

2023双十一爆冷收场,订单后暗藏这些电商痛点问题需要注意

打开某软件的瞬间,手不小心抖一下就进入了淘宝,而且无法第一时间准确找到关闭按钮。相信不少人都在这个双十一通过开屏广告为淘宝“贡献”至“超8亿”的访问量,更有网友辣评:“现在打开别的软件跳转淘宝的速度都比直接打开淘宝要快…

基于STM32婴儿床检测控制系统及源程序

一、系统方案 1、本设计采用STM32单片机作为主控器。 2、DHT11检测湿度,液晶OLED显示,声音检测声音,有声音或尿床,蜂鸣器报警。 3、手机APP可以控制音乐播放。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先…

新能源充电桩物联网应用之工业4G路由器

新能源充电桩是智慧城市建设中不可缺少且可持续发展的重要设施,而工业4G路由器物联网应用为其提供了更加高效、智能、实时的管理方式。充电桩通过工业4G路由器可以与充电运营商的管理中心建立稳定的连接,实现双向数据传输,为用户提供优质的充…

CMA认证和CNAS认可的联系和区别?哪个更权威?

一、CMA认证是什么?   CMA认证是指中国计量认证,省级以上的计量行政部门根据中国计量法的规定,对申请CMA测试资质的第三方检测机构进行评估,对检测水平和检测可靠性达到国家标准的实验室授予计量认证合格证书(CMA资质)。 二、CNAS认可是什…

设计模式之结构型模式

这些模式关注对象之间的组合和关联方式,以便形成更大的结构和功能。 适配器模式(Adapter Pattern)桥接模式(Bridge)装饰器模式(Decorator)组合模式(Composite)外观模式&a…

有向无权图的最短路径

在运筹学领域的经典模型中,最大流问题、多商品网络流问题和最短路径问题等都依附在图上对问题进行描述,同样,当我们梳理问题的数学模型,或理解相关问题的求解算法时,也要依靠它。因此,我将总结和图相关的问…

Mac笔记本打开Outlook提示:您需要最新的版本的Outlook才能使用此数据库

Mac笔记本打开Outlook提示:您需要最新的版本的Outlook才能使用此数据库 故障现象: 卸载旧的office安装新版的office,打开outlook提示:您需要最新的版本的outlook才能使用此数据库。 故障截图: 故障原因:…

让文字在盒子中水平居中与垂直居中

简单方法&#xff1a; 1.先用text-align: center;将文字垂直居中。 2.再用line-height: Xpx;将元素的行高设置为与父元素同样的高度。&#xff08;这里的X代表父元素的高度&#xff09; 举例&#xff1a; 对于该网页的代码如下&#xff1a; <!DOCTYPE html> <html&…

AI中文版怎么用,版本分享,GPT官网入口

网页版上线啦&#xff0c;在线助力大学生、上班族的高效生活&#xff01; GPT4.0是OpenAI最新推出的聊天模型&#xff0c;它的语言理解和生成能力比以前的版本更强大。对于忙碌的上班族来说&#xff0c;GPT4.0能帮助你高效处理工作中的大部分写作任务&#xff0c;比如撰写报告…

Docker与VM虚拟机的区别以及Docker的特点

01、本质上的区别 VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库&#xff0c;然后再安装应用&#xff1b; Container(Docker容器)&#xff0c;在宿主机器、宿主机器操作系统上创建Docker引擎&#xff0c;在引擎的基础上再安装应…

【MySQL】索引和事务(B树、B+树图解原理)

一、索引 1.1 什么是索引&#xff1f; 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 1.2 索引的作用 &#x1f693;&#xff08;1&#…

Android修行手册 - 阴影效果的几种实现以及一些特别注意点

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…

m1 rvm install 3.0.0 Error running ‘__rvm_make -j8‘

在使用M1 在安装cocopods 前时&#xff0c;安装 rvm install 3.0.0遇到 rvm install 3.0.0 Error running __rvm_make -j8 备注: 该图片是借用其他博客图片&#xff0c;因为我的环境解决完没有保留之前错误信息。 解决方法如下&#xff1a; 1. brew uninstall --ignore-depe…