popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...

本人萌新,利用业余时间学习Java。最近在写一个GUI程序的时候遇到一个问题,系统托盘创建弹出菜单中文乱码,网上搜索很多内容都没有找到解决方案,现将个人解决方案分享给大家,希望有所帮助

一、PopupMenu存在的问题

标准文档中系统托盘的构造函数:TrayIcon(Image image,String tips,PopupMenu menu),但实施过程中遇到两个问题:

1、PopupMenu添加的菜单项MenuItem不支持图标,是awt级组件,没有提供paint函数,也就意味着不能重绘,去实现带图标的菜单,这在作为强迫症的我是无法接受的;

2、PopupMenu中文乱码,只支持英文,网上需要修改文件编码方式为GBK,然而在整个项目中都采用了UTF-8,这也不是解决办法。

二、基于JPopupMenu的解决方案

JPopupMenu是Swing组件,而且支持图标+文本,更美观。在标准API里,添加JPopupMenu的有两种方式:

1、Component组件通过setComponentPopuMenu(JPopupMenu)绑定JPopupMenu;

2、JPopupMneu调用show(Component c,int x,int y)函数绑定至组件;

再研究发现,TrayIcon不是Component,现有方法实现直接绑定是行不通的。弹出菜单的关键事件:鼠标点击(含有快捷键等,不一一列举),然后生成菜单。那么我们为什么不能再点击系统托盘的时候,单独创建一个Component作为JPopupMenu的坐标参考呢?系统托盘的位置,与程序的主界面(JFrame)在是没有关联的,可以脱离主框架独立存在的Component中,JWindow可以独立存在的,没有标题栏,也不会在任务栏显示窗口,显然这是作为一个坐标参考的完美组件。接下来就好办了:

3、获取鼠标点击的坐标值,在这个坐标值上创建一个JWindow,将JPopupMenu绑定到这个JWindow的(0,0)位置上,弹出菜单显示后再获取弹出菜单的尺寸,再根据尺寸回调JWindow的大小,这样JPopupMenu就完美的遮罩了JWindow,看不出JWindow的存在,到这里,还有最后一个问题,弹出菜单消失,JWindow依然存在;

4、查看JPopupMenu的API文档,发现有三个函数firePopupMenuCanceled()、firePopupMenuWillBecomeInvisible()、firePopupMenuWillBecomeVisible(),是菜单消失、即将消失、消失前、消失后调用的函数,所以,直接选择其中任意一个函数进行重写,先执行JWindow.dispose(),再super执行一下原函数就OK了,意思就是,再消失、即将消失前、消失后,将JWindow关闭。

至此,完美实现系统托盘弹出菜单。

第一次分享,可能有大神有更好的解决方案,请多多指教。

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

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

相关文章

QT获取主机名称

//获取主机名 QString localHost QHostInfo::localHostName(); 转载于:https://www.cnblogs.com/amwuau/p/8021758.html

Java哈利波特死亡圣器下_如果编程语言是《哈利波特》中的人物

如果编程语言是《哈利波特》中的人物,本文是作者的一些观点,如果你有不同的看法,欢迎在留言中告诉我们。C语言每个人都在说,C语言已经死了至少十年以上了。人们对它嗤之以鼻。当然它也曾不可一世,肆虐横行,…

序列每天从0开始_【算法打卡】分割数组为连续子序列

难度:中等题目:给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个长度为 3 的子序列,其中每个子序列都由连续整数组成。如果可以完成上述分割,则返回 true ;否则&#xff0c…

linux中 /dev/null命令

/dev/null :代表空设备文件 > :代表重定向到哪里,例如:echo "123" > /home/123.txt1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/d…

php会员系统源码_b2b2c商城系统会员预存款架构及源码分享

业务需求可以为预存款充值,在支付订单时使用预存款支付功能当预存款余额>商品订单总金额时,完全抵扣商品订单金额;当预存款余额架构一、 充值二、 数据结构1、会员钱包表(es_member_wallet)2、 后期可能会将会员积分等关于消费抵扣相关信息…

mongodb 去重查询 Java,mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句...

另外附上mongodb eclipse插件地址: http://www.jumperz.net/update/ import java.net.UnknownHostException;import com.mongodb.DB;import com.mongodb.DBCol1.首先操作mongodb最基本命令::show databases; ---------------------显示全部数…

HTML5 规范

在学习编程的时候,每次看到那些整齐规范的代码,心里顿时对这个程序员表示点点好感,有时,比如看到自己和朋友写的代码时,那阅读起来就是苦不堪言,所以,一些基本的开发规范是必须的,是…

python提交事务_事务提交和回滚

操作方法begin; -开始事物commit; - 提交事物 Python 默认是取消自动提交的rollback; - 回撤操作, 只要操作没有执行 commit 就可以进行回滚操作, 撤回create table tb_account(accid char(4) not null,uname varchar(20) not null,balance float default 0)insert into tb_ac…

求数组的最大值php,求PHP数组最大值,最小值的代码

求PHP数组最大值,最小值的代码,需要的朋友可以参考下。代码如下:$fruits array("155::vbscript::http://www.jb51.net/list/list_114_1.htm", "1::javascript::http://www.jb51.net/list/list_3_1.htm", "2::正则表达式::http://www.jb51…

JWT.NET的使用

JWT.NET的使用 原文:JWT.NET的使用JWT是什么 JWT全称是Json Web Token,是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方法用于通信…

正在搜索需要的文件_【数澜发布-澜寻】智能内容搜索引擎,释放“机器阅读” 潜力...

4月23日,又是一年世界读书日。知识传播的重要性在这一天被无数次提起,记录、阅读成为我们 “理解”这个世界的加速通道,但在科技力量迅猛发展的当下,阅读这件事早已不再局限于人类。人工智能应用到社会中很重要的一步就是模仿人类…

学习笔记(十一)——数据库的索引碎片、计划缓存、统计信息

1.索引碎片 数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘。既键值的逻辑顺序决定了表中相应行的物理顺序 而且在大多数的情况下,数据库写入频率远低于读取频率,索引的存在为了读取速度牺牲写入速度&…

网络软文发布软件_星浪中合网软文写出爆款汽车营销软文的特点是什么?

在移动互联网快速发展的时代,人们都是使用移动设备来获取外界信息。过去,许多广告汽车公司都专注于线下广告,但是现在他们已经将广告费用投入了移动互联网市场。移动互联网营销方法很多,例如,软文营销是一种非常强大的…

通达oa wbupload.php,关于通达OA上传附件类型限制的设置

关于上传附件类型限制的设置有些用户在使用OA系统的过程中,要求只允许上传比如后缀名为doc,xls,ppt等的附件文件。如何设置才能实现这一点呢?下面简单介绍下设置方法。1、在该路径MYOA\webroot\inc下找到配置文件oa_config.php文件…

JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...

说明:本文为作者原创,作者联系地址为:josserchaiyahoo.com。由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清…

ADC应用

数模转换(ADC)的应用笔记 智能时代,数字信号已体现在我们生活的方方面面,A/D,D/A是重要的基础。智能手机触摸信号需要转换为数字信号才能分辨触摸位置、数字去抖;打电话或者麦克风需要将模拟声信号转换为数字信号以便存…

springboot 禁用tomcat_Spring Boot 面试的十个问题

点击左上角蓝字,关注“SpringForAll社区”专注分享Spring周边技术内容用下面这些常见的面试问题为下一次 Spring Boot 面试做准备。在本文中,我们将讨论 Spring boot 中最常见的10个面试问题。现在,在就业市场上,这些问题有点棘手…

java oracle数据库连接代码,java连接oracle数据库代码实例(注释详解)

import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class GetOracleConnection{/** Oracle数据库连接URL*/private final static String DB_URL "jdbc:oracle:thin:1…

javascript总for of和for in的区别?

for in是ES5标准,for of是ES6标准; for in是遍历对象属性,for of是遍历对象元素。 for of兼容性还不够,移动端安卓微信浏览器貌似不支持,苹果的可以;web端IE支持也不够,chrome可以。 先说结论: 推荐在循环对象属性的时候,使用for.…

go 怎么等待所有的协程完成_理解真实世界中 Go 的并发 BUG

点击上方蓝色“Go语言中文网”关注,回复「电子书」领全套Go资料有几个学生研究归纳了go编程中的并发bugs,发表了一篇(英文)论文:《Understanding Real-World Concurrency Bugs in Go》。为你下载好了 PDF,关注公众号 Go语言中文网…