本文继续前面关于弹出窗口的话题。弹出窗口常见另一个效果是阴影。这种阴影不是单纯的黑色矩形,而是带有背景具有渐变灰度级别的阴影。在Windows上启动这一特性的地方在桌面属性->外观->效果窗口中:
设置启动这一效果后,所有Windows中的菜单都具有阴影效果,如下图所示:
很可惜的是Java6并没有检测并启动这一效果。但是我们可以根据前面文章的方法自定义这种ShadowPopupFactory,这能不仅仅使菜单具有阴影效果,其他弹出式窗口如ToolTip和下拉框也都有这种效果。
这种ShadowPopupFactory的基本思想是为要弹出的内容加上阴影边框,由它实现阴影效果的渲染。为实现文章开始所说的背景灰度渐变阴影效果,同前一篇文章的透明Popup窗口一样,要使用java.awt.Robot抓取组件的背景屏幕,并切割右边、下边以及右下边角图像,并进行灰度处理。最后将这三处图像作为边框内容画出,就实现了阴影效果。接着ShadowPopupFactory的getPopup方法中,将要弹出的组件放在边框是阴影边框的容器内,最后以此容器替代目标组件作为弹出内容获取Popup对象返回。
下面是使用ShadowPopupFactory所写的演示程序的抓图:
如果结合前面两篇文章的两种动画效果,就可实现滚动式弹出的阴影窗口和淡入淡出式弹出的阴影窗口。实现方法比较简单,仅需要将ScrollablePopupFactory和TranslucentPopupFactory的父类换成ShadowPopupFactory并适当调整一下构造函数就可以了。