popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...
本人萌新,利用業(yè)余時(shí)間學(xué)習(xí)Java。最近在寫一個(gè)GUI程序的時(shí)候遇到一個(gè)問題,系統(tǒng)托盤創(chuàng)建彈出菜單中文亂碼,網(wǎng)上搜索很多內(nèi)容都沒有找到解決方案,現(xiàn)將個(gè)人解決方案分享給大家,希望有所幫助
一、PopupMenu存在的問題
標(biāo)準(zhǔn)文檔中系統(tǒng)托盤的構(gòu)造函數(shù):TrayIcon(Image image,String tips,PopupMenu menu),但實(shí)施過程中遇到兩個(gè)問題:
1、PopupMenu添加的菜單項(xiàng)MenuItem不支持圖標(biāo),是awt級(jí)組件,沒有提供paint函數(shù),也就意味著不能重繪,去實(shí)現(xiàn)帶圖標(biāo)的菜單,這在作為強(qiáng)迫癥的我是無法接受的;
2、PopupMenu中文亂碼,只支持英文,網(wǎng)上需要修改文件編碼方式為GBK,然而在整個(gè)項(xiàng)目中都采用了UTF-8,這也不是解決辦法。
二、基于JPopupMenu的解決方案
JPopupMenu是Swing組件,而且支持圖標(biāo)+文本,更美觀。在標(biāo)準(zhǔn)API里,添加JPopupMenu的有兩種方式:
1、Component組件通過setComponentPopuMenu(JPopupMenu)綁定JPopupMenu;
2、JPopupMneu調(diào)用show(Component c,int x,int y)函數(shù)綁定至組件;
再研究發(fā)現(xiàn),TrayIcon不是Component,現(xiàn)有方法實(shí)現(xiàn)直接綁定是行不通的。彈出菜單的關(guān)鍵事件:鼠標(biāo)點(diǎn)擊(含有快捷鍵等,不一一列舉),然后生成菜單。那么我們?yōu)槭裁床荒茉冱c(diǎn)擊系統(tǒng)托盤的時(shí)候,單獨(dú)創(chuàng)建一個(gè)Component作為JPopupMenu的坐標(biāo)參考呢?系統(tǒng)托盤的位置,與程序的主界面(JFrame)在是沒有關(guān)聯(lián)的,可以脫離主框架獨(dú)立存在的Component中,JWindow可以獨(dú)立存在的,沒有標(biāo)題欄,也不會(huì)在任務(wù)欄顯示窗口,顯然這是作為一個(gè)坐標(biāo)參考的完美組件。接下來就好辦了:
3、獲取鼠標(biāo)點(diǎn)擊的坐標(biāo)值,在這個(gè)坐標(biāo)值上創(chuàng)建一個(gè)JWindow,將JPopupMenu綁定到這個(gè)JWindow的(0,0)位置上,彈出菜單顯示后再獲取彈出菜單的尺寸,再根據(jù)尺寸回調(diào)JWindow的大小,這樣JPopupMenu就完美的遮罩了JWindow,看不出JWindow的存在,到這里,還有最后一個(gè)問題,彈出菜單消失,JWindow依然存在;
4、查看JPopupMenu的API文檔,發(fā)現(xiàn)有三個(gè)函數(shù)firePopupMenuCanceled()、firePopupMenuWillBecomeInvisible()、firePopupMenuWillBecomeVisible(),是菜單消失、即將消失、消失前、消失后調(diào)用的函數(shù),所以,直接選擇其中任意一個(gè)函數(shù)進(jìn)行重寫,先執(zhí)行JWindow.dispose(),再super執(zhí)行一下原函數(shù)就OK了,意思就是,再消失、即將消失前、消失后,將JWindow關(guān)閉。
至此,完美實(shí)現(xiàn)系統(tǒng)托盤彈出菜單。
第一次分享,可能有大神有更好的解決方案,請(qǐng)多多指教。
總結(jié)
以上是生活随笔為你收集整理的popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql1714_linux环境安装m
- 下一篇: 1bit和1byte_1byte等于(