创建Java2D图形

创建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再创建它们,这样图像将比原来大一倍。缩放多边形图像的速度比图像文件快,且得到的结果更好。

 

 

 

 

原文地址:https://www.cnblogs.com/javawebsoa/p/2981405.html