SWT 中实现最小化到托盘图标,并只能通过托盘的弹出菜单关闭程序

我们有些程序会想要托盘处显示图标,最小化到系统栏;关闭按钮不关闭程序,也是最小化到系统栏;点击托盘图标激活窗口,通过托盘图标的弹出菜单来退出程序。

本段代码就是要完成这样的功能,是 SWT  来实现的。

直接代码给出,代码中有较详细的注释,说明了本程序的功能及实现。文中的任务栏和系统栏应该知道是指哪一段吧,微软就是这么定义的,用 spyxx 的 findwindow 窥探一下就知道了。

实现效果如下:

SwtNoTray.jpg                    SwtHasTray.jpg

左图是窗口显示时,系统栏中无图标,而任务栏中有图标。右图是窗口隐藏时,只有系统栏有图标。

过后,看了翻译软件 LINGOES 灵格斯的表现形式是:

1. 任何时候系统栏都有图标
2. 最小化按钮不会隐藏窗口,只是最小化到任务栏
3. 关闭按钮也是不会关闭程序,而是最小化到系统栏
4. 也是只能通过托盘图标的弹出菜单项“退出” 来关闭程序

参考:http://www.eclipseworld.org/bbs/read-cec-tid-15458-fpage-9.html

但最后还留有一个问题:如何实现窗口可见状态时,任务栏里什么都不显示呢?

本文链接 https://yanbin.blog/swt-systray-close-via-tray/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

14 Comments
Inline Feedbacks
View all comments
千里冰封
16 years ago

你写的窗口如果是继承自JDialog的话,则任务栏什么也不会显示

千里冰封
16 years ago

# while (!shell.isDisposed()) {
# if (!display.readAndDispatch())
# display.sleep();
# }
怎么像MFC的事件循环哦,
唉,SWT就是和SWING没法比了

隔叶黄莺
16 years ago

SWT的程序如果继承自 JDialog 就不伦不类了,也没这么试过,用SWT一般也不建议这么做,虽然SWT也提供了 SWT-AWT 相应类

SWT 确实很多东西太像 MFC 的,比如

窗口构造方式:

final Shell shell = new Shell(display,SWT.SHELL_TRIM ^ SWT.MAX);

SWT中很多变量在MFC都有相应的全局常量对应

资源的获取方式:

display.getSystemImage(SWT.ICON_WORKING

不过SWT可还是比MFC简单多了。

ITLabour
ITLabour
15 years ago

博主的代码很工整,尊重知识产权。

ichuan
15 years ago

请教,如何实现启动时不显示shell窗口,只显示托盘图标;可以通过托盘图标显示shell窗口?

隔叶黄莺
15 years ago

启动 java window 程序时用命令

start javaw ...........

就不会出现 shell 窗口,不要用 java,就这么简单。

ichuan
15 years ago

晕,我把意思表述错误了。
不是那个控制台窗口,是SWT中的shell。shell.open()以后会显示shell窗口,我想问的是如何实现程序启动时隐藏主窗口,而只显示托盘?
我在shell.open()后加了一句shell.setVisiable(false),但启动时窗口会一闪而过,不完美,请问有办法吗?
多谢回复!!!

隔叶黄莺
15 years ago

启动程序时不要执行

shell.open();

设置托盘图标启动时可见

trayItem.setVisible(true);

试一试看看效果。

ichuan
15 years ago

可以了!多谢!!
刚开始学SWT,许多东西不懂,没想到这样做。

polaris
15 years ago

楼主,你太强了

我正要这个,谢了哦

春风扬鹏
春风扬鹏
15 years ago

楼主,我想问一下,如果程序主页面用得是jfc的applicationwindow,如何设置系统托盘?我尝试引用您的代码,可是报错,shell不能引用。

隔叶黄莺
15 years ago

这是用的 SWT 组件的做法,不适用于 jfc

如果是 jdk1.6的 jfc 可以用 SystemTray,具体用法可参考

java实现系统托盘

http://www.blogjava.net/kissjava/archive/2008/07/30/218654.html

春风扬鹏
春风扬鹏
15 years ago

谢谢楼主的解答。

duduli
15 years ago

看得出博主在这个blog中花费了很多心思的。