创建Java2D图形
下面我们将介绍如何将Swing容器(存放GUI组件的纯黑色面板和框架)变成一块可以在上面绘制字体、颜色、形状和图形的艺术画布。
1、使用Font类
在Java中,颜色和字体使用java.awt包中的Color和Font类来表示。字体使用构造函数Font(String , int , int)来创建,3个参数分别为:
>字体的名字,它可以使描述性名字,也可以是实际的字体名;
>Font.BOLD、Font.ITALIC和Font.PLAIN这3个类变量中的一个;
>字体大小,单位为磅
下面的语句创建了一个Font对象,字体为微软雅黑:
Font current = new Font(“微软雅黑” , Font.ITALIC , 12);
如果你使用了一个指定的字体而非通用字体,则改字体必须已经安装在运行程序的计算机中。你可以将字体样式合并起来使用,例如:
Font current = new Font(“微软雅黑” , Font.BOLD + Font.ITALIC , 72);
当有了字体之后,可以调用Graphics2D组件的setFont(Font)方法,讲其指定为当前字体。在没有指定新字体之前,后续所有的绘制操作都将使用该字体。下面创建了一个字体费翔,并在绘制文本之前将其指定为当前字体:
public void paintComponents(Graphics g) {
super.paintComponents(g); //To changebody of generated methods, choose Tools | Templates.
Graphics2D graphics2D = (Graphics2D)g;
Font font = new Font("微软雅黑", Font.BOLD,15);
graphics2D.setFont(font);
graphics2D.drawString("小武灵灵", 5, 50);
}
Java支持消除锯齿功能,因此可以更为平滑地绘制字体和图形,而且他们的外观具有较少的锯齿。为了启用这个功能,必须在Swing中设置渲染提示(rendering hint)。Graphics2D对象具有一个setRenderingHint(int , int)方法,他可以接受两个参数:
>渲染提示键(key);
>与该键相关联的值。
这些值是位于java.awt包中的RenderingHints类的类变量。要启用消除锯齿功能,可使用两个参数来调用setRenderingHint()方法:
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
2、使用Color类
在Java中,颜色可使用Color类来表示,其中包括许多常量如black、red等。在容器中,可以调用setBackground(Color)方法来设置组件的背景色,其中上面提到的颜色常量作为该方法的参数,如下所示:
setBackground(Color.orange);
与当前的字体相同,使用setColor(Color)方法执行绘制任务之前必须先设置当前的颜色。下面的代码将颜色设置为red:
graphics2D.setColor(Color.red);
在使用setBackground()方法时,我们可以直接在容器上调用,但是setColor()则不行,我们必须在Graphics2D对象上调用该方法。
3、创建自定义颜色
在Java中,通过制定sRGB通用色彩标准的值,可以创建自定义颜色。sRGB使用颜色中的红、绿、蓝分量来定义颜色。每一种颜色的取值在0~255之间。构造函数Color(int , int , int)接受3个参数,分别表示红、绿、蓝的值。下面的代码将回执一个面板,该面板在暗红色(红:235;绿:50;蓝:50)背景中显示亮橙色(红:230;绿:220;蓝:0)文本:
Color lightOrange = new Color(230, 220, 0);
Color darkRed = new Color(235, 50, 50);
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D graphics2D = (Graphics2D)g;
graphics2D.setColor(darkRed);
graphics2D.fillRect(0, 0, 200, 100);
graphics2D.setColor(lightOrange);
graphics2D.drawString("小武灵灵", 5, 50);
}
该示例调用Graphics2D的fillRect()方法使用当前颜色绘制一个填充的矩形。
4、绘制直线和形状
在Java中,绘制直线和矩形这样的形状就想显示文本那样简单。只需要一个Graphics2D对象来定义绘制平面和表示要绘制内容的对象即可。
Graphics2D对象有用来绘制文本的方法,如下所示:
graphics2D.drawString(“小武灵灵” , 15 , 40);
这将在坐标点(15 , 40)位置绘制文本”小武灵灵”。绘制直线的方法所使用的坐标系与绘制文本的方法相同。通过使用下面的语句可以确定applet能够使用的最大(x , y)值:
Int maxXValue = getSize().width;
Int maxYValue = getSize().height;
除了可以绘制直线以外,你还可以绘制填充的形状或者是为填充的形状。
1)、绘制直线
Line2D.Float类能够创建一条连接起点(x1 , y1)和终点(x2, y2)的直线。
Line2D.Float line= new Line2D.Float(x1 , y1 , x2 , y2);
除了直线之外,调用Graphics2D类的方法还可以绘制其他形状:draw()方法可以绘制轮廓线,而fill()方法可以绘制填充形状。下面的语句与上面的对象想结合,可以绘制出直线对象:
Graphics2D.draw(line);
2)、绘制矩形
矩形可以使填充或非填充的,还可以是圆角或直角的。矩形可以使用构造函数Rectangle2D.Float(int , int , int , int)来创建,4个参数如下:
>矩形左上角的X坐标
>左上角的Y坐标
>矩形的宽度
>矩形的高度
下面的语句可以绘制一个非填充的直角矩形:
Rectangle2D.Float box = new Rectangle2D.Float(245F , 60F , 20F, 10F);
要绘制矩形的轮廓,可以使用下面的语句:
graphics2D.draw(box);
要填充该矩形,可以使用fill()方法:
Graphics2D.fill(box);
可以使用RoundRectangle2D.Float类来创建圆角矩形。这个类的构造函数前4个参数与Rectangle2D.Float类相同,并增加了下面两个参数:
>水平方向上距离矩形角的像素数;
>垂直方向上距离矩形角的像素数。
下面的语句创建一个圆角矩形:
RoundRectangle2D.Floatrr2d = new RoundRectangle2D.Float(10F , 10F , 100F , 80F , 15F , 15F);
最后两个参数指定在矩形的4个角上,在离角点15像素出开始倒圆角。
3)、绘制椭圆和圆
椭圆和圆使用同一个类——Ellipse2D.Float创建。这个类的构造函数接受4个参数:
>椭圆的X坐标
>椭圆的Y坐标
>椭圆的宽度
>椭圆的高度
(x, y)坐标、宽度、高度描述了椭圆的外接矩形,(x , y)是该矩形的左上角坐标。如果宽和高相同,则椭圆变成圆。下面的语句创建一个圆:
Ellipse2D.Float cir = new Ellipse2D.Float(245F , 45F , 5F , 5F);
4)、绘制弧线
在Java中可绘制的另一个圆形形状是弧线,它是椭圆或圆的一部分。弧线用Arc2D.Float类创建,这个类的构造函数使用几个与Ellipse2D.Float相同的参数。要创建弧线,需要制定一个椭圆、该椭圆的可见部分(单位为度)以及弧线的起点。
要创建弧线,向构造函数传递下述整型参数:
>椭圆外接矩形左上角的X坐标;
>该矩形左上角的坐标;
>该矩形的宽度;
>该矩形的高度;
>弧线的起点(0°~359°);
>弧线长度,单位为度;
>弧线类型。
弧线的起点为0~359°,方向为逆时针方向,其中0°对应于3点钟的位置。
弧线的类型用Arc2D.Float类的3个类变量之中的一个指定:PIE将弧线绘制为饼图的一部分;CLOSED将弧线的起点和终点用直线相连;OPEN不将终点和起点相连。
下面的语句创建一个非闭合弧线,其外接矩形的左上角坐标为(100 , 50),高度和宽度值都是75,弧线从30°处开始,长120°:
Arc2D.Floatsmile = new Arc2D.Float(100F , 50F , 65F , 75F , 30F , 120F , Arc2D.Float.OPEN);
总结
尽管使用Java中的形状在尽兴绘制时,看起来相当麻烦,而且不是那么值得,但是,与从图像文件中载入的图形相比,使用多边形描绘的图形具有两个优势:
>速度:即使是加载和显示小图形,所需的时间也比交在和显示一系列多边形长;
>缩放:对于由多边形组成的图像,只需修改用于创建多边形的值就能改变整个图像的大小。例如可以在Sign类中添加一个函数,将每个形状的(x, y)点乘以2再创建它们,这样图像将比原来大一倍。缩放多边形图像的速度比图像文件快,且得到的结果更好。