5.2.2 任意形状的窗口
在桌面应用中,窗口的形状一般以矩形为主。这也是大多数用户所需要的窗口形状。在某些特定的情况下,可能会需要使用其他形状的窗口,其目的也是为了提高用户体验。对于一个音乐播放器应用来说,如果播放窗口的形状是连在一起的多个圆形,类似多个圆形按钮拼接在一起,就可以更加地贴近用户的使用习惯。在Java 7中,AWT的Window类中新增了用来获取和设置其窗口形状的方法,分别是getShape和setShape。设置窗口形状时使用的参数是AWT中表示几何形状的java.awt.Shape接口的实现对象。AWT中本身提供了很多Shape接口的实现类,用来表示常见的图形,包括弧线、椭圆、多边形、矩形和圆角矩形等。开发人员还可以通过实现Shape接口来创建独特的形状,这为在桌面应用中使用任意形状的窗口提供了极大的便利。
把一个窗口的形状设置为给定的Shape接口的实现对象之后,该窗口只有在该形状范围之内的区域才是可见的,在其他区域都是不可见的。设置任意形状的窗口需要底层操作系统的支持,最主要的是支持将界面上的每个像素都设置为完全透明或完全不透明。另外,要求窗口不能包含装饰元素,如标题栏和边框。窗口也不能处于最大化的状态。满足这三个条件之后,就可以设置窗口的形状了。如果想恢复原来的默认形状,只需要传入null作为调用setShape方法的参数即可。
代码清单5-1给出了任意形状窗口的一个示例,其中把窗口的形状设置成椭圆。代码中使用Window类的子类Frame来创建一个顶层窗口,方法setUndecorated用来去掉窗口包含的装饰元素,Ellipse2D.Float类则表示一个椭圆。
代码清单5-1 任意形状窗口的示例
public void createShapedWindow(){
Frame frame=new Frame();
frame.setUndecorated(true);
Shape shape=new Ellipse2D.Float(0,0,400,300);
frame.setShape(shape);
Label label=new Label("Hello World!");
frame.add(label);
frame.setSize(400,300);
frame.setVisible(true);
}