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弹出菜单中文乱码...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql1714_linux环境安装m
- 下一篇: 未来计算机控制器趋势,未来DCS控制系统