使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。
day068 图形程序设计(三)(处理2D图形、使用颜色)
1.处理2D图形
自从Java版本1.0以来,Graphics类就包含绘制直线、矩形和楠圆等方法。但是,这些绘制图形的操作能力非常有限。例如,不能改变线的粗细,不能旋转这些图形。
JavaSE1.2引人了Java2D库,这个库实现了一组功能强大的图形操作。要想使用Java2D库绘制图形,需要获得一个Graphics2D类对象。这个类是Graphics类的子类。自从JavaSE2版本以来,paintComponent方法就会自动地获得一个Graphics2D类对象,我们只需要进行一次类型转换就可以了。如下所示:
public void paintComponent(Graphics g)
{
Graphics2D g2 =(Graphics2D) g;
...
}
Java2D库采用面向对象的方式将几何图形组织起来。包含描述直线、矩形的椭圆的类:
Line2D
Rectang1e2D
Ellipse2D
这些类全部实现了 Shape 接口。
要想绘制图形,首先要创建一个实现了Shape接口的类的对象,然后调用GraphicS2D类中的draw方法。例如,
Rectangle2D rect = . . .;
g2.draw(rect);
使用Java2D图形类或许会增加一些复杂度。在1.0的绘制方法中,采用的是整型像素坐标,而Java2D图形采用的是浮点坐标。在很多情况下,用户可以使用更有意义的形式(例如,微米或英寸)指定图形的坐标,然后再将其转换成像素,这样做很方便。在Java2D库中,内部的很多浮点计算都采用单精度float。毕竟,几何计算的最终目的是要设置屏幕或打印机的像素,所以单精度完全可以满足要求了。只要舍人误差限制在一个像素的范围内,视觉效果就不会受到任何影响。
然而,有时候程序员处理float并不太方便,这是因为Java程序设计语言在将double值转换成float值时必须进行类型转换。例如,考虑下列的语句:
float f = 1.2; // Error
这条语句无法通过编译,因为常量1.2属于double类型,而编译器不允许丢失精度。解决的方法是给浮点常量添加一个后缀F:
float f = 1.2F; // Ok
现在,看一下这条语句:
Rectang1e2D r =.. .
float f = r.getWidth(); // Error
这条语句也无法通过编译,其原因与前面一样。由于getWidth方法的返回类型是double,所以需要进行类型强制转换:
float f = (float) r.getWidth(); // OK
由于后缀和类型转换都有点麻烦,所以2D库的设计者决定为每个图形类提供两个版本:一个是为那些节省空间的程序员提供的float类