TrayIcon构造函数
方法 |
描述 |
TrayIcon(Image image) |
Creates a TrayIcon with the specified image. |
TrayIcon(Image image, String tooltip) |
Creates a TrayIcon with the specified image and tooltip text. |
TrayIcon(Image image, String tooltip, PopupMenu popup) |
Creates a TrayIcon with the specified image, tooltip and popup menu. |
可以看到,我们可以使用PopupMenu
作为系统托盘程序的弹出菜单。
但是PopupMenu有如下问题:
- PopupMenu添加的菜单项MenuItem不支持图标,是awt级组件,没有提供paint函数,也就意味着不能重绘,去实现带图标的菜单;
- PopupMenu只支持英文,中文会乱码,如果确实需要支持中文的话,运行的jar时候,需要使用加上
-Dfile.encoding=GBK
参数,指定以GBK编码来运行,一般来说我们要处理的文件也通常是UTF-8编码的,如果使用这个GBK编码运行的jar来处理此文件,就会出现乱码问题。
JPopupMenu是Swing组件,而且支持图标+文本,更美观。在标准API里,添加JPopupMenu的有两种方式:
1、Component组件调用setComponentPopuMenu(JPopupMenu)方法来绑定JPopupMenu;
2、JPopupMneu调用show(Component c,int x,int y)方法绑定至组件的(x,y)坐标上;
但问题是,TrayIcon不是Component,不能通过上述两种方法进行绑定。
弹出菜单的触发过程
在 鼠标点击或者按下快捷键 时 生成弹出菜单。
所以我们可以在点击系统托盘的时候,单独创建一个Component作为JPopupMenu的参考坐标。
这个Component,我们可选择Java现成的JWindow或者JDialog等等。经过测试JDialog来实现会更好一些。
获取鼠标点击的坐标值,在这个坐标值上创建一个JDialog,然后将JPopupMenu绑定到这个JDialog的(0,0)位置上,弹出菜单显示后再获取弹出菜单的尺寸,再根据尺寸回调JDialog的大小,这样JPopupMenu就完美的遮罩了JDialog,看不出JDialog的存在。
不过这样做,还有最后一个问题,那就是在弹出菜单消失后,JDialog依然存在;
这倒不用担心,JPopupMenu提供了:firePopupMenuCanceled()、firePopupMenuWillBecomeInvisible()、firePopupMenuWillBecomeVisible(),菜单消失、消失前、消失后,这三个回调函数。
所以,我们可以选择重写其中任意一个函数,在JPopupMenu消失之前关闭JPopupMenu的载体即可。
这样就可以完美实现系统托盘弹出菜单啦。