日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2025/3/15 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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關閉。

至此,完美實現系統托盤彈出菜單。

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

總結

以上是生活随笔為你收集整理的popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。